我正在尝试使用新的 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树更新?根本不使用任何缓存就可以访问消失的元素?我错过了什么?

我真的需要帮助

好的,还有更多发现:

  • UISpy.exe能够像inspect.exe一样神秘的方式刷新UIA树(这尤其奇怪,因为inspect.exe使用的是与我相同的 native 接口(interface),但UISpy.exe使用.NET的AFAIK接口(interface))。这意味着这是一种系统范围的持久性UIA问题,而不是纯粹的 native UIA问题。
  • 如果在切换 View 之前不访问树,则不会发生此问题。 IE。如果我的测试器应用程序在通过单击主菜单按钮切换 View 之前未访问AUT的 View ,则它会看到新的小部件,而不会出现问题。这有力地表明了 native UIA API的某些缓存问题-即使我完全不缓存也不知道怎么发生。有人知道是否发生一些内部缓存吗?

  • 我认为这可能是API错误。但是考虑到我目前使用Microsoft Connect的经验,我对showtopper有点迷失:-(

    有人知道吗?

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

    最佳答案

    好的,对此进行更新。 UIA似乎简直令人毛骨悚然。我发现读取元素的内容数组及其长度可以更新隐藏的缓存。我也遇到过这样的情况,一个选项卡的子树没有更新,但是可以通过切换到另一个选项卡然后再返回来更新(在这种情况下,按模式读取内容没有帮助)。两种情况都可以重现,但我找不到任何方法来预测或预防它们。同样,许多第三方WPF组件似乎也有问题。我们最终放弃了使用该API。

    关于wpf - 过时的UI自动化树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10782100/

    10-10 13:44