Modèle d'objet de page (POM) & Tutoriel Page Factory dans Selenium

Table des matières:

Anonim

Qu'est-ce que le modèle d'objet de page?

Le modèle d'objet de page (POM) est un modèle de conception, couramment utilisé dans l'automatisation des tests, qui crée un référentiel d'objets pour les éléments de l'interface utilisateur Web. L'avantage du modèle est qu'il réduit la duplication de code et améliore la maintenance des tests.

Dans ce modèle, pour chaque page Web de l'application, il doit y avoir une classe de page correspondante. Cette classe Page identifie les WebElements de cette page Web et contient également des méthodes Page qui effectuent des opérations sur ces WebElements. Le nom de ces méthodes doit être donné en fonction de la tâche qu'elles exécutent, c'est-à-dire que si un chargeur attend que la passerelle de paiement apparaisse, le nom de la méthode POM peut être waitForPaymentScreenDisplay ().

Dans ce didacticiel, vous apprendrez-

  • Pourquoi le modèle d'objet de page?
  • Avantages du POM
  • Comment mettre en œuvre le POM?
  • Qu'est-ce que Page Factory?
  • Guru99 TestCase avec le concept Page Factory
  • AjaxElementLocatorFactory

Pourquoi le modèle d'objet de page?

Démarrer une automatisation de l'interface utilisateur dans Selenium WebDriver n'est PAS une tâche difficile. Vous avez juste besoin de trouver des éléments, d'effectuer des opérations dessus.

Considérez ce simple script pour vous 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.

Ceci est un petit script. La maintenance des scripts semble facile. Mais avec le temps, la suite de tests augmentera. Au fur et à mesure que vous ajoutez de plus en plus de lignes à votre code, les choses deviennent difficiles.

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 source d'erreurs.

Une meilleure approche de la maintenance des scripts consiste à créer un fichier de classe distinct qui trouverait les éléments Web, les remplirait ou les vérifierait. Cette classe peut être réutilisée dans tous les scripts utilisant cet élément. À l'avenir, s'il y a un changement dans l'élément Web, nous devons effectuer le changement dans un seul fichier de classe et non dans 10 scripts différents.

Cette approche est appelée modèle d'objet de page dans Selenium. Cela permet de rendre le code plus lisible, maintenable et réutilisable.

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 dans un but différent avec différents outils. Par exemple, nous pouvons intégrer Page Object Model dans Selenium avec TestNG / JUnit pour les tests fonctionnels et en même temps avec JBehave / Cucumber pour les tests d'acceptation.
  3. Le code devient moins et optimisé en raison des méthodes de page réutilisables dans les classes POM.
  4. Les méthodes obtiennent des noms plus réalistes qui peuvent être facilement mappés avec l'opération se déroulant dans l'interface utilisateur. c'est-à-dire que si après avoir cliqué sur le bouton on arrive sur la page d'accueil, le nom de la méthode sera comme 'gotoHomePage ()'.

Comment mettre en œuvre le POM?

POM simple:

Il s'agit de la structure de base du cadre de modèle d'objet de page où tous les éléments Web de l' AUT et la méthode qui opèrent sur ces éléments Web sont conservés dans un fichier de classe.Une tâche comme la vérification doit être séparée dans le cadre des méthodes de test.

Exemple complet

TestCase: accédez au site de démonstration Guru99.

Étape 1) Accédez au site de démonstration Guru99
Étape 2) Sur la page d'accueil, vérifiez que le texte "Guru99 Bank" est présent
Étape 3) Connectez-vous à l'application
Étape 4) Vérifiez que la page d'accueil contient du texte comme "Manger Id: demo"

Ici, nous avons affaire à 2 pages

  1. Page de connexion
  2. Page d'accueil (affichée une fois que vous vous êtes connecté)

En conséquence, nous créons 2 POM dans les classes Selenium

Page de connexion Guru99 POM

