7

我正在尝试使用新的本机 Microsoft UI 自动化接口 3.0(在 VC++ 2010、Win7 中)编写自动化测试器应用程序。被测应用程序 (AUT) 是一个 WPF 应用程序。

几乎一切正常...我可以安装事件处理程序,在树中导航,使用各种条件搜索元素并使用它们的模式控制找到的元素。

但是昨天我发现了一个让我绝望的行为:我的 AUT 的 UIA 树在通过单击其主菜单按钮之一切换其 GUI 主面板后根本没有更新。

单击主菜单按钮后,我可以在 AUT 的 GUI 中看到新的小部件,但 UIA 树仍然包含单击主菜单按钮之前存在的控件。(过时的)UIA 树仍然可以使用搜索功能或使用 walker 完全读取,但当然它不能被写入,因为小部件不再存在。

这看起来就像会有一个过时的缓存......但是我根本不使用任何缓存 UIA 函数。没有任何。绝不。无处。

我无法以编程方式更新 UIA 树……既不是通过调用任何 UIA 函数,也不是通过重新启动测试器应用程序,也不是通过来回切换 AUT 的 GUI。这并非每次都会发生。有时单击主按钮后,树似乎是最新的并且一切正常。然而,大多数运行它都失败了。只有一种(神秘的)方法可以可靠地更新 UIA 树:使用 inspect.exe。当使用 inspect.exe 工具简要查看 AUT 的 UIA 子树时,问题突然消失了,我的测试应用程序可以立即访问实际更新的树!当然,重新启动 AUT 后问题再次出现。

inspect.exe 做了什么来更新 UIA 树(另一个应用程序!!!)?怎么可能在不使用任何缓存的情况下访问消失的元素?我错过了什么?

我真的需要帮助。


好的,还有一些发现:

  1. UISpy.exe 能够以与 inspect.exe 相同的神秘方式刷新 UIA 树(这特别奇怪,因为 inspect.exe 使用与我相同的本机接口,但 UISpy.exe 使用 .NET 接口 AFAIK)。这意味着这是一种系统范围和持久的 UIA 问题,而不是纯原生 UIA 问题。

  2. 如果我在切换视图之前不访问树,则不会发生此问题。即,如果我的测试应用程序在通过单击主菜单按钮切换视图之前没有访问 AUT 的视图,它会毫无问题地看到新的小部件。这强烈表明本机 UIA API 的一些缓存问题 - 即使我不知道这是如何发生的,因为我根本不缓存。有人知道是否发生了一些内部缓存吗?

我认为这可能是一个 API 错误。但是,考虑到我目前使用 Microsoft Connect 的经验,我有点迷失了那个炫技 :-(

有人知道吗?


我还测试了 Snoop 工具。使用 Snoop 不会像 Inspect 和 UISpy 那样暂时解决问题。关于Inspect.exe,还有一个细节……折叠和展开AUT的子树就足以暂时治愈问题。

4

2 回答 2

3

好的,更新这个。UIA 看起来非常糟糕。我发现读取元素的内容数组和该数组的长度会更新隐藏的缓存。我还遇到过一个选项卡的子树没有更新但可以通过切换到另一个选项卡并返回来更新的情况(在这种情况下,按模式读取内容没有帮助)。这两种情况都是可重现的,但我找不到任何方法来预测或阻止它们。很多第三方 WPF 组件似乎也有问题。我们最终放弃了使用该 API。

于 2012-12-23T15:03:25.840 回答
1

我知道这个问题已经很老了,但我想出了Inspect.exe为其他应用程序刷新 UIA 树所做的工作:查看“选项”菜单;有一个标记SPI_SCREENREADER flag为默认选中的项目。

在您的代码中执行以下操作,您可能会得到一个新的 UIA 树:

SystemParametersInfo( SPI_SETSCREENREADER, TRUE, NULL, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);

PostMessage( HWND_BROADCAST, WM_WININICHANGE, SPI_SETSCREENREADER, 0);
于 2017-11-17T15:33:40.510 回答