【问题标题】:Selenium get value of current implicit waitSelenium 获取当前隐式等待的值
【发布时间】:2014-04-04 19:58:46
【问题描述】:

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

driver.implicitly_wait( 13 );

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

【问题讨论】:

    标签: selenium webdriver


    【解决方案1】:

    【讨论】:

    • +1 表示正确答案,但这真的很不幸 :(,为什么他们没有该值的吸气剂...
    • 那些链接已经失效了。文档可能没有显示任何 getter,但我们可以查看源代码,看看是否有办法制作我们自己的 getter。我这样做了,但我看不到制作我们自己的吸气剂的方法。隐式等待实际上对我们隐藏了 - stackoverflow.com/a/60919695/1521751
    【解决方案2】:

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

    希望对你有帮助!

    【讨论】:

    • 使用变量设置所需的等待时间会容易得多。然后,您可以随时引用该变量。
    • 当然,但有时您需要将该值与驱动程序对象本身打包。此解决方案比将变量传递到使用驱动程序的任何位置要干净得多。
    • @forresthopkinsa - 感谢您的回答。为什么需要将值与驱动程序对象本身打包?此外,是否有充分的理由能够获得隐式等待?
    • @armani 在许多情况下,您将驱动程序传递到很多地方,而您不能(或不想)用它发送配置对象。一个简单的例子是在使用 DI 容器时——您只需注入驱动程序并获得所需的信息。此方法还保证等待 getter 与实际等待值同步。至于为什么,一种情况是您需要知道隐式等待才能正确计时其他代码。我认为关于这个问题的活动证明有必要获得隐含的等待值。 :)
    【解决方案3】:

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      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.
      

      【讨论】:

        【解决方案5】:

        这样可以打印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);
        }
        

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

        【讨论】:

          【解决方案6】:

          对于 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 之前就已经存在了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-12-08
            • 1970-01-01
            • 1970-01-01
            • 2023-04-08
            • 1970-01-01
            • 2018-01-24
            相关资源
            最近更新 更多