Доступность веб-приложений (Accessibility, a11y) является критически важной частью разработки. Фреймворк Fresh, построенный на Deno и использующий современный подход к серверному рендерингу с нативной поддержкой Islands Architecture, предоставляет возможности для интеграции инструментов тестирования доступности прямо в процессе разработки. Основная цель — обеспечить, чтобы интерфейс был удобен для всех пользователей, включая людей с ограниченными возможностями.
Fresh поддерживает использование стандартных инструментов для проверки доступности, таких как axe-core, Pa11y, Lighthouse. Они могут быть интегрированы как на уровне разработки, так и на этапе CI/CD.
Пример настройки автоматического тестирования с axe-core:
import { axe, toHaveNoViolations } from 'jest-axe';
import { render } from '@testing-library/preact';
import App from './routes/index.tsx';
expect.extend(toHaveNoViolations);
test('Главная страница не содержит нарушений доступности', async () => {
const { container } = render(<App />);
const results = await axe(container);
expect(results).toHaveNoViolations();
});
Ключевые моменты:
jest-axe интегрируется с популярными тестовыми
фреймворками.@testing-library/preact, что
позволяет тестировать реальные DOM-элементы.axe содержит детализированную информацию о
нарушениях WCAG.Fresh использует Preact-компоненты, которые рендерятся на сервере. Это упрощает проверку семантики HTML, так как можно анализировать статический HTML до его отправки клиенту. Основные проверки:
<h1>–<h6>).alt у
изображений.Пример проверки доступности кнопки:
const button = container.querySelector('button');
expect(button).toHaveAttribute('aria-label');
expect(button).not.toBeDisabled();
В Fresh важно, чтобы интерактивные компоненты были доступны через клавиатуру. Для этого применяются следующие подходы:
Tab.Enter и
Space должны активировать интерактивные элементы.Пример теста с использованием
@testing-library/user-event:
import userEvent from '@testing-library/user-event';
test('Клавиатурная навигация по форме', async () => {
const { getByLabelText } = render(<Form />);
const input = getByLabelText('Имя');
input.focus();
await userEvent.keyboard('{Tab}');
expect(document.activeElement).toBe(getByLabelText('Email'));
});
Автоматическое тестирование доступности во Fresh рекомендуется включать в процесс CI/CD. Для этого можно использовать:
deno test для unit-тестов доступности.Пример конфигурации GitHub Actions:
name: Accessibility Tests
on: [push, pull_request]
jobs:
a11y:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: denoland/setup-deno@v1
- run: deno test --allow-net
Fresh использует Islands Architecture, что позволяет выделять интерактивные части страницы. Для тестирования доступности динамических компонентов важно:
aria-expanded,
aria-checked) при обновлении состояния.MutationObserver для отслеживания
изменений DOM в тестах.Пример проверки динамического компонента:
test('Динамическое раскрытие меню', () => {
const { getByRole } = render(<Dropdown />);
const button = getByRole('button');
button.click();
const menu = getByRole('menu');
expect(menu).toBeVisible();
expect(menu).toHaveAttribute('aria-hidden', 'false');
});
Fresh позволяет работать с мультиязычностью, что требует проверки доступности:
<html lang="..."> должны соответствовать
языку контента.Для комплексного контроля доступности применяется визуальное тестирование с инструментами вроде Storybook и Chromatic. Они позволяют:
Тщательная интеграция тестирования доступности во Fresh позволяет создавать интерфейсы, соответствующие стандартам WCAG, улучшает пользовательский опыт и снижает риск юридических проблем, связанных с недоступностью веб-продукта.