Контрастность и цвета элементов на веб-странице напрямую влияют на восприятие интерфейса пользователем и соответствие стандартам доступности. Puppeteer предоставляет инструменты для проверки визуальных характеристик страниц, что позволяет автоматизировать тестирование цветовой схемы, контрастности текста и фона, а также корректности отображения стилей.
Для анализа цветов необходимо извлекать стили элементов. Puppeteer
позволяет это делать через метод evaluate, который
выполняет код внутри контекста браузера:
const color = await page.$eval(&
const style = window.getComputedStyle(el);
return {
color: style.color,
backgroundColor: style.backgroundColor
};
});
console.log(color); // { color: 'rgb(34, 34, 34)', backgroundColor: 'rgb(255, 255, 255)' }
window.getComputedStyle возвращает все вычисленные стили
элемента, включая цвета текста, фона, границ и теней. Это позволяет
проводить точный аудит визуального отображения элементов.
Контрастность текста и фона важна для доступности, особенно для людей с нарушениями зрения. Для вычисления контрастности можно использовать формулу WCAG:
[ L = 0.2126 R + 0.7152 G + 0.0722 B]
где (R, G, B) — линейные компоненты цвета, преобразованные из sRGB. Контрастность рассчитывается как отношение яркости:
[ = , L_1 > L_2]
Пример проверки контрастности с использованием Puppeteer и Node.js:
function rgbToLuminance(rgb) {
const [r, g, b] = rgb.match(/\d+/g).map(x => x / 255).map(v => v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4));
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
}
function contrastRatio(foreground, background) {
const L1 = rgbToLuminance(foreground);
const L2 = rgbToLuminance(background);
return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);
}
const ratio = contrastRatio('rgb(34, 34, 34)', 'rgb(255, 255, 255)');
console.log(ratio); // 12.63
Значения контрастности для нормального текста должны быть не менее 4.5:1, а для крупного текста — 3:1, что соответствует стандартам WCAG 2.1.
Puppeteer позволяет отслеживать изменение стилей при взаимодействии с элементами. Например, изменение цвета кнопки при наведении:
await page.hover('button#submit');
const hoverColor = await page.$eval('button#submit', el => getComputedStyle(el).backgroundColor);
console.log(hoverColor);
Такой подход важен для тестирования визуальных состояний: hover, active, focus, disabled. Автоматическая проверка этих состояний предотвращает ошибки в пользовательском интерфейсе.
Для комплексного тестирования контрастности и цветов используется визуальная регрессия. Puppeteer позволяет делать скриншоты отдельных элементов или всей страницы:
await page.screenshot({ path: 'screenshot.png', fullPage: true });
await page.$('header').then(el => el.screenshot({ path: 'header.png' }));
Эти изображения можно использовать с инструментами сравнения, например
pixelmatch или jest-image-snapshot, для
обнаружения неожиданных изменений цветовой схемы.
Современные приложения используют CSS-переменные для управления цветами интерфейса. Puppeteer позволяет получать значения переменных напрямую:
const primaryColor = await page.evaluate(() => getComputedStyle(document.documentElement).getPropertyValue('--primary-color'));
console.log(primaryColor);
Это упрощает тестирование смены тем (light/dark mode) и гарантирует, что все элементы корректно используют заданные цвета.
Применение этих методов позволяет выявлять проблемы с контрастностью ещё на этапе автоматического тестирования, повышая качество интерфейса и соответствие стандартам доступности.