我成功地获得了内容和元素.一切都运行良好一段时间,但几个小时后,元素变得无法访问.
(AutomationElement).FindAll()返回0个子节点.
UIAutomation是否使用了任何内部未记录的超时?
根据这个IUIAutomation2 interface
有2次超时,但无法从IUIAutomation界面访问它们.
IUIAutomation2仅在Windows 8(仅限桌面应用程序)上受支持.
所以我相信有一些暂停.
我做了一个解决方法,重新开始从桌面树的开头搜索和监视元素,但元素仍然不可用.
经过一段时间(不确定多少)元素再次可用.
我的要求是尽可能快地读取值,但这种行为会对整个架构造成损害.
我在某处看到有3分钟的超时但不确定.
如果有超时,是否可以更改它?
是否有可能重新启动或释放/处置某些东西?
我在MSDN上找不到任何东西.
有没有人知道发生了什么以及如何解决?
解决方法
许多不同的事情包括调度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