← Volver al listado de tecnologías
Capítulo 10: Visual Testing
Visual Testing
Detecta cambios visuales no deseados comparando screenshots entre ejecuciones.
Screenshot Básico
import { test, expect } from '@playwright/test';
test('capturar screenshot', async ({ page }) => {
await page.goto('https://ejemplo.com');
await page.screenshot({ path: 'screenshot.png' });
});
Comparación Visual
test('comparación visual', async ({ page }) => {
await page.goto('https://ejemplo.com');
// Compara con snapshot guardado
await expect(page).toHaveScreenshot('homepage.png');
});
Opciones de Screenshot
// Página completa
await page.screenshot({
path: 'full.png',
fullPage: true
});
// Solo elemento
const header = page.locator('header');
await header.screenshot({ path: 'header.png' });
// Con máscara (ocultar elementos dinámicos)
await expect(page).toHaveScreenshot({
mask: [page.locator('.fecha-actual')],
});
// Tolerancia de diferencia
await expect(page).toHaveScreenshot({
maxDiffPixels: 100,
});
// Porcentaje de diferencia
await expect(page).toHaveScreenshot({
maxDiffPixelRatio: 0.1,
});
Actualizar Snapshots
# Actualizar todos los snapshots
npx playwright test --update-snapshots
# Actualizar test específico
npx playwright test visual.spec.ts --update-snapshots
Configuración en playwright.config.ts
export default defineConfig({
expect: {
toHaveScreenshot: {
maxDiffPixels: 10,
animations: 'disabled',
},
},
use: {
screenshot: 'only-on-failure',
},
});
Ejercicio Práctico
Objetivo
Crear tests visuales para TodoMVC.
Pasos
- Captura screenshot de la página inicial
- Agrega una tarea y captura nuevo screenshot
- Compara elementos específicos (header, lista)
- Usa máscara para elementos dinámicos
Ver solución
import { test, expect } from '@playwright/test';
test('visual - página inicial', async ({ page }) => {
await page.goto('https://demo.playwright.dev/todomvc');
await expect(page).toHaveScreenshot('todomvc-inicial.png');
});
test('visual - con tarea', async ({ page }) => {
await page.goto('https://demo.playwright.dev/todomvc');
await page.getByPlaceholder('What needs to be done?')
.fill('Mi tarea');
await page.keyboard.press('Enter');
await expect(page.locator('.todo-list'))
.toHaveScreenshot('lista-con-tarea.png');
});
test('visual - header', async ({ page }) => {
await page.goto('https://demo.playwright.dev/todomvc');
await expect(page.locator('header'))
.toHaveScreenshot('header.png');
});
Criterios de Éxito
- Screenshots generados
- Comparación visual funciona
- Entiendes las opciones de tolerancia