Modelo de objetos de página y fábrica en Selenium

⚡ Resumen inteligente

Modelo de objetos de página y fábrica de páginas en Selenium Define un patrón de diseño estructurado para construir marcos de automatización de pruebas robustos y fáciles de mantener. Se centra en la creación de clases específicas de página que encapsulan los elementos web y sus comportamientos, reduciendo así la duplicación y mejorando la legibilidad y la escalabilidad de... Selenium guiones de prueba.

  • Concepto principal: Cada página de la aplicación corresponde a una clase de página dedicada que contiene tanto los elementos web como las acciones que se realizan en ellos, lo que permite una separación clara entre la estructura de la interfaz de usuario y la lógica de prueba.
  • Enfoque de implementación: POM promueve la gestión de elementos centralizada y reutilizable: las modificaciones a los elementos de la página requieren actualizaciones en una sola clase en lugar de múltiples scripts.
  • Ventaja del diseño: El modelo garantiza repositorios de objetos más limpios, modulares e independientes de las herramientas que pueden integrarse con marcos como TestNG, JUnit, Cucumber, o JBehave.
  • Convenio de denominación: Los métodos dentro de las clases de página deben reflejar las acciones reales de la interfaz de usuario (por ejemplo, gotoHomePage()), lo que refuerza la claridad semántica en los flujos de trabajo de automatización.
  • Estructura mejorada: Page Factory refina POM mediante el uso de @FindBy anotaciones y PageFactory.initElements() para la inicialización automática de WebElement, eliminando errores repetitivos findElement llamadas.
  • Optimización del rendimiento: AjaxElementLocatorFactory Introduce la carga diferida (los elementos se ubican solo cuando se accede a ellos), lo que mejora la eficiencia de ejecución y maneja el comportamiento dinámico de la página con elegancia.
  • Resultado: El enfoque unificado da como resultado una arquitectura de automatización de pruebas mantenible, legible y escalable, alineada con las normas modernas. Selenium prácticas.

Modelo de objeto de página

¿Qué es el Modelo de Objetos de Página? ¿Cuáles son sus componentes clave?

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

Bajo este modelo, cada página web de la aplicación debe tener su correspondiente clase de página. Esta clase de página identificará los elementos web de esa página y también contiene métodos de página que realizan operaciones en ellos. Los nombres de estos métodos deben asignarse según la tarea que realizan; por ejemplo, si un cargador espera a que aparezca la pasarela de pago, el nombre del método POM puede ser waitForPaymentScreenDisplay().

Componentes clave del modelo de objetos de página

  • Clases de página: Representa cada página web como una clase separada.
  • Localizadores: Identifique elementos web utilizando ID, XPaths o selectores CSS.
  • Métodos: Contiene acciones u operaciones realizadas en los elementos .page.
  • Reutilización: PromoReutilización de código y mantenimiento más sencillo en todas las pruebas.
  • Separación de intereses: Mantiene la estructura de la página independiente de la lógica de prueba para una mejor organización.

Modelo de objeto de página

¿Por qué el modelo de objetos de página?

Iniciar una automatización de UI en Selenium Controlador web No es una tarea difícil. Solo necesitas encontrar elementos y realizar operaciones con ellos.

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

Modelo de objeto de página

Como puede observar, todo lo que estamos haciendo es encontrar elementos y completar valores para esos elementos.

Este es un script que consume mucho tiempo y es propenso a errores. Al principio parece fácil, pero a medida que el conjunto de pruebas se expande, la gestión de los cambios de elementos se vuelve difícil. Con el tiempo, el conjunto de pruebas crecerá. A medida que se añaden más líneas al código, la situación se complica.

El principal problema con el mantenimiento de scripts es que si 10 scripts diferentes utilizan el mismo elemento de página, con cualquier cambio en ese elemento, deberá cambiar los 10 scripts. Esto requiere mucho tiempo y es propenso a errores.

Un mejor enfoque para el mantenimiento de scripts es crear un archivo de clase independiente que encuentre elementos web, los complete o los verifique. Esta clase puede reutilizarse en varios scripts de prueba que interactúen con el mismo elemento. En el futuro, si se produce un cambio en el elemento web, necesitaremos realizarlo en un solo archivo de clase y no en diez scripts diferentes.

Este enfoque se llama modelo de objetos de página en SeleniumAyuda a que el código sea más legible, fácil de mantener y reutilizable.

 Modelo de objeto de página

👉 Inscríbete gratis en directo Selenium Proyectos

Ventajas del POM

  1. El patrón de diseño de objetos de página indica que las operaciones y los flujos en la interfaz de usuario deben estar separados de la verificación. Este concepto hace que nuestro código sea más claro y fácil de entender.
  2. La segunda ventaja es que el repositorio de objetos es independiente de los casos de prueba, por lo que podemos usarlo para distintos propósitos con distintas herramientas. Por ejemplo, podemos integrar el Modelo de Objetos de Página en Selenium con TestNG/JUnit para funcional Pruebas y al mismo tiempo con JBehave/Cucumber para pruebas de aceptación.
  3. El código se vuelve menos y optimizado porque reutiliza los métodos de página en las clases POM.
  4. Los métodos reciben nombres más realistas que pueden asignarse fácilmente a la operación que ocurre en la interfaz de usuario, es decir, si después de hacer clic en el botón llegamos a la página de inicio, el nombre del método será como 'gotoHomePage()'.

