我不认为很多人正在使用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中暂停,它也没有真正的帮助。
我会提供我的解决方法作为答案,但如果有人有更好的建议,我会非常感激吗?
答案 0 :(得分:2)
一个简单的解决方法是使用xpath来识别应用程序。
xpath = '/*[@AutomationId=\'yourappid\']'
wnd_element = wait.until { @driver.find_element(:xpath, xpath) }
这限制了搜索到桌面的直接子节点,如果第一次尝试找不到子节点,则不会遍历整个树。
缺点是除非你有一个好的id,否则很难建立xpath。我已经创建了一个工具(Cruciatus.Xml)来帮助尝试可能有用的xpath。