过时的UI自动化树

Sil*_*cer 6 wpf user-interface visual-studio-2010 ui-automation visual-c++

我正在尝试使用新的本机Microsoft UI Automation接口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'S视图,它会看到新的小部件没有问题.这强烈表明了本机UIA API的一些缓存问题 - 即使我不知道如何发生这种情况,因为我根本不缓存.有人知道是否有一些内部缓存发生?

我认为这可能是一个API错误.但是考虑到我目前使用Microsoft Connect的经历,我有点迷失于那个showstopper :-(

有人有什么想法吗?


我还测试了Snoop工具.使用Snoop不会像Inspect和UISpy那样暂时修复问题.关于Inspect.exe,还有另一个细节......它足以折叠和扩展AUT的子树以暂时解决问题.

Sil*_*cer 3

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