在继续之前,请使用完整的非XPath路径确认元素不再存在

2024-09-27 07:32:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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"))
)

我遇到的问题是用于验证进度条的代码部分在继续之前消失了。那一行执行起来太长了。经过一些调查,我得出结论,这是因为我只能将组件地址输入到“元素所在的位置”,而不是它的完整地址,这看起来像。。。你知道吗

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) 将此绝对/完整地址插入预期的_条件。元素的存在位置()或找到另一种方法来确认对象不再存在。你知道吗

-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”、“表”、“输入”、“tspn”等等。。我一直在使用UISpy工具计算桌面应用程序中对象的名称。当我看着它时,我对它所引用的对象前面的标签感到好奇。你知道吗

enter image description here

从控件视图中,我看到“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中表示它。你知道吗


Tags: 对象进度条nameidbydriverelementfind
1条回答
网友
1楼 · 发布于 2024-09-27 07:32:11

您可以使用显式等待来等待进度条的不可见性。它只会等待进度条不可见,而不再等待。你知道吗

您可以尝试使用以下元素:

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

相关问题 更多 >

    热门问题