[英]WPF UI Automation with Caliburn.Micro?
我正在尝试为使用Caliburn.Micro和White的WPF应用程序编写一些UI自动化测试。 我使用CM的内置约定将我的控件绑定到视图模型的属性和方法。 我也在使用Conductor
类,这样我可以在一个屏幕上看到多个视图。 这通常意味着屏幕上的多个控件最终可能具有相同的x:Name
值。 它将被绑定到不同的视图模型。 在CM附带的HelloScreens示例应用程序中可以看到我想要做的好事 。
我遇到的问题是我将拥有多个具有相同x:Name
属性的XAML元素,以便CM可以为我处理所有绑定工作。 遗憾的是,这意味着多个UIItem
对象将具有相同的UI自动化ID。 我发现获得的唯一方法,例如,使用x:Name="DisplayName"
不同TextBlock
元素是进行如下调用:
SearchCriteria criteria = SearchCriteria.ByAutomationId("DisplayName").AndIndex(1);
WPFLabel label = myWindow.Get<WPFLabel>(criteria);
这意味着我的测试需要知道屏幕上放置不同控件的确切顺序,这看起来非常脆弱。 通过添加另一个视图模型,我可以看到我的测试全部破坏。
x:Name
属性之外,有没有办法指定自动化ID? x:Name
值并手动绑定它们? 更新
通过一次看到多个视图来澄清我的意思,这是我的总体布局。 我有我的ShellViewModel
,它派生自Conductor<IScreen>.Collection.OneActive
。 然后我的视图有一个ItemsControl
绑定到shell视图模型的Items
属性。 每个项目模板都会显示一个按钮,用于将特定的IScreen
加载到shell视图中的ContentControl
中。 因此,如果我尝试使用x:Name="DisplayName"
查找元素,我在shell视图上有标签, ItemsControl
按钮上的标签以及ContentControl
内部的标签。
虽然AutomationId默认来自x:Name属性,但您可以通过设置AutomationProperties.AutomationId来覆盖它。
一个选项可能是更改ViewModelBinder
类型上的BindProperties
和BindActions
委托以使用其名称根据它们所属的视图而更改的控件名称。
例如,您可以选择将视图名称作为前缀添加到可能在其他视图中具有重复名称的每个控件。 因此DisplayName
可以成为ListViewDisplayName
和ContentViewDisplayName
。
在继续处理控件之前,可以剥离控件名称中包含单词“View”的任何文本以形成清洁控件名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.