Modelo de objeto de página (POM) & Tutorial de Page Factory en Selenium

Tabla de contenido:

Anonim

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

Page Object Model (POM) es un patrón de diseño, utilizado popularmente 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, para cada página web en la aplicación, debe haber una Clase de Página correspondiente. Esta clase de página identificará 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 debe proporcionarse 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 ().

En este tutorial, aprenderá:

  • ¿Por qué Page Object Model?
  • Ventajas de POM
  • ¿Cómo implementar POM?
  • ¿Qué es Page Factory?
  • Guru99 TestCase con concepto de Page Factory
  • AjaxElementLocatorFactory

¿Por qué Page Object Model?

Iniciar una automatización de la interfaz de usuario en Selenium WebDriver NO es una tarea difícil. Solo necesitas encontrar elementos, realizar operaciones en 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 pequeño guión. El mantenimiento de la secuencia de comandos parece sencillo. 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 los scripts es que si 10 scripts diferentes están usando 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 de scripts 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 utilizan ese elemento. En el futuro, si hay un cambio en el elemento web, debemos realizar el cambio en solo 1 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, fácil de mantener y reutilizable.

Ventajas de POM

  1. El patrón de diseño de objetos de página 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 Page Object Model en Selenium 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 pueden mapearse 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 marco del modelo de objetos de la página 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. Una tarea como la verificación debe estar separada 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: demostración"

Aquí estamos tratando con 2 páginas.

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

En consecuencia, creamos 2 POM en clases de Selenium

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

