繁体   English   中英

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

[英]WPF UI Automation with Caliburn.Micro?

我正在尝试为使用Caliburn.MicroWhite的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?
  • 如果我直接使用UI Automation框架而不是使用White,这会更容易吗?
  • 或者,我是否真的不得不放弃CM基于约定的约束并给出每个唯一的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类型上的BindPropertiesBindActions委托以使用其名称根据它们所属的视图而更改的控件名称。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM