Библиотека Axe-core — это мощный инструмент для автоматизированного тестирования доступности веб-приложений. Она распространяется как npm-пакет и может использоваться как в браузере, так и в Node.js-среде.
Установка через npm:
npm install axe-core
Подключение в проект:
import axe from 'axe-core';
Для браузерного окружения возможно подключение через
<script>:
<script src="https://cdnjs.cloudflare.com/ajax/libs/axe-core/4.8.5/axe.min.js"></script>
После подключения появляется глобальный объект axe,
через который осуществляется доступ ко всем функциям библиотеки.
Профилирование доступности — процесс выявления нарушений стандартов WCAG в интерфейсе. Axe-core предоставляет несколько ключевых методов:
axe.run([context], [options], [callback]) — основной
метод сканирования страницы или выбранного DOM-узла.axe.configure(options) — позволяет задать глобальные
правила проверки, фильтры и параметры профилирования.axe.reset() — сброс всех кастомных настроек к значениям
по умолчанию.axe.run(document, {}, (err, results) => {
if (err) throw err;
console.log(results.violations);
});
results.violations — массив объектов с обнаруженными
нарушениями.results.passes — элементы, прошедшие проверку.results.incomplete — элементы, где проверка была
частичной.results.inapplicable — элементы, к которым проверка не
применима.Для глубокого профилирования важно корректно настраивать правила. Axe-core поддерживает:
const mainContent = document.querySelector('#main');
axe.run(mainContent, {}, (err, results) => {
console.log(results.violations);
});
axe.configure({
rules: [
{ id: 'color-contrast', enabled: false },
{ id: 'image-alt', enabled: true }
]
});
axe.run(document, {
runOnly: {
type: 'rule',
values: ['color-contrast', 'image-alt']
}
}, (err, results) => {
console.log(results.violations);
});
Axe-core полностью поддерживает промисы, что упрощает интеграцию в современные приложения:
async function runAccessibilityScan() {
try {
const results = await axe.run(document);
console.table(results.violations.map(v => ({
rule: v.id,
impact: v.impact,
nodes: v.nodes.length
})));
} catch (err) {
console.error(err);
}
}
runAccessibilityScan();
Такой подход позволяет легко обрабатывать результаты, фильтровать по
уровню серьёзности (critical, serious,
moderate, minor) и интегрировать сканирование
в автоматические тесты.
Axe-core умеет работать с динамическим контентом, подгружаемым через JavaScript или AJAX:
axe.run() для обновлённого узла.setTimeout(async () => {
const results = await axe.run(document.querySelector('#dynamic-component'));
console.log(results.violations);
}, 500);
const observer = new MutationObserver(async () => {
const results = await axe.run(document);
console.log(results.violations);
});
observer.observe(document.body, { childList: true, subtree: true });
Для учебных или аналитических целей важно сохранять результаты сканирования:
const results = await axe.run(document);
const json = JSON.stringify(results, null, 2);
console.log(json);
function generateHTMLReport(results) {
return `
<h1>Accessibility Report</h1>
${results.violations.map(v => `
<h2>${v.id} (${v.impact})</h2>
<ul>
${v.nodes.map(node => `<li>${node.html}</li>`).join('')}
</ul>
`).join('')}
`;
}
Для больших страниц и сложных приложений важно уменьшить нагрузку:
runOnly и
include/exclude для таргетинга определённых
компонентов.Axe-core легко комбинируется с Jest, Mocha, Cypress:
import 'cypress-axe';
describe('Проверка доступности', () => {
it('страница соответствует WCAG', () => {
cy.visit('/');
cy.injectAxe();
cy.checkA11y({
runOnly: ['color-contrast', 'image-alt']
});
});
});
Такой подход позволяет автоматизировать обнаружение нарушений и включить их в процесс разработки без ручной проверки.
Каждое нарушение имеет уровень серьёзности:
Фильтрация по уровню позволяет фокусироваться на наиболее критичных проблемах:
const criticalViolations = results.violations.filter(v => v.impact === 'critical');
Axe-core поддерживает создание собственных правил для специфичных требований проекта:
axe.configure({
rules: [
{
id: 'custom-link-check',
selector: 'a',
any: [{ match: node => node.textContent.length > 0 }],
enabled: true,
tags: ['custom']
}
]
});
Это позволяет расширять стандартный набор проверок и учитывать внутренние стандарты доступности.
Профилирование с использованием кастомных правил повышает точность тестирования и обеспечивает соответствие уникальным требованиям проекта.