浏览器堆栈上的Selenium等待失败

2024-06-14 14:45:51 发布

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

我们有一个使用BrowserStack运行的自动化UI测试,在等待元素添加到DOM时,它不会偶尔超时运行,但当使用Chromedriver在本地运行时,测试会100%成功

以下是selenium等待失败的示例:

return WebDriverWait(self.__driver, 10).until(
    ec.presence_of_element_located((By.XPATH, locator))
)

是否有其他人看到BrowserStack存在任何类似的不一致性,并知道可能是什么导致了这种不一致性,是否有更好的方法等待元素可用

我们得到的确切表达式是来自ec.presence_of_element_located((By.XPATH, locator))TimeoutException


Tags: of元素ui示例byseleniumelementchromedriver
2条回答

_元素_的存在位置()

^{}是检查页面的DOM上是否存在元素的期望值。这并不一定意味着元素是可见的。因此需要等待第一个匹配的WebElement出现


通用用例

通常,在您的测试中,仅仅等待元素的存在可能不足以满足您的要求,您可能需要等待元素可见可交互

要等到元素可见,您需要为visibility_of_element_located()引入WebDriverWait,有效代码块将是:

return WebDriverWait(self.__driver, 10).until(
    ec.visibility_of_element_located((By.XPATH, locator))
)

要等待元素可交互,需要为element_to_be_clickable()引入WebDriverWait,有效代码块将是:

return WebDriverWait(self.__driver, 10).until(
    ec.element_to_be_clickable((By.XPATH, locator))
)

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec

这个用例

在本用例中,行:

ec.presence_of_element_located((By.XPATH, locator))

无法在所需的时间范围内识别所需的元素,因此您面临TimeoutException

然而,从TimeoutException中很难找出故障的实际结果


解决方案

作为了解故障确切原因的解决方案,您需要删除WebDriverWait并将代码行替换为以下任一行:

  • find_element_by_class_name(name)
  • find_element_by_css_selector(css_selector)
  • find_element_by_id(id)
  • find_element_by_link_text(link_text)
  • find_element_by_name(name)
  • find_element_by_partial_link_text(partial_link_text)
  • find_element_by_tag_name(tag_name)
  • find_element_by_xpath(xpath)

如果需要,您可以在调试时通过^{}减慢搜索速度


参考资料

您可以在以下内容中找到一些相关讨论:

这个问题已经解决了。出于某种原因,将OS BrowserStack切换到OS X解决了错误。chrome驱动程序的本地测试对两种操作系统都有效,但我们的BrowserStack测试只在Mac上持续有效,Windows大约有一半的时间失败。我们仍在努力理解这到底是为什么,但目前,这是解决办法

相关问题 更多 >