我正在尝试使用新的本机 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 树(另一个应用程序!!!)?怎么可能在不使用任何缓存的情况下访问消失的元素?我错过了什么?
我真的需要帮助。
好的,还有一些发现:
UISpy.exe 能够以与 inspect.exe 相同的神秘方式刷新 UIA 树(这特别奇怪,因为 inspect.exe 使用与我相同的本机接口,但 UISpy.exe 使用 .NET 接口 AFAIK)。这意味着这是一种系统范围和持久的 UIA 问题,而不是纯原生 UIA 问题。
如果我在切换视图之前不访问树,则不会发生此问题。即,如果我的测试应用程序在通过单击主菜单按钮切换视图之前没有访问 AUT 的视图,它会毫无问题地看到新的小部件。这强烈表明本机 UIA API 的一些缓存问题 - 即使我不知道这是如何发生的,因为我根本不缓存。有人知道是否发生了一些内部缓存吗?
我认为这可能是一个 API 错误。但是,考虑到我目前使用 Microsoft Connect 的经验,我有点迷失了那个炫技 :-(
有人知道吗?
我还测试了 Snoop 工具。使用 Snoop 不会像 Inspect 和 UISpy 那样暂时解决问题。关于Inspect.exe,还有一个细节……折叠和展开AUT的子树就足以暂时治愈问题。