webelement until example java selenium selenium-webdriver wait predicate

java - until - ¿Cómo esperar hasta que un elemento esté presente en el selenio?



wait webelement (5)

Estoy intentando hacer que Selenium espere un elemento que se agrega dinámicamente al DOM después de cargar la página. Intenté esto:

fluentWait.until(ExpectedConditions.presenceOfElement(By.id("elementId"));

En caso de que ayude, aquí está fluentWait :

FluentWait fluentWait = new FluentWait<>(webDriver) { .withTimeout(30, TimeUnit.SECONDS) .pollingEvery(200, TimeUnit.MILLISECONDS); }

Pero arroja una NoSuchElementException : parece que presenceOfElement espera que el elemento esté allí, por lo que está dañado. Esto debe ser pan y mantequilla para Selenium y no quiero reinventar la rueda ... ¿alguien podría sugerir una alternativa, idealmente sin rodar mi propio Predicate ?


Debe hacer una llamada ignoring con excepción para ignorarlo mientras el WebDriver esperará.

FluentWait<WebDriver> fluentWait = new FluentWait<>(driver) .withTimeout(30, TimeUnit.SECONDS) .pollingEvery(200, TimeUnit.MILLISECONDS) .ignoring(NoSuchElementException.class);

Consulte la documentación de FluentWait para obtener más información. Pero ten en cuenta que esta condición ya está implementada en ExpectedConditions por lo que debes usar

WebElement element = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.elementToBeClickable(By.id("someid")));

El tutorial básico para esperar se puede encontrar here .


FluentWait lanza una NoSuchElementException en caso de confusión

org.openqa.selenium.NoSuchElementException;

con

java.util.NoSuchElementException

en

.ignoring(NoSuchElementException.class)


Permítame recomendarle que use la biblioteca de Selenide . Permite escribir pruebas mucho más concisas y legibles. Puede esperar la presencia de elementos con una sintaxis mucho más corta:

$("#elementId").shouldBe(visible);

Aquí hay un proyecto de muestra para probar la búsqueda de Google: https://github.com/selenide-examples/google


WebDriverWait wait = new WebDriverWait(driver,5) wait.until(ExpectedConditions.visibilityOf(element));

puede usar esto como un tiempo antes de que se cargue todo el código de la página y arroje errores. el tiempo está en segundo


public WebElement fluientWaitforElement(WebElement element, int timoutSec, int pollingSec) { FluentWait<WebDriver> fWait = new FluentWait<WebDriver>(driver).withTimeout(timoutSec, TimeUnit.SECONDS) .pollingEvery(pollingSec, TimeUnit.SECONDS) .ignoring(NoSuchElementException.class, TimeoutException.class).ignoring(StaleElementReferenceException.class); for (int i = 0; i < 2; i++) { try { //fWait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//*[@id=''reportmanager-wrapper'']/div[1]/div[2]/ul/li/span[3]/i[@data-original--title=''We are processing through trillions of data events, this insight may take more than 15 minutes to complete.'']"))); fWait.until(ExpectedConditions.visibilityOf(element)); fWait.until(ExpectedConditions.elementToBeClickable(element)); } catch (Exception e) { System.out.println("Element Not found trying again - " + element.toString().substring(70)); e.printStackTrace(); } } return element; }