• 12 de may de 2025

Muerte al...¿Page Object Model?

Hay dos líneas de pensamiento sobre cómo organizar el código de automation...cuál es tu favorita?

🧪 Page Object Model vs. Funciones Auxiliares en Playwright con TypeScript

Cuando hacés testing automatizado, especialmente con herramientas modernas como Playwright y Cypress, surge un debate interesante: ¿es mejor utilizar el tradicional Page Object Model (POM) o adoptar una estrategia basada en funciones auxiliares (functional helpers)? Hace poco me crucé con un artículo que exploraba esto y me recordó al infame post oficial de Cypress sobre el tema. En este post vamos a explorar ambas metodologías, sus ventajas y desventajas, y concluiremos por qué, en muchos casos, POM sigue siendo la opción preferida.

🧱 Page Object Model (POM): Estructura y Organización

El POM es una técnica que encapsula la lógica de interacción con una página web en clases, promoviendo la reutilización y el mantenimiento del código. Cada clase representa una página o componente de la aplicación, conteniendo los selectores y métodos necesarios para interactuar con ella. Recuerden que NO deberían tener validaciones o assertions en estas clases. Es un gran NO NO eso y lo explicamos clarito en varios de nuestros cursos.

Ejemplo en TypeScript con Playwright:

// loginPage.ts
import { Page, Locator } from '@playwright/test';

export class LoginPage {
  readonly page: Page;
  readonly usernameField: Locator;
  readonly passwordField: Locator;
  readonly loginButton: Locator;

  constructor(page: Page) {
    this.page = page;
    this.usernameField = page.locator('[data-testid="username"]');
    this.passwordField = page.locator('[data-testid="password"]');
    this.loginButton = page.locator('[data-testid="login-button"]');
  }

  async login(username: string, password: string): Promise<void> {
    await this.usernameField.fill(username);
    await this.passwordField.fill(password);
    await this.loginButton.click();
  }
}
// login.spec.ts
import { test, expect } from '@playwright/test';
import { LoginPage } from './loginPage';

test('El usuario puede iniciar sesión', async ({ page }) => {
  const loginPage = new LoginPage(page);
  await loginPage.login('usuarioTest', 'contraseña123');

  await expect(page.locator('[data-testid="welcome-message"]')).toHaveText(
    'Bienvenido, usuarioTest'
  );
});

Este enfoque proporciona una estructura clara y facilita la gestión de cambios en la interfaz de usuario. Al centralizar los selectores y acciones en clases específicas, cualquier modificación en la UI requiere cambios mínimos en el código de prueba. Si me dice que actualizaron la página de "órdenes" en un e-commerce, se que tengo que ir a esa clase y ya.

🔧 Funciones Auxiliares (Functional Helpers): Simplicidad y Flexibilidad

Las funciones auxiliares promueven el uso de funciones reutilizables para interactuar con elementos de la interfaz, evitando la creación de clases. Este enfoque es más directo y puede ser más fácil de entender para pruebas simples o equipos que prefieren una estructura funcional.

Ejemplo en TypeScript con Playwright:

// loginHelpers.ts
import { Page } from '@playwright/test';

export async function login(page: Page, username: string, password: string): Promise<void> {
  await page.fill('[data-testid="username"]', username);
  await page.fill('[data-testid="password"]', password);
  await page.click('[data-testid="login-button"]');
}
// login.spec.ts
import { test, expect } from '@playwright/test';
import { login } from './loginHelpers';

test('El usuario puede iniciar sesión', async ({ page }) => {
  await login(page, 'usuarioTest', 'contraseña123');

  await expect(page.locator('[data-testid="welcome-message"]')).toHaveText(
    'Bienvenido, usuarioTest'
  );
});

Este método es más directo y puede ser más fácil de entender para pruebas simples. Sin embargo, a medida que el proyecto crece, la dispersión de selectores y lógica puede dificultar el mantenimiento.

⚖️ Comparación y Consideraciones

Aunque las funciones auxiliares ofrecen una solución más ligera y rápida para comenzar, especialmente en proyectos pequeños o medianos, el POM proporciona una base más sólida y escalable para proyectos de mayor envergadura. La estructura y organización que ofrece POM facilita el mantenimiento y la colaboración en equipos grandes.

🧠 Conclusión

Si bien las funciones auxiliares presentan una alternativa interesante y válida en ciertos contextos, especialmente cuando se busca rapidez y simplicidad, el Page Object Model sigue siendo la opción preferida para proyectos que requieren una estructura robusta y escalable. La claridad, reutilización y facilidad de mantenimiento que ofrece POM lo convierten en una herramienta valiosa en el arsenal de testing automatizado.

Dicho esto...hay un momento en el que uso el approach de funciones auxiliares. ¿Saben cuándo? Cuando hago API Testing o bien testing en la nube

💬 ¿Qué opinás vos?

Ahora me interesa escucharte a vos ¿Preferís la simplicidad de las funciones auxiliares o la estructura del POM? ¿Cómo manejás tus pruebas automatizadas en tus proyectos? ¡Compartí tu experiencia y sumate al bardo la conversación!

Un poco

Sobre mi

Consultor privado e instructor en QA

Más de 16 años en el mercado, trabajando como consultor QA privado para empresas de Nueva Zelanda y Australia en proyectos de gran impacto y siempre a la vanguardia.

Lo que enseño viene de mi experiencia 🧑🏻‍💻

  • Entrega gratuita por correo electrónico

La guía 2027 para conseguir trabajo en Testing de Software

  • Descarga digital
  • 1 archivo

Conseguir trabajo en Testing de Software, en este 2025, presenta desafíos de los que necesitás enterarte YA mismo. En esta guía exclusiva de Free Range Testers vuelco en el tono informal de siempre, mis más de 16 años de experiencia y sobre todo lo relacionado a las nuevas tendencias que van a hacer la gran diferencia a la hora de buscar trabajo. ¡Nos vemos en el libro!

Suscríbete para estar informado de las actividades de Free Range Testers.

0 comments

Sign upor login to leave a comment