我正在使用 Winium 和 Python 进行一些桌面应用程序测试。对于我的应用程序,我首先确认进度条出现在窗口上以及一些其他文本。然后我确认进度条不再存在,然后继续前进。
running_app = driver.find_element_by_name("MyApp")
status_bar = running_app.find_element_by_id("statusStrip1")
status_bar.find_element_by_class_name("WindowsForms10.msctls_progress32.app.0.141b42a_r9_ad1")
status_bar.find_element_by_name("Loading Default Files...")
# Confirm Progress Bar disappears before continuing
WebDriverWait(driver, 60).until_not(
expected_conditions.presence_of_element_located((eval("By.CLASS_NAME"), "WindowsForms10.msctls_progress32.app.0.141b42a_r9_ad1"))
)
我遇到的问题是用于验证进度条的代码部分在继续之前已经消失。该特定行执行时间太长。经过一番调查,我得出结论,这是因为我只能将组件地址输入“presence_of_element_located”,而不是其完整地址,这看起来像......
driver.find_element_by_name("MyApp").find_element_by_id("statusStrip1").find_element_by_class_name("WindowsForms10.msctls_progress32.app.0.141b42a_r9_ad1")
不幸的是,我无法将其分解为 XPath 并改为使用它。据我所知,我也不知道使用此地址检索对象的 XPath 的方法。我想找到一种方法来做到这一点.. (1) 将此绝对/完整地址插入 expected_conditions.presence_of_element_located() 或找到另一种方法来确认该对象不再存在。
- 20190502 更新 -
到目前为止,我最接近解决方案的是结合以下想法:
WebDriverWait(driver, 15).until(
expected_conditions.invisibility_of_element_located((eval("By.XPATH"), "//*[@name='MyApp']//*[@id='statusStrip1']//*[@class='WindowsForms10.msctls_progress32.app.0.141b42a_r9_ad1']"))
)
这确实让我无法确认进度条已经消失,因此测试可以继续。它还具有与通配符相同的时间问题,这意味着必须首先搜索对象。
- 20190502 更新 (2) -
所以,我在解决这个难题方面有了一点突破。对于使用 XPath,如果我在做 Web UI 测试,我可以查看 XML 代码并看到它是一个'//div'、'//table'、'//input'、'//tspn'等。 . 我一直在使用 UISpy 工具来找出我桌面应用程序上对象的名称。当我看着它时,我对它所引用的对象前面的标签产生了好奇。
从控制视图中,我看到“MyApp”旁边有标签“Window”。所以我决定用它来改变我的 XPath 尝试如下:
WebDriverWait(driver, 15).until(
expected_conditions.invisibility_of_element_located((eval("By.XPATH"), "//window[@name='MyApp']//*[@id='statusStrip1']//*[@class='WindowsForms10.msctls_progress32.app.0.141b42a_r9_ad1']"))
)
这不仅有效,而且比以前的尝试快了一点。问题是下一层被标记为“状态栏”,我不确定如何在 XPath 中表示它。