我正在使用 UI自动化COM-to-.NET适配器来阅读在Windows 7上播放FLASH内容的目标Google Chrome浏览器的内容。它可以正常运行。
我成功获得了内容和元素。一切都运行良好一段时间,但几个小时后元素变得无法访问。
(AutomationElement).FindAll()
会返回 0 子女。
UIAutomation是否使用了任何内部未记录的超时?
根据这个IUIAutomation2 interface 有2次超时,但无法从IUIAutomation界面访问它们。 IUIAutomation2仅在Windows 8(仅限桌面应用程序)上受支持。
所以我相信有一些超时。 我做了一个解决方法,重新开始从桌面树的开头搜索和监视元素,但元素仍然不可用。 经过一段时间(不确定多少)元素再次可用。 我的要求是尽可能快地读取值,但这种行为会对整个架构造成损害。 我在某个地方看到有3分钟的超时但不确定。
如果超时,是否可以更改它? 是否有可能重新启动或释放/处置某些东西? 我在MSDN上找不到任何东西。
有没有人知道发生了什么以及如何解决?
答案 0 :(得分:1)
感谢您提出这个问题。我有一个类似的问题,有一个非常不同的设置。我在Win7上,直接从C#使用UIAutomationCore.dll来测试我们正在开发的应用程序。在完成我的一系列动作之后事件订阅和所有其他事情,我间歇地观察到UIA接口停止工作(在我的情况下大约8-10分钟,但我大量使用UIA接口)。
许多不同的事情,包括调度COM接口,在不同的地方睡觉都失败了。有趣的启示是我在测试期间设法使用AccEvent.exe(类似于inspect.exe的SDK的一部分),并且看到事件也停止流向AccEvent。所以这不是我的客户端界面停止了,而是停止响应的COM服务器(或任何UIAutomationCore所做的)。
作为一种解决方案(似乎大部分时间都在工作 - 或者很多情况下改善了这种情况),我决定给测试中的应用程序一些呼吸点,因为使用UIA会给它带来额外的负担。这可能是您客户端中的智能睡眠点,但我没有在设定的时间内休眠,而是监视应用程序的处理器负载并等待它停止运行。
当问题出现时,我收到的一个间歇性错误是“......无法呼叫任何订阅者......”,我的搜索结果是msdn页面说他们在CUIAutomation8接口上有所改进,但是因为这是Windows8特定的,我还没有机会尝试。
我还应该补充一点,我还通过合并更多的ui缓存(FindAllBuildCache)减少了对UIA的调用次数,因为反复的频率越少,uia就越好。感谢Guy在另一个问题中的回答:UI Automation events stop being received after a while monitoring an application and then restart after some time