¿Cuál es la diferencia entre Page Object Model (POM) y Page Factory en Selenium?

Jagan Maruthappan ya ha respondido muy bien a esta pregunta. Sin embargo, me gustaría agregar un punto clave que he notado durante mi trabajo en Selenium.

En Page Factory, si el elemento no se encuentra en un lugar en particular, el elemento web en el que está almacenando el elemento no contiene nulo, contiene algún elemento proxy o algo así. Significa que, para los proyectos de la compañía, donde usualmente ejecutamos miles de casos de prueba, es muy difícil rastrear el error.

Otro inconveniente es que Page Factory usa Anotación. Quizás pienses que es un inconveniente. Permítanme explicar, Annotation proporciona una funcionalidad específica para la facilidad de los programadores, pero también es de naturaleza estática, no podemos modificarlo. Un lenguaje de programación como JAVA nos permite hacer lo que queramos, y podemos hacerlo de múltiples maneras como queramos. POM no es más que la implementación de Object Repository que se comporta exactamente como si estuviéramos insertando driver.findElement (By .- (“- – -“)); declaración directamente en nuestros scripts de prueba.

Objetos de página

El código de los casos de prueba automatizados debe ser fácil de entender y no demasiado complejo. Si una prueba falla, queremos saber por qué y esto lo antes posible. Para permitir esto existe PageObjects. Los PageObjects son clases que contienen WebElements y todas las acciones asociadas con ellos.

Un PageObject se ve así:

clase HomePage {

Controlador de WebDriver;

HomePage público (controlador) {
this.driver = driver;
}

// Encuentra un solo elemento
@FindBy (id = “home-menu-entry”)
WebElement homeMenuEntry;

public void clickHomeMenuEntry () {
homeMenuEntry.click ();
}

// Encuentra varios elementos
@FindBy (className = “menu-entry”)
Lista menuEntries;

// Más acciones y elementos
}

Uso de PageFactory y PageObject

clase TestSomething {

public void testMethod () {

// Conductor inicial.

// Usa PageFactory para iniciar elementos.
HomePage hp = PageFactory.initElements (controlador, HomePage.class);

// Usa PageObject para ejecutar la acción.
hp.clickHomeMenuEntry ();

// Afirmaciones o más acciones.

}

}

También puede poner el PageFactory.initElements(); en el constructor y cree solo un objeto HomePage lugar de llamar al método PageFactory .

Importante: si llama a initElements() todos los elementos se inicializarán, no más tarde si los usa.

¿Cómo organizar esto?

Hago lo siguiente: cada página tiene un PageObject, que representa estos. Pero algunos componentes de una página están presentes en muchas páginas. Para este caso creo para cada componente clases adicionales. Ejemplo:

  • Header.class
  • Footer.class
  • HomePage.class
  • ContactPage.class

Page Object Model (POM) y Page Factory en Selenium: Ultimate Guide

Antes de que aprendamos sobre el Modelo de objetos de página, entendamos:

¿Por qué POM?

Iniciar una automatización de la interfaz de usuario en Selenium WebDriver NO es una tarea difícil. Solo necesita encontrar elementos, realizar operaciones en él.

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

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

Este es un pequeño guión. El mantenimiento del script parece fácil. Pero con el tiempo la suite de pruebas crecerá. A medida que agrega más y más líneas a su código, las cosas se vuelven difíciles.

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

Un mejor enfoque para el mantenimiento del script es crear un archivo de clase separado que encuentre elementos web, los complete o los verifique. Esta clase se puede reutilizar en todos los scripts que usan ese elemento. En el futuro, si hay un cambio en el elemento web, necesitamos hacer cambios en solo 1 archivo de clase y no en 10 scripts diferentes.

Este enfoque se llama Modelo de Objeto de Página (POM) . Ayuda a que el código sea más legible, mantenible y reutilizable.

¿Qué es el POM?

  • Page Object Model es un patrón de diseño para crear Object Repository para elementos de IU web.
  • Bajo este modelo, para cada página web en la aplicación debe haber una clase de página correspondiente.
  • Esta clase de página encontrará los elementos web de esa página web y también contiene métodos de página que realizan operaciones en esos elementos web.
  • El nombre de estos métodos se debe dar según 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 ser waitForPaymentScreenDisplay ().

Ventajas de POM

  1. Page Object Patten dice 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 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 POM con TestNG / JUnit para pruebas funcionales y al mismo tiempo con JBehave / Cucumber para pruebas de aceptación.
  3. El código se vuelve menos 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 mapear fácilmente con la operación que ocurre 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 implementar POM?

POM simple:

Es la estructura básica del modelo de objeto de página (POM) donde todos los elementos web del AUT y el método que operan en estos elementos web se mantienen dentro de un archivo de clase. Tareas como la verificación deben estar separadas como parte de los métodos de prueba.

Ejemplo completo

TestCase: 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, el texto de verificación “Guru99 Bank” está presente

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

Paso 4) Verifique que la página de inicio contenga texto como “Id. De administrador: demo”

