Coded UI的“始终搜索”配置如何与父/子对象一起使用?

时间:2014-05-21 15:30:57

标签: .net coded-ui-tests gui-testing ui-testing

作为示例,我将使用一个非常简单的用户界面:一个窗口(我称之为W)只需一个按钮(B)。在Coded UI的UIMap中,BW的孩子。即,在地图的XML规范中,B出现在W""后代"。

现在说我们有两个W同时打开的实例。有一个搜索属性可以将W1W2区分开来(例如,它们具有不同的Name属性),但无法将B1与{{{1}区分开来1}}除了父母B2

我按照以下程序进行测试:

  1. 打开窗口的两个实例WW1
  2. 在UIMap的W2 Name上设置W属性,以匹配UITestControl的名称。
  3. 在UIMap W1 Mouse.Click()上执行B
  4. 在UIMap的UITestControl Name上设置W属性,以匹配UITestControl的名称。
  5. 在UIMap W2 Mouse.Click()上执行B
  6. 我的理解是,如果UITestControlW都没有"始终搜索"配置,这将导致在第3和第5阶段点击B。所以我的问题是在以下场景中会发生什么:

    • B1已经"始终搜索"设置,但B没有。
    • W已经"始终搜索"设置,但W没有。

1 个答案:

答案 0 :(得分:2)

如果没有Search Always配置,引擎会在找到之后缓存ui元素(通过缓存我的意思是保留对从该元素获得的MSAA COM对象的引用)。正如你所说,永远搜索将始终按照你的说法搜索元素。此外,UITestControl.Find()完全相同,因此如果您不想设置始终搜索配置,则可以明确使用它。

当您更改控件的搜索属性时,引擎将在您下次使用该控件时搜索该元素(因此在更改搜索属性后,控件将删除对ui元素的引用)。但是,如果子元素(您的案例中的按钮)已经缓存并且您更改了其父搜索属性,则您必须在按钮上调用查找(或设置始终搜索),否则引擎将使用缓存ui元素。

如果要使用同一个类的多个UITestControl,您应该忘记UIMap并只创建该类的多个实例,然后分别更改它们的搜索属性。 UIMap不对元素的层次结构负责,它只是访问元素的一种方式。

所以在你的情况下:

var W1 = new MyWindowClass();
var W2 = new MyWindowClass();
W1.SearchProperties.Add( ... );
W2.SearchProperties.Add( ... );

然后,如果一切设置正确,W1-> B将是W1窗口中的按钮,而W2-> B将是W2窗口中的按钮。

如果W不是顶级元素,那么您可以从UIMap设置父级:

var W1 = new MyWindowClass(UIMap.UITopWindow);

这些问题也可能对您有所帮助:

Interacting with multiple instances of an application in Coded UI

SwitchTo method for Coded UI