【问题标题】:Difference between driver.manage.wait(long timeout) and Explicit waitdriver.manage.wait(long timeout) 和 Explicit wait 之间的区别
【发布时间】:2018-06-29 14:17:44
【问题描述】:

谁能说出不同的用法:

driver.manage().wait(long timeout)

WebDriverWait wait = new WebDriverWait(driver, WAIT_IN_SECONDS) 

(EXPLICIT WAIT) 了解我未来的参考。

请原谅我这些问题对于我在自动化领域的新人来说是愚蠢的。

是显式等待的简单形式吗?

【问题讨论】:

  • @DebanjanB 感谢您的快速回复。实际上,我不相信这个问题与您所说的隐式等待和显式等待重复我希望隐式等待不是由“driver.manage”定义().wait(long time out)" 它由 "driver.manage().timeouts().implicitlyWait(some time in seconds)" 定义。
  • @DebanjanB 我的疑问是 driver.manage().wait(time) 它等待时间作为等待内的给定时间。如果是这样,那么它是显式等待的简单形式?

标签: java selenium selenium-webdriver wait webdriverwait


【解决方案1】:

driver.manage.wait(long timeout)

driver.manage.wait(long timeout) 实际上是 java.lang.Object.wait() 方法来自 java.lang.Object Class 导致当前线程等待直到另一个线程调用 notify() 方法或 notifyAll() 方法此对象或指定的时间已过。当前线程必须拥有该对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用 notify 方法或 notifyAll 方法通知在此对象的监视器上等待的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。

声明

java.lang.Object.wait()方法的声明如下:

public final void wait() throws InterruptedException
{
    //code logic
}

参数

timeout - the maximum time to wait in milliseconds.

返回值

This method does not return a value.

用法

在单参数版本中,中断和虚假唤醒是可能的,因此应始终在循环中使用此方法,如下所示:

 synchronized (obj) {
     while (<condition does not hold>)
         obj.wait();
     ... // Perform action appropriate to condition
 }

该方法只能由作为该对象监视器所有者的线程调用。

异常

投掷:

  • InterruptedException : 如果另一个线程中断了当前线程。抛出该异常时清除当前线程的中断状态。
  • IllegalArgumentException : 如果 timeout 的值为负数。
  • IllegalMonitorStateException : 如果当前线程不是对象监视器的所有者。

Explicit Wait

Explicit Wait 是您为 WebDriver 实例定义、配置和实现的代码块,以等待满足特定条件,然后再继续执行下一行代码。有一些方法可以帮助我们实现 ExplicitWait,它只会在需要的时候等待。 WebDriverWait 结合 ExpectedCondition 是 ExplicitWait 可以实现的方式之一。

您可以在 Explicit Wait 上找到详细讨论,它在 QA 中的实现Replace implicit wait with explicit wait (selenium webdriver &amp; java)


回答这个问题

obj.wait()WebDriverWait 无关。 obj.wait() 处理线程级别的内部逻辑,而 WebDriverWait 处理 HTML DOM 范围内的逻辑。

【讨论】:

  • 感谢有关 driver.manage.wait(long timeout) 的明确信息,以便清楚地了解这一点。
【解决方案2】:

有不同的方法可以在 selenium 中等待。隐式和显式以及一种更高级的等待形式是流畅等待。

【讨论】:

  • 这没有回答所问的问题
【解决方案3】:

隐式等待

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

隐式等待会告诉 Web 驱动程序在抛出异常之前等待一定的时间。隐式等待时间适用于脚本中的所有元素。隐式等待的缺点是,即使页面并且元素在时间单位之前加载,Webdriver 会一直执行到该时间。

显式等待

显式等待用于告诉 Web Driver 等待某些条件(预期条件)或在抛出异常之前超过的最长时间。显式等待是一种智能等待,但它只能应用于指定的元素。显式等待比隐式等待提供了更好的选择,因为它将等待动态加载的元素。

WebDriverWait wait = new WebDriverWait(driver, 40);

WebElement el = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("*xpath*")));
el.click();

更多信息请参考此链接: https://www.guru99.com/implicit-explicit-waits-selenium.html

【讨论】:

  • 这没有回答所问的问题
猜你喜欢
  • 2011-03-19
  • 2018-10-17
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2010-10-28
  • 2016-11-23
相关资源
最近更新 更多