1

简单的问题:

这两个陈述之间的确切区别是什么:

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

4

4 回答 4

1

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

于 2021-06-30T12:17:06.053 回答
1

我从 Selenium 官方文档中得到的东西很少:这里

警告:

不要混合隐式和显式等待。这样做会导致不可预测的等待时间。例如,设置 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()内部检查。

于 2021-06-30T12:40:44.113 回答
0

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

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

于 2021-06-30T12:05:26.623 回答
0

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

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

于 2021-06-30T12:47:42.680 回答