0

W作为一个例子,我将使用一个非常简单的 UI:一个带有单个按钮 ( )的窗口(我将调用它B)。在 Coded UI 的 UIMap 中,BW. 即在地图的XML规范中,B出现在W's"descendants"中。

现在说我们有两个W同时打开的实例。有一个可以区分的搜索属性W1W2例如,它们具有不同的属性),但是除了它们的 parent 之外,Name没有其他方法可以区分。B1B2W

我使用以下过程执行测试:

  1. 打开窗口的两个实例,W1然后W2
  2. NameUIMap 的属性设置W UITestControl为匹配W1的名称。
  3. 在UIMapMouse.Click()B UITestControl.
  4. NameUIMap 的属性设置W UITestControl为匹配W2的名称。
  5. 在UIMapMouse.Click()B UITestControl.

我的理解是,如果既没有WB没有“始终搜索”配置,那么这将导致B1在第 3 阶段和第 5 阶段都被点击。所以我的问题是在以下情况下会发生什么:

  • B设置了“始终搜索”,但W没有。
  • W设置了“始终搜索”,但B没有。
4

1 回答 1

2

如果没有 Search Always 配置,引擎将在找到 ui 元素后对其进行缓存(缓存是指保留对它从该元素获取的 MSAA COM 对象的引用)。正如它所说,始终搜索将始终按照您所说的那样搜索元素。UITestControl.Find() 也做同样的事情,所以如果你不想设置 Always Search 配置,你可以明确地使用它。

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

如果你想使用同一个类的多个 UITestControls,你应该忘记 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);

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

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

编码 UI 的 SwitchTo 方法

于 2014-05-22T10:35:55.633 回答