【问题标题】:wait.until(ExpectedConditions) doesnt work any more in seleniumwait.until(ExpectedConditions) 在硒中不再起作用
【发布时间】:2017-07-14 06:04:23
【问题描述】:

到目前为止,我使用了 2.45.0 版本的 selenium,我所有的等待都是以这种方式完成的:

WebDriverWait wait = new WebDriverWait(webKitUtility.getWebDriver(), 5);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("role")));

但我将 selenium 更新为 3.1.0,但出现错误:

"FluentWait 类型中的方法 until(Predicate) 不适用于参数 (预期条件)”

我看到从 2.45.0 到 3.1.0 的某些内容已被弃用。我正在尝试调查现在最好的方法是什么,但我不确定。我在 google 上找到的大部分内容都是旧信息,解释方式与我目前使用的方式相同。

【问题讨论】:

    标签: selenium


    【解决方案1】:

    如果您正在使用 intellij。您希望您的代码使用最新版本: -->将intellij更新到最新版本:2020.2.1 壁虎驱动程序:v0.27.0 硒 3.12.0 也更新 番石榴到 28.0-jre 并从 jar 文件夹中删除旧版本的 selenium 和 guava jar

    【讨论】:

      【解决方案2】:

      这个依赖对我有用。

      <dependency>
              <groupId>org.seleniumhq.selenium</groupId>
              <artifactId>selenium-support</artifactId>
              <version>3.0.1</version>
      </dependency>
      

      【讨论】:

        【解决方案3】:

        当您使用高于 3.1.0 版本的 selenium 时,我通过添加 guava 21 和删除 guava 20.0 来消除此错误

        【讨论】:

          【解决方案4】:

          如果您使用的是 Maven,请注意 order of the dependencies do matter

          例如:

          public static void main(String[] args) {
              System.setProperty("webdriver.gecko.driver", "/Users/me/geckodriver");
              final WebDriver driver = new FirefoxDriver();
              driver.get("https://www.google.com");
              final WebDriverWait wait = new WebDriverWait(driver, 5);
              final By feelLuckyXpath = By.xpath("//div[@class='jsb']/center/input[@type='submit' and @name='btnI']");
              wait.until(ExpectedConditions.visibilityOfElementLocated(feelLuckyXpath)).click();
              driver.close();
          }
          

          此代码适用于以下 maven 依赖项:

          <dependency>
              <groupId>org.seleniumhq.selenium</groupId>
              <artifactId>selenium-java</artifactId>
              <version>3.8.1</version>
          </dependency>
          
          <dependency>
              <groupId>com.google.api-client</groupId>
              <artifactId>google-api-client</artifactId>
              <version>1.22.0</version>
          </dependency>
          

          但它可能会因重新排序而失败:

          <dependency>
              <groupId>com.google.api-client</groupId>
              <artifactId>google-api-client</artifactId>
              <version>1.22.0</version>
          </dependency>
          
          <dependency>
              <groupId>org.seleniumhq.selenium</groupId>
              <artifactId>selenium-java</artifactId>
              <version>3.8.1</version>
          </dependency>
          

          在这种情况下,因为google-api-client 包含:

          <groupId>com.google.guava</groupId>
          <artifactId>guava-jdk5</artifactId>
          

          作为在selenium 库中隐藏guava 库的依赖项。

          在这种情况下,错误是:

          不存在类型变量 V 的实例,因此 ExpectedCondition ...

          直到类 org.openqa.selenium.support.ui.FluentWait 中的方法不能应用于给定类型; 必需:java.util.function.Function 找到:org.openqa.selenium.support.ui.ExpectedCondition 原因:无法推断类型变量 V (参数不匹配;org.openqa.selenium.support.ui.ExpectedCondition 无法转换为 java.util.function.Function)

          【讨论】:

            【解决方案5】:

            在将 guava 版本更改为 21 并将 maven 插件配置版本更改为之后,我遇到了与 java.util.function 相关的类似问题 maven-compiler-plugin 3.11.81.8
            我仍然遇到同样的错误,构建失败。解决此问题的方法是删除 maven repo .m2 文件夹并从头开始导入项目,然后尝试进行以下更改。在 POM selenium java 和 selenium 服务器版本进行更改后尝试进行 Maven 更新并尝试使用 maven clean,然后是 maven install。在我的情况下,pom.xml 仍在使用旧的 selenium 版本。在对 maven 插件进行更改后,我将使用的 jdk 版本更改为 1.8,现在它对我来说非常好

            【讨论】:

              【解决方案6】:

              当我从 selenium 2 (org.seleniumhq.selenium:selenium-java:2.53.0) 更改为 selenium 3 (org.seleniumhq.selenium:selenium-java:3.4.0) 时出现此编译错误。

              如上所述,我必须从 guava 18 (guava:com.google.guava:18.0) 更改为 guava 21 (guava:com.google.guava:21.0)。

              但是,我还必须将构建配置为使用 Java 8,因为

              ExpectedCondition<T> extends Function<WebDriver, T>
              Function<F, T> extends java.util.function.Function<F, T>
              

              其中 java.util.function.Function 必须来自 Java 8 JDK。

              对于命令行,我将 JAVA_HOME 环境变量更改为 JAVA_HOME:C:\Program Files\Java\jdk1.8.0_131

              对于 Eclipse、Windows -> 首选项、Java/已安装的 JRE、添加按钮、JRE 主页:C:\Program Files\Java\jdk1.8.0_131 和 JRE 名称:jdk1.8.0_131。

              【讨论】:

                【解决方案7】:

                你需要添加依赖:

                <dependency>
                        <groupId>org.seleniumhq.selenium</groupId>
                        <artifactId>selenium-support</artifactId>
                        <version>3.0.1</version>
                </dependency>
                

                这是为了让您的代码仍然有效。尽管最终需要重写代码以不使用已弃用的 FluentWait。

                【讨论】:

                • FluentWait 从 Selenium 3.4.0 开始似乎没有被弃用。
                • 在将 deeplearning4j 依赖项添加到项目后 Selenium 遇到问题时有所帮助。
                【解决方案8】:

                你可以为新的FluentWait做这样的事情

                    new WebDriverWait(driver, 60).until(new Function<WebDriver, Boolean>() {
                    Boolean isWindowFound = Boolean.FALSE;
                        @Override
                        public Boolean apply(WebDriver driver) {
                            try {
                                driver.switchTo().window("Your Window Name");
                                isWindowFound = Boolean.TRUE;
                            } catch (NoSuchWindowException e) {
                                System.out.println("Your Window Name not found");
                                System.out.println(driver.getTitle());
                                return isWindowFound;
                            }
                            return isWindowFound;
                        }
                    });
                

                【讨论】:

                  【解决方案9】:

                  如果您使用 maven 来管理您的依赖项,请检查依赖关系层次结构并检查正在使用的 guava 版本。 selenium-remote-driver JAR 需要 guava 版本 21。为使用不需要的 guava 版本的工件添加排除项。例如:

                  <dependency>
                  <groupId>io.github.bonigarcia</groupId>
                  <artifactId>webdrivermanager</artifactId>
                  <version>1.5.1</version>
                    <exclusions>
                      <exclusion>
                         <groupId>com.google.guava</groupId>
                         <artifactId>guava</artifactId>
                      </exclusion>
                    </exclusions>
                  </dependency>
                  

                  【讨论】:

                    【解决方案10】:

                    我遇到了同样的问题。

                    我通过使用 WebDriverWait 的未弃用 .until() 方法并将以下内容添加到我的 maven pom.xml 来修复它:

                    <dependency>
                          <groupId>com.google.guava</groupId>
                          <artifactId>guava</artifactId>
                          <version>21.0</version>
                    </dependency>
                    

                    除此之外,我的代码看起来和以前一模一样。

                    更具体地说,现在有两个 .until() 方法。

                    旧的(已弃用):
                    public void until(final Predicate&lt;T&gt; isTrue) {}

                    还有新的:
                    public &lt;V&gt; V until(Function&lt;? super T, V&gt; isTrue) {}

                    【讨论】:

                    • 我去了官方的 selenium 聊天室,那个家伙告诉我做和你一样的事情。它也适用于我。我来这里是为了发布答案,但你已经这样做了:)。
                    • 谁能告诉我如何使用新的示例。我的意思是真正的程序。
                    • 对于 gradle:compile group: 'com.google.guava', name:'guava', version:'21.0'build.gradle 的依赖项中。 Info on dependencies.
                    • 这很有趣。我的wait.until 工作得非常好,直到我今天将我的 IntelliJ 更新到最新版本 2021.1,然后我开始看到这个问题。正如@Robert 所解释的那样添加 Guava 依赖项确实解决了这个问题。不确定最新的 IntelliJ 做了什么会破坏我的代码。展望未来,我不再热衷于更新我的 IntelliJ :)
                    最近更新 更多