我不认为许多人正在使用Winium.Cruciatus或Winium.Desktop WebDriver实现,但是如果有人使用,您可以从我的解决方法中受益或受益。
我使用WebDriver实现来启动我的应用程序,如下所示:
capabilities = { 'app' => path, 'launchDelay' => 1500 }
driver = Selenium::WebDriver.for(:remote,
url: 'http://127.0.0.1:9999',
desired_capabilities: capabilities)
该应用程序启动正常,但我需要找到根元素才能找到子级,而不必每次都遍历整个自动化树。
我曾经这样做:
wait.until { @driver.find_element(:id, 'appid') }
如果加载了应用程序并且没有太多的窗口打开,则可以正常工作。但是,当我打开10-15个窗口并且应用程序花了几秒钟来启动cruciatus库时,挂起了。我已经将其跟踪到自动化库本身,它已挂起。我认为这是由于当库仔细阅读元素树时应用程序尚未加载,并且它开始遍历作用域中的每个元素,这需要很长时间,并且最终可能会导致堆栈溢出(according to MSDN)。
我什至尝试自己修复Cruciatus实现,但是由于这是元素枚举速度缓慢的固有问题,因此即使我在Cruciatus中设置了超时,它也并没有真正的帮助。
我将提供解决方法作为答案,但如果有人有更好的建议,将不胜感激?
最佳答案
一个简单的解决方法是使用xpath标识应用程序。
xpath = '/*[@AutomationId=\'yourappid\']'
wnd_element = wait.until { @driver.find_element(:xpath, xpath) }
这将搜索限制为桌面的直接子级,并且如果第一次尝试找不到子级树,则不会遍历整个树。
缺点是,除非您具有良好的ID,否则可能很难构建xpath。我创建了一个工具(Cruciatus.Xml)来帮助尝试可能有用的xpath。