編集:この質問を作成する際に、ターゲットウィンドウがモーダルウィンドウであることに気付かなかったため、私が試みていたアプローチが間違っていました。GetWindowではなくGetModalを使用する必要がありました。これを将来の旅行者のための潜在的な参照としてここに残します
継承した大規模なWPFアプリ用にTestStack.Whiteを使用していくつかのテストを作成しようとしています。子ウィンドウが作成され、それへの参照を取得する必要があるケースが1つあります。Application.GetWindowsの呼び出しの結果を繰り返すと、それを見つけることができますが、想像できるApplication.GetWindowの化身では見つけることができません。
これを次の例に示します(nameは文字列です)。ウィンドウはforeachループにあります(他の何かをクリックした後にウィンドウが作成される時間を与えるために反復する前にスレッドを1秒間スリープする限り)。正直なところ、この演習の要点は取得することです。このThread.Sleepコードの臭いを取り除くので、GetWindowとその組み込みの待機を使用したいと思います。
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));
それが機能する場合、問題は、探している名前で実行されている複数のプロセス/ウィンドウがあることだと私は信じています。foreachループは、気にせず、最初のループを見つけるだけなので機能しますが、その場合、GetWindow()メソッドは壊れます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加