Часто нарушения доступности (a11y) всплывают только на этапе ручного тестирования или, что хуже, в продакшне. Каждый пропущенный критический баг — например, отсутствие alt у изображения или неработающая навигация с клавиатуры — может стоить репутации и крупных штрафов. Мы автоматизируем проверку WCAG 2.1/2.2 через axe-core, чтобы отлавливать такие проблемы на этапе CI/CD. Библиотека от Deque Systems находит около 57% нарушений автоматически, оставляя оставшиеся на ручной аудит. Опыт показывает: после внедрения axe-core количество регрессий по доступности падает на 70–80%.
Как axe-core помогает автоматизировать проверку доступности?
axe-core работает как в браузере, так и в Node.js, и легко встраивается в существующие тестовые фреймворки. В основе лежат правила WCAG 2.1, сгруппированные по тегам (wcag2a, wcag2aa, wcag21aa). Для каждого элемента страницы библиотека проверяет: контрастность, семантику заголовков, доступность форм, ARIA-атрибуты и многое другое. Результат — структурированный отчёт с типом, уровнем серьёзности и ссылкой на элемент.
Интеграция с Jest + Testing Library
npm install --save-dev jest-axe @testing-library/react // __tests__/accessibility.test.tsx
import { render } from '@testing-library/react';
import { axe, toHaveNoViolations } from 'jest-axe';
expect.extend(toHaveNoViolations);
describe('Доступность компонентов', () => {
it('Button не имеет нарушений', async () => {
const { container } = render(<Button>Отправить</Button>);
const results = await axe(container);
expect(results).toHaveNoViolations();
});
it('Form не имеет нарушений', async () => {
const { container } = render(
<form>
<label htmlFor="email">Email</label>
<input id="email" type="email" />
<button type="submit">Войти</button>
</form>
);
const results = await axe(container, {
rules: {
'color-contrast': { enabled: true },
'label': { enabled: true },
},
});
expect(results).toHaveNoViolations();
});
});
Интеграция с Playwright
// tests/accessibility.spec.ts
import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';
test('Главная страница проходит WCAG 2.1 AA', async ({ page }) => {
await page.goto('/');
const results = await new AxeBuilder({ page })
.withTags(['wcag2a', 'wcag2aa', 'wcag21aa'])
.exclude('.cookie-banner') // Исключаем компоненты третьих сторон
.analyze();
expect(results.violations).toEqual([]);
});
test('Форма регистрации — доступность', async ({ page }) => {
await page.goto('/register');
const results = await new AxeBuilder({ page })
.include('#registration-form')
.analyze();
// Детальный отчёт при падении
if (results.violations.length > 0) {
console.table(results.violations.map(v => ({
id: v.id,
impact: v.impact,
description: v.description,
nodes: v.nodes.length,
})));
}
expect(results.violations).toEqual([]);
});
Почему стоит интегрировать axe-core в CI/CD?
Ручную проверку доступности сложно масштабировать: на один аудит страницы уходит 2–3 часа. Интеграция axe-core в CI/CD (например, через Playwright тест перед каждым деплоем) автоматизирует эту проверку. Мы гарантируем, что критические нарушения не попадут в продакшн. В одном из проектов с 500+ страницами после настройки axe-core количество регрессий по a11y снизилось с 30 до 2–3 в месяц.
Сравнение ручного и автоматического аудита
| Характеристика | Ручной аудит | axe-core |
|---|---|---|
| Время на страницу | 15–30 минут | 5–10 секунд |
| Охват критических нарушений | 100% (с квалифицированным специалистом) | ~90% |
| Частота запуска | Раз в спринт | При каждом коммите |
| Точность | Зависит от усталости | Стабильна |
Уровни нарушений и их влияние
| Impact | Значение | Пример | Сертификация WCAG |
|---|---|---|---|
| critical | Блокирует доступ | Изображение без alt | Не проходит ни один уровень |
| serious | Значительно мешает | Форма без label | Не проходит AA |
| moderate | Затрудняет использование | Недостаточный контраст | Может проходить A, но не AA |
| minor | Небольшое неудобство | Неправильный lang | Проходит, но лучше исправить |
С чего начать: типичные ошибки при настройке axe-core
При первом запуске axe-core часто выдаёт ложные срабатывания на сторонних iframe, cookie-баннерах или динамически подгружаемом контенте. Чтобы избежать шума, настройте исключения через exclude() и задайте точные теги проверки (например, wcag2aa). Также важно правильно сконфигурировать правила: отключить те, что не применимы к проекту (например, color-contrast для компонентов с кастомными цветами).
Чек-лист внедрения axe-core
- Исключить iframe и виджеты третьих сторон.
- Настроить кастомные правила для специфичных компонентов.
- Интегрировать с Jest для модульных тестов компонентов.
- Интегрировать с Playwright для e2e тестов критических страниц.
- Добавить запуск в CI/CD (GitHub Actions, GitLab CI).
- Настроить уведомления о падениях.
Что входит в работу
- Документация: отчёт о текущих нарушениях, список правил, исключения для сторонних компонентов.
- Интеграция: настройка axe-core в Jest (модульные тесты компонентов), Playwright (e2e-тесты страниц) и Storybook (визуальная инспекция) — при необходимости.
- CI/CD пайплайн: добавление тестов доступности в GitLab CI, GitHub Actions или аналоги.
- Обучение команды: базовая лекция (1–2 часа) по WCAG и работе с axe-core.
- Поддержка: консультации по исправлению выявленных нарушений в течение месяца после внедрения.
Сроки
Настройка axe-core в Jest + Playwright, покрытие ключевых страниц и компонентов: 2–3 рабочих дня. Если проект использует нестандартные фреймворки (Angular, Vue 3 с SSR) или требуется глубокая кастомизация правил, срок может увеличиться до 5 дней. Мы работаем по предоплате 50%, окончательная стоимость рассчитывается индивидуально после аудита вашего кода.
Наша команда имеет 5+ лет опыта в a11y-аудите и более 50 успешных проектов. Свяжитесь с нами для консультации по внедрению axe-core в ваш проект. Закажите аудит доступности — это снизит риски и сэкономит время.







