一些类似的硒等待有啥区别?

Posted

技术标签:

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

简单的问题:

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

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

    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 秒。我应该删除它还是更改它? 【参考方案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 中,这就是为什么它会先等待可见性,然后再等待不可见性。

【讨论】:

以上是关于一些类似的硒等待有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

queue.wait() 和等待缓冲区销毁有啥区别

java中同步和异步有啥异同?

sleep和wait有啥区别

异步编程和多线程有啥区别?

小程序开发和App开发有啥区别,哪个好学一些?

“类型”和“子类型”关键字有啥区别?