有没有人尝试过“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 ??
答案 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可以帮助按类型过滤结果。不是强制性的,但如果您具有不同类型但具有相同名称属性的自动化元素,则可以提供帮助。