Caliburn.MicroとWhiteを使用している WPF アプリケーションの UI 自動化テストを作成しようとしています。CM の組み込み規則を使用して、コントロールをビュー モデルのプロパティとメソッドにバインドしています。また、Conductor
クラスを使用して、1 つの画面に複数のビューを表示できるようにしています。これは通常、画面上の複数のコントロールが同じx:Name
値になる可能性があることを意味します。別のビューモデルにバインドされるだけです。私がやろうとしていることの良いアイデアは、 CM に付属の HelloScreens サンプル アプリケーションで見ることができます。
私が直面している問題はx:Name
、CM がすべてのバインディング作業を処理できるように、同じ属性を持つ複数の XAML 要素を持つことです。残念ながら、これは、複数のUIItem
オブジェクトが同じ UI オートメーション ID を持つことを意味します。たとえば、さまざまTextBlock
な要素を取得するために私が見つけた唯一の方法x:Name="DisplayName"
は、次のような呼び出しを行うことです。
SearchCriteria criteria = SearchCriteria.ByAutomationId("DisplayName").AndIndex(1);
WPFLabel label = myWindow.Get<WPFLabel>(criteria);
これは、私のテストでは、さまざまなコントロールが画面に配置される正確な順序を知る必要があることを意味しますが、これは非常に脆いようです。別のビュー モデルを追加するだけで、テストがすべて壊れていることがわかります。
x:Name
属性を使用する以外にオートメーション ID を指定する方法はありますか?- White を使用する代わりに UI オートメーション フレームワークを直接使用した場合、これはより簡単になりますか?
- それとも、CM の規約ベースのバインドをやめて、すべてに固有の
x:Name
値を与えて手動でバインドする必要がありますか?
更新しました
一度に複数のビューを表示することの意味を明確にするために、ここに私の一般的なレイアウトを示します。私は私ShellViewModel
が由来するものを持っていConductor<IScreen>.Collection.OneActive
ます。次に、私のビューにはItemsControl
、シェル ビュー モデルのItems
プロパティにバインドされた があります。各項目テンプレートには、シェルのビューにある にIScreen
特定のものをロードするためのボタンが表示されます。ContentControl
したがって、 で要素を検索しようとするとx:Name="DisplayName"
、シェル ビューにラベルがあり、 ボタンにItemsControl
ラベルがあり、 の中にラベルがありContentControl
ます。