java selenium selenium-webdriver webdriver fluentwait

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