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

Я получаю следующую ошибку всякий раз, когда пытаюсь использовать wait.until(ExpectedConditions) в своем проекте:

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

Пример кода, с которым я вижу проблему:

public static void clickSearch(WebDriver driver,By by, int timeout){
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
    WebDriverWait wait = new WebDriverWait(driver, 2);
    WebElement webElement = wait.until(ExpectedConditions.elementToBeClickable(by));
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    webElement.click();
}

И

FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver).withTimeout(waitSeconds, TimeUnit.SECONDS).pollingEvery(5, TimeUnit.SECONDS) .ignoring(NoSuchElementException.class);
wait.until(new ExpectedCondition<Boolean>() {
      @Override
      public Boolean apply(WebDriver driver) {
          return ((JavascriptExecutor) driver).executeScript("return document.readyState").toString().equals("complete");
      }
});

У меня есть следующие библиотеки:

activation.jar
byte-buddy-1.8.3.jar
cglib-nodep-3.2.4.jar
commons-codec-1.10.jar
commons-collections4-4.1.jar
commons-exec-1.3.jar
commons-io-2.5-javadoc.jar
commons-io-2.5.jar
commons-lang3-3.5.jar
commons-logging-1.2.jar
dom4j-1.6.1.jar
dsn.jar
gson-2.8.5.jar
hamcrest-core-1.3.jar
hamcrest-library-1.3.jar
http-client-6.6.0.5.jar
httpclient-4.5.5.jar
httpcore-4.4.9.jar
httpmime-4.5.5.jar
imap.jar
jackson-annotations-2.9.1.jar
jackson-core-2.9.1.jar
jackson-databind-2.9.1.jar
java-client-3.3.0.jar
jaxen-1.1.6.jar
jcl-over-slf4j-1.7.21.jar
jcommander-1.72.jar
jna-4.4.0.jar
json-20151123.jar
jsr305-3.0.2.jar
junit-4.12.jar
jxl-2.6.12.jar
mail.jar
mailapi.jar
netty-3.5.7.Final.jar
ojdbc6.jar
okio-1.15.0.jar
pm-webdriver-6.6.0.5-javadoc.jar
pm-webdriver-6.6.0.5.jar
poi-3.17.jar
poi-examples-3.16.jar
poi-excelant-3.17.jar
poi-ooxml-3.17.jar
poi-ooxml-schemas-3.17.jar
poi-scratchpad-3.17.jar
selenium-3.13\selenium-api-3.13.0.jar
selenium-3.13\selenium-java-3.13.0.jar
selenium-3.13\selenium-remote-driver-3.13.0.jar
selenium-3.13\selenium-server-standalone-3.13.0.jar
selenium-3.13\selenium-support-3.13.0.jar
slf4j-api-1.7.25.jar
smtp.jar
testng-6.14.2.jar
xml-apis-2.9.1.jar
xmlbeans-2.6.0.jar
guava-26.0-jre.jar

Мы не используем Gradle / Maven в нашем проекте. Мы храним физическую копию этих библиотек в определенном месте и используем то же самое для создания исполняемого jar-файла с использованием сценария ANT. И запускаем jar, созданный скриптом ANT из командной строки:

java.exe -cp <ProjectJarName>;<Location of jar libraries> <Main class name with whole package>.
For eg : java.exe project.jar;C:\Libraries\*.jar java.main.Main

Когда я искал проблему, обычно я видел добавление последней банки гуавы, которую я пробовал, и это не решило проблему. Также на форуме selenium в github я вижу, как люди решают проблему, внося изменения в pom.xml, изменяя порядок, который, как мне кажется, мне не нужно делать, поскольку я не зависим от maven.


person Jai    schedule 20.08.2018    source источник
comment
Итак, как вы компилируете свой код? Если вы используете IDE, вы можете проверить, какие версии библиотек доступны для IDE, поскольку (если вы их используете), он не жалуется на неизвестный метод, на который жалуется выполнение ...   -  person moilejter    schedule 20.08.2018


Ответы (1)


Сигнатура метода для этого метода задокументирована по адресу: https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html#until-java..util.function.Function-

Вы передаете этот https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedCondition.html, расширяющий com.google.common.base.Function.

https://google.github.io/guava/releases/20.0/api/docs/com/google/common/base/Function.html говорит

Этот интерфейс теперь является устаревшим. По возможности используйте вместо этого java.util.function.Function (или соответствующую примитивную специализацию, например ToIntFunction). В противном случае, по крайней мере, уменьшите явные зависимости от этого типа, используя лямбда-выражения или ссылки на методы вместо классов, что упростит перенос вашего кода в будущем.

Чтобы использовать существующую функцию (скажем, именованную функцию) в контексте, где ожидается другой тип функции, используйте ссылку на метод function :: apply. Будущая версия com.google.common.base.Function будет расширять java.util.function.Function, делая код преобразования необходимым только в одном направлении. В то время этот интерфейс будет официально не поддерживаться.

Это говорит о том, что ваша версия JRE или версии вашей библиотеки не совпадают. Сообщение об ошибке, которое вы получаете, говорит, что вы передаете com.google.common.base.Function, когда Javadoc для until сообщает, что его аргумент должен быть java.util.function.Function.

person Freiheit    schedule 20.08.2018
comment
Спасибо, что поделились своим мнением. Но я вижу, что com.google.common.base.Function расширяет java.util.function.Function. Ниже приведен исходный код того же. И IU использует банку guava 26.0-jre, в которой доступно это изменение. [github.com/ google / guava / blob / master / guava / src / com / google / common / Что касается версии JRE, я в 1.8.0_131. - person Jai; 21.08.2018
comment
Поскольку вы используете JRE 1.8+, помогает ли замечание из javadoc, на которое я указал, и источника, который вы опубликовали? This interface is now a legacy type. Use {@code java.util.function.Function} (or the appropriate primitive specialization such as {@code ToIntFunction}) instead whenever possible. метод, который вы пытаетесь вызвать, ожидает java.util.function.Function, класс, который вы передаете, говорит, что он унаследован и использует java.util.function.Function напрямую. - person Freiheit; 21.08.2018