páginas de paquetes;import org.openqa.selenium.By;importar org.openqa.selenium.WebDriver;public class Guru99Login {Controlador WebDriver;Por user99GuruName = By.name ("uid");By password99Guru = By.name ("contraseña");Por titleText = By.className ("barone");Por login = By.name ("btnLogin");public Guru99Login (controlador WebDriver) {this.driver = controlador;}// Establecer el nombre de usuario en el cuadro de textopublic void setUserName (String strUserName) {driver.findElement (user99GuruName) .sendKeys (strUserName);}// Establecer contraseña en el cuadro de texto de contraseñapublic void setPassword (String strPassword) {driver.findElement (contraseña99Guru) .sendKeys (strPassword);}// Haga clic en el botón de inicio de sesiónpublic void clickLogin () {driver.findElement (inicio de sesión) .click ();}// Obtener el título de la página de inicio de sesiónpublic String getLoginTitle () {return driver.findElement (titleText) .getText ();}/ *** Este método POM se expondrá en caso de prueba para iniciar sesión en la aplicación* @param strUserName* @param strPasword* @regreso* /public void loginToGuru99 (String strUserName, String strPasword) {// Completar el nombre de usuariothis.setUserName (strUserName);// Completar contraseñathis.setPassword (strPasword);// Haga clic en el botón Iniciar sesiónthis.clickLogin ();}}

Página de inicio de Guru99 POM en selenio

páginas de paquetes;import org.openqa.selenium.By;importar org.openqa.selenium.WebDriver;public class Guru99HomePage {Controlador WebDriver;By homePageUserName = By.xpath ("// tabla // tr [@ class = 'header3']");public Guru99HomePage (controlador WebDriver) {this.driver = controlador;}// Obtener el nombre de usuario de la página de iniciopublic String getHomePageDashboardUserName () {return driver.findElement (homePageUserName) .getText ();}}

Guru99 Simple POM en caso de prueba de selenio

prueba de paquete;import java.util.concurrent.TimeUnit;importar org.openqa.selenium.WebDriver;importar org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.annotations.BeforeTest;import org.testng.annotations.Test;importar páginas.Guru99HomePage;importar páginas.Guru99Login;clase pública Test99GuruLogin {String driverPath = "C: \\ geckodriver.exe";Controlador WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@AntesTestconfiguración de vacío público () {System.setProperty ("webdriver.gecko.driver", ruta del controlador);controlador = nuevo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** 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* Iniciar 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ónobjLogin = new Guru99Login (controlador);// Verificar el título de la página de inicio de sesiónString loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Contains ("guru99 bank"));// iniciar sesión en la aplicaciónobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// ir a la página siguienteobjHomePage = new Guru99HomePage (controlador);// Verificar la página de inicioAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Contains ("ID del administrador: mgr123"));}

¿Qué es Page Factory en Selenium?

Page Factory en Selenium es un concepto de marco de modelo de objeto de página incorporado para Selenium WebDriver, pero está muy optimizado. Se utiliza para la inicialización de objetos de página o para crear una instancia del objeto de página en sí. También se utiliza para inicializar elementos de la clase Page sin utilizar "FindElement / s".

Aquí también seguimos el concepto de separación de Page Object Repository y Test Methods. Además, con la ayuda de la clase PageFactory en Selenium, usamos las anotaciones @FindBy para encontrar WebElement. Usamos 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 anterior usando Page Factory

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

package PageFactory;importar org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.support.FindBy;importar org.openqa.selenium.support.PageFactory;public class Guru99Login {/ *** Todos los WebElements están identificados por la anotación @FindBy* /Controlador WebDriver;@FindBy (nombre = "uid")WebElement user99GuruName;@FindBy (nombre = "contraseña")WebElement password99Guru;@FindBy (className = "barone")WebElement titleText;@FindBy (nombre = "btnLogin")Inicio de sesión de WebElement;public Guru99Login (controlador WebDriver) {this.driver = controlador;// Este método initElements creará todos los WebElementsPageFactory.initElements (controlador, esto);}// Establecer el nombre de usuario en el cuadro de textopublic void setUserName (String strUserName) {user99GuruName.sendKeys (strUserName);}// Establecer contraseña en el cuadro de texto de contraseñapublic void setPassword (String strPassword) {password99Guru.sendKeys (strPassword);}// Haga clic en el botón de inicio de sesiónpublic void clickLogin () {login.click ();}// Obtener el título de la página de inicio de sesiónpublic String getLoginTitle () {return titleText.getText ();}/ *** Este método POM se expondrá en caso de prueba para iniciar sesión en la aplicación* @param strUserName* @param strPasword* @regreso* /public void loginToGuru99 (String strUserName, String strPasword) {// Completar el nombre de usuariothis.setUserName (strUserName);// Completar contraseñathis.setPassword (strPasword);// Haga clic en el botón Iniciar sesiónthis.clickLogin ();}}

Página de inicio de Guru99 con Page Factory

package PageFactory;importar org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.support.FindBy;importar org.openqa.selenium.support.PageFactory;public class Guru99HomePage {Controlador WebDriver;@FindBy (xpath = "// tabla // tr [@ class = 'header3']")WebElement homePageUserName;public Guru99HomePage (controlador WebDriver) {this.driver = controlador;// Este método initElements creará todos los WebElementsPageFactory.initElements (controlador, esto);}// Obtener el nombre de usuario de la página de iniciopublic String getHomePageDashboardUserName () {return homePageUserName.getText ();}}

Guru99 TestCase con concepto de Page Factory

prueba de paquete;import java.util.concurrent.TimeUnit;importar org.openqa.selenium.WebDriver;importar 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";Controlador WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@AntesTestconfiguración de vacío público () {System.setProperty ("webdriver.gecko.driver", ruta del controlador);controlador = nuevo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Esta prueba vaya a http://demo.guru99.com/V4/* Verifique el título de la página de inicio de sesión como guru99 bank* Iniciar 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ónobjLogin = new Guru99Login (controlador);// Verificar el título de la página de inicio de sesiónString loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Contains ("guru99 bank"));// iniciar sesión en la aplicaciónobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// ir a la página siguienteobjHomePage = new Guru99HomePage (controlador);// Verificar la página de inicioAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Contains ("ID del administrador: mgr123"));}}

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

AjaxElementLocatorFactory

AjaxElementLocatorFactory es un concepto de carga diferida de PageFactory en Selenium. Se utiliza para buscar los elementos web solo cuando los elementos se utilizan en alguna operación. Asigna un tiempo de espera para WebElements a la clase de página de objeto. Una de las ventajas clave de usar 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 desde ese momento. Si el elemento no se encuentra en el intervalo de tiempo dado, la ejecución del caso de prueba arrojará la excepción 'NoSuchElementException'.

Resumen

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

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