TestStack.White 为什么我可以通过 Application.GetWindows 找到一个 window 而不能通过 .GetWindow 找到?

TestStack.White Why can I find a window with Application.GetWindows but not with .GetWindow?

编辑:在形成这个问题时,我没有注意到目标 window 是模态 window 所以我尝试的方法是错误的。我应该一直使用 GetModal,而不是 GetWindow。留在这里作为未来旅行者的潜在参考

我正在尝试使用 TestStack.White 为我继承的大型 WPF 应用程序编写一些测试;我有一个案例,其中创建了 child window,我需要获取对它的引用。如果我遍历对 Application.GetWindows 的调用结果,我可以找到它,但是我无法用我能想象的 Application.GetWindow 的任何化身找到它。

这在以下示例中进行了说明(其中名称是一个字符串)。 window 是在 foreach 循环中找到的(只要我在迭代之前让线程休眠一秒钟,以便在单击其他内容后创建 window 时间......)老实说,整个这个练习的重点只是为了摆脱这个 Thread.Sleep code-smell,所以我想使用 GetWindow 及其 built-in 等待。

        Thread.Sleep(1000);

        foreach (Window window in app.GetWindows())
        {
            if (window.AutomationElement.Current.Name == name)
            {
                Assert.AreEqual(window.Title, name); // passes.. they match
                Assert.AreEqual(window.AutomationElement.Current.Name, name);  // passes.. they match
                var aIdCheck = window.AutomationElement.Current.AutomationId; // empty string
            }
        }

        try  // this fails.. (after 30s)
        {
            var testGetWindow = app.GetWindow(name);
        }
        catch (Exception ex)   {   }

        try // this fails too... (after 5s)
        {
            var testGetWindow = app.GetWindow(SearchCriteria.ByNativeProperty(AutomationElement.NameProperty, name), InitializeOption.NoCache);
        }
        catch (Exception ex) {}

        try // you guessed it.. fail..
        {
            var testGetWindow = app.GetWindow(SearchCriteria.ByText(name), InitializeOption.NoCache);
        }
        catch (Exception ex) {}

试试这个:

var window = Retry.For(
            () => parent.GetWindows().First(x => x.Title.Contains(name)),
            TimeSpan.FromSeconds(5));

如果有效,我认为问题在于您要查找的名称有多个 processes/windows 运行。您的 foreach 循环之所以有效,是因为它不关心并且只是找到第一个,但是在这种情况下 GetWindow() 方法会中断。