【发布时间】:2014-04-04 19:58:46
【问题描述】:
我意识到 Selenium 有一个隐式等待的默认值,但是如果我改变它,我该如何获得这个值呢?例如:
driver.implicitly_wait( 13 );
我以后如何从驱动程序中获取 13 值?
【问题讨论】:
我意识到 Selenium 有一个隐式等待的默认值,但是如果我改变它,我该如何获得这个值呢?例如:
driver.implicitly_wait( 13 );
我以后如何从驱动程序中获取 13 值?
【问题讨论】:
【讨论】:
我知道我迟到了几年,@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);
}
希望对你有帮助!
【讨论】:
对于那些从谷歌来到这里的人。在 2018 年,似乎有一种方法可以至少在 javascript 中获得这些超时(我知道问题是关于 java 的):
const {implicit, pageLoad, script} = await driver.manage().getTimeouts();
希望这会有所帮助。
【讨论】:
TL;DR - 这不是获得隐式等待的解决方案。即使在今天,如果不使用解决方法 like this,您也无法在 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.
【讨论】:
这样可以打印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);
}
所以你总是可以调用这样的方法来确保你知道实际的超时时间,而不是你尝试设置的值。
【讨论】:
对于 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 之前就已经存在了。
【讨论】: