84 votes

WebDriver - attendre un élément en utilisant Java

Je cherche quelque chose de similaire à waitForElementPresent pour vérifier si l'élément est affiché avant que je ne le clique. 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 par

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

Malheureusement, il attend parfois l'élément et parfois non. J'ai cherché pendant un certain temps 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 se terminer, il a dû attendre 10 fois 5, 50 secondes. Un peu trop. J'ai donc réglé l'attente implicite à 1 seconde et tout semblait aller bien jusqu'à maintenant. Parce que maintenant, certaines choses attendent 10 secondes avant de se terminer, mais d'autres se terminent après 1 seconde.

Comment couvrir l'attente de l'élément present/visible dans votre code ? Toute indication est appréciable.

167voto

Ashwin Prabhu Points 4833

Voici comment je procède 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 :

2 votes

Merci ! Si j'avais su plus tôt l'existence de ce cours, ma vie serait plus facile :)

0 votes

Comment puis-je incorporer votre code dans ce format ? @FindBy(how = How.ID, using = "signup-button") WebElement signUpButton; De plus, j'obtiens toujours un NPE avec votre code. On dirait qu'il essaie d'obtenir elementToBeClickable. Comment pouvons-nous utiliser cette méthode lorsque l'élément n'est pas chargé ?

16voto

anuja jain Points 758

Vous pouvez utiliser l'attente explicite ou l'attente fluide.

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

Vérifiez ceci TUTORIAL pour plus de détails.

5voto

andrej Points 186

Nous avons beaucoup de conditions de course avec elementToBeClickable . Voir https://github.com/angular/protractor/issues/2313 . Quelque chose de ce genre a fonctionné assez 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)
        );

-5voto

satender Points 1

L'instruction wait ci-dessus est un bel exemple d'attente explicite.

Les attentes explicites sont des attentes intelligentes qui se limitent à un élément Web particulier (comme mentionné dans le chemin d'accès X ci-dessus).

En utilisant des attentes explicites, vous dites essentiellement à WebDriver qu'il doit attendre au maximum X unités (ce que vous avez indiqué comme timeoutInSeconds) de temps avant d'abandonner.

6 votes

Ajoutez un extrait de code à votre réponse, car d'autres utilisateurs pourraient trier les réponses différemment et le contexte de "Au-dessus" pourrait changer pour eux.

0 votes

Cela fait 5 ans, et j'attends toujours l'extrait de code pour que cela puisse avoir un sens pour les autres qui sont à la recherche d'informations sur le sujet.

0 votes

Si quelqu'un souhaite en savoir plus sur cette réponse. guru99.com/implicit-explicit-waits-selenium.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X