www ultimate que pom patrones patron para page guru99 guide framework example disponible diseño automatización java selenium selenium-webdriver webdriver pageobjects

java - ultimate - patron de diseño page object model



Implementando el patrón PageObjects para marcos en una página (1)

Antes de escribir mi sugerencia, me gustaría compartir mi aplicación para la cual desarrollé un marco POM. Así que, básicamente, mi aplicación tiene tres marcos diferentes para cada página html:

  1. Marco superior: es una vista compartida para toda la aplicación que contiene funcionalistas comunes como cerrar sesión, ayuda, configuración de administrador, etc.

  2. Panel de navegación izquierdo: en la mayoría de los lugares de mi aplicación, este marco está disponible y proporciona navegación entre diferentes secciones de la aplicación.

  3. Marco de contenido: este es el marco donde el usuario realiza la operación principal.

Diseñar un framework basado en Objetos de Página para este tipo de aplicación es realmente un trabajo tedioso, pero decidí diseñarlo de tal manera que podamos evitar todo el código repetitivo. En primer lugar, compartiré la estructura del framework:

org.xyz.automation.sdk - TopFrame.java - MainNavigator.java - WebDriverFactory.java - Configuration.java org.xyz.automation.sdk.global.pages - LoginPage.java - TopFrame.java org.xyz.automation.sdk.global - Navigator.java org.xyz.automation.sdk.leftpanel.pages - LeftFramePage.java org.xyz.automation.sdk.leftpanel - LeftFrameNavigator.java

Así que, básicamente, org.xyz.automation.sdk contiene todas las clases de configuración comunes que tienen la responsabilidad de instanciar el controlador web según la configuración de su sistema.

org.xyz.automation.sdk.global.pages : este paquete contiene clase de objeto de página de vistas comunes, como ya he dicho TopFrame es algo que se puede ver a lo largo de toda la aplicación, así que TopFrame.java esta vista en TopFrame.java . Para segregar el marco navegando desde la clase de objeto Página, lo mantuve en un paquete separado que no es más que el paquete padre de la clase de Objeto de Página.

org.xyz.automation.sdk.global contiene Navigation.java que se encarga de la navegación de cuadros y todas las demás navegaciones. El único beneficio de mantenerlo fuera de global.pages es que en el futuro, cuando su aplicación no admita marcos, no necesita cambiar ninguna clase de página, modificar solo la clase de navegador.

org.xyz.automation.sdk.leftpanel.pages : Al igual que en el org.xyz.automation.sdk.leftpanel.pages anterior, este paquete contiene la clase java del objeto de página del panel izquierdo y de nuevo he separado la navegación de este panel izquierdo del paquete leftpanel.pages .

@FindBy Esto no es más que una forma de acceso directo para encontrar elementos web de la página modelada. El concepto muy básico de objeto de página es que cada clase debe modelar una única vista, por lo que la clase modelada solo debe contener los elementos web que realmente aparecen en la vista modelada. Por ejemplo, TopFrame.java debe contener el elemento de TopFrame.java sesión tal como aparece solo en ese marco.

@FindBy(name = "logOut") // To find the element by name @CacheLookup private WebElement logOutLInk;

y mientras realiza cualquier acción en él, debe tratarlo como una instancia de WebElement .

logOutLInk.click();

/** * Class which models the view of Left Navigation Frame */ public class LeftNavigationFrame{ @FindBy(name= "exampleName") private WebElement exampleButton; private WebDriver driver; public LeftNavigationFrame(WebDriver driver) { this.driver = driver; } /** * Opens a new page by clicking example button */ public void openNewPage() { exampleButton.click(); } }

Ejemplo de clase Navigator:

/** * Class which provides convenient methods to navigate on left frame */ public class LeftFrameNavigator{ private WebDriver driver; public LeftFrameNavigator(WebDriver driver) { this.driver = driver; } /** * Changes scope to the left frame * * @return Page Object class of LeftNavigationFrame */ public LeftNavigationFrame switchToLeftFrame() { // Code to switch Frame return new LeftNavigationFrame(driver); } }

Este es un ejemplo de tu clase de prueba:

/** * Class which contains test cases of xyz */ public class doTesting{ LeftFrameNavigator leftNav; @BeforeTest public void instantiateRequiredClasses() { LeftFrameNavigator leftNav = new LeftFrameNavigator(); } @Test public void doTestingHere() { LeftNavigationFrame leftFrame = leftNav.switchToLeftFrame(); leftFrame.openNewPage() } } }

Cómo implementar el patrón pageObject (Selenium) para marcos en una página ... Tengo una página de inicio y hay un marco izquierdo y un marco derecho y me gustaría crear un objeto de página para cada cuadro.

Por ejemplo, tengo el Objeto de página LeftFrame como a continuación:

Public Class HomePageLeftFrame{ private WebElement link; private WebElement textField; }

Cómo escribir la anotación @FindBy para los dos elementos en el objeto HomePageLeftFrame ... ¿Hay alguna manera?

Nota: Según la documentación sobre el selenio para pageObjects, se menciona que los objetos de la página pueden ser una página completa de HTML o una parte de una página. ¿Entiendo que es correcto para la implementación anterior?