0

Кто-нибудь пробовал «Microsoft UI Automation» для веб-приложения?Microsoft UI Automation для веб-приложения

У меня есть приложение WPF, которое имеет встроенный wpfbrowser. Поскольку это в основном приложение для настольных компьютеров, я не могу использовать Selenium Webdriver.

Я попытался CodedUI, но я столкнулся с вопросом, который я задал здесь: Coded UI - Unable to identify a html controls on a Wpfbrowser

Я планирую использовать UIAutomation, Но снова itseems, что я не в состоянии идентифицировать элемент управления с помощью свойства идентификатора

Ex:

<button id="but1">Click Me</button> 

Для этого у меня есть:

PropertyCondition ps = new PropertyCondition(AutomationElement.AutomationIdProperty, "but1"); 
AutomationElement Clickme = elementMainWindow.FindFirst(TreeScope.Descendants, ps); 

Но это не работает. «Clickme» имеет значение NULL.

Как это сделать UIAutomation ??

EDIT: Прикрепление Screeshot: enter image description here

+0

Можете ли вы снять снимок экрана того, что проверяет, показывает иерархию исходного дерева? если бы у меня было, что я могу вам помочь. –

+0

@MaxYoung, я добавил скриншот. Надеюсь, этого хватит. – user2048204

ответ

0

Я хотел бы попробовать на самом деле навигации древовидную вниз управления вы ищете а не делать это на основе покойных. Еще одна вещь, которую вы могли бы попробовать, - это сделать цикл повтора, если он равен нулю. Вот пример общего Retry для FlaUI. Таким образом, ваш код будет выглядеть примерно так.

PropertyCondition ps = new PropertyCondition(AutomationElement.AutomationIdProperty, "but1"); 

Func<AutomationElement> func =() => elementMainWindow.FindFirst(TreeScope.Descendants, ps); 
Predicate<AutomationElement> retry = element => element == null; 

AutomationElement clickMe = Retry.While<AutomationElement>(func, retry, TimeSpan.FromSeconds(1)); 

Так что этот код будет пытаться найти элемент в течение 1 секунды и будет пытаться найти его, если элемент возвращается нуль или это исключения. Если кто-то из них случится, он ждет 200 миллисекунд и повторит попытку. Это скажет мне, если элементы просто не отображаются, когда вы пытаетесь их найти, или если их разница между тем, как проверяет их обнаружение и как их обнаруживает System.Windows.Automation.

Если это не сработает, я отправлю решение с помощью древовидной мыши, но я предлагаю использовать это решение по дереву ходок, потому что, если это приложение, то другое захочет написать автоматизацию, поскольку они будут ожидать, что эти функции будут работать как вы пытаетесь их использовать.

0

Не уверен, что <button id="but1"> соответствует автоматизации. Вы можете установить идентификатор автоматизации с помощью AutomationProperties.AutomationId="but1", если вы можете использовать это пространство имен в коде, где вы определяете свой интерфейс (XAML), что является вероятным только для приложений WPF.

В вашем случае, если ваш пользовательский интерфейс, определенный в HTML, я думаю, вы можете использовать подпись кнопки. Так что-то вроде этого.

var ps = new AndCondition(new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button), 
       new PropertyCondition(AutomationElement.NameProperty, "Click Me")); 

AutomationElement Clickme = elementMainWindow.FindFirst(TreeScope.Descendants, ps); 

ControlTypeProperty может помочь в фильтрации результатов по типу. Не обязательно, но это может помочь, если у вас есть элементы автоматизации с другим типом, но с тем же именем.

Смежные вопросы