Снимки страниц для сравнения

Проведение визуальных тестов является важной частью автоматизированного тестирования веб-приложений. Одним из самых распространённых подходов является использование снимков страниц (или скриншотов) для того, чтобы проверить, как изменяется интерфейс приложения с течением времени. Puppeteer предоставляет удобный инструмент для захвата снимков, что позволяет легко интегрировать этот процесс в систему тестирования.

Захват снимков страниц с помощью Puppeteer

Puppeteer — это библиотека для Node.js, которая предоставляет API для управления браузером Chromium или Chrome. Она позволяет выполнять множество задач, таких как симуляция пользовательских действий, тестирование интерфейсов и взаимодействие с веб-страницами.

Для захвата снимков достаточно вызвать метод page.screenshot() на экземпляре страницы. Этот метод позволяет сделать скриншот всей страницы или её части, сохраняя изображение в различных форматах (например, PNG или JPEG). Основная задача при использовании снимков заключается в сравнении изображений для выявления визуальных изменений на страницах.

const puppeteer = require(&

async function takeScreenshot() {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  
  await page.goto('https://example.com');
  
  await page.screenshot({ path: 'example.png' });
  
  await browser.close();
}
takeScreenshot();

В приведённом примере создаётся снимок страницы example.com и сохраняется в файл example.png.

Основные параметры для работы со снимками

Метод page.screenshot() имеет несколько параметров, которые позволяют настроить поведение снимка в зависимости от требований:

  • path: путь к файлу, в который будет сохранён снимок.
  • fullPage: если установлено значение true, будет захвачен скриншот всей страницы, включая области, находящиеся за пределами экрана. По умолчанию снимается только видимая часть страницы.
  • clip: позволяет указать прямоугольную область для захвата снимка. Это полезно, если нужно сделать скриншот только части страницы.
  • quality: для формата JPEG можно указать качество изображения от 0 до 100.
  • type: тип изображения, который будет использоваться (например, png или jpeg).

Пример использования параметров для захвата части страницы:

await page.screenshot({
  path: 'example-part.png',
  clip: { x: 0, y: 0, width: 800, height: 600 }
});

В этом примере будет сделан скриншот только области 800x600 пикселей, начиная с верхнего левого угла страницы.

Сравнение снимков

Для автоматизированного тестирования важным моментом является способность сравнивать снимки страниц, чтобы выявить изменения в интерфейсе. Существует несколько подходов к решению этой задачи.

Использование библиотеки pixelmatch

Одним из популярных способов сравнения изображений является использование библиотеки pixelmatch. Эта библиотека позволяет сравнивать два изображения, пиксель за пикселью, и вычислять процент различий между ними. Она может быть полезной для обнаружения незначительных изменений в UI, таких как изменение цвета кнопки или текста.

Для использования pixelmatch необходимо установить её через npm:

npm install pixelmatch

Пример кода для сравнения двух снимков с использованием pixelmatch:

const fs = require('fs');
const pixelmatch = require('pixelmatch');
const PNG = require('pngjs').PNG;

const img1 = PNG.sync.read(fs.readFileSync('screenshot1.png'));
const img2 = PNG.sync.read(fs.readFileSync('screenshot2.png'));

const { width, height } = img1;
const diff = new PNG({ width, height });

const numDiffPixels = pixelmatch(img1.data, img2.data, diff.data, width, height, { threshold: 0.1 });

fs.writeFileSync('diff.png', PNG.sync.write(diff));

console.log(`Number of different pixels: ${numDiffPixels}`);

В этом примере сравниваются два снимка, screenshot1.png и screenshot2.png. Результат сохраняется в виде изображения diff.png, где будут отображены отличия между изображениями. Метод pixelmatch возвращает количество пикселей, которые отличаются на двух изображениях. Это позволяет быстро определить, насколько сильно изменился интерфейс.

Обработка ошибок и терпимость к изменениям

Для большинства приложений потребуется учитывать небольшие различия между снимками, которые могут возникнуть из-за таких факторов, как временные изменения в содержимом страницы, асинхронная загрузка данных или различия в рендеринге браузера.

Чтобы справиться с этим, можно настроить порог изменения пикселей. Параметр threshold в библиотеке pixelmatch позволяет задать процент различий, при котором изменения будут считаться значимыми. Значение по умолчанию — 0.1, что соответствует 10% различий между пикселями.

Если нужно игнорировать изменения, которые не оказывают существенного влияния на визуальное восприятие, можно повысить значение порога.

const numDiffPixels = pixelmatch(img1.data, img2.data, diff.data, width, height, { threshold: 0.2 });

Кроме того, стоит учитывать время рендеринга страницы. Чтобы избежать ложных срабатываний тестов из-за временных изменений, можно добавлять небольшую задержку перед снятием снимков или использовать дополнительные техники синхронизации.

Интеграция с системами CI/CD

Автоматическое тестирование с использованием снимков страниц и их сравнение является важным элементом в процессе интеграции и доставки (CI/CD). Такие тесты позволяют убедиться, что обновления в коде не нарушают визуальную целостность приложения.

Для интеграции с CI/CD можно настроить скрипты, которые будут автоматически выполнять тесты с использованием Puppeteer и сравнивать снимки перед каждым деплоем. Если различия в снимках превышают допустимый порог, можно настроить систему так, чтобы она отклоняла изменения, требующие ручной проверки.

Советы по использованию снимков страниц для тестирования

  • Регулярное обновление эталонных снимков: Визуальные тесты должны быть динамичными, особенно если дизайн интерфейса часто меняется. Убедитесь, что эталонные снимки обновляются в соответствии с изменениями дизайна.
  • Не ограничивайтесь только скриншотами: Сравнение снимков хорошо работает для визуальных тестов, но важно также проводить функциональные тесты для проверки логики работы приложения.
  • Обработка изменений состояния страницы: Для динамических страниц (например, с анимациями или асинхронными данными) может понадобиться несколько снимков, сделанных в разные моменты времени.

Визуальное тестирование с помощью снимков страниц помогает автоматически отслеживать изменения в интерфейсе и гарантировать, что приложение не теряет своей визуальной стабильности при каждом обновлении.