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

Har*_*ber 4 wpf white-framework ui-automation caliburn.micro

我正在尝试为使用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);
Run Code Online (Sandbox Code Playgroud)

这意味着我的测试需要知道屏幕上放置不同控件的确切顺序,这看起来非常脆弱.通过添加另一个视图模型,我可以看到我的测试全部破坏.

  • 除了使用x:Name属性之外,有没有办法指定自动化ID ?
  • 如果我直接使用UI Automation框架而不是使用White,这会更容易吗?
  • 或者,我是否真的不得不放弃CM基于约定的约束并提供每个独特的x:Name值并手动绑定它们?

更新

通过一次看到多个视图来澄清我的意思,这是我的总体布局.我有我的ShellViewModel,我从派生Conductor<IScreen>.Collection.OneActive.然后我的视图ItemsControl绑定到shell视图模型的Items属性.每个项目模板都会显示一个按钮,用于将特定内容加载IScreenContentControlshell视图中.所以,如果我试图寻找一个元素x:Name="DisplayName",我在shell视图上有标签,按钮上的ItemsControl标签以及内部的标签ContentControl.

Sam*_*ack 5

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