到目前为止,我使用了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上发现的大部分内容都是旧信息,解释的方式与我目前使用的方式相同。
答案 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