Невозможно получить детей из выпадающего списка DevExpress через собственный API пользовательского интерфейса для Windows 7
Я работаю над процессом автоматизации тестирования GUI одного настольного приложения Windows. В общем, графический интерфейс одного был разработан с WPF, и использовались элементы управления DevExpress, такие как комбинированный список (на самом деле это панель с редактированием и кнопкой внутри). Поэтому я столкнулся с такой проблемой: когда я получил панель (комбобокс), я не могу получить редактирование или кнопки управления внутри панели. Я использую Inspect.exe, чтобы получить информацию об элементах управления пользовательского интерфейса, и я могу получить и перейти к панели, а также редактировать и кнопки управления внутри. Я знаю, что есть много информации по этой теме, и я знаю, что Inspect.exe использует собственный API пользовательского интерфейса, поэтому я переписал свой код с использованием собственного API, но проблема все еще возникает.
Код ниже показывает, как я пытаюсь получить элементы управления внутри обернутой панели (выпадающий список):
public void findButtondWithUnmanagedApi(AutomationElement win){
/* win - current window where I try to find my target controls.
* win is instance of AutomationElement (Yes, I know AutomationElement is managed code, but I use it only for getting pointer to my windows and will reduced futher)
*/
IntPtr hwnd = (IntPtr)win.Current.NativeWindowHandle;
interop.UIAutomationCore.IUIAutomation automation = new interop.UIAutomationCore.CUIAutomation();
interop.UIAutomationCore.IUIAutomationElement element = automation.ElementFromHandle(hwnd);
interop.UIAutomationCore.IUIAutomationTreeWalker walker = automation.RawViewWalker;
interop.UIAutomationCore.IUIAutomationElement child = walker.GetFirstChildElement(element);
int level = 0;
/*
* Scaning all controlls on the form to find target panel which represents a combobox
*/
while (child != null) {
string name = child.CurrentName;
string aid = child.CurrentAutomationId != null ? child.CurrentAutomationId : "null";
string type = child.CurrentLocalizedControlType;
log.TraceInformation("child: {0}, {1}, {2}, {3}", name, type, aid, level);
// Some controls have value of the property "Name" and don't have value of AutomationId
if (name == "PanelControlFromTo" || name == "panelControlSystem")
{
level++;
child = walker.GetFirstChildElement(child);
continue;
}
/*
* lookUpEditSystem - is value of AutomationId property of target panel (combobox from DevExpress)
* If target panel has found then stop scanning of other element
*/
if (child.CurrentAutomationId == "lookUpEditSystem"){
break;
}
child = walker.GetNextSiblingElement(child);
}
interop.UIAutomationCore.IUIAutomationElement comboboxChild = walker.GetFirstChildElement(child);
log.TraceInformation("Combobox Child: {0}", comboboxChild == null ? null: comboboxChild.CurrentName);
log.Flush();
}
В журнале я вижу результат:
TestLog Information: 0 : Combobox Child:
В Inspect.exe я вижу: Информация о combobox в Inspect.exe
Как вы видите, Inspect показывает, что у панели "lookUpEditeSystem" есть два дочерних элемента. Кстати, у каждого из этих потомков значение свойства IsWindowPatternAvailable равно false.
Я потратил 3 дня, пытаясь решить эту проблему и ничего. Любая помощь приветствуется.