4

我正在尝试为使用Caliburn.MicroWhite的 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属性。每个项目模板都显示了一个按钮,用于将特定内容加载IScreenContentControlshell 视图中的 a 中。所以,如果我尝试查找带有 的元素x:Name="DisplayName",我会在 shell 视图上找到标签,在按钮上的ItemsControl标签以及在ContentControl.

4

2 回答 2

5

虽然 AutomationId 默认来自 x:Name 属性,但您可以通过设置AutomationProperties.AutomationId来覆盖它。

于 2011-04-07T13:17:55.080 回答
1

一种选择可能是更改类型上的BindPropertiesBindActions委托ViewModelBinder以使用其名称根据它们所属的视图而更改的控件名称。

例如,您可以选择将视图名称作为前缀添加到每个可能在其他视图中具有重复名称的控件。所以DisplayName可以变成ListViewDisplayNameContentViewDisplayName

在继续处理控件之前,可以剥离从控件名称到包含单词“View”的任何文本以形成干净的控件名称。

于 2011-04-04T21:51:34.640 回答