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

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

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

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

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

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

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

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

  com.google.guava guava 21.0  

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

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

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

И новый:
public V until(Function isTrue) {}

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

  org.seleniumhq.selenium selenium-support 3.0.1  

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

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

  io.github.bonigarcia webdrivermanager 1.5.1   com.google.guava guava    

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

  new WebDriverWait(driver, 60).until(new Function() { 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; } }); 

Я получил эту ошибку компиляции, когда я перешел из seleniumа 2 (org.seleniumhq.selenium: selenium-java: 2.53.0) в selenium 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 extends Function Function extends java.util.function.Function 

где 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.

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

Обратите внимание, если вы используете 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:

  org.seleniumhq.selenium selenium-java 3.8.1   com.google.api-client google-api-client 1.22.0  

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

  com.google.api-client google-api-client 1.22.0   org.seleniumhq.selenium selenium-java 3.8.1  

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

 com.google.guava guava-jdk5 

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

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

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

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

  • ChromeDriver - отключить расширения режима разработки для Selenium WebDriver
  • Как я могу попросить Selenium-WebDriver ждать несколько секунд в Java?
  • Официальные страtagsи локатора для webdriver
  • Как остановить Selenium от создания временных профилей Firefox с помощью Web Driver?
  • Не удается открыть браузер с Selenium после обновления Firefox
  • Исключение StaleElementReference в PageFactory
  • Как перейти к новому окну браузера, который открывается после нажатия кнопки?
  • Использование библиотеки Java с зарезервированными словами Scala
  • Как выбрать только видимые элементы с помощью XPath?
  • как проверить элемент в selenium3.6, поскольку firebug больше не является вариантом для FF 56?
  • Почему нужно предпочитать использование CSS поверх XPath в IE?
  • Давайте будем гением компьютера.