Axe-core — это мощная библиотека для автоматизированного тестирования доступности веб-приложений. Она реализует проверку интерфейса по стандартам WCAG (Web Content Accessibility Guidelines) и помогает выявлять ошибки, связанные с доступностью элементов для пользователей с ограниченными возможностями.
Библиотека предоставляет API для запуска сканирования DOM и получения
подробных отчётов о нарушениях. В JavaScript Axe-core интегрируется
через npm-пакет axe-core и может работать как в браузере,
так и в средах тестирования на базе Node.js.
Для работы с Axe-core необходимо установить пакет через npm:
npm install axe-core
В браузерных тестах подключение может выполняться напрямую:
import axe from 'axe-core';
или через включение скрипта на страницу:
<script src="node_modules/axe-core/axe.min.js"></script>
После подключения библиотека готова к анализу DOM.
Основной метод для проверки доступности — axe.run. Он
принимает два параметра:
Пример базового запуска:
axe.run(document, {
runOnly: {
type: 'tag',
values: ['wcag2a', 'wcag2aa']
}
}).then(results => {
console.log(results.violations);
});
Ключевые моменты:
runOnly позволяет ограничить проверку определёнными
тегами или уровнями WCAG.results.violations возвращает массив объектов, каждый
из которых содержит описание ошибки, элементы DOM, где она обнаружена, и
рекомендации по исправлению.Axe-core поддерживает гибкую настройку правил:
axe.run(document, {
rules: {
'color-contrast': { enabled: true },
'label': { enabled: false }
}
});
Также существует возможность фильтрации элементов:
axe.run(document.querySelector('#main-content'));
Это позволяет анализировать только определённые блоки страницы, что полезно после миграции, когда часть интерфейса обновлена, а остальная остаётся прежней.
Для автоматизированного тестирования Axe-core хорошо интегрируется с Jest, Mocha, Cypress и другими инструментами.
Пример с Jest:
import { configureAxe } from 'jest-axe';
import { render } from '@testing-library/react';
import MyComponent from './MyComponent';
const axe = configureAxe();
test('Компонент соответствует стандартам доступности', async () => {
const { container } = render(<MyComponent />);
const results = await axe(container);
expect(results).toHaveNoViolations();
});
jest-axe оборачивает axe-core и
интегрирует его с Jest.toHaveNoViolations упрощает проверку: тест
падает, если найдены нарушения.Пример с Cypress:
import 'cypress-axe';
cy.visit('/page');
cy.injectAxe();
cy.checkA11y();
injectAxe добавляет библиотеку в контекст теста.checkA11y выполняет проверку доступности и выводит
результаты в консоль.Объект results содержит несколько ключевых полей:
Пример структуры violation:
{
"id": "color-contrast",
"impact": "serious",
"description": "Недостаточный контраст текста",
"nodes": [
{
"html": "<span class='text'>Пример</span>",
"target": ["#main-content .text"],
"failureSummary": "Контраст текста слишком низкий для WCAG 2.1 AA"
}
]
}
impact указывает серьёзность ошибки (minor, moderate,
serious, critical).nodes содержит элементы, нарушающие правило.После миграции интерфейса важно проверять:
Рекомендовано:
Пример добавления пользовательского правила:
axe.registerRule({
id: 'custom-link-check',
selector: 'a',
evaluate(node) {
return node.getAttribute('href') !== '';
},
meta: {
description: 'Все ссылки должны иметь href',
impact: 'critical'
}
});
Хотите, я подготовлю примеры комплексного отчёта после тестирования нескольких страниц сразу? Это будет полезно для понимания работы Axe-core на больших проектах.