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() 方法会中断。
编辑:在形成这个问题时,我没有注意到目标 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() 方法会中断。