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



使用MS编码的UI,是否有一种方法可以指定对控件的搜索必须从特定的父级开始?

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

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

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

是否有一种方法可以限制UI搜索,以便只有在特定父项下(例如View1)才能成功搜索?失败后,我可以阻止从根目录重新启动搜索吗?

我相信你能做到,

您熟悉搜索属性和筛选器属性吗?

如果不是,我建议你做以下事情。

  1. 转到UIMap.uitest文件

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

在"搜索特性"中,可以添加新特性(如TagName或TagInstance),也可以删除导致问题的特性或筛选器特性。

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

常见的答案是向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),您的代码可以选择任何顶级控件并从那里开始搜索。

我建议仔细阅读生成的代码,看看编码的UI生成的代码是如何使用UI映射中的类、类型和实例的。还要注意,使用属性(例如,在表达式this.UIParent.UIChild中使用UIParent的值)会调用Find方法,并使用该项的SearchProperties和FilterProperties。

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

WinButton UIButtonStartButton = new WinButton();

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

WinButton UIButtonStartButton = new WinButton(MyApplicationWindow);

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

WinButton UIButtonStartButton = new WinButton(View1);

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

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

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

Playback.PlaybackSettings.MatchExactHierarchy = true;

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

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

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

最新更新