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

Posted

技术标签:

【中文标题】如何限制编码的 UI 测试控件搜索【英文标题】:How to limit a Coded UI Test control search 【发布时间】:2013-07-25 13:57:28 【问题描述】:

使用 MS Coded UI,是否可以指定搜索控件必须从特定父级开始?

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

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

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

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

【问题讨论】:

【参考方案1】:

我相信你可以做到,

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

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

    转到 UIMap.uitest 文件

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

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

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

【讨论】:

【参考方案2】:

常见的答案是向 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 中的类、类型和实例。另请注意,使用属性(例如,在表达式 this.UIParent.UIChild 中使用 UIParent 的值)会导致调用 Find 方法,并使用该项目的 SearchProperties 和 FilterProperties。

【讨论】:

感谢您的回复!我们正在做的测试是在 Coded UI Test 框架之上构建的,并且我们正在对所有内容进行手动编码。我正在使用您提到的语法访问控件,问题是我需要对实际搜索进行更多控制;我想防止搜索在失败时重新启动。我认为您是对的,因为我需要更严格地探索搜索属性。再次感谢!【参考方案3】:

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

WinButton UIButtonStartButton = new WinButton();

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

WinButton UIButtonStartButton = new WinButton(MyApplicationWindow);

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

WinButton UIButtonStartButton = new WinButton(View1);

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

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

【讨论】:

【参考方案4】:

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

Playback.PlaybackSettings.MatchExactHierarchy = true;

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

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

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

【讨论】:

以上是关于如何限制编码的 UI 测试控件搜索的主要内容,如果未能解决你的问题,请参考以下文章

为啥编码的 UI 模块无法在 Internet Explorer 浏览器中看到 UI 控件元素?

如何判断约束绑定编码的时间限制?

Android 系统搜索框 如何限制输入字数长度?

如何使用Winforms现代用户界面MetroFramework

如何查询在 Coded-UI-Test 中测试的当前 UI-Window 的标题?

iOS 输入框如何限制字符长度和emoji