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, - это старая информация, объясняющая то же, что я использовал до сих пор.
Ответы
Ответ 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)