pages de package;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;public class Guru99Login {Pilote WebDriver;Par user99GuruName = By.name ("uid");Par mot de passe99Guru = Par.nom ("mot de passe");Par titleText = By.className ("barone");Par login = By.name ("btnLogin");public Guru99Login (pilote WebDriver) {this.driver = pilote;}// Définir le nom d'utilisateur dans la zone de textepublic void setUserName (String strUserName) {driver.findElement (user99GuruName) .sendKeys (strUserName);}// Définir le mot de passe dans la zone de texte du mot de passepublic void setPassword (String strPassword) {driver.findElement (password99Guru) .sendKeys (strPassword);}// Cliquez sur le bouton de connexionpublic void clickLogin () {driver.findElement (connexion) .click ();}// Récupère le titre de la page de connexionpublic String getLoginTitle () {return driver.findElement (titleText) .getText ();}/ *** Cette méthode POM sera exposée dans le cas de test pour se connecter à l'application* @param strUserName* @param strPasword* @revenir* /public void loginToGuru99 (String strUserName, String strPasword) {// Remplissez le nom d'utilisateurthis.setUserName (strUserName);// Remplissez le mot de passethis.setPassword (strPasword);// Cliquez sur le bouton Connexionthis.clickLogin ();}}

Page d'accueil de Guru99 POM dans Selenium

pages de package;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;public class Guru99HomePage {Pilote WebDriver;By homePageUserName = By.xpath ("// table // tr [@ class = 'titre3']");public Guru99HomePage (pilote WebDriver) {this.driver = pilote;}// Récupère le nom d'utilisateur de la page d'accueilpublic String getHomePageDashboardUserName () {return driver.findElement (homePageUserName) .getText ();}}

Guru99 Simple POM dans un cas de test de sélénium

test de colis;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";Pilote WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);pilote = nouveau FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Ce cas de test se connectera à http://demo.guru99.com/V4/* Vérifiez le titre de la page de connexion en tant que banque guru99* Connectez-vous à l'application* Vérifiez la page d'accueil à l'aide du message du tableau de bord* /@Test (priorité = 0)public void test_Home_Page_Appear_Correct () {// Créer un objet Page de connexionobjLogin = nouveau Guru99Login (pilote);// Vérifier le titre de la page de connexionChaîne loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Contains ("guru99 bank"));// connexion à l'applicationobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// aller à la page suivanteobjHomePage = new Guru99HomePage (pilote);// Vérifier la page d'accueilAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Contains ("id du gestionnaire: mgr123"));}

Qu'est-ce que Page Factory dans Selenium?

Page Factory in Selenium est un concept de cadre de modèle d'objet de page intégré pour Selenium WebDriver, mais il est très optimisé. Il est utilisé pour l'initialisation des objets Page ou pour instancier l'objet Page lui-même. Il est également utilisé pour initialiser les éléments de classe Page sans utiliser «FindElement / s».

Ici aussi, 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 les annotations @FindBy pour trouver WebElement. Nous utilisons la méthode initElements pour initialiser les éléments Web

@FindBy peut accepter tagName, partialLinkText, name, linkText, id, css, className, xpath comme attributs.

Regardons le même exemple que ci-dessus en utilisant Page Factory

Page de connexion Guru99 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 {/ *** Tous les WebElements sont identifiés par l'annotation @FindBy* /Pilote WebDriver;@FindBy (nom = "uid")WebElement user99GuruName;@FindBy (nom = "mot de passe")WebElement password99Guru;@FindBy (className = "barone")WebElement titleText;@FindBy (nom = "btnLogin")Connexion WebElement;public Guru99Login (pilote WebDriver) {this.driver = pilote;// Cette méthode initElements créera tous les WebElementsPageFactory.initElements (pilote, ceci);}// Définir le nom d'utilisateur dans la zone de textepublic void setUserName (String strUserName) {user99GuruName.sendKeys (strUserName);}// Définir le mot de passe dans la zone de texte du mot de passepublic void setPassword (String strPassword) {password99Guru.sendKeys (strPassword);}// Cliquez sur le bouton de connexionpublic void clickLogin () {login.click ();}// Récupère le titre de la page de connexionpublic String getLoginTitle () {retourne titleText.getText ();}/ *** Cette méthode POM sera exposée dans le cas de test pour se connecter à l'application* @param strUserName* @param strPasword* @revenir* /public void loginToGuru99 (String strUserName, String strPasword) {// Remplissez le nom d'utilisateurthis.setUserName (strUserName);// Remplissez le mot de passethis.setPassword (strPasword);// Cliquez sur le bouton Connexionthis.clickLogin ();}}

Page d'accueil de Guru99 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 {Pilote WebDriver;@FindBy (xpath = "// table // tr [@ class = 'titre3']")WebElement homePageUserName;public Guru99HomePage (pilote WebDriver) {this.driver = pilote;// Cette méthode initElements créera tous les WebElementsPageFactory.initElements (pilote, ceci);}// Récupère le nom d'utilisateur de la page d'accueilpublic String getHomePageDashboardUserName () {return homePageUserName.getText ();}}

Guru99 TestCase avec le concept Page Factory

test de colis;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";Pilote WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);pilote = nouveau FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Ce test va sur http://demo.guru99.com/V4/* Vérifiez le titre de la page de connexion en tant que banque guru99* Connectez-vous à l'application* Vérifiez la page d'accueil à l'aide du message du tableau de bord* /@Test (priorité = 0)public void test_Home_Page_Appear_Correct () {// Créer un objet Page de connexionobjLogin = nouveau Guru99Login (pilote);// Vérifier le titre de la page de connexionChaîne loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Contains ("guru99 bank"));// connexion à l'applicationobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// aller à la page suivanteobjHomePage = new Guru99HomePage (pilote);// Vérifier la page d'accueilAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Contains ("id du gestionnaire: mgr123"));}}

La structure complète du projet ressemblera au diagramme:

AjaxElementLocatorFactory

AjaxElementLocatorFactory est un concept de chargement différé de PageFactory dans Selenium. Il est utilisé pour rechercher les éléments Web uniquement lorsque les éléments sont utilisés dans une opération. Il attribue un délai d'expiration pour WebElements à la classe de page d'objet. La classe AjaxElementLocatorFactory est l'un des principaux avantages de l'utilisation du modèle PageFactory dans Selenium.

Ici, lorsqu'une opération est effectuée sur un élément, l'attente de sa visibilité ne commence qu'à partir de ce moment. Si l'élément n'est pas trouvé dans l'intervalle de temps donné, l'exécution du scénario de test lèvera l'exception «NoSuchElementException».

Résumé

  1. Page Object Model dans Selenium Websdriver est un modèle de conception de référentiel d'objets.
  2. Le modèle objet de page Selenium crée notre code de test maintenable, réutilisable.
  3. Page Factory est un moyen optimisé de créer un référentiel d'objets dans le concept de structure Page Object Model.
  4. AjaxElementLocatorFactory est un concept de chargement différé dans Page Factory - modèle de conception d'objet de page pour identifier les WebElements uniquement lorsqu'ils sont utilisés dans une opération.

Téléchargez les fichiers de projet Selenium pour la démonstration dans ce didacticiel