Le design pattern Page Object
samedi 30 novembre 2019

Licence Creative Commons

Le design pattern "page object" est un modèle de conception très populaire qui permet de structurer un code de tests automatisés dans le but d'éviter les problèmes de maintenabilité.




Les méthodes d'une classe de type "page object" correspondent à des actions possibles sur une page. Une "page object" doit fournir des mécanismes pour manipuler, observer et rechercher des éléments d'une page.

Un exemple implementation du design patter page object

LoginTest.java

public class LoginTest extends BaseTest {

    @Test
    public void testLogin() {

        LoginPage loginPage = new LoginPage(webDriver);
        HomePage homePage = new HomePage(webDriver));

        loginPage.setUsername("administrator");
        loginPage.setPassword("password");
        loginPage.submit();

        if (homePage.isDisplayed()) {
            System.out.println("Login successful, home page displayed.");
        } else { 
            System.out.println("Login failed, home page not displayed.");
        }
    }
}

BaseTest.java

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.junit.After;
import org.junit.Before;

public class BaseTest {

    protected WebDriver webDriver;

    @Before
    public void setUp() {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        webDriver = new ChromeDriver();
        webDriver.get("http://yourapp.com");
    }

    @After
    public void tearDown() {
        if (webDriver != null) {
            webDriver.quit();
        }
    }
}

LoginPage.java

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class LoginPage {

    private WebDriver webDriver;

    private By usernameField = By.id("username");
    private By passwordField = By.id("password");
    private By submitButton = By.id("loginButton");

    public LoginPage(WebDriver webDriver) {
        this.webDriver = webDriver;
    }

    public void setUsername(String username) {
        WebElement usernameElement = webDriver.findElement(usernameField);
        usernameElement.clear();
        usernameElement.sendKeys(username);
    }
    
    public void setPassword(String password) {
        WebElement passwordElement = webDriver.findElement(passwordField);
        passwordElement.clear();
        passwordElement.sendKeys(password);
    }

    public void submit() {
        WebElement submitButtonElement = webDriver.findElement(submitButton);
        submitButtonElement.click();
    }
}

HomePage.java

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class HomePage {

    private WebDriver webDriver;
    
    private By home= By.id("home");

    public HomePage(WebDriver webDriver) {
        this.webDriver = webDriver;
    }

    public boolean isDisplayed() {
        WebElement homePageWebElement = webDriver.findElement(home);
        return homePageWebElement.isDisplayed();
    }
}

Les principaux avantages de ce modèle sont :

  • la réduction de la quantité de code dupliqué
  • la réutilisabilité des classes page object pour différents tests
  • une maintenance plus facile en cas de modification de l'interface utilisateur
  • un code plus lisible et plus compréhensible


Note: Une classe de type "page object" ne représente pas forcément une page entière mais peut représenter un élément significatif d'une page comme par exemple, le header d'une application web.



Références: