8.4. Travailler avec des pages asynchrones

Les pages asynchrones sont celles dont les champs ou les données ne sont pas tous affichés quand la page est chargée. Parfois, vous devez attendre que certains éléments apparaissent ou disparaissent pour lancer vos tests. Thucydides fournit certaines méthodes pratiques dans la classe PageObject pour faciliter la gestion de tels scénarios. Elles sont principalement conçues pour être utilisées dans les méthodes métier de vos objets page, mais dans les exemples, nous les utiliserons par appel externe sur un PageObject pour la clarté de la démonstration.

8.4.1. Vérifier si un élément est visible

Pour WebDriver, il existe une distinction entre le fait qu’un élément soit présent à l'écran (i.e. dans le code source HTML) et qu’il soit rendu (i.e. visible pour l’utilisateur). Vous pouvez également avoir besoin de savoir si un élément est visible à l'écran . Vous pouvez le faire de deux façons. La première possibilité est d’utiliser la méthode isElementVisible qui renvoie une valeur booléenne indiquant si l'élément est rendu (visible pour l’utilisateur) ou pas:

assertThat(indexPage.isElementVisible(By.xpath("//h2[.='A visible title']")), is(true));

ou

assertThat(indexPage.isElementVisible(By.xpath("//h2[.='An invisible title']")), is(false));

La seconde possibilité est de décider activement que l'élément doit être visible:

indexPage.shouldBeVisible(By.xpath("//h2[.='An invisible title']");

Si l'élément n’apparaît pas immédiatement, vous pouvez attendre qu’il apparaisse:

indexPage.waitForRenderedElements(By.xpath("//h2[.='A title that is not immediately visible']"));

Une alternative à la syntaxe précédente consiste à utiliser la méthode plus souple waitFor qui prend un sélecteur CSS ou XPath comme paramètre:

indexPage.waitFor("#popup"); //sélecteur CSS

indexPage.waitFor("//h2[.='A title that is not immediately visible']"); //xpath selector

Si vous voulez simplement vérifier si un élément est présent bien que pas forcément visible, vous pouvez utiliser waitForRenderedElementsToBePresent :

indexPage.waitForRenderedElementsToBePresent(By.xpath("//h2[.='A title that is not immediately visible']"));

ou sa variante plus expressive, waitForPresenceOf qui prend un sélecteur CSS ou XPath comme paramètre:

indexPage.waitForPresenceOf("#popup"); //CSS

indexPage.waitForPresenceOf("//h2[.='A title that is not immediately visible']"); //XPath

Vous pouvez également attendre qu’un élément disparaisse en utilisant waitForRenderedElementsToDisappear ou waitForAbsenceOf :

indexPage.waitForRenderedElementsToDisappear(By.xpath("//h2[.='A title that will soon disappear']"));

indexPage.waitForAbsenceOf("#popup");

indexPage.waitForAbsenceOf("//h2[.='A title that will soon disappear']");

Pour simplifier, vous pouvez également utiliser les méthodes waitForTextToAppear et waitForTextToDisappear:

indexPage.waitForTextToDisappear("A visible bit of text");

S’il y a plusieurs textes différents qui peuvent apparaître, vous pouvez utiliser waitForAnyTextToAppear ou waitForAllTextToAppear:

indexPage.waitForAnyTextToAppear("this might appear","or this", "or even this");

Si vous devez attendre qu’un élément parmi plusieurs possibles apparaisse, vous pouvez également utiliser la méthode waitForAnyRenderedElementOf:

indexPage.waitForAnyRenderedElementOf(By.id("color"), By.id("taste"), By.id("sound"));