Библиотека Axe-core предоставляет инструменты для автоматизированного тестирования доступности веб-приложений. Она позволяет выявлять проблемы, связанные с нарушением стандартов WCAG (Web Content Accessibility Guidelines), и интегрируется как в браузерное окружение, так и в среду Node.js. В основе работы лежит анализ DOM и выполнение набора правил, проверяющих элементы страницы на соответствие критериям доступности.
Для Node.js используется пакет axe-core, устанавливаемый
через npm:
npm install axe-core
В браузерных проектах библиотека подключается через скрипт:
<script src="https://cdnjs.cloudflare.com/ajax/libs/axe-core/4.8.3/axe.min.js"></script>
После подключения можно инициировать анализ элементов страницы через
метод axe.run(), который принимает два параметра:
Пример базового запуска проверки:
axe.run(document, {
runOnly: ['wcag2a', 'wcag2aa']
}).then(results => {
console.log(results.violations);
});
Результаты выполнения проверки формируются в виде объекта с ключевыми полями:
violations — массив нарушений, описывающий каждое
правило, которое не соблюдается.passes — массив успешно пройденных проверок.incomplete — проверки, которые не удалось полностью
выполнить.inapplicable — правила, которые не применяются к
текущему DOM.Каждое нарушение содержит подробную информацию:
id — уникальный идентификатор правила.impact — уровень серьёзности (critical,
serious, moderate, minor).description — текстовое объяснение проблемы.nodes — список элементов DOM, где обнаружена
проблема.Можно включать или исключать отдельные правила через объект
options:
axe.run(document, {
rules: {
'color-contrast': { enabled: true },
'label': { enabled: false }
}
});
Дополнительно возможно ограничить выполнение проверок определёнными стандартами:
axe.run(document, {
runOnly: {
type: 'tag',
values: ['wcag2aa', 'best-practice']
}
});
Для больших веб-приложений важно использовать параллельное выполнение проверок. Axe-core позволяет запускать несколько анализов одновременно через Promise API, что ускоряет тестирование страниц с множеством элементов и динамическим контентом.
Пример параллельного запуска:
const contexts = [
document.querySelector('#header'),
document.querySelector('#main'),
document.querySelector('#footer')
];
const axePromises = contexts.map(ctx => axe.run(ctx));
Promise.all(axePromises)
.then(resultsArray => {
resultsArray.forEach((result, index) => {
console.log(`Результаты для контекста ${index}:`, result.violations);
});
})
.catch(err => console.error(err));
В данном примере каждый раздел страницы анализируется независимо, а результат объединяется после завершения всех промисов.
Axe-core легко интегрируется с Jest, Mocha и Cypress для автоматизации тестирования:
axe-core вместе с
@testing-library/react для проверки компонентов React.cypress-axe
обеспечивается проверка доступности во время E2E-тестов.Пример с Jest:
import { render } from '@testing-library/react';
import axe from 'axe-core';
import MyComponent from './MyComponent';
test('Компонент соответствует стандартам доступности', async () => {
const { container } = render(<MyComponent />);
const results = await axe.run(container);
expect(results.violations).toHaveLength(0);
});
Для SPA и приложений с динамическими обновлениями DOM важно запускать анализ после полной отрисовки элементов:
function checkAccessibility() {
return axe.run(document.querySelector('#app'));
}
// Пример использования с MutationObserver
const observer = new MutationObserver(() => {
checkAccessibility().then(results => {
console.log(results.violations);
});
});
observer.observe(document.querySelector('#app'), { childList: true, subtree: true });
Такой подход обеспечивает проверку только актуального контента и предотвращает избыточные вызовы на несуществующие элементы.
Promise.all
позволяет масштабировать тестирование.runOnly и rules
повышает точность и адаптируемость тестов под конкретные проекты.Эффективное использование параллельного выполнения в Axe-core обеспечивает быстрый и надёжный анализ доступности, особенно в больших проектах с множеством интерактивных компонентов и динамически загружаемым контентом.