Playwright Autenticación (Authentication)
Este capítulo explica cómo manejar la autenticación en Playwright, evitando repetir el inicio de sesión en cada prueba y manteniendo al mismo tiempo el aislamiento de las pruebas.
El problema central de la autenticación
La mayoría de las pruebas de aplicaciones web requieren que el usuario inicie sesión.
Si cada prueba ejecuta el flujo de inicio de sesión desde cero, la velocidad de las pruebas se ralentizará significativamente.
La solución de Playwright es:Autenticarse una vez, guardar el estado y reutilizarlo en todas las pruebas。
Preparación: directorio .auth
Ejemplo
mkdir -p playwright/.auth
# Agregar a .gitignore (el estado de autenticación contiene información confidencial)
echo 'playwright/.auth' >> .gitignore
.authEl archivo contiene cookies sensibles y tokens de autenticación,y nunca debe enviarse al repositorio de código。
Enfoque básico: cuenta compartida + proyecto Setup
Este es el esquema de autenticación recomendado por Playwright, adecuado para escenarios donde todas las pruebas comparten la misma cuenta de prueba.
Primer paso: crear el Setup de autenticación
Ejemplo
import { test as setup } from '@playwright/test';
// Especificar la ruta de guardado del estado de autenticación
const authFile = 'playwright/.auth/user.json';
setup('authenticate', async ({ page }) => {
// Ejecutar la operación de inicio de sesión
await page.goto('https://www.example.com/login');
await page.getByLabel('nombre de usuario').fill('testuser');
await page.getByLabel('contraseña').fill('password123');
await page.getByRole('button', { name: 'Iniciar sesión' }).click();
// Esperar a que se complete el inicio de sesión (confirmar la redirección de la página o la aparición de la información del usuario)
await page.waitForURL(/dashboard/);
// Guardar el estado de autenticación actual (cookies, localStorage) en un archivo
await page.context().storageState({ path: authFile });
});
Segundo paso: configurar el proyecto Setup
Ejemplo
import { defineConfig } from '@playwright/test';
export default defineConfig({
projects: [
// Proyecto Setup — se ejecuta solo una vez y genera el archivo de estado de autenticación
{
name: 'setup',
testMatch: /auth\.setup\.ts/,
},
// Proyecto de pruebas real — reutiliza el estado de autenticación
{
name: 'chromium',
use: {
storageState: 'playwright/.auth/user.json',
},
dependencies: ['setup'], // Depende del proyecto setup para garantizar que setup se ejecute primero
},
],
});
Tercer paso: las pruebas usan directamente el estado de autenticación
Ejemplo
import { test, expect } from '@playwright/test';
test('Ver el panel', async ({ page }) => {
// Acceder directamente a la página que requiere inicio de sesión; page ya contiene el estado de autenticación
await page.goto('/dashboard');
await expect(page.getByText('Bienvenido de nuevo, testuser')).toBeVisible();
});
Escenario de múltiples cuentas
Si diferentes pruebas necesitan usar diferentes cuentas, se pueden crear múltiples archivos de estado de autenticación.
Ejemplo
test.describe('Funciones de administrador', () => {
test.use({ storageState: 'playwright/.auth/admin.json' });
test('Gestionar usuarios', async ({ page }) => {
// Operar como administrador
});
});
// Prueba de usuario normal
test.describe('Funciones de usuario normal', () => {
test.use({ storageState: 'playwright/.auth/user.json' });
test('Explorar contenido', async ({ page }) => {
// Operar como usuario normal
});
});
Autenticación mediante solicitudes API (recomendado)
Ejecutar el flujo de inicio de sesión a través de la UI es lento; una forma más eficiente es llamar directamente a la API de inicio de sesión.
Ejemplo
import { test as setup } from '@playwright/test';
const authFile = 'playwright/.auth/user.json';
setup('Autenticación mediante API', async ({ request }) => {
// Llamar directamente a la API de inicio de sesión, sin pasar por la UI del navegador
const response = await request.post('https://www.example.com/api/login', {
data: {
username: 'testuser',
password: 'password123',
},
});
// Confirmar que el inicio de sesión fue exitoso
const json = await response.json();
console.log('Inicio de sesión exitoso, Token:', json.token);
// Guardar el Token como cookie (simulando el estado de autenticación del navegador)
// Nota: storageState debe guardarse en el Context del navegador
});
La autenticación por API es más rápida y confiable que la autenticación por UI; se recomienda usarla preferentemente en proyectos reales.
Resumen de escenarios aplicables de los esquemas de autenticación
| Escenario | Esquema recomendado |
|---|---|
| Todas las pruebas usan la misma cuenta de prueba | Proyecto Setup + storageState |
| Diferentes tipos de pruebas necesitan diferentes cuentas | Múltiples storageState + test.use |
| Cada prueba necesita una cuenta independiente | Crear cuenta e iniciar sesión mediante API dentro de cada prueba |
| Recursos de cuenta limitados | Autenticación una sola vez en el proyecto Setup, reutilización completa |