作为示例,我将使用一个非常简单的用户界面:一个窗口(我称之为W
)只需一个按钮(B
)。在Coded UI的UIMap中,B
是W
的孩子。即,在地图的XML规范中,B
出现在W
""后代"。
现在说我们有两个W
同时打开的实例。有一个搜索属性可以将W1
与W2
区分开来(例如,它们具有不同的Name
属性),但无法将B1
与{{{1}区分开来1}}除了父母B2
。
我按照以下程序进行测试:
W
和W1
W2
Name
上设置W
属性,以匹配UITestControl
的名称。W1
Mouse.Click()
上执行B
。UITestControl
Name
上设置W
属性,以匹配UITestControl
的名称。W2
Mouse.Click()
上执行B
。我的理解是,如果UITestControl
和W
都没有"始终搜索"配置,这将导致在第3和第5阶段点击B
。所以我的问题是在以下场景中会发生什么:
B1
已经"始终搜索"设置,但B
没有。W
已经"始终搜索"设置,但W
没有。答案 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