Библиотека Haunted, базирующаяся на Web Components и Hooks-ориентированном подходе, позволяет создавать реактивные интерфейсы без привязки к конкретному фреймворку. В производственной базе особое значение приобретает доступность: корректное озвучивание экранными дикторами, фокусируемость, читабельность для assistive-технологий и предсказуемое управление с клавиатуры. Тестирование доступности обеспечивает устойчивость этих аспектов при изменении логики или стилей.
Фокус и клавиатурная навигация. Компоненты обязаны корректно реагировать на Tab/Shift+Tab, Enter, Space и Escape. Проверяется соблюдение tabindex, предсказуемость порядка обхода и отсутствие ловушек фокуса.
ARIA-атрибуты. Состояние компонентов (expanded, selected, pressed и подобные) отражается с помощью aria-expanded, aria-selected и других атрибутов. Тесты отслеживают соответствие состояния компонента и значения атрибутов.
Роль и структура. Семантическая роль (role) должна соответствовать типу элемента интерфейса. Например, выпадающие списки оформляются как combobox с корректными дочерними элементами.
Контент и альтернативный текст. Текстовые подписи, aria-label и aria-labelledby обеспечивают информативность для пользователей экранных дикторов.
Для Web Components на Haunted применяются инструменты уровня DOM, способные анализировать дерево компонентов и вычислять нарушения правил доступности.
axe-core для Web Components. Модуль axe-core интегрируется с тестовыми раннерами (Jest, Playwright, Vitest) и анализирует DOM после рендера компонента. Используется для выявления некорректных ролей, отсутствия aria-меток, низкой контрастности текста и других нарушений.
Testing Library с пользовательскими хелперами.
@testing-library/dom позволяет взаимодействовать с
элементами так, как это происходит у пользователя. Вместе с
@testing-library/user-event обеспечивается проверка
клавиатурных сценариев.
Playwright и Cypress для end-to-end. Сценарии E2E фиксируют поведение в реальном браузере, проверяя работу фокуса, навигации и экранных дикторов через API браузера или axe-core.
Этот подход минимизирует регрессии при обновлениях логики, стилей и состояния.
Компоненты Haunted обычно используют хуки (useState,
useEffect) для изменения состояния. Важно отражать
состояние в ARIA:
Тесты проверяют, что изменение состояния вызывает корректное обновление атрибутов и роли компонента.
Ключевые проверки включают:
Для Haunted важно отслеживать момент перерендера и обновления DOM, поскольку фокус может сбрасываться при замене узлов.
Семантические подписи обеспечивают понятное восприятие компонентов. В
тестах валидируется наличие aria-label, label и aria-labelledby в тех
случаях, когда визуальный текст отсутствует или недостаточен. Допустимо
использовать Jest DOM matchers (toHaveAccessibleName,
toHaveAccessibleDescription), если они присутствуют в
окружении.
Визуальные тесты дополнительно проверяют читабельность, достаточный контраст текста и границ элементов. Axe-core автоматически обнаруживает нарушения по WCAG-критериям, что удобно для компонентов, активно использующих стилизацию.
Автоматическое тестирование доступности включается в конвейер сборки. При обновлении компонентов или темизации тесты гарантируют отсутствие критичных регрессий. Рекомендовано запускать их на каждом merge request и nightly-сборках.
При сложных компонентах (комбобоксы, меню, вкладки) добавляются сценарии:
Инструменты: axe-core, Testing Library, Playwright, Cypress, Jest DOM matchers, Storybook Accessibility Addon для визуального анализа.
Практики:
Компоненты Haunted сохраняют состояние в хуках, что облегчает привязку поведения к ARIA. Тесное соответствие состояния и атрибутов предоставляет детерминированную базу для тестов: в аналогичных условиях DOM всегда отражает одно и то же состояние, что уменьшает флаки-тесты и облегчает анализ ошибок.