WebDriver: attendere l’elemento utilizzando Java

Sto cercando qualcosa di simile a waitForElementPresent per verificare se l’elemento viene visualizzato prima di fare clic su di esso. Ho pensato che questo può essere fatto da implicitWait , così ho usato il seguente:

 driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 

e quindi fai clic su

 driver.findElement(By.id(prop.getProperty(vName))).click(); 

Sfortunatamente, a volte attende l’elemento e talvolta no. Ho cercato per un po ‘e ho trovato questa soluzione:

 for (int second = 0;; second++) { Thread.sleep(sleepTime); if (second >= 10) fail("timeout : " + vName); try { if (driver.findElement(By.id(prop.getProperty(vName))) .isDisplayed()) break; } catch (Exception e) { writeToExcel("data.xls", e.toString(), parameters.currentTestRow, 46); } } driver.findElement(By.id(prop.getProperty(vName))).click(); 

E ha aspettato tutto bene, ma prima di scadere doveva aspettare 10 volte 5, 50 secondi. Un po ‘troppo. Così ho impostato implicitamente l’attesa per 1sec e tutto sembrava a posto fino ad ora. Perché ora alcune cose aspettano 10 secondi prima del timeout ma alcune altre cose scadono dopo 1 secondo.

Come copri l’elemento in attesa presente / visibile nel tuo codice? Ogni suggerimento è apprezzabile.

Questo è come lo faccio nel mio codice.

 WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds); wait.until(ExpectedConditions.visibilityOfElementLocated(By.id)); 

o

 wait.until(ExpectedConditions.elementToBeClickable(By.id)); 

per essere precisi.

Guarda anche:

  • org.openqa.selenium.support.ui.Condizioni previste per scorciatoie simili per vari scenari di attesa.
  • org.openqa.selenium.support.ui.WebDriverWait per i suoi vari costruttori.

Puoi usare Explicit Wait o Fluent Wait

Esempio di attesa esplicita –

 WebDriverWait wait = new WebDriverWait(WebDriverRefrence,20); WebElement aboutMe; aboutMe= wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("about_me"))); 

Esempio di attesa fluente –

 Wait wait = new FluentWait(driver) .withTimeout(20, TimeUnit.SECONDS) .pollingEvery(5, TimeUnit.SECONDS) .ignoring(NoSuchElementException.class); WebElement aboutMe= wait.until(new Function() { public WebElement apply(WebDriver driver) { return driver.findElement(By.id("about_me")); } }); 

Controlla questo TUTORIAL per maggiori dettagli.

Stiamo avendo molte condizioni di gara con elementToBeClickable . Vedere https://github.com/angular/protractor/issues/2313 . Qualcosa lungo queste linee funzionava abbastanza bene anche se un po ‘di forza bruta

 Awaitility.await() .atMost(timeout) .ignoreException(NoSuchElementException.class) .ignoreExceptionsMatching( Matchers.allOf( Matchers.instanceOf(WebDriverException.class), Matchers.hasProperty( "message", Matchers.containsString("is not clickable at point") ) ) ).until( () -> { this.driver.findElement(locator).click(); return true; }, Matchers.is(true) ); 

L’attestazione sopra l’attesa è un bell’esempio di attesa esplicita.

Poiché Explicit attende sono attese intelligenti che sono confinate a un particolare elemento web (come menzionato sopra il percorso x).

Usando le attese esplicite stai praticamente dicendo a WebDriver al massimo è di aspettare le unità X (qualunque cosa tu abbia dato come timeoutInSeconds) di tempo prima che si arrenda.