Библиотека axe-core является стандартным инструментом для автоматической проверки доступности веб-приложений. Она реализует рекомендации WCAG (Web Content Accessibility Guidelines) и позволяет выявлять нарушения, связанные с цветовым контрастом, семантикой HTML, фокусом клавиатуры и другими аспектами доступности.
Cypress, как фреймворк для end-to-end тестирования, обеспечивает удобную среду для запуска тестов в браузере. Совмещение Cypress с axe-core позволяет интегрировать автоматическую проверку доступности в процессы CI/CD.
Для использования axe-core с Cypress требуется установка двух пакетов:
npm install --save-dev cypress
npm install --save-dev cypress-axe
После установки необходимо подключить cypress-axe в
файле cypress/support/e2e.js:
import 'cypress-axe';
Это позволяет использовать команды injectAxe и
checkA11y в тестах.
cy.injectAxe()Эта команда внедряет скрипт axe-core в текущую страницу. Она должна вызываться после того, как страница полностью загружена:
cy.visit('/login');
cy.injectAxe();
cy.checkA11y(context, options, violationCallback)Команда выполняет проверку доступности. Параметры:
context (необязательный) – селектор или DOM-элемент,
для которого проводится проверка. Если не указан, проверяется весь
документ.options (необязательный) – объект конфигурации
axe-core, например, для отключения отдельных правил.violationCallback (необязательный) – функция обратного
вызова, вызываемая при обнаружении нарушений.Пример:
cy.checkA11y(null, {
runOnly: {
type: 'tag',
values: ['wcag2a', 'wcag2aa']
}
}, (violations) => {
if (violations.length) {
cy.log(`${violations.length} нарушений доступности обнаружено`);
violations.forEach(v => {
cy.log(`Элемент: ${v.nodes.map(n => n.target).join(', ')} - ${v.help}`);
});
}
});
violations содержит подробную информацию о каждом
нарушении: целевой элемент, описание ошибки, рекомендации по
исправлению.Для сложных интерфейсов может потребоваться исключить определённые элементы из проверки:
cy.checkA11y('.main-content', {
exclude: ['.advertisement', '#promo-banner']
});
include, чтобы проверять только
конкретные части страницы.Также можно отключать отдельные правила:
cy.checkA11y(null, {
rules: {
'color-contrast': { enabled: false },
'label': { enabled: true }
}
});
Рекомендуется вызывать cy.injectAxe() в блоке
beforeEach, чтобы скрипт axe-core был внедрён перед каждой
проверкой:
describe('Тестирование доступности страницы логина', () => {
beforeEach(() => {
cy.visit('/login');
cy.injectAxe();
});
it('Страница соответствует стандартам WCAG 2.1', () => {
cy.checkA11y();
});
});
violationCallback можно использовать для генерации
детализированных отчётов. Например, для CI/CD удобно выводить результаты
в консоль в структурированном виде или сохранять в файл JSON:
cy.checkA11y(null, {}, (violations) => {
const results = violations.map(v => ({
id: v.id,
impact: v.impact,
description: v.description,
elements: v.nodes.map(n => n.target)
}));
cy.writeFile('cypress/reports/accessibility.json', results);
});
impact (critical, serious,
moderate, minor) для приоритизации исправлений.Для визуальной отладки удобно использовать команду
cy.checkA11y с выделением нарушений на странице:
cy.checkA11y(null, {}, (violations) => {
violations.forEach(v => {
v.nodes.forEach(n => {
Cypress.$(n.target).css('outline', '3px solid red');
});
});
});
Для компонентов, которые загружаются асинхронно (React, Vue,
Angular), необходимо вызывать cy.checkA11y после завершения
рендеринга:
cy.get('#dynamic-component').should('be.visible');
cy.checkA11y('#dynamic-component');
should('be.visible') гарантирует, что axe-core
проверяет окончательное состояние DOM.color-contrast или aria-roles.Использование axe-core совместно с Cypress обеспечивает системный подход к проверке доступности, позволяет выявлять ошибки на ранних этапах и поддерживать соответствие стандартам WCAG в масштабных веб-приложениях.