Modèle d'objet de page et usine dans Selenium
⚡ Résumé intelligent
Modèle d'objet de page et fabrique de pages dans Selenium Définir un modèle de conception structuré pour la création de frameworks d'automatisation de tests robustes et maintenables. Il met l'accent sur la création de classes spécifiques à chaque page qui encapsulent les éléments Web et leurs comportements, réduisant ainsi la duplication et améliorant la lisibilité et l'évolutivité du code. Selenium scripts de test.

Qu’est-ce que le modèle Page Object ? Quels sont ses composants clés ?
Modèle d'objet de page (POM) Il s'agit d'un modèle de conception, couramment utilisé en automatisation des tests, qui crée un référentiel d'objets pour les éléments d'interface utilisateur web. L'avantage de ce modèle est qu'il réduit la duplication de code et améliore la maintenance des tests.
Dans ce modèle, chaque page web de l'application doit être associée à une classe Page. Cette classe Page identifie les éléments web (WebElements) de la page et contient les méthodes Page qui effectuent des opérations sur ces éléments. Le nom de ces méthodes doit refléter leur fonction ; par exemple, si un indicateur de chargement attend l'affichage de la passerelle de paiement, la méthode POM peut s'appeler waitForPaymentScreenDisplay().
Composants clés du modèle Page Object
- Classes de pages : Représentez chaque page web comme une classe distincte.
- Localisateurs : Identifier les éléments web à l'aide d'identifiants, de XPath ou de sélecteurs CSS.
- Méthodologie: Contenir des actions ou des opérations effectuées sur les éléments .page.
- Réutilisabilité: PromoRéutilisation du code et maintenance simplifiée pour l'ensemble des tests.
- Séparation des préoccupations: Maintient la structure de la page indépendante de la logique de test pour une meilleure organisation.
Pourquoi un modèle objet de page ?
Démarrer une automatisation d'interface utilisateur dans Selenium pilote web Ce n'est PAS une tâche difficile. Il suffit de trouver les éléments et d'effectuer des opérations dessus.
Voici un script simple pour se connecter à un site web.
Comme vous pouvez le constater, tout ce que nous faisons est de trouver des éléments et de remplir des valeurs pour ces éléments.
Ce script est long et sujet aux erreurs. Il paraît simple au départ, mais à mesure que la suite de tests s'étoffe, la gestion des modifications d'éléments devient complexe. Avec le temps, la suite de tests va s'étoffer. Plus vous ajouterez de lignes de code, plus la tâche se compliquera.
Le principal problème avec la maintenance des scripts est que si 10 scripts différents utilisent le même élément de page, avec toute modification de cet élément, vous devez modifier les 10 scripts. Cela prend du temps et est sujet aux erreurs.
Une meilleure approche pour la maintenance des scripts consiste à créer un fichier de classe distinct qui détectera, renseignera ou vérifiera les éléments web. Cette classe pourra ensuite être réutilisée dans plusieurs scripts de test interagissant avec le même élément. Ainsi, en cas de modification d'un élément web, il suffira de modifier un seul fichier de classe au lieu de dix scripts différents.
Cette approche est appelée modèle d'objet de page dans SeleniumCela permet de rendre le code plus lisible, plus facile à maintenir et plus réutilisable.
👉 Inscrivez-vous gratuitement en direct Selenium Projet
Avantages du POM
- Le modèle de conception d'objet de page indique que les opérations et les flux dans l'interface utilisateur doivent être séparés de la vérification. Ce concept rend notre code plus propre et facile à comprendre.
- Le deuxième avantage est que le référentiel d'objets est indépendant des cas de test ; nous pouvons donc utiliser le même référentiel d'objets à des fins différentes avec des outils différents. Par exemple, nous pouvons intégrer le modèle Page Object dans Selenium au TestNG/JUnit pour fonctionnel Tests et en même temps avec JBehave/Cucumber pour les tests d'acceptation.
- Code devient plus concis et optimisé car il réutilise les méthodes de page dans les classes POM.
- Les méthodes reçoivent des noms plus explicites, facilement associables à l'opération effectuée dans l'interface utilisateur. Par exemple, si après avoir cliqué sur le bouton, on arrive sur la page d'accueil, le nom de la méthode sera « gotoHomePage() ».
Comment implémenter POM dans Selenium?
PLog simple dans la structure fondamentale d'un framework Page Object Model, où les whereManagereIDElements de AUT Les méthodes qui agissent sur ces éléments Web sont consignées dans un fichier journal. Une tâche comme la vérification doit être traitée séparément, dans le cadre des méthodes de test.
Exemple complet
Cas de test: Allez dans GuruSite de démonstration 99.
Étape 1) Allez à GuruSite de démonstration 99
Étape 2) Sur la page d'accueil, vérifiez que le texte «Guru« 99 Bank » est présent
Étape 3) Connectez-vous à l'application
Étape 4) Vérifiez que la page d'accueil contient le texte « Manger Id : démo »
Dans cet exemple, nous avons affaire à deux pages :
- Page de connexion
- Page d'accueil (affichée une fois connecté)
En conséquence, nous créons 2 POM dans Selenium les classes
Guru99 Page de connexion POM
package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99Login {
WebDriver driver;
By user99GuruName = By.name("uid");
By password99Guru = By.name("password");
By titleText =By.className("barone");
By login = By.name("btnLogin");
public Guru99Login(WebDriver driver){
this.driver = driver;
}
//Set user name in textbox
public void setUserName(String strUserName){
driver.findElement(user99GuruName).sendKeys(strUserName);
}
//Set password in password textbox
public void setPassword(String strPassword){
driver.findElement(password99Guru).sendKeys(strPassword);
}
//Click on the login button
public void clickLogin(){
driver.findElement(login).click();
}
//Get the title of Login Page
public String getLoginTitle(){
return driver.findElement(titleText).getText();
}
/**
* This POM method allows the test case to perform the login operation
* @param strUserName
* @param strPasword
* @return
*/
public void loginToGuru99(String strUserName,String strPasword){
//Fill user name
this.setUserName(strUserName);
//Fill password
this.setPassword(strPasword);
//Click Login button
this.clickLogin();
}
}
Guru99 Page d'accueil POM dans Selenium
package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99HomePage {
WebDriver driver;
By homePageUserName = By.xpath("//table//tr[@class='heading3']");
public Guru99HomePage(WebDriver driver){
this.driver = driver;
}
//Get the User name from Home Page
public String getHomePageDashboardUserName(){
return driver.findElement(homePageUserName).getText();
}
}
Guru99 POM simples en Selenium Cas de test
package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import pages.Guru99HomePage;
import pages.Guru99Login;
public class Test99GuruLogin {
String driverPath = "C:\\geckodriver.exe";
WebDriver driver;
Guru99Login objLogin;
Guru99HomePage objHomePage;
@BeforeTest
public void setup(){
System.setProperty("webdriver.gecko.driver", driverPath);
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("https://demo.guru99.com/V4/");
}
/**
* This test case will login in https://demo.guru99.com/V4/
* Verify login page title as guru99 bank
* Login to application
* Verify the home page using Dashboard message
*/
@Test(priority=0)
public void test_Home_Page_Appear_Correct(){
//Create Login Page object
objLogin = new Guru99Login(driver);
//Verify login page title
String loginPageTitle = objLogin.getLoginTitle();
Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
//login to application
objLogin.loginToGuru99("mgr123", "mgr!23");
// go the next page
objHomePage = new Guru99HomePage(driver);
//Verify home page
Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
}
Qu’est-ce que Page Factory Selenium?
Usine de pages dans Selenium est un concept de cadre de modèle d'objet de page intégré pour Selenium Ce WebDriver améliore la maintenabilité en réduisant les recherches répétitives d'éléments grâce aux annotations, et non en optimisant la vitesse d'exécution. Il sert à initialiser les objets Page ou à instancier l'objet Page lui-même. Il permet également d'initialiser les éléments de la classe Page sans utiliser la méthode `FindElement`.
Ici également, nous suivons le concept de séparation du référentiel d'objets de page et des méthodes de test. De plus, avec l'aide de la classe PageFactory dans Selenium, nous utilisons des annotations @FindBy Pour trouver les éléments Web, nous utilisons la méthode initElements afin de les initialiser.
@FindBy Peut accepter tagName, partialLinkText, nom, linkText, identifiant, css, className, xpath comme attributs.
Regardons le même exemple que ci-dessus en utilisant Page Factory
Guru99 Page de connexion avec Page Factory
package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99Login {
/**
* All WebElements are identified by @FindBy annotation
*/
WebDriver driver;
@FindBy(name="uid")
WebElement user99GuruName;
@FindBy(name="password")
WebElement password99Guru;
@FindBy(className="barone")
WebElement titleText;
@FindBy(name="btnLogin")
WebElement login;
public Guru99Login(WebDriver driver){
this.driver = driver;
//This initElements method will create all WebElements
PageFactory.initElements(driver, this);
}
//Set user name in textbox
public void setUserName(String strUserName){
user99GuruName.sendKeys(strUserName);
}
//Set password in password textbox
public void setPassword(String strPassword){
password99Guru.sendKeys(strPassword);
}
//Click on login button
public void clickLogin(){
login.click();
}
//Get the title of Login Page
public String getLoginTitle(){
return titleText.getText();
}
/**
* This POM method will be exposed in test case to login in the application
* @param strUserName
* @param strPasword
* @return
*/
public void loginToGuru99(String strUserName,String strPasword){
//Fill user name
this.setUserName(strUserName);
//Fill password
this.setPassword(strPasword);
//Click Login button
this.clickLogin();
}
}
GuruPage d'accueil 99 avec Page Factory
package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99HomePage {
WebDriver driver;
@FindBy(xpath="//table//tr[@class='heading3']")
WebElement homePageUserName;
public Guru99HomePage(WebDriver driver){
this.driver = driver;
//This initElements method will create all WebElements
PageFactory.initElements(driver, this);
}
//Get the User name from Home Page
public String getHomePageDashboardUserName(){
return homePageUserName.getText();
}
}
Guru99 cas de test avec le concept de fabrique de pages
package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import PageFactory.Guru99HomePage;
import PageFactory.Guru99Login;
public class Test99GuruLoginWithPageFactory {
String driverPath = "C:\\geckodriver.exe";
WebDriver driver;
Guru99Login objLogin;
Guru99HomePage objHomePage;
@BeforeTest
public void setup(){
System.setProperty("webdriver.gecko.driver", driverPath);
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("https://demo.guru99.com/V4/");
}
/**
* This test go to https://demo.guru99.com/V4/
* Verify login page title as guru99 bank
* Login to application
* Verify the home page using Dashboard message
*/
@Test(priority=0)
public void test_Home_Page_Appear_Correct(){
//Create Login Page object
objLogin = new Guru99Login(driver);
//Verify login page title
String loginPageTitle = objLogin.getLoginTitle();
Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
//login to application
objLogin.loginToGuru99("mgr123", "mgr!23");
// go the next page
objHomePage = new Guru99HomePage(driver);
//Verify home page
Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
}
}
La structure complète du projet ressemblera au diagramme :
AjaxElementLocatorFactory
AjaxElementLocatorFactory est un concept de chargement paresseux de PageFactory dans SeleniumIl sert à trouver les éléments web uniquement lorsqu'ils sont utilisés dans une opération. Il attribue un délai d'expiration aux éléments web de la classe d'objet page. L'un des principaux avantages de l'utilisation du modèle PageFactory est… Selenium est la classe AjaxElementLocatorFactory.
Ici, lorsqu'une opération est effectuée sur un élément, l'attente de sa visibilité commence à partir de ce moment précis. Si l'élément n'est pas trouvé dans l'intervalle de temps imparti, Cas de test l'exécution lèvera l'exception 'NoSuchElementException'.
Par exemple :
AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(factory, this);
Téléchargez le Selenium Fichiers de projet pour la démo de ce didacticiel











