Сравнение скриншотов является важной частью автоматизированного тестирования пользовательских интерфейсов. Оно позволяет выявлять визуальные регрессии, которые могут быть незаметны при обычных функциональных проверках. WebdriverIO предоставляет интеграцию с инструментами для визуального тестирования, что делает процесс сравнения скриншотов структурированным и автоматизированным.
1. Pixel-by-Pixel сравнение Это наиболее точный метод, при котором каждый пиксель скриншота сравнивается с эталонным изображением. Любое расхождение фиксируется как ошибка. Применение:
import { expect } from 'chai';
import fs from 'fs';
import pixelmatch from 'pixelmatch';
import { PNG } from 'pngjs';
const baseline = PNG.sync.read(fs.readFileSync('./baseline.png'));
const current = PNG.sync.read(fs.readFileSync('./current.png'));
const { width, height } = baseline;
const diff = new PNG({ width, height });
const numDiffPixels = pixelmatch(baseline.data, current.data, diff.data, width, height, { threshold: 0.1 });
expect(numDiffPixels).to.equal(0);
Ключевой момент: threshold задаёт чувствительность, чтобы минимальные отличия, например, из-за сглаживания шрифтов, не приводили к ложным срабатываниям.
2. Сравнение с учётом области Иногда нужно проверять только конкретные элементы страницы. В WebdriverIO это реализуется через локаторы:
const element = await $('#login-button');
const screenshot = await element.saveScreenshot('./current-element.png');
Далее этот скриншот можно сравнивать с эталонным, как показано выше.
3. Использование специализированных библиотек
Популярные инструменты: webdriver-image-comparison,
Percy, Applitools. Они предоставляют
расширенные функции:
Пример с webdriver-image-comparison:
import { browser } from '@wdio/globals';
await browser.setupTestingEnvironment();
const result = await browser.checkElement($('#header'), 'header');
console.log(result.misMatchPercentage); // процент различий
npm install @wdio/cli @wdio/local-runner @wdio/mocha-framework webdriver-image-comparison
exports.config = {
services: [
['image-comparison', {
baselineFolder: './baseline/',
formatImageName: '{tag}-{logName}-{width}x{height}',
screenshotPath: './.tmp/',
savePerInstance: true,
autoSaveBaseline: true,
}]
]
};
describe('Visual regression test', () => {
it('Header should match baseline', async () => {
await browser.url('/home');
const result = await browser.checkElement($('#header'), 'header');
expect(result.misMatchPercentage).toBeLessThan(1); // допускаем до 1% различий
});
});
| Метод | Преимущества | Ограничения |
|---|---|---|
| Pixel-by-Pixel | Максимальная точность, простота реализации | Чувствителен к мелким изменениям шрифтов и рендеринга |
| Сравнение области | Позволяет проверять конкретные элементы | Требует явного указания локаторов, не учитывает контекст страницы |
| Специализированные библиотеки | Поддержка динамических областей, отчёты, интеграция с CI/CD | Дополнительная зависимость, возможные платные версии |
WebdriverIO легко интегрируется с Jenkins, GitHub Actions, GitLab CI. Для визуальных тестов важно:
Пример GitHub Actions:
name: Visual Tests
on: [pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install dependencies
run: npm ci
- name: Run visual tests
run: npx wdio run wdio.conf.js
- name: Upload screenshots
uses: actions/upload-artifact@v3
with:
name: visual-screenshots
path: ./.tmp/
Сравнение скриншотов в WebdriverIO — это систематический подход к проверке интерфейса, который сочетает точность, автоматизацию и интеграцию с CI/CD. Правильное использование методов визуального тестирования позволяет выявлять мельчайшие расхождения и повышает стабильность пользовательского опыта на всех этапах разработки.