我面临的情况是我正在尝试编写一个测试,它将使用Coded UI与同一应用程序的多个实例进行交互,在本例中为Microsoft Excel。换句话说,将在多个窗口中打开多个Excel工作簿,我需要能够指示编码的UI以编程方式与特定实例进行交互。我最初认为这种类型的实例管理是ApplicationUnderTest
类的函数,但是这个类如何实现这一点并不明显。
对于所有实例,交互将涉及相同的UIMap(实际上,每个实例可能需要多个UIMap,但为了简单起见,可以忽略此问题,除非它对答案很重要)。
我已经意识到的几种解决方法:
理想情况下,我希望将更多内容集成到Coded UI中,而不是其中任何一个选项,尽管后者可能在必要时就足够了。如果有任何其他可能的方法,我将不胜感激。
答案 0 :(得分:3)
您可以尝试创建ui控件的多个实例(在UIMap中生成的类)并为它们设置实例搜索属性(如果您还有其他任何唯一的搜索属性,也可以使用它们)。您只需在测试开始时设置它们。
我在这个例子中使用了计算器。它应该是Namespace.UIControl而不是UIMap.UIControl。你需要的是课而不是属性。
var a1 = new UICalculatorWindow();
a1.SearchProperties["Instance"] = "1";
var a2 = new UICalculatorWindow();
a2.SearchProperties["Instance"] = "2";
a1.Find();
a2.Find();
找到这些窗口后,它们的窗口句柄将与控制对象相关联,因此您不必再担心他们的订单了。
另一种解决方案是通过pinvoke函数获取所有当前窗口句柄,过滤这些句柄以获得所需的窗口,然后使用UITestControlFactory
创建控件。
编辑:或者您可以使用FindMatchingControls方法。
var a = new UICalculatorWindow().FindMatchingControls();
然后,您可以从返回的列表中获取实时控件。这些解决方案有点解决方法,但我不认为这可以在UIMap级别上解决,除非控件的所有实例都记录为唯一的ui控件。
编辑:CUIT搜索从WinApi调用(EnumWindows
)获取的窗口句柄列表,默认情况下,它返回列表中与给定搜索属性匹配的第一个窗口。如果设置了Instance
属性,则它会跳过前n-1个窗口(与搜索条件匹配)并获取第n个窗口。
当您在Find()
上致电UITestControl
时,它会搜索具有给定搜索属性的窗口,如果找到一个窗口,UITestControl
会保留对该窗口的引用'窗口句柄或从该窗口获取的AccessibleObject
。
窗口句柄的顺序可以经常更改,例如,如果将焦点设置为窗口,它将更接近列表的开头。因此,当您打开所有窗口时,您应该创建UITestControl
s,设置Instance属性并在所有窗口上调用Find()
,以便它们在测试运行期间不会混淆。
如果您找到一个Instance
设置为1的窗口,然后混合窗口的顺序,那么当您搜索Instance
设置为2的窗口时,您可能会找到已找到的窗口最后将两个UITestControl
设置为同一个窗口。
我不知道OrderOfInvocation
是如何运作的,我无法让它工作。