Aquí estamos tratando con 2 páginas

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

En consecuencia, creamos 2 clases POM

Página de inicio de sesión de Guru99 POM

páginas del paquete;

import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

clase pública Guru99Login {

Controlador de WebDriver;

Por user99GuruName = By.name (“uid”);

Por contraseña99Guru = Por.nombre (“contraseña”);

Por titleText = By.className (“barone”);

Por inicio de sesión = Por.nombre (“btnLogin”);

public Guru99Login (controlador WebDriver) {

this.driver = driver;

}

// Establecer nombre de usuario en el cuadro de texto

public void setUserName (String strUserName) {

driver.findElement (user99GuruName) .sendKeys (strUserName) ;;

}

// Establecer contraseña en el cuadro de texto de contraseña

public void setPassword (String strPassword) {

driver.findElement (contraseña99Guru) .sendKeys (strPassword);

}

// Haga clic en el botón de inicio de sesión

public void clickLogin () {

driver.findElement (inicio de sesión) .click ();

}

// Obtenga el título de la página de inicio de sesión

public String getLoginTitle () {

return driver.findElement (titleText) .getText ();

}

/ **

* Este método POM estará expuesto en caso de prueba para iniciar sesión en la aplicación

* @param strUserName

* @param strPasword

* @regreso

* /

public void loginToGuru99 (String strUserName, String strPasword) {

// Escribe el nombre de usuario

this.setUserName (strUserName);

// Completar contraseña

this.setPassword (strPasword);

// Haga clic en el botón Iniciar sesión

this.clickLogin ();

}

}

Página de inicio de Guru99 POM

páginas del paquete;

import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

