我正在尝试为使用Caliburn.Micro和White的 WPF 应用程序编写一些 UI 自动化测试。我正在使用 CM 的内置约定将我的控件绑定到视图模型的属性和方法。我也在使用Conductor
类,这样我就可以在一个屏幕上看到多个视图。这通常意味着屏幕上的多个控件最终可能具有相同的x:Name
值。它只会绑定到不同的视图模型。在CM 附带的 HelloScreens 示例应用程序中可以看到我想要做什么的一个好主意。
我遇到的问题是我将拥有多个具有相同x:Name
属性的 XAML 元素,以便 CM 可以为我处理所有绑定工作。不幸的是,这意味着多个UIItem
对象将具有相同的 UI 自动化 ID。例如,我发现获得不同TextBlock
元素的唯一方法x:Name="DisplayName"
是进行如下调用:
SearchCriteria criteria = SearchCriteria.ByAutomationId("DisplayName").AndIndex(1);
WPFLabel label = myWindow.Get<WPFLabel>(criteria);
这意味着我的测试需要知道不同控件在屏幕上放置的确切顺序,这看起来很脆弱。只需添加另一个视图模型,我就可以看到我的测试全部中断。
x:Name
除了使用属性之外,还有其他方法可以指定自动化 ID ?- 如果我直接使用 UI 自动化框架而不是使用 White,这会更容易吗?
- 或者,我真的必须放弃 CM 的基于约定的绑定并赋予每个唯一的
x:Name
值并手动绑定它们吗?
更新
为了澄清我的意思是同时显示多个视图,这是我的总体布局。我有我ShellViewModel
的来源Conductor<IScreen>.Collection.OneActive
。然后我的视图有一个ItemsControl
绑定到外壳视图模型的Items
属性。每个项目模板都显示了一个按钮,用于将特定内容加载IScreen
到ContentControl
shell 视图中的 a 中。所以,如果我尝试查找带有 的元素x:Name="DisplayName"
,我会在 shell 视图上找到标签,在按钮上的ItemsControl
标签以及在ContentControl
.