如何限制编码的UI测试控件搜索

时间:2013-07-25 13:57:28

标签: c# user-interface msdn coded-ui-tests ui-testing

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

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

我猜测搜索从指定的父级开始并查找所需的控件。当找不到它时,我相信搜索从根开始,这次找到同名的控件(尽管它不是我感兴趣的控件,它是不同子树的一部分)。

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

是否有办法限制用户界面搜索,以便只有在特定父级(例如View1)下找到搜索才会成功搜索?失败后,我可以阻止搜索在根目录重新启动吗?

4 个答案:

答案 0 :(得分:2)

我相信你能做到,

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

如果不是我建议你做的是以下。

  1. 转到 UIMap.uitest 文件

  2. 右键点击您的操作,然后选择属性

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

    如果这样做了,或者您已经尝试过,那么您需要手动编写棘手的搜索代码。

答案 1 :(得分:1)

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

要获得更复杂的答案,请查看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地图发生更改,它就会重新生成。由于它有助于UI地图(使用partial class s),您的代码可以选择任何顶级控件并从那里开始搜索。

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

答案 2 :(得分:0)

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

WinButton UIButtonStartButton = new WinButton();

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

WinButton UIButtonStartButton = new WinButton(MyApplicationWindow);

创建一个按钮,将搜索属性添加到指定窗口中。

WinButton UIButtonStartButton = new WinButton(View1);

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

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

答案 3 :(得分:0)

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

Playback.PlaybackSettings.MatchExactHierarchy = true;

在Test初始化中使用上面的行,所以如果你将MatchExactHierarchy设置为true,那么它只会在你提到的同一个父项下找到控件。

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

如果您想了解有关codedUI的更多信息,请参阅my blog