在Coded UI中与应用程序的多个实例交互

时间:2014-05-07 15:32:02

标签: .net mstest ui-automation coded-ui-tests

我面临的情况是我正在尝试编写一个测试,它将使用Coded UI与同一应用程序的多个实例进行交互,在本例中为Microsoft Excel。换句话说,将在多个窗口中打开多个Excel工作簿,我需要能够指示编码的UI以编程方式与特定实例进行交互。我最初认为这种类型的实例管理是ApplicationUnderTest类的函数,但是这个类如何实现这一点并不明显。

对于所有实例,交互将涉及相同的UIMap(实际上,每个实例可能需要多个UIMap,但为了简单起见,可以忽略此问题,除非它对答案很重要)。

我已经意识到的几种解决方法:

  • 最小化并最大化实例,以便在任何给定时间只显示当前使用的实例。理想情况下,我想避免这种情况。首先,最终可能要求在测试过程中同时看到两个窗口。
  • 动态修改搜索属性,以便每次访问UI Map时始终包含一些唯一标识符。我不确定搜索属性的最佳候选者是什么。

理想情况下,我希望将更多内容集成到Coded UI中,而不是其中任何一个选项,尽管后者可能在必要时就足够了。如果有任何其他可能的方法,我将不胜感激。

1 个答案:

答案 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是如何运作的,我无法让它工作。