0

我正在使用 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 中表示它。

4

1 回答 1

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
于 2019-05-02T10:02:19.887 回答