使用Caliburn.Micro进行WPF UI自动化?

我正在尝试为使用Caliburn.Micro和White的WPF应用程序编写一些UI自动化测试。我使用CM的内置约定将我的控件绑定到视图模型的属性和方法。我也在使用
Conductor
类,这样我可以在一个屏幕上看到多个视图。这通常意味着屏幕上的多个控件最终可能具有相同的
x:Name
值。它将被绑定到不同的视图模型。在CM附带的HelloScreens示例应用程序中可以看到我想要做的好事。 我遇到的问题是我将拥有多个具有相同
x:Name
属性的XAML元素,以便CM可以为我处理所有绑定工作。遗憾的是,这意味着多个
UIItem
对象将具有相同的UI自动化ID。例如,我发现获得different5ѭ的不同
TextBlock
元素的唯一方法是进行如下调用:
SearchCriteria criteria = SearchCriteria.ByAutomationId("DisplayName").AndIndex(1);
WPFLabel label = myWindow.Get<WPFLabel>(criteria);
这意味着我的测试需要知道屏幕上放置不同控件的确切顺序,这看起来非常脆弱。通过添加另一个视图模型,我可以看到我的测试全部破坏。 除了使用
x:Name
属性之外,有没有办法指定自动化ID? 如果我直接使用UI Automation框架而不是使用White,这会更容易吗? 或者,我是否真的不得不放弃CM基于约定的约束并给出每个独特的
x:Name
值并手动绑定它们? 更新 通过一次看到多个视图来澄清我的意思,这是我的总体布局。我有我的
ShellViewModel
,我来自
Conductor<IScreen>.Collection.OneActive
。然后我的视图有一个绑定到shell视图模型的
Items
属性的
ItemsControl
。每个项目模板都会显示一个按钮,用于将特定的
IScreen
加载到shell视图中的
ContentControl
中。所以,如果我试图用
x:Name="DisplayName"
寻找一个元素,我在shell视图上有标签,
ItemsControl
上的按钮上的标签以及
ContentControl
内的标签。     
已邀请:
虽然AutomationId默认来自x:Name属性,但您可以通过设置AutomationProperties.AutomationId来覆盖它。     
一种选择可能是改变
ViewModelBinder
类型的
BindProperties
BindActions
代表,以使用名称根据它们所属的视图而改变的控制名称。 例如,您可以选择将视图名称作为前缀添加到可能在其他视图中具有重复名称的每个控件。所以
DisplayName
可能变成
ListViewDisplayName
,而
ContentViewDisplayName
。 在继续处理控件之前,可以剥离控件名称中包含单词“View”的任何文本以形成清洁控件名称。     

要回复问题请先登录注册