Saltar al contenido

Modelo de objeto de página (POM) y fábrica de páginas en el tutorial de Selenium

¿Qué es un modelo de objetos de página?

Modelo de objeto de página (POM) Es un patrón de diseño, comúnmente utilizado en la automatización de pruebas, que crea un repositorio de objetos para los elementos de la interfaz de usuario web. La ventaja del modelo es que reduce la duplicación de código y mejora el mantenimiento de las pruebas.

Bajo este modelo, debería haber una Clase de Página correspondiente para cada página web en la aplicación. Esta clase de página de WebElements identificará esa página web y también habrá métodos de página que realicen operaciones en esos WebElements. El nombre de estos métodos debe darse de acuerdo con la tarea que están realizando, es decir, si un cargador está esperando que aparezca la pasarela de pago, el nombre del método POM puede estar esperandoParaPaymentScreenDisplay ().

En este tutorial, aprenderá:

Modelo ¿Por qué objetos de página?

Iniciar la automatización de la interfaz de usuario en Selenium WebDriver NO es una tarea difícil. Todo lo que tienes que hacer es encontrar elementos, realizar operaciones en ellos.

Considere este sencillo script para iniciar sesión en un sitio web

Como puede ver, todo lo que tenemos que hacer es buscar elementos y completar valores para esos elementos.

Aquí hay un pequeño guión. El mantenimiento de la secuencia de comandos parece sencillo. Pero con el tiempo, el conjunto de pruebas crecerá. A medida que agrega más y más líneas a su código, las cosas se ponen difíciles.

El principal problema con el mantenimiento de la secuencia de comandos es que si hay 10 secuencias de comandos diferentes que utilizan el mismo elemento de página, para cualquier cambio en ese elemento, debe cambiar las 10 secuencias de comandos. Esto lleva tiempo y es propenso a errores.

Un mejor enfoque para el mantenimiento de scripts es crear un archivo de clase separado que recibirá, completará o verificará los elementos web. Esta clase se puede reutilizar en todos los scripts que utilicen ese elemento. En el futuro, si hay un cambio en la función web, debemos realizar el cambio en un archivo de clase y no en 10 scripts diferentes.

Este enfoque se llama Modelo de objetos de página en Selenium. Ayuda a que el código sea más legible, sostenible y reutilizable.

Ventajas de POM

  1. El patrón de diseño de objetos de página establece que las operaciones y los flujos en la interfaz de usuario deben separarse de la verificación. Este concepto hace que nuestro código sea más limpio y más fácil de entender.
  2. El segundo beneficio es que el repositorio de objetos es independiente de los casos de prueba, por lo que podemos usar el mismo repositorio de objetos para un propósito diferente con diferentes herramientas. Por ejemplo, podemos integrar Page Object Model en Selenium con TestNG / JUnit para la función Prueba y al mismo tiempo con JBehave / Cucumber para las pruebas de aceptación.
  3. El código se vuelve más pequeño y optimizado debido a los métodos de página reutilizables en las clases POM.
  4. Los métodos obtienen nombres más realistas que se pueden asignar fácilmente a medida que la operación se lleva a cabo en la interfaz de usuario. es decir, si después de hacer clic en el botón aterrizamos en la página de inicio, el nombre del método será como ‘gotoHomePage ()’.

¿Cómo aplicar POM?

POM simple:

La estructura básica del marco es un modelo de objeto de página que contiene todos los elementos web de la AUT y el método que funciona en estos elementos web se mantiene dentro de un archivo de clase. Los métodos de prueba deben incluir una tarea como la verificación por separado.

Ejemplo completo

Caso de prueba: Vaya al sitio de demostración de Guru99.

Paso 1) Vaya al sitio de demostración de Guru99
Paso 2) Verifique el texto en la página de inicio “Guru99 Bank” regalo
Paso 3) Inicie sesión en la aplicación
Paso 4) Confirme el texto en la página de inicio como “ID del administrador: demostración”

Aquí se trata de 2 páginas.

  1. Página de inicio de sesión
  2. Página de inicio (se muestra al iniciar sesión)

Por lo tanto, creamos 2 POM en clases de selenio

Página de inicio de sesión de Guru99 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 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 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();        
    }

}

Página de inicio de POM Guru99 en Selenio

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 Simple POM para prueba de selenio

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("http://demo.guru99.com/V4/");

    }

    /**

     * This test case will login in http://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("manger id : mgr123"));

    }

¿Qué es Page Factory en Selenium?

Fábrica de páginas en selenio Selenium WebDriver es un concepto de marco de modelo de modelo de página integrado, pero está altamente optimizado. Se utiliza para inicializar objetos Page o para agregar instantáneamente el propio objeto Page. También se utiliza para inicializar elementos de la clase Page sin “FindElement / in use”.

Aquí también seguimos el concepto de Separación de Almacén de Páginas y Métodos de Prueba. Además, con la ayuda de una clase PageFactory en Selenium, usamos anotaciones @FindBy para obtener WebElement. Usamos el método initElements para inicializar elementos web

@FindBy puede ser aceptado tagName, parcialLinkText, nombre, linkText, id, css, className, xpath como características.

Veamos el mismo ejemplo anterior mientras usamos Page Factory

Página de inicio de sesión de Guru99 con página de fábrica

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();           

    }

}

Página de inicio de Guru99 con 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 TestCase con concepto de Page Factory

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("http://demo.guru99.com/V4/");

    }

    /**

     * This test go to http://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("manger id : mgr123"));

    }

}

La estructura general del proyecto aparecerá en el diagrama:

AjaxElementLocatorFactory

AjaxElementLocatorFactory PageFactory es un concepto de carga diferida en Selenium. Solo se utiliza para localizar los elementos web cuando los elementos se utilizan en alguna operación. Asigna un límite de tiempo para WebElements para la clase de página de objeto. Una de las principales ventajas de utilizar el patrón PageFactory en Selenium es la clase AjaxElementLocatorFactory.

Aquí, cuando se realiza una operación en un elemento, la espera de su visibilidad comienza solo a partir de ese momento. Si el elemento no se encuentra en el intervalo de tiempo dado, Caso de prueba la ejecución requiere la excepción ‘NoSuchElementException’.

Resumen

  1. Page Object Model en Websdriver Selenium es un patrón de diseño de Object Store.
  2. Un modelo de objeto de página de selenio crea nuestro código de prueba sostenible y reutilizable.
  3. Page Factory es una forma optimizada de crear un repositorio de objetos en el concepto de marco del modelo de objetos.
  4. AjaxElementLocatorFactory es un concepto de carga diferida en Page Factory: un patrón de diseño de objeto de página para identificar WebElements solo cuando se usa en cualquier operación.

Descargue los archivos de proyecto de Selenium para la demostración en este tutorial

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *