Cuando empezamos en el mundo de la automatización de pruebas enfocados en Interfaz de Usuario lo primero que encontramos en Google es Selenium como el amo y señor de las herramientas, si bien hoy en día no es tan asi, sigue siendo un framework bastante utilizado; no en vano SerenityBDD lo adoptó e incluso lo mejoro, haciendo que las automatizaciones sean mas robustas, nos dejemos de preocupar por muchas cosas como manejo de driver, configuraciones demasiado técnicas, ejecuciones complejas o generación de reportes.
Sin embargo, el que nos libre de esa complejidad, no significa entonces que no debemos conocer como funciona por debajo, este conocimiento es crucial al momento que deseemos personalizar nuestro script.
Una de las tantas cosas que empezamos a crear en nuestras clases StepDefinition es el llamado de las anotaciones @Page pero si nos detenemos a pensar un poco, no tenemos ni idea de como funciona y cuando empezamos a indagar un poco, nos volvemos un 8.
Pues en esta entrada vas a aprender de una manera muy corta como funcionan y por que usamos estas anotaciones, asi que vamos a ello.
Por cierto, Antes de que comiences la lectura, te recomiento este articulo sobre Inyección de Dependencias
Contexto
SerenityBDD usa la anotación @Page para inyectar automáticamente instancias de las clases tipo Page en las clases StepDefinitions o en cualquier otra clase que se llegue a necesitar (Aunque no es muy común en otras clases), permitiendo que Serenity se encargue de la creación y configuración de los objetos de una manera muy sencilla.
¿Qué hace la anotación @Page?
Inyección de Dependencias Automática: La anotación @Page facilita la inyección de dependencias, Cuando usas @Page, Serenity se encarga de crear una instancia del PageObject correspondiente y la asigna al campo anotado.
Configuración del WebDriver: Al usar @Page, no necesitas pasar manualmente el WebDriver al constructor del PageObject (Recuerda que una clase PageObject hereda de esta y por ende, debe tener un driver que manipular y un constructor). Serenity hace esto automáticamente, asegurando que cada PageObject tenga acceso al WebDriver adecuado durante toda la ejecución.
Manejo de Contexto de Navegador: Al usar @Page, los PageObjects están configurados para trabajar con el contexto del navegador actual y no con diferentes instancias del mismo. Esto es útil para manejar múltiples navegadores o ventanas emergentes dentro de la misma prueba sin que se pierda el foco de interación o conexión entre las clases al momento de pasar a otro método que llame otra clase Page.
Integración con Serenity Reports: La anotación @Page también facilita la integración con los reportes de Serenity ayudando a la obtención de detalles de las acciones realizadas en los PageObjects instanciados.
Ejemplo con @Page
Supongamos que tienes una clase HomePage y una clase de pasos HomePageStepDefinitions
Ahora para instanciar esta clase en HomePageStepDefinitions podemos hacerlo con la anotación sin tener que declarar un objeto directamente. Esto lo podemos hacer asi
Con esta simple implementación donde la clase Page es llamada con el @Page aseguras que se inicialice correctamente antes de usarlo en los métodos de prueba.
Internamente, la anotación @Page está respaldada por la libreria de FluentLenium org.fluentlenium.core.annotation.Page que Serenity utiliza para gestionar el ciclo de vida de los objetos de página. Esta anotación simplifica la creación y uso de PageObjects ya que cuando Serenity encuentra un campo anotado con @Page, crea una instancia del PageObject, la inicializa, y se asegura de que tenga acceso a las capacidades del WebDriver. ademas, también se encarga de sincronizar los PageObjects con el estado del WebDriver, garantizando que las interacciones sean seguras y efectivas.
Qué pasa entonces si no quiero usar el @Page?
Si no quieres usar el @Page debes crear de forma manual las instancias PageObject en tus clases StepDefinitions, pasar el Driver manualmente a cada PageObject y asegurarte que el Webdriver esta disponible y correctamente configurado antes de utilizar los PageObject.
Espera, espera, cómo asi?
Quieres saber todo el detalle de esta implementación desde 0? Pues siguenos y animate a tomar nuestros cursos, por lo pronto te dejaré detalles.
Lo mejor es tener una clase BaseTest (Ojo, Test, no Page) para que puedas manejar el driver y que tus clases StepDefinitiuon deriven de ella.
Ahora asegurate que tu clase Page, tiene un constructor que reciba el Webdriver
Y ahora en tus clases StepDefinitions tienes que heredar de BaseTest y ademas, inicializar cada uno de los Page que requieras
Aqui se ve fácil por que es uno solo una clase Page, imaginas como sería si tienes que instanciar muchas clases Page😉
Antes de finalizar para que recuerdes...
Si vas a usar SerenityBDD pero sin implementar el @Page, es importante estructurar tu código para asegurar que las instancias de PageObjects se manejen de manera clara y coherente, ademas asegura la sincronización del WebDriver sino tus pruebas no van a poder conectarse entre si.
Espero que este articulo te sea de ayuda. Compartelo con tus amigos para que tambien conozcan un poco mas del uso de estas anotaciones.
Comentarios