Библиотека Axe-core является мощным инструментом для автоматизированного анализа доступности веб-страниц. Для работы с отдельными элементами необходимо установить пакет через npm:
npm install axe-core
В браузерных проектах можно подключить скрипт напрямую через CDN:
<script src="https://cdnjs.cloudflare.com/ajax/libs/axe-core/4.9.3/axe.min.js"></script>
После подключения библиотека доступна через глобальный объект
axe.
Для анализа конкретного элемента необходимо инициализировать Axe с
настройками. Основной метод — axe.run(), который принимает
два аргумента: целевой элемент и опции
конфигурации.
import axe from 'axe-core';
const element = document.querySelector('#target-element');
axe.run(element, {
rules: {
'color-contrast': { enabled: true },
'label': { enabled: true },
},
reporter: 'v2'
}).then(results => {
console.log(results.violations);
});
Ключевые моменты конфигурации:
v2, который структурирует данные для
удобного анализа.Метод axe.run() принимает DOM-элемент или селектор CSS.
Важно передавать корень, с которого начинается анализ.
Если не указать элемент, анализируется весь документ:
const element = document.querySelector('.form-section');
axe.run(element).then(results => {
results.violations.forEach(v => {
console.log(`Нарушение: ${v.id}, Элементы: ${v.nodes.map(n => n.target)}`);
});
});
Особенности:
Результаты Axe включают массив violations, каждая из
которых содержит список nodes — узлов DOM, к которым
применимо нарушение. Для анализа отдельного элемента фильтруют
nodes:
const targetElement = document.querySelector('#submit-button');
axe.run(document).then(results => {
const violationsForElement = results.violations.filter(v =>
v.nodes.some(node => node.target.includes('#submit-button'))
);
console.log(violationsForElement);
});
Преимущества такого подхода:
Некоторые элементы требуют индивидуальной конфигурации правил.
Например, кнопки могут проверяться на доступность текста, а формы — на
корректное использование aria-label.
axe.run(document.querySelector('#login-form'), {
rules: {
'label': { enabled: true },
'button-name': { enabled: true },
'color-contrast': { enabled: false } // отключение для конкретного блока
}
});
Для автоматизированного тестирования отдельных элементов удобно использовать Axe совместно с Jest или Cypress.
Пример с Jest:
import axe from 'axe-core';
import { render } from '@testing-library/react';
import MyButton from './MyButton';
test('кнопка доступна', async () => {
const { container } = render(<MyButton />);
const results = await axe.run(container.querySelector('button'));
expect(results.violations).toHaveLength(0);
});
Пример с Cypress:
cy.get('#main-form').then($el => {
cy.window().then(win => {
win.axe.run($el[0], {}, (err, results) => {
if (err) throw err;
cy.log(JSON.stringify(results.violations));
});
});
});
Axe-core поддерживает:
Пример анализа с детальным контекстом:
axe.run(document.querySelector('#profile-card')).then(results => {
results.violations.forEach(v => {
v.nodes.forEach(node => {
console.log('Элемент:', node.target.join(', '));
console.log('Описание:', node.failureSummary);
});
});
});
Такой подход позволяет не просто выявлять ошибки, но и сразу формировать рекомендации по их устранению для конкретного блока интерфейса.