【问题标题】:Selenium wait failing on BrowserStack在 BrowserStack 上 Selenium 等待失败
【发布时间】:2020-08-03 17:01:21
【问题描述】:

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

这是一个失败的 selenium 等待示例:

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

有没有其他人看到任何与 BrowserStack 类似的不一致并知道可能导致它的原因,是否有更好的方法来等待元素可用。

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

【问题讨论】:

  • 您的 Web 应用程序托管在哪里?是内部服务器还是云? ... 可能看起来很明显,但您是否尝试过增加超时时间?
  • 该应用程序托管在云服务上,BrowserStack 能够毫无问题地访问该站点。将超时时间增加到 40 秒会减少失败,但仍然不可靠。使用 ChromeDriver 在本地测试总是成功。
  • 您是否在 browserstack 中并行运行? - 在本地运行通常是单线程,但是当您并行执行操作时,可能会出现数据重叠。 (我知道这些是悬而未决的问题 - 但没有简单的答案,它是梳理本地 i7 机器与需要尽可能便宜和高效的远程虚拟机之间的区别的信息):-)
  • 不,没有任何并行运行的东西,这是我们考虑在未来添加的一件事,但目前,一切都是单线程的。不过谢谢,这是个好主意!

标签: python python-3.x selenium selenium-webdriver browserstack


【解决方案1】:

presence_of_element_located()

presence_of_element_located() 是检查页面 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)

如果需要,您可以在调试时通过 time.sleep(secs) 减慢搜索诱导等待时间。


参考文献

您可以在以下位置找到一些相关讨论:

【讨论】:

  • 失败的行是ec.presence_of_element_located((By.XPATH, locator)) 我们只是试图检测元素的存在。不过还是谢谢你的回答!
  • @EvanSnapp 查看更新后的答案,让我知道您的想法。
  • 谢谢!我将尝试使用这些进行调试!
【解决方案2】:

此问题已解决。出于某种原因,将 OS BrowserStack 切换到 OS X 解决了该错误。使用 chrome-driver 进行的本地测试适用于两种操作系统,但我们的 BrowserStack 测试只能在 Mac 上始终如一地运行,Windows 大约有一半的时间失败。我们仍在努力弄清为什么会这样,但目前已经解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2019-11-25
    • 2023-03-30
    • 2014-07-19
    • 1970-01-01
    • 2018-09-18
    相关资源
    最近更新 更多