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.

¿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.
¿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.
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.
👉 Inscríbete gratis en directo Selenium Proyectos
Ventajas del POM
- 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.
- 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.
- El código se vuelve menos y optimizado porque reutiliza los métodos de página en las clases POM.
- 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.
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) En la página de inicio, verifique que esté presente el texto “Guru99 Bank”
Paso 3) Inicie sesión en la aplicación
Paso 4) Verifique que la página de inicio contenga texto como "Id. del administrador: demostración"
En este ejemplo, tratamos con dos páginas:
- Página de inicio
- 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.
@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:
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'.
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











