【问题标题】:What is the difference between some similar selenium waits?一些类似的硒等待有什么区别?
【发布时间】:2021-09-12 14:07:44
【问题描述】:

简单的问题:

这两种说法的确切区别是什么:

  1. WebDriverWait(self._driver, WEB_WAIT_TIMEOUT).until(ec.invisibility_of_element_located(element))

  1. WebDriverWait(self._driver, WEB_WAIT_TIMEOUT).until_not(ec.presence_of_element_located(element))

在这两种情况下,硒的行为在我的情况下是相同的。 提前致谢

感谢您的回复 好的,但仍有一些我不明白的地方: 我有检查微调器是否不可见的基本功能。

`def wait_until_request_api_process_finished(self):
    try:
        WebDriverWait(self._driver, 1).until(ec.visibility_of_element_located(BaseLoc.spinner))
        WebDriverWait(self._driver, 10).until(ec.invisibility_of_element_located(BaseLoc.spinner))
    except TimeoutException:
        pass

但是,即使微调器不可见,selenium 也会等待(比预期多 8 秒)。有什么问题?

【问题讨论】:

  • 那么invisibility(你的意思是visibility_of_element_located)和presence有什么区别?
  • 确实,没发现有什么区别
  • 忘记 Selenium,阅读英文的函数名称。您的应用程序可能没有区别,但做不同的事情。
  • ut,即使微调器不可见,selenium 也会等待(比预期多 8 秒)。有什么问题? - 你的代码中是否也有隐式等待?
  • 是的,我已将隐式等待设置为 10 秒。我应该删除它还是更改它?

标签: python selenium expected-condition


【解决方案1】:

顶部语句等待(ec.invisibility_of_element_located(element)) 发生,底部语句等待(ec.presence_of_element_located(element)) 不发生。

从功能上讲,我知道这没有意义,但这就是要问的:)

【讨论】:

  • 据我了解,您的意思是等待隐形需要元素首先可见?
  • 我的理解是第一个会等到找到元素,第二个会等到找不到元素
  • 我编辑了问题以突出问题
【解决方案2】:

ec.invisibility_of_element_located 等待元素不可见。
元素可以存在于页面上但不可见。
对于此类元素 ec.invisibility_of_element_located 将成功返回 True 并且您的场景流程将继续,而 until_not(ec.presence_of_element_located(element)) 将抛出超时异常,因为该元素仍然存在于页面上。

【讨论】:

  • 好的,所以存在寻找元素仅在 DOM 中?
  • “仅”是什么意思?是的,它从字面上寻找元素的存在。大多数页面上都有很多不可见的元素。
【解决方案3】:

我从 Selenium 官方文档中得到了一些东西:here

警告:

不要混合隐式和显式等待。这样做会导致 不可预知的等待时间。例如,将隐式等待设置为 10 秒和 15 秒的显式等待可能会导致超时 20 秒后发生。

所以对于你的这个问题:

但是,即使微调器不可见,selenium 也会等待(比预期多 8 秒)。有什么问题?

  • 是的,因为你把它们都混合了。在移除隐式等待之前(认为 8 秒真的很重要,或者测试套件的可靠性更重要)

现在回答这个问题:

  invisibility_of_element_located 

基本看这个内部实现:

 private static boolean isInvisible(final WebElement element) {
    try {
      return !element.isDisplayed();
    } catch (StaleElementReferenceException ignored) {
      // We can assume a stale element isn't displayed.
      return true;
    }
  }

所以它只是在内部检查isDisplayed()

【讨论】:

    【解决方案4】:

    问题第二部分(添加)的答案:

    selenium 脚本在页面完成加载之前检查是否不可见是可能的(并且很可能)。 Selenium 无法知道元素之前是否可见,现在是否不存在于 DOM 中,这就是为什么它会先等待可见性,然后再等待不可见性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-26
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2019-12-06
      • 2014-05-04
      相关资源
      最近更新 更多