Компоненты выбора, построенные поверх стандартного
<select>, относятся к наиболее чувствительным с точки
зрения доступности элементам интерфейса. Библиотека Tom Select заменяет
нативное поведение браузера собственным UI, что автоматически
накладывает ответственность за корректную реализацию:
Тестирование доступности в таком контексте не ограничивается проверкой соответствия WCAG, а включает в себя проверку фактического поведения компонента в различных сценариях взаимодействия.
Ключевая задача при тестировании — проверка соответствия ARIA-ролей ожидаемой модели поведения.
Типовая структура:
role="combobox" — основной контейнер;role="listbox" — выпадающий список;role="option" — элементы выбора;aria-expanded — состояние раскрытия;aria-activedescendant — активный элемент;aria-selected — состояние выбора.Критически важно проверять синхронизацию между внутренним состоянием и ARIA-атрибутами. Несоответствие приводит к:
Клавиатурное управление является основой доступности кастомных селекторов.
Типовой набор проверок включает:
Tab — вход и выход из компонента;ArrowDown / ArrowUp — перемещение по списку;Enter — выбор активного элемента;Esc — закрытие списка;Backspace — удаление выбранных значений (в
multi-select).Тестирование фиксирует не только факт срабатывания событий, но и состояние UI:
aria-activedescendant;Фокус в кастомных компонентах часто становится источником доступностных дефектов.
При тестировании проверяются следующие сценарии:
Особое внимание уделяется динамическому созданию/уничтожению DOM-элементов, поскольку Tom Select может пересоздавать внутреннюю структуру при обновлении данных.
Проверка совместимости со скринридерами относится к обязательному этапу валидации доступности.
Тестируемые аспекты:
expanded/collapsed);Дополнительно проверяется отсутствие шумовых элементов:
aria-live обновлений;Автоматизация позволяет выявить базовые нарушения ARIA и DOM-структуры.
Наиболее распространённый инструмент — axe-core.
Пример интеграции в тестовый стек:
jest-axe;Cypress + cypress-axe;Playwright + axe.Типовые проверки:
Важно учитывать, что автоматические инструменты не покрывают:
import { axe } fr om 'jest-axe';
test('Tom Select не содержит критических нарушений доступности', async () => {
document.body.innerHTML = `
<select id="select">
<option value="1">One</option>
<option value="2">Two</option>
</select>
`;
new TomSelect('#select');
const results = await axe(document.body);
expect(results).toHaveNoViolations();
});
E2E тесты фиксируют реальное взаимодействие пользователя с компонентом.
Проверяются сценарии:
Пример сценария:
cy.get('.ts-control').focus().type('{downarrow}');
cy.get('.ts-dropdown').should('be.visible');
cy.get('.option').first().trigger('keydown', { key: 'Enter' });
cy.get('.ts-control').should('contain', 'One');
Особое внимание уделяется синхронизации DOM и accessibility tree, поскольку визуально корректное поведение может расходиться с доступностной моделью.
При интеграции с формами возникают дополнительные доступностные риски:
label → input;Тестируются сценарии:
disabled) и его влияние на
ARIA.На практике в компонентах выбора встречаются повторяющиеся ошибки:
aria-expanded при открытии dropdown;aria-activedescendant;Каждое из этих нарушений может не проявляться визуально, но критично влияет на использование скринридерами.
Тестирование строится слоями:
1. Статический слой
2. Поведенческий слой
3. Интеграционный слой
4. Accessibility слой
Изменения в UI-компонентах часто приводят к скрытым регрессиям доступности:
Регрессионные тесты фиксируют: