java .lang.NoSuchMethodError: org.openqa.selenium.support.ui.Wait.until (Lcom / google / common / base / Function;) с использованием selenium-server-standalone-3.12.0 - PullRequest
3 голосов
/ 14 января 2020

Я боролся с селеном, чтобы решить эту проблему:

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;

Ответы [ 4 ]

4 голосов
/ 14 января 2020

Это проблема совместимости. Чтобы решить эту проблему, вы можете использовать Guava версия 21 + селен версия 3.2.0 + JDK 8 .

Более подробную информацию вы можете проверить по ссылке ниже:

https://softwaretestingboard.com/q2a/1907/function-webdriver-fluentwait-webdriver-applicable-arguments#axzz68BFzmEjv

Надеюсь, это поможет вам.

3 голосов
/ 14 января 2020

Это сообщение об ошибке ...

java.lang.NoSuchMethodError: org.openqa.selenium.support.ui.Wait.until(Lcom/google/common/base/Function;)Ljava/lang/Object;

... означает, что версия Guava была несовместима.


Поскольку вы используете selenium-server-standalone-3.12.0 согласно содержимому selenium- java -3.12.0 клиентских комплектов поддерживаемая версия:

guava-23,6-jre


Снимок

guava


Решение

Непосредственное решение будет:

  • Обновление Гуава с guava-23.6-jre.jar

Настоящая проблема

В вашем первом обновлении, когда вы подтвердили, что Guava версия 23.6-jre, реальная проблема, похоже, в конструкторе FluentWait . Тип аргумента для withTimeout и pollingEvery post Selenium v3.11.0 , который был:

  • pollingEvery: pollingEvery(long duration, java.util.concurrent.TimeUnit unit)
  • withTimeout: withTimeout(long duration, java.util.concurrent.TimeUnit unit)

Сейчас устарели и новый тип java. time.Duration . Таким образом, ваш эффективный блок кода будет:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(Duration.ofSeconds(30))
.pollingEvery(Duration.ofMillis(500))
.ignoring(NoSuchElementException.class);

Подробное обсуждение можно найти в Тип FluentWait не является универсальным; он не может быть параметризован с ошибкой аргументов для класса FluentWait через Selenium и Java


Дополнительные сведения

Дополнительно,

  • Ваша версия JDK - это 1.8_71 , что довольно старое и древнее .
  • Решение: убедитесь, что JDK обновлен до текущих уровней JDK 8u222 .

Best Practices

В соответствии с лучшими практиками, вам необходимо:

  • Обновление JDK до последних уровней JDK 8u222 .
  • Обновление Selenium до текущих уровней Версия 3.141.59 .
  • GeckoDriver и Firefox speci c:
    • Обновить GeckoDriver до GeckoDriver v0.26.0 level.
    • GeckoDriver присутствует в нужном месте.
    • GeckoDriver имеет разрешение на выполнение для пользователей, не являющихся root.
    • Upgrade Firefox версия до Firefox v72.0 уровней.
  • ChromeDriver и Chrome Speci c:
    • ChromeDriver обновлен до текущего ChromeDriver v79.0.3945.36 уровень.
    • Chrome обновлен до текущего уровня Chrome Версия 79.0 . (согласно примечаниям к выпуску ChromeDriver v79.0 )
  • Очистка вашего рабочего пространства проекта через IDE и Перестройте ваш проект только с необходимыми зависимостями.
  • ( только для WindowsOS ) Используйте инструмент CCleaner для стереть все дела ОС до и после выполнения Test Suite .
  • ( только для LinuxOS ) освободить и освободить неиспользуемую / кэшированную память в Ubuntu / Linux Mint до и после выполнения Test Suite .
  • Если ваша базовая версия Web Client устарела, удалите ее. через Revo Uninstaller и установите последнюю версию GA и выпущенную версию Веб-клиент .
  • Возьмите Перезагрузка системы .
  • Выполните Test как пользователь, не являющийся root.
  • Всегда вызывайте driver.quit() в методе tearDown(){}, чтобы закрыть и уничтожить WebDriver и * 1 224 * Веб-клиент экземпляров изящно.

Ссылка

Соответствующее подробное обсуждение можно найти в:

0 голосов
/ 23 января 2020

Я думаю, вам следует проверить под D:\sln\ и D:\sln\lib\, есть ли там другая версия библиотеки селена. Удалите его, если он есть.

Из сообщения об ошибке кажется, что при выполнении пакетного сценария используется другая версия Selenium из другого файла jar селена. Вероятно, старая версия селеновой банки, в которой еще не было метода Wait.until.

0 голосов
/ 21 января 2020

Простой короткий ответ: у вас есть проблемы с устаревшей версией гуавы!

-> Сделайте это: В каждом отдельном проекте явно исключите зависимость от гуавы из каждая отдельная зависимость , которая ее запрашивает (используйте граф зависимостей , чтобы найти их) или, лучше, исключите ее в родительском (если она есть)

- > Затем явно добавьте зависимость для гуавы 23.0 (или новее).

Это исправит это. Прямо сейчас откуда-то извлекается старая версия гуавы, у которой нет метода "пока" (или, по крайней мере, с этим параметром).

Удачи! :)

...