Я боролся с селеном, чтобы решить эту проблему:
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;
});
Большинство решений на inte rnet предлагаю использовать Guava 21
, но у меня это не работает.
Локально работающий селен работает нормально, и я не понимаю этой проблемы, проблема в том, что мы используем бегун, который будет использовать selenium-server-standalone-3.12.0
для запуска тестов на нескольких виртуальных машинах, и в classpath мы определяем все используемые нами зависимости, где я также объявил Guava, я также пробовал другие версии Guava
с 19 до 23.
Я пытался Несколько решений, и теперь у меня нет идей, я не знаю, почему я все еще получаю эту ошибку, хотя я объявил Guava, и я ясно вижу, когда я запускаю тесты локально, что Guava 23
работает просто отлично.
Я использую java 1.8_71
.
Когда я проверял источник кода selenium-server-standalone-3.12.0
, интерфейс ожидания выглядит следующим образом:
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
расширяется * 1 028 * в Гуаве 23, это не должно быть проблемой, так почему я все еще получаю эту ошибку?
Заранее спасибо.
Обновление:
У меня есть проверил содержимое автономного фляги, и оно содержит Guava
версию 23.6-jre
, поэтому я очень скептически отношусь к проблеме, связанной с гуавой.
Я также проверил интерфейс Wait
, и он определен как это:
import java.util.function.Function;
public interface Wait<F> {
<T> T until(Function<? super F, T> var1);
}
Я до сих пор не понимаю, почему я получаю until(Lcom/google/common/base/Function;)
в исключении, когда используемый Function
интерфейс от java.util.function
, а не com.google.common.base
Обновление 2
Я как-то решил эту проблему, посмотрев, как intellij выполняет мой jar-файл, поэтому я добавил D:\..\target\test-classes
в путь к классам, и исключение почему-то исчезло, почему это произошло? и как я могу включить файлы в test-classes
в мою последнюю банку?
Обычно у меня есть файл 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;