Selenium 获取当前隐式等待的值

问题描述 投票:0回答:8

我知道 Selenium 有一个隐式等待的默认值,但是如果我改变它,我该如何获得这个值?例如:

driver.implicitly_wait( 13 );

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

selenium webdriver
8个回答

6
投票

我知道我迟到了几年,@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);
}

希望对您有所帮助!


3
投票

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

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

希望这会有所帮助。


0
投票

TL;DR - 这不是获得隐式等待的解决方案。即使在今天,如果不使用像这样的解决方法.

,您也无法在 Java 中获得隐式等待

2020 年,selenium 3.141.59 仍然没有任何超时的 getter。 WebDriver 接口有一个嵌套接口 Timeouts,它没有定义任何 getter。 RemoteWebDriver 是 Chrome 和 Firefox 驱动程序的父级,实现了 WebDriver 接口,它没有为超时添加 getter。

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.

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

所以你总是可以调用这样的方法来确保你知道实际超时,而不是你试图设置的值。


0
投票

对于 Java 版本的 Selenium,org.seleniumhq.selenium:selenium-api:4.0.0-beta-4 允许您获取当前隐式等待持续时间:

WebDriver.manage().timeouts().getImplicitWaitTimeout()

使用这种方法,可以暂时将超时更改为 1 秒,然后再恢复:

final Duration originalTimeout = driver.manage().timeouts().getImplicitWaitTimeout();
driver.manage().timeouts().implicitlyWait(Duration.of(1, ChronoUnit.SECONDS));
... // do something
// restore the original timeout
driver.manage().timeouts().implicitlyWait(originalTimeout);

可能这个功能甚至在 selenium-api:4.0.0-beta-4.

之前就存在了

0
投票

我得到定义的隐式超时:

driver.manage().timeouts().getImplicitWaitTimeout().getSeconds()


0
投票

许多年后,在 Python 中,使用

selenium 4.4.3
您可以通过以下方式非常轻松地访问超时:

print(driver.timeouts.implicit_wait)
print(driver.timeouts.page_load)
print(driver.timeouts.script)

请注意,当我调用

driver.implicitly_wait(60)
时,它仅更改了
implicit_wait
值。

此外,Python中没有

driver.manage()
这样的功能,如上面的Java答案。

© www.soinside.com 2019 - 2024. All rights reserved.