React Academy · Lección

Probar formularios y flujos de usuario de extremo a extremo

Automatice envíos de formularios de varios pasos y flujos de navegación con objetos de página de Playwright.

Lección 4 de 414 pasos

Probar formularios y flujos de usuario de extremo a extremo es una lección gratuita de React Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.

Estrategia para probar formularios de extremo a extremo

Las pruebas E2E de formularios simulan el recorrido completo del usuario: llegar a la página, rellenar los campos, enviar el formulario, gestionar los errores de validación y verificar el resultado satisfactorio.

Modelo de objetos de página

El modelo de objetos de página (POM) encapsula los selectores y las interacciones de una página en una clase, lo que hace que las pruebas sean más legibles y reduce la duplicación.

class LoginPage {
  constructor(private page: Page) {}

  async goto() { await this.page.goto('/login'); }
  async fillEmail(email: string) { await this.page.getByLabel('Email').fill(email); }
  async fillPassword(pw: string) { await this.page.getByLabel('Password').fill(pw); }
  async submit() { await this.page.getByRole('button', { name: /log in/i }).click(); }
  async getError() { return this.page.getByRole('alert').textContent(); }
}

Usar el objeto de página en las pruebas

Al utilizar objetos de página, las pruebas se convierten en descripciones de las acciones del usuario a nivel de intención, fáciles de leer y mantener.

test('successful login redirects to dashboard', async ({ page }) => {
  const loginPage = new LoginPage(page);
  await loginPage.goto();
  await loginPage.fillEmail('alice@example.com');
  await loginPage.fillPassword('password123');
  await loginPage.submit();
  await expect(page).toHaveURL('/dashboard');
  await expect(page.getByRole('heading', { name: 'Dashboard' })).toBeVisible();
});

Probar los errores de validación

Envíe datos no válidos o vacíos y compruebe los mensajes de error que muestra la interfaz.

test('shows validation errors on empty submit', async ({ page }) => {
  await page.goto('/register');
  await page.getByRole('button', { name: 'Create account' }).click();
  await expect(page.getByText('Email is required')).toBeVisible();
  await expect(page.getByText('Password must be at least 8 characters')).toBeVisible();
});

Pruebas de formularios de varios pasos

En los asistentes de varios pasos, avance por cada paso y compruebe que el formulario progresa y conserva los datos introducidos anteriormente.

test('completes 3-step signup', async ({ page }) => {
  await page.goto('/signup');
  // Step 1
  await page.getByLabel('First Name').fill('Alice');
  await page.getByRole('button', { name: 'Next' }).click();
  // Step 2
  await page.getByLabel('Plan').selectOption('pro');
  await page.getByRole('button', { name: 'Next' }).click();
  // Step 3
  await page.getByLabel('Card Number').fill('4242424242424242');
  await page.getByRole('button', { name: 'Complete' }).click();
  await expect(page.getByText('Welcome, Alice!')).toBeVisible();
});

Simular la API en Playwright

Use page.route() para interceptar las llamadas a la API y devolver respuestas simuladas; resulta útil para probar casos extremos sin un backend real.

await page.route('/api/register', async route => {
  await route.fulfill({
    status: 200,
    contentType: 'application/json',
    body: JSON.stringify({ token: 'fake-token' }),
  });
});

await page.goto('/register');
// ...fill and submit form
await expect(page).toHaveURL('/dashboard');

Probar la carga de archivos

Use setInputFiles() para simular la carga de un archivo en Playwright.

test('uploads a profile photo', async ({ page }) => {
  await page.goto('/profile');
  const fileInput = page.getByLabel('Profile photo');
  await fileInput.setInputFiles('./fixtures/avatar.png');
  await page.getByRole('button', { name: 'Upload' }).click();
  await expect(page.getByAltText('Profile photo')).toBeVisible();
});

Reutilización del estado de autenticación

Inicie sesión una vez, guarde el estado de almacenamiento del navegador y reutilícelo en las pruebas para omitir los flujos de inicio de sesión repetidos.

// auth.setup.ts
test('authenticate', async ({ page }) => {
  await page.goto('/login');
  await page.getByLabel('Email').fill('alice@example.com');
  await page.getByLabel('Password').fill('password');
  await page.getByRole('button', { name: 'Log in' }).click();
  await page.context().storageState({ path: 'e2e/.auth/user.json' });
});

// playwright.config.ts — use storageState in other tests
use: { storageState: 'e2e/.auth/user.json' }

Probar la recuperación ante errores

Simule fallos de red y verifique que el usuario pueda reintentar o vea un mensaje de error útil.

await page.route('/api/submit', route => route.abort());
await page.getByRole('button', { name: 'Submit' }).click();
await expect(page.getByText('Network error. Please try again.')).toBeVisible();
await page.unroute('/api/submit');
// Now the real request goes through
await page.getByRole('button', { name: 'Retry' }).click();

Pruebas de navegación con teclado

Compruebe que los formularios sean totalmente accesibles mediante el teclado: desplácese por los campos con el tabulador y envíe el formulario con Enter.

test('submits form with keyboard only', async ({ page }) => {
  await page.goto('/contact');
  await page.keyboard.press('Tab'); // focus name
  await page.keyboard.type('Alice');
  await page.keyboard.press('Tab'); // focus email
  await page.keyboard.type('alice@example.com');
  await page.keyboard.press('Tab'); // focus submit
  await page.keyboard.press('Enter');
  await expect(page.getByText('Message sent!')).toBeVisible();
});

Fixtures para datos de prueba

Use fixtures de Playwright para compartir de forma ordenada la lógica de configuración, como la creación de un usuario de prueba, entre varias pruebas.

// fixtures.ts
const test = base.extend<{ testUser: User }>({ 
  testUser: async ({}, use) => {
    const user = await createTestUser();
    await use(user);
    await deleteTestUser(user.id);
  },
});

// In a test file:
test('edits profile', async ({ page, testUser }) => {
  await page.goto(`/users/${testUser.id}/edit`);
});

Ejecución de pruebas en paralelo

Playwright ejecuta las pruebas en paralelo de forma predeterminada mediante varios workers. Use test.describe.serial únicamente para las pruebas que deban ejecutarse en orden.

Comprobación rápida

¿Cuál es la principal ventaja del modelo de objetos de página (POM) en las pruebas E2E?

Resumen

Las pruebas E2E de formularios utilizan objetos de página para facilitar el mantenimiento, page.route() para simular la API, setInputFiles() para las cargas y el estado de almacenamiento para reutilizar las sesiones autenticadas. Pruebe la validación, los flujos de varios pasos y la navegación con teclado para cubrir recorridos de usuario reales.

Gratis para empezar

Aprende React con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
88
Lecciones
324

Preguntas frecuentes

¿La lección «Probar formularios y flujos de usuario de extremo a extremo» es gratis?

Sí — el texto completo de «Probar formularios y flujos de usuario de extremo a extremo» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Probar formularios y flujos de usuario de extremo a extremo»?

Automatice envíos de formularios de varios pasos y flujos de navegación con objetos de página de Playwright. Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar React Academy?

No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Probar formularios y flujos de usuario de extremo a extremo»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de React Academy?

Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Pruebas de integración con React Testing Library
  2. Probar UI asíncrona y llamadas a API con MSW
  3. Primeros pasos con Playwright para React
  4. Probar formularios y flujos de usuario de extremo a extremo
← Volver a React Academy