Volver al blog
Automatización QA: Cómo validar correos de registro con Playwright y la API de JunkMail

Automatización QA: Cómo validar correos de registro con Playwright y la API de JunkMail

Las pruebas E2E a menudo se detienen en el envío del correo. Descubre cómo cerrar el ciclo y probar el clic en el enlace de confirmación utilizando una API de correo programable.

Por Leandre5/1/2026

Es la pesadilla clásica del Ingeniero de QA o del desarrollador Fullstack: probar el flujo de registro (Sign Up Flow).

El escenario es simple sobre el papel:

  1. El usuario rellena el formulario.
  2. Recibe un correo con un enlace mágico.
  3. Hace clic en el enlace.
  4. Su cuenta se activa.

Con herramientas modernas como Playwright o Cypress, los pasos 1 y 4 son triviales. Pero los pasos 2 y 3 suelen ser un agujero negro. ¿Cómo verificar que un correo fue realmente enviado? ¿Cómo recuperar el enlace de validación dentro para hacer clic en él programáticamente?

A menudo, los equipos de desarrollo utilizan trucos:

  • Conectarse a una cuenta real de Gmail a través de IMAP (lento, inestable, Google a menudo bloquea la conexión).
  • Mockear el envío de correo (rápido, pero no prueba la entregabilidad real ni la plantilla HTML).
  • Usar Mailhog/Mailcatcher localmente (bueno, pero no funciona en Staging/Prod).

¿La solución robusta? Usar una API de correo desechable y programable como JunkMail.

La Arquitectura de la Prueba

Esto es lo que vamos a construir:

  1. Playwright genera una dirección de correo electrónico única a través de la API de JunkMail.
  2. Playwright rellena el formulario de registro de tu app con este correo.
  3. Playwright consulta la API de JunkMail (Polling) hasta recibir el mensaje.
  4. Playwright extrae la URL de validación (Regex) del cuerpo del mensaje.
  5. Playwright navega a esta URL y verifica el éxito.

Requisitos previos

  • Node.js instalado.
  • Un proyecto Playwright (npm init playwright@latest).
  • Una clave API de JunkMail (disponible en tu panel Business).

El Código

Aquí tienes un ejemplo completo en TypeScript.

1. El Cliente API de JunkMail

Primero, creemos un pequeño ayudante para interactuar con JunkMail.

// utils/junkmail.ts
import { request } from '@playwright/test';

const JUNKMAIL_API_URL = 'https://junkmail.site/api/v1';
const API_KEY = process.env.JUNKMAIL_API_KEY;

export async function createTempEmail() {
  const context = await request.newContext();
  const response = await context.post(`${JUNKMAIL_API_URL}/emails`, {
    headers: { 'Authorization': `Bearer ${API_KEY}` }
  });
  return await response.json(); // Devuelve { id: "...", address: "xyz@junkmail.site" }
}

export async function waitForEmail(addressId: string, timeout = 30000) {
  const context = await request.newContext();
  const startTime = Date.now();

  while (Date.now() - startTime < timeout) {
    const response = await context.get(`${JUNKMAIL_API_URL}/emails/${addressId}/messages`, {
      headers: { 'Authorization': `Bearer ${API_KEY}` }
    });
    const messages = await response.json();
    
    if (messages.length > 0) {
      return messages[0]; // Devolvemos el primer mensaje recibido
    }
    
    // Esperar 1s antes de reintentar
    await new Promise(r => setTimeout(r, 1000));
  }
  throw new Error('Correo no recibido a tiempo');
}

2. La Prueba E2E

Ahora, usemos este ayudante en nuestra especificación Playwright.

// tests/signup.spec.ts
import { test, expect } from '@playwright/test';
import { createTempEmail, waitForEmail } from '../utils/junkmail';

test('Un nuevo usuario puede registrarse y validar su correo', async ({ page }) => {
  // 1. Crear una dirección de correo única para esta prueba
  const tempEmail = await createTempEmail();
  console.log(`Correo de prueba generado: ${tempEmail.address}`);

  // 2. Rellenar el formulario de registro
  await page.goto('https://mi-app.com/register');
  await page.fill('input[name="email"]', tempEmail.address);
  await page.fill('input[name="password"]', 'Password123!');
  await page.click('button[type="submit"]');

  await expect(page.locator('text=Verifica tus correos')).toBeVisible();

  // 3. Esperar la recepción del correo (Lado JunkMail)
  const message = await waitForEmail(tempEmail.id);
  console.log(`Correo recibido: ${message.subject}`);

  // 4. Extraer el enlace de validación
  // Buscamos una URL que se parezca a https://mi-app.com/verify?token=...
  const linkRegex = /https:\/\/mi-app\.com\/verify\?token=[a-zA-Z0-9-]+/;
  const match = message.body.text.match(linkRegex);
  
  if (!match) throw new Error('Enlace de validación no encontrado en el correo');
  const verificationUrl = match[0];

  // 5. Visitar el enlace de validación
  await page.goto(verificationUrl);

  // 6. Verificar que la cuenta está activada
  await expect(page.locator('text=Cuenta activada con éxito')).toBeVisible();
});

¿Por qué es mejor que otros métodos?

Aislamiento de datos

Cada prueba utiliza una dirección de correo nueva (test-123@junkmail.site, test-456@junkmail.site). No te arriesgas a conflictos de datos (ej: "Este correo ya existe") si ejecutas tus pruebas en paralelo.

Prueba de la cadena completa (End-to-End)

A diferencia de los mocks, pruebas:

  • Que tu servicio de envío (SendGrid, AWS SES...) funciona.
  • Que tu plantilla HTML no rompe el enlace.
  • Que el enlace de validación realmente funciona en el navegador.

Estabilidad y Rapidez

La API de JunkMail está diseñada para desarrolladores. Es rápida, RESTful y no requiere una configuración IMAP compleja o eludir la 2FA como con Gmail.

El momento filosófico: QA vs Realidad

Una prueba que no reproduce la realidad no es una prueba, es una esperanza. Tus usuarios no "mockean" sus correos. Realmente esperan recibirlos. Si tu sistema de envío de correo falla (cuota excedida, IP en lista negra), tus pruebas mockeadas seguirán en verde, pero tu negocio estará detenido.

Probar con una infraestructura de recepción de correo real es la única forma de tener una confianza absoluta en tu "Happy Path" de registro.

Conclusión

La automatización de pruebas de correo electrónico no debería ser un dolor. Con las herramientas adecuadas, es tan simple como una llamada a la API. Integra JunkMail en tu pipeline CI/CD y deja de cruzar los dedos en cada despliegue.

¿Listo para codificar? Obtén tu clave API en JunkMail Developer.