Cómo implementar POM en Selenium?

PLog simple en la estructura fundamental de un marco de modelo de objetos de página, donde los elementos whereManagereIDElements del AUT Los métodos que operan en estos elementos web se guardan en un archivo clog. Una tarea como la verificación debe ser independiente de los métodos de prueba.

Implementar POM

Ejemplo completo

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

Paso 1) Vaya al sitio de demostración de Guru99

Implementar POM

Paso 2) En la página de inicio, verifique que esté presente el texto “Guru99 Bank”

Implementar POM

Paso 3) Inicie sesión en la aplicación

Implementar POM

Paso 4) Verifique que la página de inicio contenga texto como "Id. del administrador: demostración"

Implementar POM

En este ejemplo, tratamos con dos páginas:

  1. Página de inicio
  2. Página de inicio (se muestra una vez que inicia sesión)

En consecuencia, creamos 2 POM en Selenium privadas

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

Página de inicio de Guru99 POM en 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 simple en Selenium Caso de prueba

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é es Page Factory en Selenium?

Fábrica de páginas en Selenium es un concepto de marco de modelo de objetos de página incorporado para Selenium Controlador web que mejora la mantenibilidad al reducir las búsquedas repetitivas de elementos mediante anotaciones, no por la velocidad de ejecución. Se utiliza para la inicialización de objetos de página o para instanciarlos. También se utiliza para inicializar elementos de la clase de página sin usar "FindElement/s".

Aquí también seguimos el concepto de separación entre el repositorio de objetos de página y los métodos de prueba. Además, con la ayuda de la clase PageFactory en Selenium, usamos anotaciones @BuscarPor Para encontrar un elemento web, utilizamos el método initElements para inicializar elementos web.

Página de fábrica en Selenium

@BuscarPor poder aceptar nombre de etiqueta, texto de enlace parcial, nombre, texto de enlace, id, css, nombre de clase, xpath como atributos.

Veamos el mismo ejemplo anterior usando Page Factory

Página de inicio de sesión 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 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 el concepto 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("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 estructura completa del proyecto se verá como el diagrama:

Fábrica de páginas en Selenium

AjaxElementLocatorFábrica

AjaxElementLocatorFábrica es un concepto de carga diferida de PageFactory en SeleniumSe utiliza para encontrar los elementos web solo cuando se utilizan en cualquier operación. Asigna un tiempo de espera para los elementos web a la clase de página del objeto. Una de las principales ventajas de usar el patrón PageFactory en Selenium es la clase AjaxElementLocatorFactory.

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

Fábrica de localizadores de elementos Ajax

Por ejemplo:

AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10);
PageFactory.initElements(factory, this);

Descargue nuestra Selenium Archivos de proyecto para la demostración en este tutorial

Preguntas Frecuentes (FAQs)

El Modelo de Objetos de Página es un patrón de diseño que abstrae los elementos de una página web en clases independientes. Simplifica la automatización al separar las interacciones de la interfaz de usuario de la lógica de prueba, lo que promueve la claridad, la escalabilidad y reduce la duplicación de código.

In SeleniumPOM representa cada página web como una clase dedicada que contiene localizadores y acciones. Encapsula los elementos de la interfaz de usuario, lo que permite que los scripts de prueba sean independientes de los cambios en la estructura de la página subyacente.

POM no es un marco independiente, sino un patrón de diseño. Puede integrarse en cualquier marco de automatización para estructurar las pruebas de forma eficiente, garantizando una mejor organización, reutilización y mantenibilidad.

POM es un principio de diseño donde cada página web se modela como una clase con localizadores y métodos definidos. Desvincula la lógica de prueba de los elementos de la interfaz de usuario, mejorando la legibilidad, la escalabilidad y el mantenimiento a largo plazo.

POM define la estructura de diseño para la abstracción de páginas, mientras que Page Factory proporciona anotaciones y métodos (@FindBy) para inicializar elementos web de forma eficiente. Page Factory es una mejora de la implementación de POM.

POM centraliza los localizadores de elementos y las acciones de página en clases dedicadas. Cualquier modificación de la interfaz de usuario requiere actualizaciones en un solo lugar, lo que minimiza la repetición de tareas, mejora la reutilización del código y acelera el mantenimiento de las pruebas.

Sí. Los generadores de pruebas impulsados ​​por IA pueden crear clases POM automáticamente mediante el análisis de las jerarquías de la interfaz de usuario, manteniendo la separación lógica de las preocupaciones y acelerando la creación de pruebas de un extremo a otro.

POM promueve componentes de prueba modulares y reutilizables, lo que permite la integración con herramientas de mantenimiento de pruebas basadas en IA que actualizan automáticamente los localizadores, lo que reduce la fragilidad del script y la sobrecarga de mantenimiento.

Resumir este post con: