【发布时间】:2020-05-01 02:32:47
【问题描述】:
我一直在用 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())
.withTimeout(timeout, TimeUnit.SECONDS)
.pollingEvery(frequency, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
wait.until(driver -> {
assert driver != null;
elt.click();
return true;
});
互联网上的大多数解决方案建议使用Guava 21,但这对我不起作用。
在本地运行 selenium 工作得很好,我没有遇到这个问题,问题是我们使用了一个运行器,它将使用 selenium-server-standalone-3.12.0 在多个虚拟机上运行测试,并且在类路径中我们定义了所有依赖项我们使用,在我声明 Guava 的地方,我还尝试了其他版本的 Guava 从 19 到 23。
我尝试了多种解决方案,但现在我没有想法,我不知道为什么即使我已经声明了 Guava,我仍然会收到此错误,并且当我在本地运行测试时,我可以清楚地看到 @987654327 @ 工作得很好。
我正在使用 java 1.8_71。
查看selenium-server-standalone-3.12.0的代码源,Wait界面如下:
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);
}
但是由于 com.google.common.base.Function 在 Guava 23 中扩展了 com.google.common.base.Function,这应该不是问题,那为什么我仍然会收到此错误?
提前致谢。
更新:
我检查了独立 jar 的内容,它包含 Guava 版本 23.6-jre,所以我非常怀疑这个问题来自番石榴。
我还检查了Wait 接口,它的定义如下:
import java.util.function.Function;
public interface Wait<F> {
<T> T until(Function<? super F, T> var1);
}
当使用的Function 接口来自java.util.function 而不是com.google.common.base 时,我仍然不明白为什么我在异常中得到until(Lcom/google/common/base/Function;)
更新 2
我通过查看 intellij 如何执行我的 jar 以某种方式解决了这个问题,所以我在类路径中添加了 D:\..\target\test-classes 并且异常由于某种原因消失了,为什么会这样?以及如何将test-classes 中的文件包含到我的最终 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;
【问题讨论】:
-
你本地的 Selenium 版本是什么?
-
@Guy
selenium-server-standalone-3.12.0 -
您在本地使用
selenium-server?不仅在远程服务器上?我问是因为直到 Selenium 版本 3.1.0Wait确实使用了com.google.common.base.Function;。但是服务器 3.12.0 使用 Selenium 3.12.0。 -
@Guy 是的,我在本地使用 selenium-server,我这样做是为了使用与 prod 中相同的 jar,但问题不在于我在本地运行 selenium,而是在 prod 中运行
-
你可以参考maven.apache.org/plugins/maven-jar-plugin/examples/…或者使用Assembly插件在fat-jar中有测试类
标签: java selenium java-8 guava webdriverwait