我正在使用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”旁边带有标签“窗口”。因此,我决定使用它来将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中表示它。
答案 0 :(得分:0)
您可以使用显式等待来等待进度栏的隐身性。它只会等待进度条的隐身状态,而不再等待。
您可以尝试使用元素:
WebDriverWait(driver, 10).until(EC.invisibility_of_element(progressbar))
在这里,我已将web元素传递给条件。 progressbar
是进度条元素。
或者您可以将定位器策略和定位器直接传递给条件:
locator = (By.LOCATOR_STRATEGY, "locator")
WebDriverWait(driver, 10).until(EC.invisibility_of_element_located(locator))
在这里,您需要在locator
中放置定位器策略和进度条的定位器
要使用等待,您必须导入以下内容:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC