Невозможно получить детей из выпадающего списка 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 дня, пытаясь решить эту проблему и ничего. Любая помощь приветствуется.

0 ответов

Другие вопросы по тегам