El tipo FluentWait no es genérico; no se puede parametrizar con argumentos de error<WebDriver> para la clase FluentWait a través de Selenium y Java
selenium-webdriver (3)
Estoy trabajando con
Selenium Standalone Server 3.0.1
.
Estoy tratando de agregar una
Explicit Wait
a mi código para detectar un elemento a través de xpath cuando el elemento se vuelve visible.
Para obtener ayuda de Java, busqué el código fuente de
Selenium Standalone Server 3.0.1
pero no pude encontrarlo.
Encontré el código fuente en la versión
selenium-java-2.53.1
.
Lo descargué y encontré
selenium-java-2.53.1-srcs
y lo agregué a mi
Eclipse IDE
.
Con la ayuda de
FluentWait
, simplemente
FluentWait
y pegué el código en mi
Eclipse IDE
y cambié los nombres de las variables.
El código de muestra en la documentación es como:
// Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 5 seconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("foo"));
}
});
Pero cuando implemente este código, simplemente copie y pegue:
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
WebElement element = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.xpath("//p[text()=''WebDriver'']"));
}
});
Recibo un error en la clase
FluentWait
ya que
The type FluentWait is not generic; it cannot be parameterized with arguments <WebDriver>
The type FluentWait is not generic; it cannot be parameterized with arguments <WebDriver>
Aquí está la lista de mis importaciones:
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Wait;
import com.google.common.base.Function;
¿Puede alguien ayudarme por favor?
Actualizar
Se agregó una answer con respecto al constructor modificado de FluentWait en Selenium v3.11.0
Con la disponibilidad de Selenium v3.11.0, el constructor de FluentWait ha cambiado. Ahora el tipo de argumento para withTimeout y pollingEvery es Duration . Aquí está la implementación modificada:
import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import com.google.common.base.Function;
public class Fluent_Wait {
public static void main(String[] args) {
System.setProperty("webdriver.gecko.driver", "C://Utility//BrowserDrivers//geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.get("https://www.google.com");
// Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 500 milliseconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(Duration.ofSeconds(30))
.pollingEvery(Duration.ofMillis(500))
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.name("q"));
}
});
}
}
Debe especificar la condición esperada dentro de la espera a continuación: el código modificado que podría resolver su problema.
Código:
import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;
public class DummyClass
{
WebDriver driver;
@Test
public void test()
{
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
until(new Function<WebElement, Boolean>()
{
public Boolean apply(WebElement element)
{
return element.getText().endsWith("04");
}
private void until(Function<WebElement, Boolean> function)
{
driver.findElement(By.linkText("Sample Post2"));
}
}
}
}
La solución más simple es usar la implementación de otro método:
withTimeout(Duration.ofSeconds(10))
.pollingEvery(Duration.ofSeconds(2))
El formulario
withTimeout(Duration timeOut)
todavía se usa y no está en desuso