В процессе тестирования веб-приложений часто возникает необходимость верифицировать визуальные аспекты интерфейса. Один из способов осуществить такую верификацию — создание скриншотов, особенно когда нужно проверить корректность отображения отдельных элементов на странице. Playwright предоставляет мощный и гибкий инструмент для работы со скриншотами, позволяя захватывать изображения как всей страницы, так и конкретных элементов.
Для того чтобы сделать снимок экрана отдельного элемента на странице,
необходимо использовать метод elementHandle.screenshot().
Сначала необходимо получить ссылку на элемент с помощью одного из
доступных методов поиска, таких как page.$() или
page.$$(...), а затем вызвать метод для создания
скриншота.
Пример кода, который демонстрирует процесс создания скриншота отдельного элемента:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
// Находим элемент по селектору
const element = await page.$('div.example');
// Делаем скриншот элемента
await element.screenshot({ path: 'element-screenshot.png' });
await browser.close();
})();
В данном примере:
page.$() выбирается элемент с классом
example.screenshot(), который сохраняет изображение в файл.Метод screenshot() имеет несколько опций, которые могут
быть полезны при настройке скриншота:
png (по умолчанию) и jpeg.jpeg. Определяет качество изображения
от 0 до 100.{ x, y, width, height }.true,
будет сделан скриншот всей страницы, а не только видимой области. Этот
параметр можно использовать, если нужно сравнить визуальное состояние
страницы с полным захватом.Пример использования параметра clip:
await element.screenshot({
path: 'element-clip.png',
clip: { x: 0, y: 0, width: 300, height: 200 }
});
Здесь будет сделан скриншот только части элемента с размерами 300x200 пикселей, начиная с координат (0, 0).
Если необходимо сделать скриншоты нескольких элементов, можно
использовать метод page.$$(), который возвращает массив
элементов, соответствующих указанному селектору. Далее для каждого
элемента вызывается метод screenshot().
Пример:
const elements = await page.$$('div.example');
for (let i = 0; i < elements.length; i++) {
await elements[i].screenshot({ path: `element-${i}.png` });
}
Этот код перебирает все элементы с классом example и
сохраняет скриншот каждого из них в отдельный файл с индексом в
названии.
Для интеграционных тестов и проверки визуальных аспектов интерфейса полезно сохранять скриншоты отдельных элементов в качестве контрольных снимков. Например, скриншоты можно использовать для сравнения изменений интерфейса, таких как визуальные баги или изменения в дизайне. Это удобно при работе с тестами на регрессию, когда важно удостовериться, что изменения в коде не повлияли на внешний вид приложения.
Playwright также позволяет легко сравнивать старые и новые скриншоты
с помощью дополнительных инструментов, таких как библиотеки для
визуального тестирования (например, pixelmatch). Это
позволяет автоматизировать процесс обнаружения визуальных
отклонений.
Пример с использованием pixelmatch:
const fs = require('fs');
const pixelmatch = require('pixelmatch');
const PNG = require('pngjs').PNG;
const img1 = PNG.sync.read(fs.readFileSync('old-screenshot.png'));
const img2 = PNG.sync.read(fs.readFileSync('new-screenshot.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 differing pixels: ${numDiffPixels}`);
Этот код сравнивает два изображения и генерирует изображение с разницей, где можно визуально увидеть изменения между скриншотами.
Скриншоты отдельных элементов полезны не только для тестирования, но и для отладки. Если тест не проходит или есть сомнения в правильности отображения какого-либо элемента на странице, можно сделать скриншот и проанализировать визуальное состояние страницы на момент ошибки. Это помогает быстрее найти причины проблемы и устранить их.
Для этого можно добавить создание скриншотов непосредственно в моменты, когда возникает ошибка или когда происходит сбой:
try {
await element.screenshot({ path: 'debug-screenshot.png' });
} catch (error) {
console.error('Error occurred while capturing screenshot', error);
}
В таких случаях скриншот будет полезен для диагностики проблемы и уменьшит время, необходимое для исправления ошибок.
Скриншоты отдельных элементов с использованием Playwright являются мощным инструментом для визуального тестирования и отладки. Возможность захватывать как отдельные части страницы, так и проводить визуальные сравнения, значительно упрощает процесс верификации интерфейса. Это особенно важно в тех случаях, когда необходимо убедиться в том, что изменения в коде не вызвали нежелательных визуальных сдвигов или багов.