1

我们正在使用 NUnit 来测试 WPF 控件。文本夹具基本上会打开一个测试窗口,其中包含要在新线程上测试的控件。然后使用 Microsoft UI 自动化 (UIA) 与控件进行交互。

新线程显示窗口并启动调度程序。事情按预期工作。

我们遇到的问题是这个控件可以启动一个对话框。对话框启动后,我们需要与之交互并关闭它。我无法获得对此对话框的引用来完成此任务。

一种不起作用的解决方案是使用 Application.Current.Windows 来获取所有窗口,然后遍历它们直到找到对话框。这不起作用,因为在单元测试期间 Application.Current = null。现在,如果我们只关心这个测试,我们就可以实例化一个应用程序。然而,这会干扰其他测试,因为当我们的应用程序变量超出范围时(在测试结束时),应用程序将自动进入关闭模式。结果,其他测试将失败(最明显的是因为 InitializeComponent 通常调用 System.Windows.Application.LoadComponent 在关机模式下无法调用)。

我想我们需要的是 Application.Current.Windows 的替代品。

4

1 回答 1

1

我找到了解决问题的有效方法。

UIA 触发许多事件。其中一个表示已打开一个新窗口。

为 WindowOpenedEvent 订阅处理程序:

Automation.AddAutomationEventHandler(WindowPattern.WindowOpenedEvent, AutomationElement.RootElement, TreeScope.Children, new AutomationEventHandler(NewWindowHandler));

public void NewWindowHandler(Object sender, AutomationEventArgs e)
{
    AutomationElement element = (AutomationElement)sender;
    if (element.Current.Name == "PUT YOUR NAME HERE") 
    {
        HwndSource hSource = HwndSource.FromHwnd(new IntPtr(element.Current.NativeWindowHandle));
        MyWindow = hSource.RootVisual as WavefrontToolkit.FormulaEditor.FormulaEditor;
        Assert.IsNotNull(_MyWindow );
        }
    }
}

在处理程序中,您没有对打开的窗口的引用。但是,您可以从 Win32 句柄中获取它。

我遇到的另一个问题是测试将在窗口打开时继续进行。某些测试可能取决于该窗口。为了解决这个问题,我会导致延迟,直到窗口准备好。

while (MyWindow == null)
{
    System.Threading.Thread.Sleep(10);
}
于 2015-04-27T20:32:10.840 回答