Визуальное регрессионное тестирование в Playwright
В этой главе представлены возможности визуального регрессионного тестирования Playwright, позволяющие обнаруживать неожиданные изменения интерфейса путём сравнения скриншотов.
Что такое визуальное регрессионное тестирование
Визуальное регрессионное тестирование сравнивает текущий скриншот сэталонным скриншотом (Golden File), чтобы обнаруживать изменения интерфейса на странице по различиям пикселей.
Когда изменение CSS неожиданно влияет на вёрстку других страниц, визуальное регрессионное тестирование может напрямую выявить эту проблему.
expect(page).toHaveScreenshot() Сравнение скриншотов страницы
Пример
await page.goto('https://www.example.com/');
// Первый запуск: сохранить эталонный скриншот
// Последующие запуски: сравнить с эталонным скриншотом
await expect(page).toHaveScreenshot('example-homepage.png');
});
При первом запуске Playwright сообщит об ошибке и создаст базовый скриншот:
Error: A snapshot doesn't exist at example-homepage-chromium-darwin.png, writing actual.
При втором запуске он автоматически сравнит с базовым скриншотом.
Полные параметры toHaveScreenshot
Пример
fullPage: true, // Скриншот всей страницы
maxDiffPixelRatio: 0.01, // Допускать 1% различия пикселей
maxDiffPixels: 100, // Допускать до 100 различий пикселей
threshold: 0.2, // Порог различия пикселей (0~1)
animations: 'disabled', // Отключить анимации (рекомендуется)
mask: [ // Игнорировать определённые области
page.getByText('Current Time'),
],
});
expect(locator).toHaveScreenshot() Сравнение скриншота элемента
Пример
await page.goto('https://www.example.com/');
// Сравнивать только скриншот панели навигации
const navbar = page.getByRole('navigation');
await expect(navbar).toHaveScreenshot('navbar.png');
});
Управление эталонными файлами
Создание эталонного файла
При первом запуске проверки скриншота Playwright автоматически создает эталонный файл и сохраняет его в-snapshotsкаталоге рядом с тестовым файлом:
tests/
├── example.spec.ts
└── example.spec.ts-snapshots/
└── example-homepage-chromium-darwin.png
Имя файла содержит название браузера и операционной системы, что обеспечивает независимое управление эталонными снимками для разных платформ.
Обновление эталонного файла
Когда в UI происходят ожидаемые изменения дизайна, необходимо обновить эталонный скриншот:
# 更新所有截图基准 npx playwright test --update-snapshots # 只更新特定文件 npx playwright test tests/example.spec.ts --update-snapshots
Пояснение параметров визуального сравнения
| Опция | Type | Описание |
|---|---|---|
maxDiffPixelRatio | число | Допустимая доля различий пикселей (0~1), по умолчанию 0 |
maxDiffPixels | число | Допустимое количество различий пикселей, по умолчанию 0 |
threshold | число | Допуск различия на пиксель (0~1), по умолчанию 0.2 |
animations | string | Отключать ли анимации:'disabled' | 'allow' |
mask | Locator[] | Игнорируемые области (не учитываются при сравнении различий) |
Особенности окружения CI
На результаты отрисовки браузера влияют такие факторы, как операционная система, версия браузера, аппаратное обеспечение, состояние питания и безголовый режим. Чтобы обеспечить согласованность, создавайте Golden Files и запускайте тесты в одной и той же среде. Рекомендуется использовать Docker-контейнер или ту же платформу, что и CI, чтобы исключить различия.
Визуальное тестирование в Docker
# 使用 Playwright Docker 镜像确保渲染一致性 docker run --rm -v $(pwd):/work -w /work \ mcr.microsoft.com/playwright:v1.52.0-jammy \ npx playwright test --update-snapshots
Лучшие практики визуального тестирования
- Создавайте Golden Files и запускайте сравнения на одной и той же платформе
- Используйте
animations: 'disabled'чтобы устранить неопределённость, связанную с анимацией - Используйте
maskчтобы игнорировать динамический контент (например, временные метки, рекламные блоки) - Отдавайте приоритет визуальному регрессионному тестированию критических страниц (главная страница, вход, оплата)
- Зафиксируйте эталонные файлы в системе контроля версий
- Используйте фиксированные версии браузеров и операционных систем в CI