Radix UI — библиотека компонентов для React, ориентированная на создание доступных интерфейсов (accessible UI). Одним из ключевых преимуществ Radix является встроенная поддержка ARIA-атрибутов, правильного фокусирования и управления клавиатурой. Это делает компоненты удобными для тестирования на соответствие стандартам доступности, таким как WCAG и WAI-ARIA.
ARIA-атрибуты Компоненты Radix автоматически включают необходимые ARIA-атрибуты, например:
role="dialog" для модальных оконaria-expanded и aria-controls для
выпадающих списковaria-checked для чекбоксов и радио-кнопокТесты должны проверять наличие этих атрибутов и их корректное обновление при взаимодействии пользователя.
Управление фокусом Radix заботится о правильной навигации с клавиатуры:
Tab перемещает фокус по интерактивным элементамEscape закрывает диалоговые окна и менюArrowUp/ArrowDown управляют выбором в спискахТесты должны эмулировать нажатия клавиш и проверять, что фокус перемещается корректно.
Состояние компонентов Важно проверять, что визуальные изменения компонентов сопровождаются соответствующими ARIA-состояниями. Например:
DropdownMenu.Item при выборе
элемента aria-selected устанавливается в
trueToggle состояние on/off отражается в
aria-pressedJest + React Testing Library Radix UI прекрасно интегрируется с React Testing Library (RTL). Примеры:
import { render, screen, fireEvent } from '@testing-library/react';
import { Dialog, DialogTrigger, DialogContent } from '@radix-ui/react-dialog';
test('Dialog открывается и закрывается с клавиатуры', () => {
render(
<Dialog>
<DialogTrigger>Открыть диалог</DialogTrigger>
<DialogContent>Содержимое диалога</DialogContent>
</Dialog>
);
const trigger = screen.getByText('Открыть диалог');
fireEvent.click(trigger);
const content = screen.getByText('Содержимое диалога');
expect(content).toHaveAttribute('role', 'dialog');
fireEvent.keyDown(content, { key: 'Escape' });
expect(content).not.toBeInTheDocument();
});
axe-core / jest-axe Для автоматизированной проверки доступности часто используют axe-core:
import { render } from '@testing-library/react';
import { axe } from 'jest-axe';
import { Checkbox } from '@radix-ui/react-checkbox';
test('Checkbox соответствует стандартам доступности', async () => {
const { container } = render(<Checkbox />);
const results = await axe(container);
expect(results).toHaveNoViolations();
});
Эти инструменты позволяют находить пропущенные ARIA-атрибуты, проблемы с фокусом и контрастностью.
Radix UI предоставляет предсказуемые схемы навигации, которые легко тестировать:
Списки и меню
ArrowDown/ArrowUp для перемещения между элементамиHome/End для быстрого перехода к началу или концу
спискаТест проверяет корректность установки фокуса и изменения состояний элементов.
Модальные окна
Тестирование включает последовательное эмулирование нажатий клавиш
Tab, Shift+Tab и Escape.
Тогглы и чекбоксы
Space или Enter переключают состояние
компонентаaria-checked, aria-pressed)Для комплексной проверки можно использовать Cypress или Playwright:
describe('DropdownMenu accessibility', () => {
it('allows keyboard navigation', () => {
cy.visit('/dropdown-page');
cy.get('[data-radix-dropdown-trigger]').focus().type('{enter}');
cy.get('[role="menuitem"]').first().should('have.focus');
cy.focused().type('{downarrow}');
cy.focused().should('contain.text', 'Второй элемент');
});
});
Такие тесты проверяют реальное поведение компонентов в браузере и гарантируют, что доступность сохраняется не только на уровне DOM, но и при взаимодействии пользователя.
Radix UI активно развивается, поэтому важно включать accessibility тесты в CI/CD-пайплайн. Это позволяет автоматически выявлять регрессии, когда новые версии компонентов могут изменить ARIA-атрибуты или поведение клавиатурной навигации.
Советы по поддержанию тестов:
axe на всех рендеренных
компонентахНекоторые компоненты Radix UI, такие как Popover, Tooltip и Toast, появляются и исчезают динамически. Для них важно:
aria-hidden,
role)Radix UI обеспечивает высокий уровень доступности “из коробки”, но для гарантии соответствия стандартам необходимо:
axe, React Testing
Library и CypressПравильная комбинация unit-, integration- и end-to-end тестов позволяет уверенно использовать Radix UI для создания доступных интерфейсов, минимизируя риск ошибок в доступности при обновлениях или расширении функциональности.