Selenium获得当前隐式等待的值

时间:2014-04-04 19:58:46

标签: selenium webdriver

我意识到Selenium有隐式等待的默认值,但是如果我改变它,我该如何得到这个值?例如:

driver.implicitly_wait( 13 );

我如何从驱动程序中获取13值?

5 个答案:

答案 0 :(得分:8)

答案 1 :(得分:3)

我知道我迟了几年,而且@JaneGoodall没有错 - 没有内置功能。但它并非不可能!

创建自己的WebDriver接口版本和特定于浏览器的驱动程序类并不是很困难。然后,您可以将任何您想要的代码放入驱动程序中!

示例:

MyDriver.java(WebDriver的专用版,不是强制性的,但是一个非常好的主意):

public interface MyDriver extends WebDriver {
    void setWait(int timeout);
    int getWait();
}

MyChrome.java(专门版ChromeDriver - 适用于任何浏览器)

public class MyChrome extends ChromeDriver implements MyDriver {
    int timeout = 0;
    public void setWait(int timeout) {
        this.timeout = timeout;
        this.manage().timeouts().implicitlyWait(timeout, TimeUnit.SECONDS);
    }
    public int getWait() {
        return timeout;
    }
}

现在,要使用它,MyProgram.java:

public class MyProgram {
    MyDriver driver = new MyChrome();
    driver.setWait(10);
    assert(driver.getWait() == 10);
}

我希望这有用!

答案 2 :(得分:1)

对于那些从谷歌来到这里的人。在2018年,似乎有一种方法可以至少在javascript中获取这些超时(我知道问题是关于java):

const {implicit, pageLoad, script} = await driver.manage().getTimeouts();

希望这会有所帮助。

答案 3 :(得分:0)

TL; DR -这不是获得隐式等待的解决方案。如果不使用变通方法like this,即使在今天,您也无法在Java中获得隐式等待。

到2020年,硒3.141.59仍然没有任何超时的吸收剂。 WebDriver界面有一个嵌套的接口Timeouts,它没有定义任何获取方法。 Chrome和Firefox驱动程序的父级RemoteWebDriver实现了WebDriver界面,并且不会为超时添加吸气剂。

RemoteWebDriver实现了WebDriver.Timeouts,但是它不将隐式超时的值存储在任何地方,如下面的代码所示。

protected class RemoteTimeouts implements Timeouts {

  public Timeouts implicitlyWait(long time, TimeUnit unit) {
    execute(DriverCommand.SET_TIMEOUT, ImmutableMap.of(
        "implicit", TimeUnit.MILLISECONDS.convert(time, unit)));
    return this;
  }

  public Timeouts setScriptTimeout(long time, TimeUnit unit) {
    execute(DriverCommand.SET_TIMEOUT, ImmutableMap.of(
        "script", TimeUnit.MILLISECONDS.convert(time, unit)));
    return this;
  }

  public Timeouts pageLoadTimeout(long time, TimeUnit unit) {
    execute(DriverCommand.SET_TIMEOUT, ImmutableMap.of(
        "pageLoad", TimeUnit.MILLISECONDS.convert(time, unit)));
    return this;
  }
} // timeouts class.

RemoteWebDriver中的execute()方法将等待放在参数的Map中,但是它不会使该映射或通过getter可以访问的等待设置。

  protected Response execute(String driverCommand, Map<String, ?> parameters)
  //Open the source code to see why you can't make your own getter for implicitWait.

答案 4 :(得分:0)

这可以显示 real 超时值(加上计算时间,通常在100ms内):

public void getCurrentWaitTimeout() {
    long milliseconds = java.time.ZonedDateTime.now().toInstant().toEpochMilli();
    driver.findElements(By.cssSelector(".nonExistingElement"));
    milliseconds = java.time.ZonedDateTime.now().toInstant().toEpochMilli() - milliseconds;
    log.info("Current waiting timeout is {} milliseconds", milliseconds);
}

因此,您始终可以调用这种方法来确保您知道实际的超时时间,而不是您尝试设置的值。