一些类似的selenium等待有什么区别?

What is the difference between some similar selenium waits?

简单问题:

这两个语句之间的确切区别是什么:

  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))

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

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

`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 秒)。有什么问题?

顶部语句等到 (ec.invisibility_of_element_located(element)) 发生,因为底部会等到 (ec.presence_of_element_located(element)) 不发生。

边注功能我知道这没有意义,但这就是被问到的:)

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

我从 Selenium 官方文档中得到了一些信息:here

警告:

Do not mix implicit and explicit waits. Doing so can cause unpredictable wait times. For example, setting an implicit wait of 10 seconds and an explicit wait of 15 seconds could cause a timeout to occur after 20 seconds.

所以对于你的这个问题:

但是,即使微调器不可见,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()

问题第二部分(新增)的答案:

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