我正在尝试使用新的 native Microsoft UI自动化接口(interface)3.0(在VC++ 2010,Win7中)对自动化测试器应用程序进行编程。被测应用程序(AUT)是WPF应用程序。
几乎所有东西都可以正常工作...我可以安装事件处理程序,在树中导航,使用各种条件搜索元素,并使用其模式控制找到的元素。
但是昨天我发现了一种让我感到绝望的行为:单击其主菜单按钮之一切换其GUI主面板后,AUT的UIA树根本就没有更新。
单击主菜单按钮后,我可以在AUT的GUI中看到新的小部件,但是UIA树仍包含单击主菜单按钮之前已经存在的控件。 (过时的)UIA树仍然可以使用搜索功能或使用walker来完全读取,但是由于不再存在窗口小部件,因此无法将其写入。
看起来好像将有一个过时的缓存...但是,我根本不使用任何缓存UIA函数。没有任何。绝不。无处。
我无法以编程方式进行UIA树的更新……既无法调用任何UIA函数,也无法通过重启测试器应用程序或来回切换AUT的GUI来进行更新。
这并非每次都会发生。有时,在单击主按钮后,树似乎已正确更新,并且一切正常。但是,大多数运行都失败了。
只有一种(神秘的)方法可以可靠地更新UIA树:使用inspect.exe。当使用inspect.exe工具简要查看AUT的UIA子树时,问题突然消失了,我的测试器应用程序可以立即访问实际的,更新的树!当然,重新启动AUT后问题会再次出现。
inspect.exe做什么使(另一个应用程序的!)UIA树更新?根本不使用任何缓存就可以访问消失的元素?我错过了什么?
我真的需要帮助
好的,还有更多发现:
我认为这可能是API错误。但是考虑到我目前使用Microsoft Connect的经验,我对showtopper有点迷失:-(
有人知道吗?
我还测试了Snoop工具。使用Snoop不能像Inspect和UISpy一样暂时解决问题。关于Inspect.exe,还有另一个细节...足以折叠并扩展AUT的子树以临时修复问题。
最佳答案
好的,对此进行更新。 UIA似乎简直令人毛骨悚然。我发现读取元素的内容数组及其长度可以更新隐藏的缓存。我也遇到过这样的情况,一个选项卡的子树没有更新,但是可以通过切换到另一个选项卡然后再返回来更新(在这种情况下,按模式读取内容没有帮助)。两种情况都可以重现,但我找不到任何方法来预测或预防它们。同样,许多第三方WPF组件似乎也有问题。我们最终放弃了使用该API。
关于wpf - 过时的UI自动化树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10782100/