3

使用 MS Coded UI,有没有办法指定控件的搜索必须从特定的父级开始?

我正在搜索控件,我想根据搜索的成功或失败执行不同的操作。不幸的是,搜索总是成功的(无论是否存在相关控件),因为另一个控件(具有完全不同的父级)具有相同的自动化 ID(应用程序非常大,因此这种情况经常发生)。

我猜测搜索从指定的父级开始并寻找所需的控件。如果没有找到,我相信搜索会从根重新开始,这次找到了同名控件(尽管它不是我感兴趣的控件,它是不同子树的一部分)。

我的问题是您是否可以将控件的搜索限制在特定的子树中。例如,考虑主视图 Main 有两个子视图 View1 和 View2 的情况。每个子视图都包含一个自动 ID 为“coolControl”的控件。

有没有办法限制 UI 搜索,以便只有在特定父级(比如 View1)下找到搜索才会成功?失败后,我可以阻止搜索从根目录重新启动吗?

4

4 回答 4

2

我相信你可以做到,

您熟悉搜索属性和过滤器属性吗?

如果不是,我建议您执行以下操作。

  1. 转到UIMap.uitest文件

  2. 右键单击您的操作并选择属性

在“搜索属性”中,您可以添加新属性,例如 TagName 或 TagInstance,或删除导致您出现问题的属性或过滤器属性。

如果这不起作用,或者如果您已经尝试过,您将需要手动编写搜索代码,这很棘手。

于 2013-07-25T15:07:08.473 回答
1

常见的答案是向SearchPropertiesFilterProperties添加更多详细信息。

如需更复杂的答案,请查看 Coded UI 记录的方法。UI Map 类中的方法具有如下行(此行来自单击 Windows 7 开始按钮):

WinButton uIStartButton = this.UIStartWindow.UIStartButton;

更一般地说,线条就像

SomeUiControl uISomeControl = this.UIParent.UIChild.UIGrandChild;

然后代码只使用控件,例如Mouse.Click(uIStartButton, new Point(29, 27));在上面的开始按钮上。

您可以将自己的方法添加到uimap.cs文件中,但不能添加到uimap.designer.cs文件中,因为它会在 UI Map 更改时重新生成。由于它有助于 UI 地图(使用partial classs),您的代码可以选择任何顶级控件并从那里开始搜索。

我建议仔细阅读生成的代码,了解 Coded UI 生成的代码如何使用 UI Map 中的类、类型和实例。另请注意,使用属性(例如,使用UIParent表达式中的值this.UIParent.UIChild)会导致Find调用该方法并使用该项目的 SearchProperties 和 FilterProperties。

于 2013-07-25T16:44:01.923 回答
0

从 UITestControl 继承的每个 Class 都有一个接受另一个 UITestControl 的构造函数 - 该 UITestControl 成为您正在搜索的控件的父级(或更远的祖先),有效地以您想要的方式限制搜索。默认构造函数(无参数构造函数)使用桌面作为搜索的祖先。例如:

WinButton UIButtonStartButton = new WinButton();

创建一个按钮以将搜索属性添加到该按钮,该按钮可以位于从桌面下降的任何窗口中。

WinButton UIButtonStartButton = new WinButton(MyApplicationWindow);

创建一个仅在指定窗口中添加搜索属性的按钮。

WinButton UIButtonStartButton = new WinButton(View1);

创建一个仅在指定视图中添加搜索属性的按钮。

任何 UITestControl 都可以作为父级传入,当然只有某些 UITestControls 会有后代。

于 2013-09-03T17:53:22.513 回答
0

也许为时已晚,但有一种方法可以找到精确的控制。您可以在其父级下找到具有确切层次结构的控件

Playback.PlaybackSettings.MatchExactHierarchy = true;

在测试初始化​​中使用上面的行,因此如果将 MatchExactHierarchy 设置为 true,那么它只会在您提到的同一父级下找到控件。

会有一些缓存问题,可能会再次发现您错误的控制。

如果您想了解更多关于 codedUI 的信息,请参阅我的博客

于 2014-11-11T08:52:49.440 回答