java.lang.NoSuchMethodError:org.openqa.selenium.support.ui.Wait.until(Lcom/google/common/base/Function;)使用selenium-server-standalone-3.12.0
我一直在努力与selenium一起解决此问题:java.lang.NoSuchMethodError:org.openqa.selenium.support.ui.Wait.until(Lcom/google/common/base/Function;)使用selenium-server-standalone-3.12.0,java,selenium,java-8,guava,webdriverwait,Java,Selenium,Java 8,Guava,Webdriverwait,我一直在努力与selenium一起解决此问题: java.lang.NoSuchMethodError: org.openqa.selenium.support.ui.Wait.until(Lcom/google/common/base/Function;)Ljava/lang/Object; 这就是我得到这个错误的地方: Wait<WebDriver> wait = new FluentWait<>(getDriverInstance()) .with
java.lang.NoSuchMethodError: org.openqa.selenium.support.ui.Wait.until(Lcom/google/common/base/Function;)Ljava/lang/Object;
这就是我得到这个错误的地方:
Wait<WebDriver> wait = new FluentWait<>(getDriverInstance())
.withTimeout(timeout, TimeUnit.SECONDS)
.pollingEvery(frequency, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
wait.until(driver -> {
assert driver != null;
elt.click();
return true;
});
但在当地,情况是这样的:
import java.util.function.Function;
public interface Wait<F> {
<T> T until(Function<? super F, T> var1);
}
import com.google.common.base.Function;
public interface Wait<F> {
<T> T until(Function<? super F, T> var1);
}
import java.util.function.Function;
public interface Wait<F> {
<T> T until(Function<? super F, T> var1);
}
我仍然不明白为什么我会得到,直到(Lcom/google/common/base/Function;)
在使用的Function
接口来自java.util.Function
而不是com.google.common.base
更新2
通过查看intellij如何执行我的jar,我以某种方式解决了这个问题,因此我在类路径中添加了D:\..\target\test class
,异常由于某种原因消失了,为什么会发生这种情况?如何将测试类中的文件包含到我的最终jar中
通常我有一个运行测试的bat文件:
@SETLOCAL
@ECHO OFF
@set JAVA_HOME="C:\Program Files\Java\jdk1.8.0_231"
@set PATH=%JAVA_HOME%\bin;D:\drivers;%PATH%
@set CLASSPATH=.;
@set CLASSPATH=%CLASSPATH%D:\sln\lib\*;
@set CLASSPATH=%CLASSPATH%D:\sln\selenium-server-standalone-3.12.0.jar;
echo %CLASSPATH%
"C:\Program Files\Java\jdk1.8.0_231\bin\java.exe" com.sln.Runner %*
我使用的方法如下:
D:\sln\Run.bat -u localhost -f D:\sln\target\sln-1.0-SNAPSHOT-tests.jar -c com.sln.SeleniumTest ...
这不起作用,除非我将其添加到类路径中,否则我将获得NoSuchMethodError
异常:
@set CLASSPATH=%CLASSPATH%D:\sln\target\test-classes;
此错误消息
java.lang.NoSuchMethodError: org.openqa.selenium.support.ui.Wait.until(Lcom/google/common/base/Function;)Ljava/lang/Object;
…意味着番石榴版本不兼容
根据selenium-java-3.12.0客户端工具包的内容,使用selenium-server-standalone-3.12.0时,支持的版本为:
番石榴-23.6-jre
快照
解决方案
立即的解决办法是:
- 使用
Guava-23.6-jre.jar升级番石榴
真正的问题
在您的第一次更新中,您确认了番石榴版本是23.6-jre
,真正的问题似乎是它的构造函数。Selenium v3.11.0之后的with timeout
和pollingEvery
的参数类型为:
- :
pollingEvery(长持续时间,java.util.concurrent.TimeUnit)
- :
withTimeout(长持续时间,java.util.concurrent.TimeUnit)
现已弃用,新类型为。因此,您的有效代码块将是:
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(Duration.ofSeconds(30))
.pollingEvery(Duration.ofMillis(500))
.ignoring(NoSuchElementException.class);
Wait Wait=new FluentWait(驱动程序)
.withTimeout(持续时间秒(30))
.pollingEvery(持续时间:百万(500))
.忽略(NoSuchElementException.class);
您可以在中找到详细的讨论
额外考虑
另外,
- 您的JDK版本是1.8_71,它非常古老和古老
- 解决方案:确保JDK升级到当前级别
最佳做法
根据最佳实践,您需要:
- 将JDK升级到最新级别
- 将硒升级到当前水平
- GeckoDriver和Firefox特定:
- 将GeckoDriver升级至标高
- 壁虎河位于所需位置
- GeckoDriver对非root用户具有可执行权限
- 将Firefox版本升级到Firefox v72.0版本
- 铬驱动和铬特定:
- ChromeDriver已更新到当前级别
- Chrome更新到当前的Chrome 79.0版本。(根据)
- 通过IDE清理项目工作区,并仅使用所需的依赖项重建项目
- (仅限Windows OS)在执行测试套件之前和之后,使用该工具清除所有操作系统杂务
- (仅限LinuxOS)在执行测试套件之前和之后
- 如果您的基本Web客户端版本太旧,请通过卸载它并安装最新的GA和Web客户端发布版本
- 重新启动系统
- 以非root用户身份执行
测试
- 始终在
tearDown(){}
方法中调用driver.quit()
,以优雅地关闭和销毁Web驱动程序和Web客户端实例
参考文献
有关详细讨论,请参见:
这是兼容性问题。要解决这个问题,可以使用番石榴21版+硒3.2.0版+JDK 8
有关更多详细信息,请查看以下链接:
我希望它能帮助你。简单的简短回答:你对过时的番石榴版本有依赖性问题
->这样做:
在每个项目中,明确地将番石榴依赖项从请求它的每个依赖项中排除(使用依赖关系图查找这些)
或者最好将其排除在父级中(如果有)
->然后明确添加guava 23.0(或更新版本)依赖项
这会解决它的。现在,从某个地方正在提取一个旧的番石榴版本,它没有“直到”方法(或者至少没有这个参数)
祝你好运!:) 我认为您应该在
D:\sln\
和D:\sln\lib\
下检查是否有其他版本的selenium库。如果有,请将其删除
从错误消息来看,执行批处理脚本时,它似乎使用了来自不同Selenium jar文件的不同版本的Selenium。可能是旧版本的selenium jar还没有Wait.until方法。很遗憾,我无法更改selenium server的版本,我必须使用3.12.0版本,我将尝试提供的其他版本solutions@IchigoKurosaki我不知道您何时将番石榴库添加到项目中(从一开始还是在这个错误之后)。我创建了一个演示项目,用相同版本的SeleniumServerStandalone、guava和java对其进行测试。我没有发现“Webdriver wait”有任何错误,但当我添加了guava 19时,我得到了相同的错误。我想说,如果您从一开始就使用番石榴,那么您可以删除番石榴库并尝试一下。谢谢您的回答,但不幸的是,这对我来说不起作用,我已经将JDK的版本更新为最新版本jdk1.8.0ç
,并将番石榴更新为<