clase pública Guru99HomePage {

Controlador de WebDriver;

Por homePageUserName = By.xpath (“// table // tr [@ class = ‘header3’]”);

public Guru99HomePage (controlador WebDriver) {

this.driver = driver;

}

// Obtener el nombre de usuario de la página de inicio

public String getHomePageDashboardUserName () {

return driver.findElement (homePageUserName) .getText ();

}

}

Caso de prueba Guru99 Simple POM

prueba de paquete;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;

importar org.openqa.selenium.firefox.FirefoxDriver;

importar org.testng.Assert;

importar org.testng.annotations.BeforeTest;

importar org.testng.annotations.Test;

importar páginas. Guru99HomePage;

importar páginas. Guru99Login;

clase pública Test99GuruLogin {

Controlador de WebDriver;

Guru99Login objLogin;

Guru99HomePage objHomePage;

@BeforeTest

configuración de vacío público () {

driver = nuevo FirefoxDriver ();

driver.manage (). timeouts (). implícitamenteWait (10, TimeUnit.SECONDS);

driver.get (” http://demo.guru99.com/V4/&quot ;);

}

/ **

* Este caso de prueba iniciará sesión en http://demo.guru99.com/V4/

* Verifique el título de la página de inicio de sesión como guru99 bank

* Inicie sesión en la aplicación

* Verifique la página de inicio usando el mensaje del Tablero

* /

@Test (prioridad = 0)

public void test_Home_Page_Appear_Correct () {

// Crear objeto de página de inicio de sesión

objLogin = nuevo Guru99Login (controlador);

// Verifique el título de la página de inicio de sesión

Cadena loginPageTitle = objLogin.getLoginTitle ();

Assert.assertTrue (loginPageTitle.toLowerCase (). Contiene (“banco guru99”));

// iniciar sesión en la aplicación

objLogin.loginToGuru99 (“mgr123”, “mgr! 23”);

// ve a la página siguiente

objHomePage = new Guru99HomePage (controlador);

// Verificar página de inicio

Assert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Contiene (“id del administrador: mgr123”));

}

¿Qué es Page Factory?

Page Factory es un concepto de modelo de objeto de página incorporado para Selenium WebDriver, pero está muy optimizado.

Aquí también seguimos el concepto de separación del repositorio de objetos de página y los métodos de prueba. Además, con la ayuda de la clase PageFactory, utilizamos anotaciones @FindBy para encontrar WebElement. Utilizamos el método initElements para inicializar elementos web

@FindBy puede aceptar tagName, partialLinkText, name, linkText, id, css, className, xpath como atributos.

Veamos el mismo ejemplo que el anterior usando Page Factory

Página de inicio de sesión de Guru99 con Page Factory

paquete PageFactory;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.support.FindBy;

import org.openqa.selenium.support.PageFactory;

clase pública Guru99Login {

/ **

* Todos los elementos web se identifican mediante la anotación @FindBy

* /

Controlador de WebDriver;

@FindBy (name = “uid”)

WebElement user99GuruName;

@FindBy (nombre = “contraseña”)

WebElement password99Guru;

@FindBy (className = “barone”)

WebElement titleText;

@FindBy (name = “btnLogin”)

WebElement login;

public Guru99Login (controlador WebDriver) {

this.driver = driver;

// Este método initElements creará todos los WebElements

PageFactory.initElements (controlador, esto);

}

// Establecer nombre de usuario en el cuadro de texto

public void setUserName (String strUserName) {

user99GuruName.sendKeys (strUserName);

}

// Establecer contraseña en el cuadro de texto de contraseña

public void setPassword (String strPassword) {

contraseña99Guru.sendKeys (strPassword);

}

// Haga clic en el botón de inicio de sesión

public void clickLogin () {

login.click ();

}

// Obtenga el título de la página de inicio de sesión

public String getLoginTitle () {

return titleText.getText ();

}

/ **

* Este método POM estará expuesto en caso de prueba para iniciar sesión en la aplicación

* @param strUserName

* @param strPasword

* @regreso

* /

public void loginToGuru99 (String strUserName, String strPasword) {

// Escribe el nombre de usuario

this.setUserName (strUserName);

// Completar contraseña

this.setPassword (strPasword);

// Haga clic en el botón Iniciar sesión

this.clickLogin ();

}

}

Página de inicio de Guru99 con Page Factory

paquete PageFactory;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.support.FindBy;

import org.openqa.selenium.support.PageFactory;

clase pública Guru99HomePage {

Controlador de WebDriver;

@FindBy (xpath = “// table // tr [@ class = ‘header3’]”)

WebElement homePageUserName;

public Guru99HomePage (controlador WebDriver) {

this.driver = driver;

// Este método initElements creará todos los WebElements

PageFactory.initElements (controlador, esto);

}

// Obtener el nombre de usuario de la página de inicio

public String getHomePageDashboardUserName () {

return homePageUserName.getText ();

}

}

Guru99 TestCase con el concepto Page Factory

prueba de paquete;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;

importar org.openqa.selenium.firefox.FirefoxDriver;

importar org.testng.Assert;

importar org.testng.annotations.BeforeTest;

importar org.testng.annotations.Test;

import PageFactory.Guru99HomePage;

import PageFactory.Guru99Login;

clase pública Test99GuruLoginWithPageFactory {

Controlador de WebDriver;

Guru99Login objLogin;

Guru99HomePage objHomePage;

@BeforeTest

configuración de vacío público () {

driver = nuevo FirefoxDriver ();

driver.manage (). timeouts (). implícitamenteWait (10, TimeUnit.SECONDS);

driver.get (” http://demo.guru99.com/V4/&quot ;);

}

/ **

* Esta prueba va a http://demo.guru99.com/V4/

* Verifique el título de la página de inicio de sesión como guru99 bank

* Inicie sesión en la aplicación

* Verifique la página de inicio usando el mensaje del Tablero

* /

@Test (prioridad = 0)

public void test_Home_Page_Appear_Correct () {

// Crear objeto de página de inicio de sesión

objLogin = nuevo Guru99Login (controlador);

// Verifique el título de la página de inicio de sesión

Cadena loginPageTitle = objLogin.getLoginTitle ();

Assert.assertTrue (loginPageTitle.toLowerCase (). Contiene (“banco guru99”));

// iniciar sesión en la aplicación

objLogin.loginToGuru99 (“mgr123”, “mgr! 23”);

// ve a la página siguiente

objHomePage = new Guru99HomePage (controlador);

// Verificar página de inicio

Assert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Contiene (“id del administrador: mgr123”));

}

}

La estructura completa del proyecto se verá como el diagrama:

AjaxElementLocatorFactory

Una de las principales ventajas de utilizar el patrón Page Factory es la clase AjaxElementLocatorFactory.

Está trabajando en el concepto de carga diferida, es decir, se asignará un tiempo de espera para un elemento Web a la clase de página Objeto con la ayuda de AjaxElementLocatorFactory.

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

Resumen

  1. Page Object Model es un patrón de diseño de repositorio de objetos en Selenium WebDriver.
  2. POM crea nuestro código de prueba mantenible, reutilizable.
  3. Page Factory es una forma optimizada de crear repositorio de objetos en concepto POM.
  4. AjaxElementLocatorFactory es un concepto de carga diferida en el patrón de Page Factory para identificar WebElements solo cuando se usan en cualquier operación.

Page Object Model (POM) y Page Factory en Selenium: Ultimate Guide

Si desea leer un proyecto de muestra en POM, consulte:

Modelo de objetos de página: un patrón de diseño: segrega el código de selenio en función de las páginas.

Ejemplo: Cree una clase de Java separada para la página de inicio de sesión, una clase más para la página de inicio, etc.

Page Factory: concepto avanzado (POM + nuevas funciones)

1. Los elementos se identifican mediante la anotación @FindBy

2. Inicialización de todos los elementos declarados en el Punto # 1 a la vez.

(en POM, la inicialización ocurre sobre la marcha)

PageFactory.initElements (controlador, esto);

Eso es todo.

Hola, he escrito un pequeño ejemplo para el Modelo de objetos de página. Puedes ir a través de esta URL.
modelo de objeto de página de selenio

Aquí en este enlace se explica muy bien Page Object Model (POM) y Page Factory en Selenium: Ultimate Guide

Avísame en caso de duda.