Сравнение скриншотов является одним из методов визуального тестирования, позволяющим выявлять изменения интерфейса приложения, которые могут не проявляться в функциональных проверках. В среде Protractor для этого чаще всего используют интеграцию с внешними библиотеками для работы с изображениями, такими как Resemble.js, Pixelmatch или protractor-image-comparison.
Для начала необходимо подключить библиотеку для сравнения изображений. Одним из наиболее удобных вариантов является protractor-image-comparison, которая обеспечивает интеграцию с Protractor и возможность сохранять эталонные изображения (baseline) для последующего сравнения.
Установка библиотеки через npm:
npm install protractor-image-comparison --save-dev
В конфигурационном файле Protractor (protractor.conf.js)
необходимо инициализировать плагин и задать параметры для работы с
изображениями:
const { join } = require('path');
const protractorImageComparison = require('protractor-image-comparison');
exports.config = {
framework: 'jasmine',
specs: ['specs/**/*.spec.js'],
capabilities: {
browserName: 'chrome',
chromeOptions: {
args: ['--headless', '--disable-gpu']
}
},
onPrepare: async () => {
browser.imageComparison = new protractorImageComparison({
baselineFolder: join(process.cwd(), './screenshots/baseline/'),
screenshotPath: join(process.cwd(), './screenshots/current/'),
autoSaveBaseline: true,
ignoreAntialiasing: true,
debug: false
});
}
};
Ключевые параметры:
baselineFolder — директория с эталонными
изображениями.screenshotPath — директория для текущих
скриншотов.autoSaveBaseline — автоматически сохраняет эталонные
скриншоты, если их ещё нет.ignoreAntialiasing — игнорирует различия из-за
сглаживания шрифтов или графики.Для получения скриншота определённого элемента на странице
используется метод
browser.imageComparison.takeElementScreenshot:
it('должен корректно отображать кнопку', async () => {
const button = element(by.css('.submit-button'));
const result = await browser.imageComparison.checkElement(button, 'submit_button');
expect(result).toBeLessThan(0.01); // порог допустимых различий
});
Метод возвращает процент различий между текущим
скриншотом и эталонным изображением. Порог можно задавать в виде числа
от 0 до 1, где 0 означает полное
совпадение.
Для полного экрана используется checkScreen:
it('главная страница соответствует эталону', async () => {
const result = await browser.imageComparison.checkScreen('homepage');
expect(result).toBeLessThan(0.02);
});
После выполнения теста можно получить отчёт с визуальными различиями. В случае использования protractor-image-comparison создаются три типа файлов:
Такой подход позволяет визуально анализировать изменения интерфейса, не ограничиваясь только процентным значением различий.
Для уменьшения ложных срабатываний применяются следующие возможности:
tolerance) —
позволяет игнорировать незначительные пиксельные различия.ignoreRect) —
задаёт прямоугольники, которые не учитываются при сравнении. Например,
динамические элементы вроде даты или счетчиков:const dynamicBanner = element(by.css('.banner'));
const result = await browser.imageComparison.checkElement(dynamicBanner, 'banner', {
ignoreRectangles: [{ x: 10, y: 5, width: 200, height: 50 }]
});
Скриншотное сравнение особенно эффективно при автоматизации в CI/CD:
Такой подход позволяет обнаруживать регрессии интерфейса еще до релиза.
browser.manage().window().setSize(width, height).Сравнение скриншотов в Protractor позволяет дополнить функциональные тесты визуальной проверкой, выявлять скрытые дефекты интерфейса и интегрироваться с автоматизированными пайплайнами. При правильной настройке и использовании эталонных изображений эта методика становится мощным инструментом для поддержки стабильного пользовательского интерфейса.