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.

  • Concept de base: Chaque page de l'application correspond à une classe de page dédiée contenant à la fois les éléments Web et les actions effectuées sur ceux-ci, permettant une séparation claire entre la structure de l'interface utilisateur et la logique de test.
  • Objectif de mise en œuvre : Le POM favorise une gestion centralisée et réutilisable des éléments : les modifications apportées aux éléments d’une page ne nécessitent la mise à jour que d’une seule classe au lieu de plusieurs scripts.
  • Avantage de conception : Ce modèle garantit des référentiels d'objets plus propres, modulaires et indépendants des outils, qui peuvent s'intégrer à des frameworks tels que TestNG, JUnit, Cucumber, ou JBehave.
  • Convention de dénomination : Les méthodes des classes de page doivent refléter les actions réelles de l'interface utilisateur (par exemple, gotoHomePage()), renforçant la clarté sémantique dans les flux de travail d'automatisation.
  • Structure améliorée : Page Factory affine le POM en utilisant @FindBy annotations et PageFactory.initElements() pour l'initialisation automatique des éléments Web, éliminant les tâches répétitives findElement appels.
  • Optimisation des performances: AjaxElementLocatorFactory introduit le chargement différé — les éléments ne sont localisés que lorsqu'ils sont consultés — améliorant ainsi l'efficacité d'exécution et gérant avec élégance le comportement dynamique des pages.
  • Résultat: Cette approche unifiée aboutit à une architecture d'automatisation des tests maintenable, lisible et évolutive, alignée sur les normes modernes. Selenium pratiques.

Modèle d'objet de page

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.

Modèle d'objet de page

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.

Modèle d'objet de page

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.

 Modèle d'objet de page

👉 Inscrivez-vous gratuitement en direct Selenium Projet

Avantages du POM

  1. 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.
  2. 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.
  3. Code devient plus concis et optimisé car il réutilise les méthodes de page dans les classes POM.
  4. 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.

Implémenter POM

Exemple complet

Cas de test: Allez dans GuruSite de démonstration 99.

Étape 1) Allez à GuruSite de démonstration 99

Implémenter POM

Étape 2) Sur la page d'accueil, vérifiez que le texte «Guru« 99 Bank » est présent

Implémenter POM

Étape 3) Connectez-vous à l'application

Implémenter POM

Étape 4) Vérifiez que la page d'accueil contient le texte « Manger Id : démo »

Implémenter POM

Dans cet exemple, nous avons affaire à deux pages :

  1. Page de connexion
  2. 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.

Usine de pages dans Selenium

@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 :

Usine de pages dans Selenium

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'.

Usine de localisation AjaxElement

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

FAQ

Le modèle Page Object est un modèle de conception quitracLes éléments de la page web sont répartis en classes distinctes. Cela simplifie l'automatisation en séparant les interactions avec l'interface utilisateur de la logique de test, ce qui favorise la clarté, l'évolutivité et réduit la duplication de code.

In SeleniumLe POM représente chaque page web comme une classe dédiée contenant des localisateurs et des actions. Il encapsule les éléments d'interface utilisateur, permettant ainsi aux scripts de test de rester indépendants des modifications de la structure sous-jacente de la page.

POM n'est pas un framework autonome, mais un modèle de conception. Il peut être intégré à n'importe quel framework d'automatisation pour structurer efficacement les tests, garantissant ainsi une meilleure organisation, une réutilisabilité accrue et une maintenabilité facilitée.

Le POM est un principe de conception qui consiste à modéliser chaque page web comme une classe dotée de localisateurs et de méthodes définis. Il découple la logique de test des éléments d'interface utilisateur, améliorant ainsi la lisibilité, l'évolutivité et la maintenance à long terme.

POM définit la structure de conception de la page abstraction, tandis que Page Factory fournit des annotations et des méthodes (@FindByPage Factory permet d'initialiser efficacement les éléments web. Il s'agit d'une amélioration de l'implémentation du POM.

Le POM centralise les localisateurs d'éléments et les actions de page dans des classes dédiées. Toute modification de l'interface utilisateur ne nécessite de mises à jour qu'à un seul endroit, ce qui minimise les reprises, améliore la réutilisation du code et accélère la maintenance des tests.

Oui. Les générateurs de tests pilotés par l'IA peuvent créer automatiquement des classes POM en analysant les hiérarchies d'interface utilisateur, en maintenant une séparation logique des préoccupations tout en accélérant la création de tests de bout en bout.

POM favorise l'utilisation de composants de test modulaires et réutilisables, permettant l'intégration avec des outils de maintenance de tests basés sur l'IA qui mettent à jour automatiquement les localisateurs, réduisant ainsi la fragilité des scripts et les coûts de maintenance.

Résumez cet article avec :