【问题标题】:WPF UI Automation with Caliburn.Micro?使用 Caliburn.Micro 实现 WPF UI 自动化?
【发布时间】:2011-04-02 14:32:09
【问题描述】:

我正在尝试为使用 Caliburn.MicroWhite 的 WPF 应用程序编写一些 UI 自动化测试。我正在使用 CM 的内置约定将我的控件绑定到视图模型的属性和方法。我也在使用Conductor 类,这样我就可以在一个屏幕上看到多个视图。这通常意味着屏幕上的多个控件最终可能具有相同的x:Name 值。它只会绑定到不同的视图模型。在HelloScreens sample application that comes with CM 中可以看到我正在尝试做的一个好主意。

我遇到的问题是我将拥有多个具有相同 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 自动化框架而不是使用 White,这会更容易吗?
  • 或者,我真的必须放弃 CM 的基于约定的绑定,而是给每个唯一的 x:Name 值并手动绑定它们吗?

更新

为了阐明我的意思是同时显示多个视图,这是我的总体布局。我有我的ShellViewModel,它来自Conductor&lt;IScreen&gt;.Collection.OneActive。然后我的视图有一个ItemsControl 绑定到shell 视图模型的Items 属性。每个项目模板都显示了一个按钮,该按钮旨在将特定的IScreen 加载到shell 视图上的ContentControl 中。因此,如果我尝试查找带有x:Name="DisplayName" 的元素,我会在shell 视图上找到标签,在ItemsControl 中的按钮上找到标签,在ContentControl 中找到标签。

【问题讨论】:

  • 当您说您在一个屏幕上可以看到多个视图时,您使用的是哪种导体类型? Conductor 或 Conductor.Collection.AllActive 等?
  • 我已更新帖子以阐明我的确切设置。如果您需要更多信息,请告诉我。

标签: wpf ui-automation caliburn.micro white-framework


【解决方案1】:

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

【讨论】:

  • 哇。这将是一个更好的解决方案。我没有注意到 WPF 中有一个附加属性。今晚我会试一试。
  • 工作就像一个魅力。我能够维护 CM 的默认约定,并提供我想要测试有意义的标识符以进行测试的控件。谢谢塞缪尔。
【解决方案2】:

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

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

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

【讨论】:

  • 当然,如果约定不起作用,则更改约定。这实际上会非常有效地解决我的问题。谢谢你的好主意。
猜你喜欢
  • 2017-11-29
  • 1970-01-01
  • 2021-03-18
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多