Найти окно рабочего стола по классу в белом
Я строю автоматизированный набор тестов с использованием White. Одна из вещей, которые мне нужно сделать, это щелкнуть значок в области уведомлений о повышении системы (правый нижний бит панели "Пуск"). У меня проблемы с опознаванием белого. Используя Spy++, я обнаружил, что в окна вложены три слоя, которые не имеют заголовка для поиска, что является обычным способом, которым белые идентифицируют окна. Поэтому я пытаюсь найти правильное окно по классу.
Согласно Spy++, мне сначала нужно получить окно 10042, которое имеет класс "Shell_TrayWnd". Затем его дочернее окно 10048 с классом TrayNotifyWnd, затем, наконец, область повышенных уведомлений системы, окно 1005E, с классом ToolbarWindow32. Взяв несколько подсказок из этого ответа, я попробовал следующий код:
win=Desktop.Instance.Get<Window>(SearchCriteria.ByNativeProperty(AutomationElement.ClassNameProperty, "Shell_TrayWnd"));
но когда я пытаюсь запустить его, я записываю эту ошибку (sic):
Exception: Error occured while geting (),AutomationElementIdentifiers.ClassNameProperty=Shell_TrayWnd
Есть идеи?
РЕДАКТИРОВАТЬ: я изменил журнал ошибок, поэтому я получил полный трассировку, а не просто сообщение об исключении, и нашел System.ArgumentException: Must specify at least two conditions.
Итак, я изменил код
win = Desktop.Instance.Get<Window>(SearchCriteria.ByClassName("Shell_TrayWnd").AndIndex(0));
но все равно выдает точно такое же сообщение об ошибке, несмотря на то, что я указал два условия.
Exception: TestStack.White.WhiteException: Error occured while geting (),ClassName=Shell_TrayWnd,Index=0 ---> System.ArgumentException: Must specify at least two conditions.
1 ответ
В White UI Automation существует различие между SearchCriteria
а также SearchConditions
, SearchConditions
используется внутренне платформой, тогда как критерии добавляются извне в качестве параметров, а затем внутренне преобразуются в условия (а затем еще более преобразуются в платформу Microsoft UIAutomation).
Если вы измените критерии поиска на
SearchCriteria.ByClassName("Shell_TrayWn").NotIdentifiedByText(String.Empty)
это перестанет выбрасывать ошибки.
Это связано с тем, что по умолчанию используется все, что ищется по именам / тексту в качестве условия поиска, и выдает не относящееся к делу сообщение об ошибке (это должно быть ArgumentException
с сообщением "Необходимо указать имя / текстовое условие")