我意识到Selenium有隐式等待的默认值,但是如果我改变它,我该如何得到这个值?例如:
driver.implicitly_wait( 13 );
我如何从驱动程序中获取13值?
答案 0 :(得分:8)
不幸的是,没有吸气剂。
http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html
也没有明确的等待。
http://selenium.googlecode.com/svn/trunk/docs/api/java/com/thoughtworks/selenium/Wait.html
答案 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);
}
因此,您始终可以调用这种方法来确保您知道实际的超时时间,而不是您尝试设置的值。