web-dev-qa-db-fra.com

WebDriver - attend l'élément avec Java

Je cherche quelque chose de similaire à waitForElementPresent pour vérifier si l'élément est affiché avant de cliquer dessus. Je pensais que cela pouvait être fait avec implicitWait, alors j'ai utilisé:

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

puis cliquez sur

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

Malheureusement, parfois, il attend l'élément et parfois pas. J'ai cherché pendant un moment et trouvé cette solution:

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

Et il a bien attendu, mais avant de s’exécuter, il a dû attendre 10 fois 5, 50 secondes. Un peu trop. Donc, je mis l'attente implicite à 1sec et tout semblait bien aller jusqu'à maintenant. Parce que maintenant, certaines choses attendent 10 secondes avant l'expiration du délai, mais d'autres choses expirent après 1s.

Comment couvrez-vous l'attente d'un élément présent/visible dans votre code? Tout indice est appréciable.

68
tom

Voici comment je le fais dans mon code.

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

ou

wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>));

pour être précis.

Voir également:

135
Ashwin Prabhu

Vous pouvez utiliser l'attente explicite ou l'attente courante

Exemple d'attente explicite -

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

Exemple d'attente courante -

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)                            
.withTimeout(20, TimeUnit.SECONDS)          
.pollingEvery(5, TimeUnit.SECONDS)          
.ignoring(NoSuchElementException.class);    

  WebElement aboutMe= wait.until(new Function<WebDriver, WebElement>() {       
public WebElement apply(WebDriver driver) { 
return driver.findElement(By.id("about_me"));     
 }  
});  

Cochez cette TUTORIAL pour plus de détails.

9
anuja jain

Nous avons beaucoup de conditions de course avec elementToBeClickable. Voir https://github.com/angular/protractor/issues/231 . Quelque chose dans ce sens a fonctionné raisonnablement bien même si un peu de force brute

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)
        );
5
andrej