Подтвердить что ты не робот

Wait.until(ExpectedConditions) больше не работает в селене

До сих пор я использовал версию селена версии 2.45.0, и все мои ожидания были выполнены следующим образом:

WebDriverWait wait = new WebDriverWait(webKitUtility.getWebDriver(), 5);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("role")));

Но я обновил селен до 3.1.0, и я получаю сообщение об ошибке:

"Метод до (Predicate) в типе FluentWait не применим для аргументов  (ExpectedCondition) "

Я вижу, что от 2.45.0 до 3.1.0 некоторые вещи устарели. Я пытаюсь выяснить, что является лучшим способом сделать это сейчас, но я не уверен. Большинство вещей, которые я нахожу в Google, - это старая информация, объясняющая то же, что я использовал до сих пор.

4b9b3361

Ответ 1

У меня была такая же проблема.

Я исправил его, используя метод .until() без устаревших .until() и добавив следующее к моему maven pom.xml:

<dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>21.0</version>
</dependency>

Кроме этого, мой код выглядит так же, как раньше.

Чтобы быть более конкретными, теперь существуют два метода .until().

Старый (который устарел):
public void until(final Predicate<T> isTrue) {}

И новый:
public <V> V until(Function<? super T, V> isTrue) {}

Ответ 2

Если вы используете maven для управления вашими зависимостями, проверьте иерархию зависимостей и проверьте используемую версию guava. selenium-remote-driver JAR требует версии guava 21. Добавьте исключение в артефакт, который использует нежелательную версию guava. Например:

<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>1.5.1</version>
  <exclusions>
    <exclusion>
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
    </exclusion>
  </exclusions>
</dependency>

Ответ 3

Вам нужно будет добавить зависимость:

<dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-support</artifactId>
        <version>3.0.1</version>
</dependency>

Это делается для того, чтобы ваш код по-прежнему работал. Хотя в конечном итоге код нужно будет переписать, чтобы не использовать устаревший FluentWait.

Ответ 4

Я получил эту ошибку компиляции, когда я перешел из селена 2 (org.seleniumhq.selenium: selenium-java: 2.53.0) в селен 3 (org.seleniumhq.selenium: selenium-java: 3.4.0).

Как уже упоминалось выше, мне пришлось перейти с guava 18 (guava: com.google.guava: 18.0) на guava 21 (guava: com.google.guava: 21.0).

Однако мне также пришлось настроить сборку на использование Java 8, потому что

ExpectedCondition<T> extends Function<WebDriver, T>
Function<F, T> extends java.util.function.Function<F, T>

где java.util.function.Function должен поступать из Java 8 JDK.

В командной строке я изменил переменную среды JAVA_HOME на JAVA_HOME: C:\Program Files\Java\jdk1.8.0_131

Для Eclipse, Windows → Предпочтения, Java/Установленные JRE, Кнопка добавления, JRE home: C:\Program Files\Java\jdk1.8.0_131 и имя JRE: jdk1.8.0_131.

Ответ 5

Вы можете сделать что-то подобное для нового FluentWait

    new WebDriverWait(driver, 60).until(new Function<WebDriver, Boolean>() {
    Boolean isWindowFound = Boolean.FALSE;
        @Override
        public Boolean apply(WebDriver driver) {
            try {
                driver.switchTo().window("Your Window Name");
                isWindowFound = Boolean.TRUE;
            } catch (NoSuchWindowException e) {
                System.out.println("Your Window Name not found");
                System.out.println(driver.getTitle());
                return isWindowFound;
            }
            return isWindowFound;
        }
    });

Ответ 6

Я столкнулся с аналогичной проблемой, связанной с java.util.function, после внесения вышеуказанных изменений в версию guava как 21 и изменения версии конфигурации плагина maven maven-compiler-plugin 3.11.81.8
Я все еще придерживался той же ошибки, и сборка была неудачной. Решение для этого, чтобы удалить папку maven repo.m2 и импортировать проект с начала, а затем попытаться сделать следующие изменения. Попробуйте сделать обновление Maven после внесения изменений в версию selenium java и selenium сервера POM и попытайтесь выполнить maven чистым, а затем maven install.Showhow pom.xml все еще использовал старую версию selenium в моем случае. Я изменил используемую версию jdk на 1.8 после внесения изменений в плагин maven, и теперь он отлично работает для меня.

Ответ 7

Обратите внимание, что если вы используете Maven, что порядок зависимостей имеет значение.

Например:

public static void main(String[] args) {
    System.setProperty("webdriver.gecko.driver", "/Users/me/geckodriver");
    final WebDriver driver = new FirefoxDriver();
    driver.get("https://www.google.com");
    final WebDriverWait wait = new WebDriverWait(driver, 5);
    final By feelLuckyXpath = By.xpath("//div[@class='jsb']/center/input[@type='submit' and @name='btnI']");
    wait.until(ExpectedConditions.visibilityOfElementLocated(feelLuckyXpath)).click();
    driver.close();
}

этот код отлично работает со следующими зависимостями maven:

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.8.1</version>
</dependency>

<dependency>
    <groupId>com.google.api-client</groupId>
    <artifactId>google-api-client</artifactId>
    <version>1.22.0</version>
</dependency>

но он может выйти из строя с измененным порядком:

<dependency>
    <groupId>com.google.api-client</groupId>
    <artifactId>google-api-client</artifactId>
    <version>1.22.0</version>
</dependency>

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.8.1</version>
</dependency>

В этом случае, поскольку google-api-client содержит:

<groupId>com.google.guava</groupId>
<artifactId>guava-jdk5</artifactId>

как зависимость, которая затеняет guava lib в selenium lib.

В этом случае ошибка:

нет экземпляра (ов) переменной типа (ов) V, чтобы ExpectedCondition < > ...

до тех пор, пока в классе org.openqa.selenium.support.ui.FluentWait не может применяться к заданным типам;   требуется: java.util.function.Function   найдено: org.openqa.selenium.support.ui.ExpectedCondition   причина: не может вызывать переменную типа (ов) V     (несоответствие аргумента; org.openqa.selenium.support.ui.ExpectedCondition не может быть преобразовано в java.util.function.Function)