如何在System.Windows.Automation中订阅弹出窗口

时间:2016-01-30 00:05:50

标签: c# windows testing ui-automation

我尝试使用System.Windows.Automation库进行一些UI测试,并且能够取得一些进展,但我无法订阅在我的应用中创建弹出窗口的事件。我尝试在根(桌面对象)和窗口上使用Automation.AddStructureChangedEventHandler,但这不起作用。我也尝试使用不同的范围,这也没有帮助。

AutomationElement desktop = AutomationElement.RootElement;
AutomationElement app = desktop
    .FindFirst(TreeScope.Children,
        new PropertyCondition(AutomationElement.NameProperty,
            "Name of the App", PropertyConditionFlags.IgnoreCase));

ActivateWindow(app);

AutomationElement appWindow = app
    .FindFirst(TreeScope.Children,
        new PropertyCondition(AutomationElement.ControlTypeProperty,
            ControlType.Window));

// Find a button that opens a popup window and click it
AutomationElement button = appWindow
    .FindFirst(TreeScope.Children, Condition.TrueCondition)
    .FindAll(TreeScope.Children, Condition.TrueCondition)[8];

MoveMouseToAndClick(button);

Automation.AddStructureChangedEventHandler(desktop, TreeScope.Descendants, setupWindowOpen);

setupWindowOpen处理程序有时会触发,但看起来这种情况发生在其他应用程序上,而不是我的(我在发件人元素对象上看到Internet Explorer ID)。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

弹出控件很棘手,因为它们可以直接位于桌面下或应用程序下,也可以位于其他任何地方(桌面的直接孩子是最好的猜测)。我建议您使用Microsoft的SDK附带的WinSDK_AccEvent.exe实用程序来测试弹出窗口的各种事件,例如:桌面上的WindowOpened,StructureChanged,ToolTipOpened和自动化应用程序。这应该为您提供订阅的正确事件以及在什么范围内。 重要说明:如果您使用的是自动化框架的托管版本,则最好迁移到本机版本,因为托管版本对其可捕获的内容以及可能出现的几个性能错误有限制。要克服此外,它显然不再得到官方支持。希望这会有所帮助。

答案 1 :(得分:0)

您可以订阅WindowOpenedEvent(请参阅page)。看起来很简单,但是我无法正常工作。

如果您仍然对UI测试感兴趣并且熟悉Selenium驱动程序,则可以在https://github.com/kfrajtak/WinAppDriver尝试我的实现。