我知道 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 - 这不是获得隐式等待的解决方案。即使在今天,如果不使用像这样的解决方法.
,您也无法在 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.
之前就存在了我得到定义的隐式超时:
driver.manage().timeouts().getImplicitWaitTimeout().getSeconds()
许多年后,在 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答案。