WebDriver-attendre l'élément en utilisant 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 par implicitWait, j'ai donc utilisé ce qui suit:

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 j'ai 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 chronométrer, il a dû attendre 10 fois 5, 50 secondes. Un peu beaucoup. J'ai donc défini implicitement wait sur 1sec et tout semblait aller bien jusqu'à maintenant. Parce que maintenant certaines choses attendent 10s avant le délai d'attente, mais d'autres choses s'arrêtent après 1s.

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

Author: Sanchit, 2012-07-31

4 answers

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 aussi:

 111
Author: Ashwin Prabhu, 2016-10-03 18:38:55

Vous pouvez utiliser explicitement attendre ou Fluide Attendre

Exemple d'attente explicite -

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

Exemple d'attente fluide -

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"));     
 }  
});  

Consultez ce TUTORIEL pour plus de détails.

 5
Author: anuja jain, 2016-10-25 13:02:31

Nous avons beaucoup de conditions de course avec elementToBeClickable. Voir https://github.com/angular/protractor/issues/2313 . 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)
        );
 2
Author: andrej, 2017-07-24 07:20:47

Au-dessus de l'instruction wait est un bel exemple d'attente explicite.

Comme Explicit waits sont des attentes intelligentes qui sont confinées à un élément Web particulier(comme mentionné dans x-path ci-dessus).

En utilisant explicit waits, vous dites essentiellement à WebDriver au maximum qu'il doit attendre X unités(tout ce que vous avez donné comme timeoutInSeconds) de temps avant qu'il n'abandonne.

 -1
Author: satender, 2014-10-27 04:14:21