Axe-core — это мощная библиотека для автоматизированного тестирования доступности веб-приложений. Основной задачей является выявление нарушений стандартов доступности (WCAG), однако при работе с динамическим контентом и сложными DOM-структурами могут возникать неоднозначные случаи, требующие внимательного подхода и правильной конфигурации инструментов.
Неоднозначные случаи в Axe-core чаще всего возникают в следующих ситуациях:
Динамический контент Компоненты, которые изменяются после первоначальной загрузки страницы (например, модальные окна, вкладки, раскрывающиеся списки), могут создавать ошибки в момент их скрытия или динамической отрисовки. Axe-core иногда фиксирует нарушения на элементах, которые в данный момент невидимы для пользователя.
Кастомные компоненты и стилизация Кастомные
элементы (custom elements, web components) или полностью стилизованные
кнопки и поля ввода могут не соответствовать стандартной разметке ARIA.
Axe-core при этом может выдавать предупреждения типа
aria-unsupported-element или color-contrast,
которые требуют анализа контекста использования.
Неполная или устаревшая разметка ARIA Когда атрибуты ARIA используются частично или некорректно, Axe-core определяет потенциальные проблемы, но иногда классифицирует их как “неоднозначные”, т.е. нарушение не однозначно подтверждено стандартами.
Сложные таблицы и списки Многоуровневые таблицы
с объединёнными ячейками (rowspan/colspan) или
вложенные списки создают трудности при проверке правильности заголовков
и контрастности текста. Axe-core может выдавать ошибки типа
table-duplicate-id или listitem в
непредсказуемых местах.
rulesAxe-core позволяет включать и исключать отдельные правила или настраивать их приоритет. Это особенно важно для работы с неоднозначными случаями, чтобы снизить количество ложных срабатываний:
const axe = require('axe-core');
axe.run(document, {
runOnly: {
type: 'rule',
values: ['color-contrast', 'aria-valid-attr']
},
rules: {
'aria-unsupported-element': { enabled: false },
'color-contrast': { enabled: true }
}
}, (err, results) => {
if (err) throw err;
console.log(results.violations);
});
Ключевые моменты:
runOnly позволяет ограничить проверку только
необходимыми правилами.aria-unsupported-element может быть отключено
для кастомных элементов, если они правильно обработаны через JS.rules позволяет контролировать
чувствительность проверки.Неоднозначные случаи часто требуют игнорирования частей DOM, которые Axe-core трактует некорректно:
axe.run(document, {
exclude: [['.no-accessibility-check'], ['#dynamic-tooltip']]
});
exclude принимает массив селекторов.Результаты Axe-core состоят из трёх основных категорий:
violations, incomplete и passes.
Неоднозначные случаи чаще всего попадают в
incomplete:
"incomplete": [
{
"id": "color-contrast",
"impact": "critical",
"nodes": [
{
"html": "<span style='color:#888;'>Text</span>",
"failureSummary": "Цвет текста может не соответствовать контрасту на некоторых фонах."
}
]
}
]
Рекомендации по обработке:
nodes вручную, проверяя контекст.Для React, Vue или других SPA важно учитывать момент появления элемента в DOM. Axe-core может выдавать ложные срабатывания, если элемент ещё не отрендерен. Решение — использовать асинхронную проверку:
async function checkAccessibility() {
await new Promise(resolve => setTimeout(resolve, 500)); // ждём рендер
axe.run(document, {}, (err, results) => {
if (err) throw err;
console.log(results);
});
}
Для специфических компонентов можно создавать собственные правила Axe-core:
axe.registerRule({
id: 'custom-button-role',
selector: 'button.custom',
any: [{ match: node => node.getAttribute('role') === 'button' }],
enabled: true,
tags: ['custom']
});
exclude для элементов, которые намеренно
не соответствуют стандартам.incomplete отдельно — это
источник большинства неоднозначностей.Эти методы позволяют превратить потенциально хаотичные отчёты Axe-core в структурированный инструмент контроля доступности, минимизируя ложные срабатывания и правильно реагируя на сложные сценарии с динамическими и кастомными элементами.