在Winium.Cruciatus中查找您的主窗口元素
本文关键字:窗口 元素 查找 Winium Cruciatus | 更新日期: 2023-09-27 18:27:21
我想没有多少人在使用Winium.Criticalus或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库就会挂起。我已经追踪到自动化库本身,它挂起了。我认为这是因为当库仔细阅读元素树时,应用程序还没有加载,它开始遍历范围内的每个元素,这需要很长时间,最终可能会导致堆栈溢出(根据MSDN)。
我甚至尝试过自己修复Criticalus实现,但由于这是枚举元素缓慢的固有问题,即使我在Criticalus中超时,也没有真正的帮助。
我会提供我的变通方法作为答案,但如果有人有更好的建议,我将不胜感激?
一个简单的解决方法是使用xpath来识别应用程序。
xpath = '/*[@AutomationId=''yourappid'']'
wnd_element = wait.until { @driver.find_element(:xpath, xpath) }
这将搜索限制在桌面的直接子级,并且如果第一次尝试时未能找到子级,则不会遍历整个树。
缺点是,除非您有一个好的id,否则可能很难构建xpath。我创建了一个工具(Criticalus.Xml)来帮助尝试xpath,这可能会有所帮助。