Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium获取当前隐式等待的值_Selenium_Webdriver - Fatal编程技术网

Selenium获取当前隐式等待的值

Selenium获取当前隐式等待的值,selenium,webdriver,Selenium,Webdriver,我意识到Selenium对隐式等待有一个默认值,但是如果我更改它,如何获得这个值呢?例如: 驱动程序。隐式等待(13); 以后如何从驱动程序中获取13值?不幸的是,没有用于此的getter 也没有显式等待 我知道我晚了几年,@JaneGoodall没有错——没有内置的函数。但这并非不可能 创建自己版本的WebDriver接口和特定于浏览器的驱动程序类并不困难。然后,你可以在驱动程序中输入你想要的任何代码 例如: MyDriver.java(WebDriver的专用版本,不是强制性的,但这是一

我意识到Selenium对隐式等待有一个默认值,但是如果我更改它,如何获得这个值呢?例如:

驱动程序。隐式等待(13);

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

不幸的是,没有用于此的getter

也没有显式等待


我知道我晚了几年,@JaneGoodall没有错——没有内置的函数。但这并非不可能

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

例如:

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

公共接口MyDriver扩展WebDriver{
void setWait(int超时);
int getWait();
}
MyChrome.java(ChromeDriver的专用版本——适用于任何浏览器)

公共类MyChrome扩展ChromeDriver实现MyDriver{
int超时=0;
公共void setWait(int超时){
this.timeout=超时;
this.manage().timeouts().implicitlyWait(超时,TimeUnit.SECONDS);
}
公共int getWait(){
返回超时;
}
}
现在,使用MyProgram.java:

公共类MyProgram{
MyDriver驱动程序=新的MyChrome();
驱动程序。设置等待(10);
断言(driver.getWait()==10);
}

我希望这是有帮助的

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


希望这会有所帮助。

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

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

RemoteWebDriver实现WebDriver.timeout,但它不会将隐式超时的值存储在任何位置,如下面的代码所示

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()方法在参数映射内进行等待,但它不会使我们通过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.
执行受保护的响应(字符串驱动器命令、映射参数)
//打开源代码,看看为什么不能为implicitWait创建自己的getter。
这可以打印实际超时值(加上计算时间,通常在100ms内):


因此,您可以随时调用这样的方法,以确保您知道实际超时,而不是您试图设置的值。

+1表示正确答案,但这确实很不幸:(,为什么他们没有这个值的getter…那些链接不再起作用了。文档可能不会显示任何getter,但我们可以查看源代码,看看是否有方法生成我们自己的getter。我这样做了,但我没有看到生成我们自己的getter的方法。隐式等待实际上对我们是隐藏的-只显示getter会容易得多使用变量设置所需的等待时间。然后,您可以随时引用该变量。当然,但有时您需要将该值与驱动程序对象本身打包在一起。此解决方案比将变量传递到使用驱动程序的任何位置要干净得多。@ForrestHopkina-谢谢您的回答。为什么需要将该值打包与驱动程序对象本身打包?此外,是否有任何理由可以获得隐式等待?@armani有许多情况下,你将驱动程序传递到很多地方,而你不能(或不想)这样做发送一个配置对象。一个简单的例子是当使用DI容器时——您只需注入驱动程序,就可以获得所需的信息。此方法还保证等待获取程序与实际等待值同步。至于原因,一种情况是,您需要知道隐式等待,以便能够对其他代码属性进行计时我认为这个问题上的活动证明需要获得隐式等待值
  protected Response execute(String driverCommand, Map<String, ?> parameters)
  //Open the source code to see why you can't make your own getter for implicitWait.
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);
}