Puppeteer — это библиотека Node.js для управления браузером Chromium или Chrome через протокол DevTools. Для тестирования доступности сначала необходимо установить Puppeteer:
npm install puppeteer
После установки создаётся базовый скрипт для запуска браузера и открытия страницы:
const puppeteer = require(&
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
})();
Опция headless: true позволяет запускать браузер без
графического интерфейса, что ускоряет тесты и снижает нагрузку на
систему.
Для тестирования доступности чаще всего используется библиотека axe-core. Она позволяет выявлять нарушения стандартов WCAG, такие как неправильные атрибуты ARIA, контраст текста, отсутствие альтернативного текста для изображений.
Установка зависимостей:
npm install axe-core
Импорт и внедрение Axe в страницу Puppeteer:
const puppeteer = require('puppeteer');
const axeSource = require('axe-core').source;
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
// Внедрение axe-core на страницу
await page.evaluate(axeSource);
// Запуск анализа доступности
const results = await page.evaluate(async () => {
return await axe.run();
});
console.log(results.violations);
await browser.close();
})();
Ключевые моменты:
axeSource содержит исходный код библиотеки, который
внедряется на страницу через page.evaluate.
axe.run() возвращает объект с массивом нарушений
(violations), предупреждений (incomplete) и
рекомендаций (passes).
Результат работы Axe можно фильтровать по типу нарушений или по критичности:
results.violations.forEach(violation => {
console.log(`Нарушение: ${violation.id}`);
console.log(`Описание: ${violation.description}`);
console.log(`Элементы:`);
violation.nodes.forEach(node => {
console.log(` ${node.html}`);
console.log(` Исправление: ${node.failureSummary}`);
});
});
Рекомендации по работе с результатами:
id для быстрого поиска и группировки схожих
ошибок.
failureSummary часто содержит конкретные шаги по
исправлению.
Puppeteer позволяет проверять доступность отдельных элементов страницы, а не только всего DOM. Например, проверка кнопки:
const buttonSelector = '#submit-button';
const buttonViolations = await page.evaluate(async (selector) => {
const element = document.querySelector(selector);
return await axe.run(element);
}, buttonSelector);
console.log(buttonViolations.violations);
Это полезно для модульного тестирования, когда страницы содержат сложные компоненты.
Axe позволяет конфигурировать правила, отключать или включать проверки:
const config = {
rules: {
'color-contrast': { enabled: true },
'image-alt': { enabled: false } // отключаем проверку альтернативного текста
}
};
const results = await page.evaluate(async (config) => {
return await axe.run(document, config);
}, config);
Применение конфигурации позволяет:
Автоматизация проверок доступности в пайплайнах GitLab, GitHub Actions или Jenkins выполняется через Node.js скрипты. Пример проверки при сборке проекта:
node accessibility-check.js
Результаты можно парсить и конвертировать в отчёты в формате JSON, HTML или Markdown для удобного отображения в CI/CD.
await page.screenshot({ path: 'screenshot.png', fullPage: true });
Для SPA и страниц с динамическим контентом необходимо дождаться полной загрузки элементов перед проверкой:
await page.waitForSelector('#main-content', { visible: true });
const results = await page.evaluate(async () => await axe.run());
Опция waitForSelector гарантирует, что анализ не выполнится
до появления всех элементов на странице. Это особенно важно для
модальных окон, выпадающих списков и интерактивных виджетов.
await page.$eval('#element', el => el.scrollIntoView());
await page.keyboard.press('Tab');
const focusedElement = await page.evaluate(() => document.activeElement.id);
console.log(focusedElement);
const urls = ['https://example.com', 'https://example.com/about'];
for (const url of urls) {
await page.goto(url);
const results = await page.evaluate(async () => await axe.run());
console.log(`${url}: ${results.violations.length} нарушений`);
}
Эти методы позволяют создавать комплексные тестовые сценарии для всего веб-приложения, повышая уровень доступности и соответствие стандартам.