Implementación de Page Object Model en Cypress

Clase 10 de 29Curso de Cypress Avanzado

Resumen

¿Qué es el Page Object Model (POM)?

El Page Object Model, comúnmente abreviado como POM, es un patrón de diseño que facilita la organización y mantenimiento del código de pruebas automatizadas. En esencia, POM trata a cada página de un sitio web como un objeto, lo que permite manejar interacciones y elementos de forma escalable y limpia. En lugar de referenciar directamente los elementos de la página en múltiples lugares de tus pruebas, se encapsulan en un solo objeto, permitiendo su reutilización y fácil actualización.

¿Cómo implementar el POM en Cypress?

Implementar el Page Object Model en Cypress es sencillo y aporta claridad a tus pruebas automatizadas. Para comenzar, debes crear un directorio específico para tus objetos de página. Esta estructura no solo mejora la organización, sino que simplifica el mantenimiento a lo largo del tiempo.

Creación y estructuración de tus objetos

  1. Crear un directorio Page Objects: Dentro de Cypress, se crea un directorio llamado PageObjects. Allí se almacenarán todas las clases que representarán las páginas del sitio web.

  2. Definir una clase para cada página: Cada página debe tener su clase correspondiente, por ejemplo: loginPage para una página de inicio de sesión. Aquí se almacenan los identificadores de los elementos relevantes en constantes.

    // Ejemplo de clase para la página de login
    export class loginPage {
      constructor() {
        this.userInput = 'userLogin';
        this.passwordInput = 'password';
        this.loginButton = 'loginButton';
      }
    }
    
  3. Métodos para interactuar con los elementos: Dentro de cada clase, se crean métodos para manejar acciones en la página. Por ejemplo, un método visit para navegar a la página y un método login para simular el inicio de sesión.

    visit() {
      cy.visit('http://example.com/login');
    }
    
    login(email, password) {
      cy.get(this.userInput).type(email);
      cy.get(this.passwordInput).type(password);
      cy.get(this.loginButton).click();
    }
    
  4. Exportación e inicialización del objeto de página: Esto permite que la clase sea utilizada en las pruebas.

    export const loginPage = new LoginPage();
    

Creación de pruebas con POM

  1. Escribir pruebas legibles y escalables: Utiliza los métodos definidos en las clases para realizar acciones en las pruebas. Esto no solo facilita la lectura y comprensión del código, sino que también hace que las pruebas sean menos propensas a errores cuando cambian los identificadores de los elementos.

    describe('Pruebas de inicio de sesión', () => {
      beforeEach(() => {
        loginPage.visit();
      });
    
      it('Login Erróneo', () => {
        loginPage.login('incorrecto@mail.com', 'contraseñaIncorrecta');
        loginPage.validateErrorLogin();
      });
    
      it('Login Exitoso', () => {
        loginPage.login('usuarioCorrecto@mail.com', 'contraseñaCorrecta');
        loginPage.validateSuccessLogin();
      });
    });
    

¿Cuáles son los beneficios y desafíos del POM en Cypress?

El uso del Page Object Model en Cypress ofrece varios beneficios:

  • Mantenibilidad: Centraliza la lógica de localización de elementos, lo que hace que las actualizaciones sean sencillas cuando los identificadores cambian.
  • Reusabilidad: Los métodos y elementos están definidos únicamente en sus respectivas clases, permitiendo su reuso constante sin duplicidad de código.
  • Claridad y Simplicidad: Facilita la lectura y entendimiento del flujo de pruebas, siendo más evidente qué acción se está llevando a cabo en cada parte de las pruebas.

Sin embargo, es importante considerar también los desafíos:

  • Algunos desarrolladores argumentan que Cypress, debido a su naturaleza, no requiere seguir el POM rigurosamente, lo que puede plantear un dilema sobre si siempre utilizar este patrón.
  • Cypress ofrece alternativas nativas como los "Custom Commands", los cuales permiten simplificar aún más las pruebas sin adherirse estrictamente a POM.

Te animo a explorar ambas opciones y decidir cuál se adapta mejor a tus necesidades y estilo de prueba. Continuar aprendiendo y adquiriendo nuevas habilidades te abrirá muchas puertas en el futuro. ¡Adelante, y buen coding!