Настройка тестирования доступности в CI/CD пайплайне

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Настройка тестирования доступности в CI/CD пайплайне
Средняя
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Настройка CI/CD пайплайна для тестирования доступности

Автоматизированная проверка доступности в CI/CD предотвращает регрессии: каждый PR проходит аудит, и если появляется новое нарушение WCAG — сборка падает. Комбинируют несколько инструментов: axe-core для компонентного тестирования, Playwright для E2E, Lighthouse CI для страничного аудита.

Стратегия покрытия

Unit-тесты компонентов (Jest + jest-axe)
  → 100% React-компонентов через Storybook
  → Запуск на каждый коммит

E2E-тесты страниц (Playwright + axe-core)
  → Ключевые страницы: главная, каталог, форма, checkout
  → Запуск на PR в main

Lighthouse CI (страничный аудит)
  → Бюджет: минимум 90/100 по accessibility
  → Запуск на PR в main

Еженедельный полный аудит (Pa11y + sitemap)
  → Все публичные страницы
  → Отчёт в Slack

GitHub Actions: полный пайплайн

# .github/workflows/accessibility.yml
name: Accessibility Tests
on:
  pull_request:
    branches: [main]
  schedule:
    - cron: '0 9 * * 1'  # Каждый понедельник в 9:00

jobs:
  component-a11y:
    name: Component Accessibility (Jest)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci
      - run: npm test -- --testPathPattern="a11y|accessibility" --coverage=false
        env:
          CI: true

  e2e-a11y:
    name: E2E Accessibility (Playwright)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci
      - run: npx playwright install chromium --with-deps
      - name: Start app
        run: npm run build && npm start &
      - name: Wait for app
        run: npx wait-on http://localhost:3000 --timeout 60000
      - name: Run accessibility tests
        run: npx playwright test tests/accessibility/
      - uses: actions/upload-artifact@v4
        if: failure()
        with:
          name: playwright-report
          path: playwright-report/

  lighthouse-a11y:
    name: Lighthouse Audit
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci && npm run build
      - name: Run Lighthouse CI
        uses: treosh/lighthouse-ci-action@v10
        with:
          urls: |
            http://localhost:3000
            http://localhost:3000/catalog
          budgetPath: .lighthouserc.json
          temporaryPublicStorage: true
        env:
          LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_GITHUB_APP_TOKEN }}

Playwright: тест доступности страниц

// tests/accessibility/pages.spec.ts
import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';

const PAGES_TO_TEST = [
  { path: '/',         name: 'Главная' },
  { path: '/catalog',  name: 'Каталог' },
  { path: '/contact',  name: 'Контакты' },
];

for (const { path, name } of PAGES_TO_TEST) {
  test(`${name}: WCAG 2.1 AA`, async ({ page }) => {
    await page.goto(path);
    await page.waitForLoadState('networkidle');

    const results = await new AxeBuilder({ page })
      .withTags(['wcag2a', 'wcag2aa'])
      .analyze();

    // Детальный вывод нарушений
    if (results.violations.length > 0) {
      const summary = results.violations.map(v =>
        `[${v.impact}] ${v.id}: ${v.description} (${v.nodes.length} элементов)`
      ).join('\n');
      console.error(`Нарушения на "${name}":\n${summary}`);
    }

    expect(results.violations).toHaveLength(0);
  });
}

Репортинг в Pull Request

# Комментарий к PR с результатами аудита
- name: Comment PR
  uses: thollander/actions-comment-pull-request@v2
  if: always()
  with:
    message: |
      ## Отчёт доступности

      | Инструмент | Статус |
      |---|---|
      | Jest + axe | ${{ job.status == 'success' && '✅ Пройден' || '❌ Ошибки' }} |
      | Playwright | ${{ needs.e2e-a11y.result == 'success' && '✅ Пройден' || '❌ Ошибки' }} |
      | Lighthouse | ${{ needs.lighthouse-a11y.result == 'success' && '✅ ≥ 90' || '❌ < 90' }} |

Известные исключения

Фиксируем ложноположительные срабатывания в конфиге:

// axe-config.js — исключения для третьесторонних виджетов
const AXE_CONFIG = {
  rules: [
    // Виджет чата (третья сторона, не контролируем)
    { id: 'color-contrast', selector: '#intercom-frame', enabled: false },
  ],
};

Сроки

Полный CI/CD пайплайн доступности с Jest, Playwright, Lighthouse и отчётом в PR: 3–4 рабочих дня.