用于Web应用程序的Microsoft UI自动化

时间:2016-12-24 11:48:11

标签: wpf selenium-webdriver browser ui-automation coded-ui-tests

有没有人尝试过“Microsoft UI Automation”用于Web应用程序?

我有一个WPF应用程序,它有一个嵌入式wpfbrowser。 由于这基本上是一个桌面应用程序,我不能使用Selenium Webdriver。

我尝试了CodedUI,但我遇到了一个问题,我在这里问过: Coded UI - Unable to identify a html controls on a Wpfbrowser

我打算使用UIAutomation,但是再次看来我无法使用id属性识别控件

例如:

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

为此,我有:

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

但这不起作用。 “Clickme”为空。

如何做到这一点是UIAutomation ??

编辑:附上一个screeshot: enter image description here

2 个答案:

答案 0 :(得分:0)

我会尝试将树视图向下导航到您正在寻找的控件,而不是根据死者进行操作。您可以尝试的另一件事是,如果它为null,则执行重试循环。以下是FlaUI的通用Retry示例。所以你的代码看起来像这样。

 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秒的元素,如果元素返回null或异常,将重试找到它。如果其中任何一个发生,它等待200毫秒并再次尝试。这将告诉我当你试图找到它们时是否只是渲染元素,或者它们是如何检查它们以及System.Windows.Automation如何找到它们之间的区别。

如果这不起作用,我将使用树步行器发布解决方案,但我建议在树步行器上使用此解决方案,因为如果这是一个应用程序,其他人想要编写自动化,他们希望这些功能工作你尝试使用它们的方式。

答案 1 :(得分:0)

不确定<button id="but1">是否等于automationId。如果您可以在定义UI(XAML)的代码中使用该命名空间,则可以使用AutomationProperties.AutomationId="but1"设置自动化ID,这仅适用于WPF应用程序。

在您的情况下,如果您在HTML中定义的UI我认为您可以使用按钮的标题。 就像这样。

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

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

ControlTypeProperty可以帮助按类型过滤结果。不是强制性的,但如果您具有不同类型但具有相同名称属性的自动化元素,则可以提供帮助。