
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.javapublic 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: