Axe-core — это мощная библиотека для автоматического тестирования доступности веб-страниц. Она предоставляет API для анализа DOM и выявления проблем с доступностью, таких как отсутствие альтернативного текста, неправильная семантика элементов или проблемы с контрастностью. Работа с библиотекой начинается с установки и подключения, после чего можно использовать её возможности как в браузерных средах, так и в Node.js.
Для браузерных проектов используется пакет через npm:
import axe from 'axe-core';
axe.run(document, (err, results) => {
if (err) throw err;
console.log(results.violations);
});
Для Node.js можно интегрировать Axe с инструментами тестирования, например, с Puppeteer или Playwright. Важно понимать, что Axe анализирует именно рендеренный DOM, поэтому скрипты должны выполняться после полной загрузки страницы.
Axe-core оперирует DOM-элементами, что делает селекторы ключевым инструментом для точечного тестирования. Основные принципы работы с селекторами:
axe.run(document.querySelector('#main-content'), (err, results) => {
if (err) throw err;
console.log(results.violations);
});
axe.run(document.querySelectorAll('[role="button"]'), (err, results) => {
if (err) throw err;
console.log(results.violations);
});
axe.run(document.querySelectorAll('#header, #footer, .sidebar'), (err, results) => {
if (err) throw err;
console.log(results.violations);
});
Axe-core предоставляет возможность включать или отключать определённые правила. Это особенно важно при работе с большим проектом, где часть элементов создаётся динамически или имеет уникальные ограничения.
const options = {
runOnly: {
type: 'tag',
values: ['wcag2a', 'wcag2aa']
},
rules: {
'color-contrast': { enabled: false }
}
};
axe.run(document, options, (err, results) => {
if (err) throw err;
console.log(results.violations);
});
runOnly ограничивает проверку
правилами определённого уровня WCAG.rules позволяет отключать или
настраивать отдельные правила, например, игнорировать контраст для
временных элементов.После выполнения анализа часто возникает необходимость фильтровать нарушения по определённым частям страницы. Это достигается с помощью селекторов:
axe.run(document, {}, (err, results) => {
if (err) throw err;
const mainViolations = results.violations.filter(v =>
v.nodes.some(node => node.target.includes('#main-content'))
);
console.log(mainViolations);
});
Такой подход позволяет сконцентрироваться на ключевых блоках страницы и уменьшить шум в отчётах.
Axe-core легко интегрируется с Jest, Mocha и другими инструментами автоматизированного тестирования. Пример использования с Jest:
import { toHaveNoViolations } from 'jest-axe';
import axe from 'axe-core';
expect.extend(toHaveNoViolations);
test('Страница должна быть доступной', async () => {
const html = '';
const results = await axe.run(html);
expect(results).toHaveNoViolations();
});
Использование селекторов позволяет ограничивать тесты только конкретными компонентами, что ускоряет процесс проверки при масштабных проектах.
Современные приложения активно используют динамическую подгрузку контента. Axe-core поддерживает асинхронный анализ DOM, что позволяет проверять элементы после их рендера:
setTimeout(() => {
axe.run(document.querySelector('#dynamic-section'), (err, results) => {
if (err) throw err;
console.log(results.violations);
});
}, 1000);
Для сложных SPA это особенно важно, так как тестирование должно учитывать состояние DOM после выполнения всех скриптов.
div,
span), так как это может привести к избыточным
результатам.[role="dialog"],
[aria-hidden="true"]).Эти практики позволяют создавать точные, воспроизводимые тесты доступности, которые легко поддерживать при изменении структуры страницы.