Axe-core — это мощная библиотека для автоматизированного тестирования доступности веб-приложений. Она анализирует DOM-структуру и выявляет потенциальные проблемы с доступностью, соответствующие стандартам WCAG (Web Content Accessibility Guidelines). Важно понимать, что Axe-core ориентирована на динамический анализ, проверяя как статический HTML, так и элементы, генерируемые JavaScript.
Для использования в браузере можно подключить Axe-core через npm:
import axe from 'axe-core';
// Инициализация
axe.run(document, {
reporter: 'v2',
rules: {
'color-contrast': { enabled: true },
'image-alt': { enabled: true }
}
}, (err, results) => {
if (err) throw err;
console.log(results.violations);
});
Ключевые моменты при настройке:
v2 для структурированного JSON.Результаты Axe-core имеют несколько важных полей:
Каждое нарушение содержит:
id — идентификатор правила.impact — уровень критичности (minor,
moderate, serious,
critical).description — описание проблемы.help — краткая рекомендация по исправлению.nodes — массив элементов DOM, на которых обнаружена
проблема, с конкретными CSS-селекторами.Пример вывода для одного нарушения:
{
"id": "image-alt",
"impact": "critical",
"description": "Все изображения должны иметь альтернативный текст",
"nodes": [
{
"html": "<img src='logo.png'>",
"target": ["#header img"],
"failureSummary": "Элемент не имеет атрибута alt"
}
]
}
Axe-core позволяет задавать условия применения правил:
enabled: true/false — включение или отключение.selector — ограничение проверки только определенными
элементами.any, all, none — условия для
комбинации проверок внутри правила.Пример включения проверки только для форм:
axe.run(document, {
rules: {
'label': {
enabled: true,
selector: 'form'
}
}
});
Также можно расширять правила собственными функциями:
axe.configure({
checks: [
{
id: 'custom-link-check',
evaluate: (node) => node.tagName === 'A' && !node.hasAttribute('href'),
enabled: true,
options: {}
}
]
});
Axe-core широко используется вместе с Jest, Cypress, Mocha для автоматизации тестирования доступности:
import axe from 'axe-core';
import { render } from '@testing-library/react';
test('страница доступна', async () => {
const { container } = render(<App />);
const results = await axe.run(container);
expect(results.violations).toHaveLength(0);
});
cy.visit('/page');
cy.injectAxe();
cy.checkA11y(null, {
includedImpacts: ['critical', 'serious']
});
Особенности:
injectAxe() внедряет библиотеку в контекст
страницы.checkA11y() выполняет проверку, принимает фильтры по
селекторам и уровню критичности.Проверка элементов, создаваемых динамически через JavaScript, требует ожидания рендеринга:
setTimeout(() => {
axe.run(document, {}, (err, results) => {
if (err) throw err;
console.log(results.violations);
});
}, 1000);
Для React или других SPA-фреймворков лучше использовать методы тестовых библиотек, которые обеспечивают ожидание появления элементов перед запуском Axe-core.
const criticalViolations = results.violations.filter(v => v.impact === 'critical');
const formViolations = results.violations.filter(v =>
v.nodes.some(node => node.target[0].startsWith('#form'))
);
context: '#main'.image-alt, color-contrast,
label), чтобы обеспечить минимум доступности.Axe-core предоставляет мощный инструментальный набор для системной проверки доступности веб-приложений. Использование всех возможностей библиотеки позволяет не только выявлять проблемы, но и формировать структурированные данные о нарушениях, что облегчает их исправление и поддержание стандартов доступности.