wait.until(ExpectedConditions)在selenium中不再起作用了

时间:2017-02-23 16:24:20

标签: selenium

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

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

但是我将selenium更新为3.1.0并且我收到错误:

" FluentWait类型中的(Predicate)方法不适用于参数  (ExpectedCondition)"

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

10 个答案:

答案 0 :(得分:29)

我遇到了同样的问题。

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

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

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

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

旧的(不推荐使用):
public void until(final Predicate<T> isTrue) {}

新的一个:
public <V> V until(Function<? super T, V> isTrue) {}

答案 1 :(得分:3)

您需要添加依赖项:

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

这是为了让您的代码仍然有用。虽然最终需要重写代码而不是使用弃用的FluentWait。

答案 2 :(得分:2)

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

例如:

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>

作为依赖项,它隐藏了guava lib中的selenium lib。

在这种情况下,错误是:

  

不存在类型变量V的实例,以便ExpectedCondition&lt;&gt; ...

     

方法直到课堂上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)

答案 3 :(得分:1)

如果您使用maven来管理依赖项,请检查依赖关系层次结构并检查正在使用的番石榴版本。 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>

答案 4 :(得分:1)

您可以为新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;
        }
    });

答案 5 :(得分:1)

当我从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 - &gt;首选项,Java /已安装的JRE,添加按钮,JRE主目录:C:\ Program Files \ Java \ jdk1.8.0_131和JRE名称:jdk1.8.0_131。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

当您使用高于3.1.0版本的硒时,我通过添加番石榴21和删除番石榴20.0消除了此错误

答案 8 :(得分:0)

这种依赖性对我有用。

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

答案 9 :(得分:0)

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