【发布时间】:2011-04-02 14:32:09
【问题描述】:
我正在尝试为使用 Caliburn.Micro 和 White 的 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<IScreen>.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