8.2. Ouvrir une page

Un objet page est habituellement conçu pour fonctionner avec une page web donnée. Quand la méthode open() est invoquée, le navigateur va s’ouvrir sur l’URL par défaut de la page.

L’annotation @DefaultUrl indique l’URL que ce test doit utiliser quand il est exécuté de manière isolée (par exemple depuis votre IDE). Généralement, cependant, la partie hôte de l’URL par défaut sera remplacée par la propriété webdriver.base.url ce qui vous permet de définir l’URL de base pour tous vos tests et de faciliter l’exécution de vos tests sur différents environnements, simplement en changeant cette valeur de propriété. Par exemple, dans la classe de test ci-dessus, définir webdriver.base.url à https://staging.mycompany.com fera que la page s’ouvrira à l’URL https://staging.mycompany.com/somepage.

Vous pouvez également définir des URL nommées qui peuvent être utilisées pour ouvrir la page web, assorties facultativement de paramètres. Par exemple, dans le code suivant, nous définissons une URL nommée open.issue qui accepte un unique paramètre:

@DefaultUrl("http://jira.mycompany.org")
@NamedUrls(
  {
    @NamedUrl(name = "open.issue", url = "http://jira.mycompany.org/issues/{1}")
  }
)
public class JiraIssuePage extends PageObject {
    ...
}

Vous pouvez alors ouvrir cette page sur l’URL http://jira.mycompany.org/issues/ISSUE-1 comme illustré ici:

page.open("open.issue", withParameters("ISSUE-1"));

Vous pouvez également omettre totalement l’URL de base dans la définition de l’URL nommée en vous reposant sur les valeurs par défaut:

@DefaultUrl("http://jira.mycompany.org")
@NamedUrls(
  {
    @NamedUrl(name = "open.issue", url = "/issues/{1}")
  }
)
public class JiraIssuePage extends PageObject {
    ...
}

Et naturellement, vous pouvez faire des définitions multiples:

@NamedUrls(
  {
          @NamedUrl(name = "open.issue", url = "/issues/{1}"),
          @NamedUrl(name = "close.issue", url = "/issues/close/{1}")
  }
)

Vous ne devriez jamais essayer d’implémenter la méthode open() vous-même. En fait, elle est final. Si vous avez besoin que votre page fasse quelque chose au chargement, comme attendre l’apparition d’un élément dynamique, vous pouvez utiliser l’annotation @WhenPageOpens. Les méthodes de PageObject dotées de cette annotation seront appelées (dans un ordre quelconque) après que l’URL aura été ouverte. Dans cette exemple, la méthode open() ne rendra pas la main tant que l'élément web dataSection ne sera pas visible:

@DefaultUrl("http://localhost:8080/client/list")
    public class ClientList extends PageObject {

     @FindBy(id="data-section");
     WebElement dataSection;
     ...

     @WhenPageOpens
     public void waitUntilTitleAppears() {
         element(dataSection).waitUntilVisible();
     }
}