web-dev-qa-db-fra.com

Équivalent de waitForVisible / waitForElementPresent dans les tests Selenium WebDriver en utilisant Java?

Avec les tests "HTML" Selenium (créés avec Selenium IDE ou manuellement), vous pouvez utiliser certaines commandes très pratiques comme WaitForElementPresent ou WaitForVisible.

<tr>
    <td>waitForElementPresent</td>
    <td>id=saveButton</td>
    <td></td>
</tr>

Lors du codage des tests Selenium dans Java (Webdriver/Selenium RC - je ne suis pas sûr de la terminologie utilisée ici)), existe-t-il quelque chose de similaire intégré ?

Par exemple, pour vérifier qu’une boîte de dialogue (dont l’ouverture prend du temps) est visible ...

WebElement dialog = driver.findElement(By.id("reportDialog"));
assertTrue(dialog.isDisplayed());  // often fails as it isn't visible *yet*

Quel est le moyen le plus propre robuste de coder cette vérification?

Ajouter des appels Thread.sleep() dans tous les sens serait laide et fragile, et rouler soi-même tout en boucle semble assez maladroit aussi ...

53
Jonik

Attentes implicites et explicites

Attente implicite

Une attente implicite consiste à demander à WebDriver d'interroger le DOM pendant un certain temps lors de la recherche d'un ou plusieurs éléments s'ils ne sont pas immédiatement disponibles. Le paramètre par défaut est 0. Une fois défini, l'attente implicite est définie pour la durée de vie de l'instance d'objet WebDriver.

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

Attente explicite + Conditions attendues

Une attente explicite est le code que vous définissez pour attendre qu'une certaine condition se produise avant de continuer dans le code. Thread.sleep () est le cas le plus défavorable. Il définit la condition sur une période d'attente exacte. Certaines méthodes pratiques fournies vous aident à écrire du code qui n'attendra que le temps nécessaire. WebDriverWait en combinaison avec ExpectedCondition est un moyen d'y parvenir.

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.id("someid")));
95
Petr Janeček
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

Cela attend jusqu'à 10 secondes avant de générer une exception TimeoutException ou s'il trouve que l'élément le renverra dans un délai de 0 à 10 secondes. WebDriverWait appelle par défaut ExpectedCondition toutes les 500 millisecondes jusqu'à ce qu'il soit renvoyé avec succès. Un retour réussi correspond à un type ExpectedCondition. Boolean return true ou une valeur non null pour tous les autres types ExpectedCondition.


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

L'élément est cliquable - il est affiché et activé.

De Documents WebDriver: Attentes explicites et implicites

8
user1710861

En réalité, vous ne voulez probablement pas que le test soit exécuté indéfiniment. Vous voulez juste attendre plus longtemps avant que la bibliothèque décide que l'élément n'existe pas. Dans ce cas, la solution la plus élégante consiste à utiliser l'attente implicite, conçue pour cela:

driver.manage().timeouts().implicitlyWait( ... )
0
Mike Kwan

Une autre façon d’attendre un certain montant, par exemple 10 secondes de temps pour l’affichage de l’élément, comme indiqué ci-dessous:

(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.findElement(By.id("<name>")).isDisplayed();

            }
        });
0
Veeksha A V