C# 如何限制编码的UI测试控件搜索
使用MS编码的UI,是否有方法指定控件的搜索必须从特定父级开始 我正在搜索控件,我希望根据搜索的成功与否执行不同的操作。不幸的是,由于另一个控件(具有完全不同的父控件)具有相同的自动化id(应用程序非常大,因此这种情况经常发生),因此搜索总是成功的(无论所讨论的控件是否存在) 我猜搜索从指定的父级开始,并查找所需的控件。如果找不到,我相信搜索会从根开始,这次找到了同名控件(尽管它不是我感兴趣的控件,它是另一子树的一部分) 我的问题是是否可以将控件的搜索限制在特定子树上。例如,考虑主视图主视图有两个子视图VIEW1和VIEW2。每个子视图都包含一个自动ID为“coolControl”的控件C# 如何限制编码的UI测试控件搜索,c#,user-interface,msdn,coded-ui-tests,ui-testing,C#,User Interface,Msdn,Coded Ui Tests,Ui Testing,使用MS编码的UI,是否有方法指定控件的搜索必须从特定父级开始 我正在搜索控件,我希望根据搜索的成功与否执行不同的操作。不幸的是,由于另一个控件(具有完全不同的父控件)具有相同的自动化id(应用程序非常大,因此这种情况经常发生),因此搜索总是成功的(无论所讨论的控件是否存在) 我猜搜索从指定的父级开始,并查找所需的控件。如果找不到,我相信搜索会从根开始,这次找到了同名控件(尽管它不是我感兴趣的控件,它是另一子树的一部分) 我的问题是是否可以将控件的搜索限制在特定子树上。例如,考虑主视图主视图有两
是否有一种方法可以限制UI搜索,以便只有在特定父项下(如View1)才能成功搜索?失败后,我可以阻止从根目录重新启动搜索吗?我相信您可以做到 您熟悉搜索属性和筛选器属性吗 如果不是,我建议你做以下几点
如果这不起作用,或者您已经尝试过,您需要手动编写搜索代码,这很棘手。常见的答案是向搜索属性或过滤器属性添加更多详细信息 要获得更复杂的答案,请查看编码UI记录的方法。UI映射类中的方法具有以下行(其中该行来自单击Windows 7开始按钮): 一般来说,线条是这样的
SomeUiControl uISomeControl = this.UIParent.UIChild.UIGrandChild;
然后代码只使用控件,例如鼠标代码>在上面的开始按钮上
您可以将自己的方法添加到uimap.cs
文件中,但不能添加到uimap.designer.cs
文件中,因为只要UI映射发生更改,就会重新生成该文件。由于它有助于UI映射(使用partial class
s),您的代码可以选择任何顶级控件并从那里开始搜索
我建议仔细阅读生成的代码,看看编码的UI生成的代码如何使用UI映射中的类、类型和实例。还要注意使用属性(例如在表达式this.UIParent.UIChild
中使用UIParent
的值)导致调用Find
方法,该方法使用该项的SearchProperties和FilterProperty。从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的信息,请参阅谢谢您的回复!我们正在做的测试是在编码的UI测试框架的基础上构建的,我们正在手工编码所有的东西。我使用您提到的语法访问控件,问题是我需要对实际搜索进行更多控制;我想防止搜索失败后重新启动。我认为你是对的,我需要更严格地探索搜索属性。再次感谢!
Playback.PlaybackSettings.MatchExactHierarchy = true;