Скриншоты являются важным инструментом в автоматизированном тестировании для визуальной проверки элементов интерфейса, фиксации ошибок и документирования состояния приложения. WebdriverIO предоставляет гибкие возможности для захвата и управления изображениями, включая контроль качества, разрешения, формата и структуры хранения.
В WebdriverIO для получения скриншота используется метод
saveScreenshot(). Он позволяет сохранять текущее состояние
браузера в файл:
browser.saveScreenshot('./screenshots/homepage.png');
Для работы с отдельными элементами используется метод
saveScreenshot() на элементе:
const loginButton = await $('#login');
await loginButton.saveScreenshot('./screenshots/login-button.png');
Это позволяет получать скриншоты конкретных элементов без лишних областей интерфейса.
WebdriverIO поддерживает настройку качества изображений при
сохранении в форматах, поддерживающих сжатие, таких как JPEG. Для этого
можно использовать сторонние библиотеки, например, sharp,
после получения скриншота в виде буфера:
const buffer = await browser.takeScreenshot();
const sharp = require('sharp');
await sharp(Buffer.from(buffer, 'base64'))
.jpeg({ quality: 80 })
.toFile('./screenshots/homepage-high-quality.jpg');
quality регулирует степень сжатия JPEG (0–100).WebdriverIO по умолчанию сохраняет скриншоты в PNG, что обеспечивает максимальное качество и поддержку прозрачности. Для преобразования в другие форматы используется работа с буферами и внешними библиотеками:
Пример конвертации в WebP:
await sharp(Buffer.from(buffer, 'base64'))
.webp({ quality: 90 })
.toFile('./screenshots/homepage.webp');
Для упорядочивания скриншотов рекомендуется использовать структуру каталогов по датам и времени:
const date = new Date().toISOString().replace(/:/g, '-');
await browser.saveScreenshot(`./screenshots/${date}/homepage.png`);
replace(/:/g, '-') используется для корректного
именования файлов.WebdriverIO позволяет автоматически сохранять скриншоты при падении теста через хуки в конфигурации:
afterTest: async (test, context, { error }) => {
if (error) {
const timestamp = new Date().toISOString().replace(/:/g, '-');
await browser.saveScreenshot(`./screenshots/failures/${timestamp}-${test.title}.png`);
}
}
Для визуального регрессионного тестирования часто используется
сравнение скриншотов. WebdriverIO совместим с библиотеками, такими как
pixelmatch или looks-same:
const fs = require('fs');
const pixelmatch = require('pixelmatch');
const PNG = require('pngjs').PNG;
const img1 = PNG.sync.read(fs.readFileSync('baseline.png'));
const img2 = PNG.sync.read(fs.readFileSync('current.png'));
const { width, height } = img1;
const diff = new PNG({ width, height });
const mismatch = pixelmatch(img1.data, img2.data, diff.data, width, height, { threshold: 0.1 });
fs.writeFileSync('diff.png', PNG.sync.write(diff));
threshold регулирует чувствительность к различиям.Для проверки адаптивного дизайна можно управлять разрешением браузера перед захватом:
await browser.setWindowSize(1920, 1080);
await browser.saveScreenshot('./screenshots/desktop.png');
await browser.setWindowSize(375, 667);
await browser.saveScreenshot('./screenshots/mobile.png');
Интеграция скриншотов с отчетами Allure или другими системами улучшает читаемость результатов:
import allure from '@wdio/allure-reporter';
afterTest: async (test, context, { error }) => {
if (error) {
const screenshot = await browser.takeScreenshot();
allure.addAttachment('Error Screenshot', Buffer.from(screenshot, 'base64'), 'image/png');
}
}
Эффективное управление качеством, форматом и структурой скриншотов позволяет повысить информативность тестов, ускорить диагностику ошибок и поддерживать визуальное соответствие интерфейса на разных устройствах.