webelement until for expected conditions chrome selenium

for - wait until selenium java



wait.until(ExpectedConditions) ya no funciona en selenio (9)

Esta dependencia funciona para mí.

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

Hasta ahora utilicé la versión 2.45.0 de selenio y todas mis esperas se hicieron de esta manera:

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

Pero actualicé selenium a 3.1.0 y recibo el error:

"El método hasta (Predicado) en el tipo FluentWait no es aplicable a los argumentos (ExpectedCondition)"

Veo que de 2.45.0 a 3.1.0 algunas cosas están en desuso. Estoy tratando de investigar cuál es la mejor manera de hacerlo ahora, pero no estoy seguro. La mayoría de las cosas que encuentro en Google son información antigua que explica la misma forma que estaba usando hasta ahora.


Estaba enfrentando un tipo similar de problema relacionado con java.util.function después de hacer los cambios anteriores en la versión de guayaba como 21 y cambiar la versión de configuración del complemento maven a maven-compiler-plugin 3.11.81.8
Todavía estaba atrapado con el mismo error y la construcción fallaba. La solución para esto es eliminar la carpeta maven repo .m2 e importar el proyecto desde el principio y luego intentar hacer los siguientes cambios. Intente hacer una actualización de Maven después de hacer cambios en POM selenium java y la versión del servidor de selenio e intente con un maven limpio seguido de instalación de maven. De alguna manera, pom.xml todavía estaba usando la versión anterior de selenio en mi caso. Cambié la versión jdk usada a 1.8 después de hacer los cambios del plugin maven y ahora funciona perfectamente bien para mí.


Obtuve este error de compilación cuando cambié de selenio 2 (org.seleniumhq.selenium: selenium-java: 2.53.0) a selenio 3 (org.seleniumhq.selenium: selenium-java: 3.4.0).

Como se mencionó anteriormente, tuve que cambiar de guayaba 18 (guava: com.google.guava: 18.0) a guava 21 (guava: com.google.guava: 21.0).

Sin embargo, también tuve que configurar la compilación para usar Java 8 porque

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

donde java.util.function.Function debe provenir de Java 8 JDK.

Para la línea de comando, cambié mi variable de entorno JAVA_HOME a JAVA_HOME: C: / Program Files / Java / jdk1.8.0_131

Para Eclipse, Windows -> Preferencias, Java / JRE instalados, Agregar botón, Inicio de JRE: C: / Archivos de programa / Java / jdk1.8.0_131 y nombre de JRE: jdk1.8.0_131.


Puedes hacer algo así para el nuevo 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; } });


Si está utilizando Maven para administrar sus dependencias, verifique la jerarquía de dependencias y verifique la versión de guayaba en uso. JAR de selenium-remote-driver requiere la versión 21 de guayaba. Agregue una exclusión al artefacto que usa la versión de guayaba no deseada. Por ejemplo:

<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>


Tendría que agregar dependencia:

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

Esto es para que su código siga funcionando. Aunque, en última instancia, el código debería reescribirse para no usar FluentWait en desuso.


Tenga en cuenta que si está utilizando Maven, el orden de las dependencias es importante .

Por ejemplo:

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(); }

Este código funciona bien con las siguientes dependencias de 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>

pero puede fallar con uno reordenado:

<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>

En este caso porque google-api-client contiene:

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

como dependencia que sombrea la lib de guava en la lib de selenium .

En este caso el error es:

no existen instancias de tipo variable (s) V de modo que ExpectedCondition <> ...

método hasta en la clase org.openqa.selenium.support.ui.FluentWait no se puede aplicar a tipos dados; requerido: java.util.function.Function encontrado: org.openqa.selenium.support.ui.ExpectedCondition motivo: no puede inferir la (s) variable (s) de tipo V (disparidad de argumentos; org.openqa.selenium.support.ui.ExpectedCondition no puede ser convertido a java.util.function.Function)


Tuve el mismo problema.

Lo arreglé utilizando el método no obsoleto .until() de WebDriverWait y agregando lo siguiente a mi maven pom.xml:

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

Aparte de eso, mi código se ve exactamente como antes.

Para ser más específicos, ahora hay dos métodos .until() .

El viejo (que está en desuso):
public void until(final Predicate<T> isTrue) {}

Y el nuevo:
public <V> V until(Function<? super T, V> isTrue) {}


eliminé este error agregando guava 21 y quitando guava 20.0, cuando está usando selenio por encima de la versión 3.1.0