Современные интерфейсы редко состоят исключительно из стандартных
HTML-элементов. В большинстве веб-приложений используются
пользовательские компоненты, создаваемые с помощью
фреймворков или Web Components API. Такие элементы могут имитировать
стандартные элементы управления — кнопки, списки, вкладки, диалоговые
окна — но фактически представляют собой комбинацию
<div>, <span> и других базовых
тегов.
Библиотека Axe-core анализирует доступность DOM-структуры и выявляет нарушения стандартов Web Content Accessibility Guidelines. При работе с пользовательскими компонентами возникают особенности:
Поэтому при тестировании таких компонентов необходимо учитывать правила доступности и особенности их реализации.
Обычный HTML-элемент уже содержит семантику. Например:
<button>Отправить</button>
Браузер автоматически предоставляет:
Пользовательский компонент может выглядеть так:
<div class="btn">Отправить</div>
Визуально элемент напоминает кнопку, но для средств доступности он остаётся обычным контейнером.
Axe-core фиксирует подобные проблемы. Например, правило interactive-supports-focus обнаруживает интерактивные элементы без фокуса.
Исправление требует добавления семантики:
<div
class="btn"
role="button"
tabindex="0"
>
Отправить
</div>
При анализе страницы Axe-core проверяет:
Axe-core анализирует DOM-структуру страницы и
применяет набор правил доступности. Проверка выполняется функцией
axe.run().
Пример базового теста:
import axe from "axe-core";
axe.run(document, {}, function (err, results) {
if (err) throw err;
console.log(results.violations);
});
В отчёте отображаются:
При использовании пользовательских компонентов это особенно важно, поскольку визуально интерфейс может выглядеть корректно, но не соответствовать требованиям доступности.
Многие пользовательские компоненты создаются через Web Components и используют Shadow DOM для изоляции структуры.
Пример компонента:
class CustomButton extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({ mode: "open" });
const button = document.createElement("button");
button.textContent = "Сохранить";
shadow.appendChild(button);
}
}
customElements.define("custom-button", CustomButton);
Структура внутри Shadow DOM не всегда доступна для стандартных инструментов анализа. Axe-core поддерживает обход таких структур при включении соответствующих параметров.
Пример запуска проверки:
axe.run({
include: [['custom-button']]
});
Axe-core анализирует:
Некоторые компоненты имеют нестандартную реализацию, поэтому может потребоваться настройка правил Axe-core.
Настройка выполняется через конфигурацию:
axe.configure({
rules: [
{
id: "color-contrast",
enabled: true
},
{
id: "region",
enabled: false
}
]
});
Настройки позволяют:
Особенно это важно для сложных интерфейсов, где компоненты генерируются динамически.
Пользовательские компоненты часто используют WAI-ARIA для передачи семантики.
Пример компонента вкладок:
<div role="tablist">
<button role="tab" aria-selected="true">Описание</button>
<button role="tab">Отзывы</button>
</div>
Axe-core проверяет:
Пример ошибки:
<div role="button"></div>
Если элемент не поддерживает фокус, правило aria-role будет нарушено.
Интерактивные пользовательские компоненты должны поддерживать управление клавиатурой.
Распространённые ошибки:
tabindex;Пример корректной реализации:
element.addEventListener("keydown", (event) => {
if (event.key === "Enter" || event.key === " ") {
activateComponent();
}
});
Axe-core фиксирует проблемы:
Пользовательские компоненты широко используются во фреймворках:
В таких приложениях интерфейс формируется динамически, поэтому Axe-core запускается:
Пример для React-тестов:
import { render } from "@testing-library/react";
import axe from "axe-core";
test("component accessibility", async () => {
const { container } = render(<CustomButton />);
const results = await axe.run(container);
expect(results.violations.length).toBe(0);
});
Такой подход позволяет проверять доступность каждого компонента изолированно.
Иногда стандартных правил недостаточно для проверки сложных компонентов. Axe-core позволяет создавать пользовательские правила.
Пример регистрации правила:
axe.registerRule({
id: "custom-role-check",
selector: ".interactive",
any: ["aria-role-valid"]
});
Компонент может быть проверен по специфическим критериям проекта.
Пользовательские правила включают:
Это позволяет адаптировать проверку под архитектуру приложения.
Некоторые компоненты требуют более сложной проверки доступности:
Для таких элементов проверяется:
Пример модального окна:
<div role="dialog" aria-modal="true">
<h2>Настройки</h2>
<button>Закрыть</button>
</div>
Axe-core анализирует:
dialog;aria-modal.В крупных проектах количество компонентов может исчисляться сотнями. Проверка всей страницы каждый раз становится затратной.
Оптимизация достигается через:
Пример проверки конкретного элемента:
axe.run({
include: [['#component-root']]
});
Это значительно ускоряет анализ.
Часто встречающиеся проблемы, выявляемые Axe-core:
Отсутствие текстовых альтернатив
<div role="img"></div>
Неправильные ARIA-роли
<div role="button" aria-checked="true"></div>
Недоступные элементы управления
<span oncl ick="submitForm()">Отправить</span>
Отсутствие связей между элементами
<input type="text">
без соответствующего label.
Исправление подобных проблем значительно повышает доступность интерфейса.
Компонентные библиотеки (design systems) особенно выигрывают от автоматизированных проверок доступности.
Типичный процесс:
После исправления компонент становится доступным по умолчанию во всех приложениях, использующих библиотеку.
Такой подход снижает количество ошибок доступности на уровне продукта и обеспечивает соответствие требованиям стандартов WCAG.