Архитектура библиотеки

Библиотека Axe-core представляет собой мощный инструмент для автоматизированного тестирования доступности веб-приложений. Она реализована на JavaScript и работает в браузерной среде, предоставляя API для анализа DOM и выявления нарушений стандартов доступности (WCAG). Архитектура Axe-core спроектирована так, чтобы быть модульной, расширяемой и высокопроизводительной.


Основные компоненты

  1. Core Engine Сердце библиотеки, выполняющее основную проверку доступности.

    • Правила (Rules): каждый тест представлен как правило. Правила описываются объектами с ключевыми свойствами: id, selector, enabled, tags, check, evaluate.
    • Selectors: определяют элементы DOM, к которым применяется правило. Используются CSS-селекторы и специальные фильтры для исключения элементов.
    • Evaluation Functions: функции, реализующие логику проверки. Они получают DOM-элемент и возвращают результат (pass/fail/needs review).
  2. API взаимодействия

    • axe.run(): основной метод для запуска анализа. Принимает root-элемент или селектор и объект с опциями. Возвращает объект с результатами, структурированными по нарушениям, предупреждениям и рекомендациям.
    • configure(): позволяет изменять поведение движка, включать/отключать правила, задавать собственные теги или модифицировать существующие.
    • reset(): сбрасывает конфигурацию к стандартным настройкам.
  3. Reporter Layer Слой отчетности отвечает за форматирование и представление результатов. Может выводить результаты в:

    • JSON (для интеграции с CI/CD)
    • HTML (для визуального анализа)
    • Консоль (для быстрого отладки)
  4. Plugin Architecture

    • Axe-core поддерживает подключаемые плагины, которые расширяют функционал.
    • Примеры: интеграции с Cypress, Selenium, React, Vue.
    • Каждый плагин регистрирует свои правила и предоставляет API для работы с конкретной средой.

Структура правил

Правило в Axe-core имеет несколько ключевых частей:

  • id: уникальный идентификатор, используемый для ссылки на правило.
  • description: краткое пояснение о том, что проверяет правило.
  • help: рекомендации по исправлению нарушений.
  • tags: классификация (например, wcag2a, wcag2aa).
  • selector: CSS-селектор элементов, к которым применяется проверка.
  • check/evaluate: функция, выполняющая проверку. Важно, что функции должны быть максимально оптимизированы, чтобы анализ больших DOM-деревьев оставался быстрым.

Каждое правило может включать multiple checks, что позволяет проверять несколько условий для одного элемента.


Взаимодействие с DOM

Axe-core анализирует DOM через TreeWalker API, что обеспечивает эффективный обход элементов без создания избыточных структур данных. В процессе обхода применяется фильтрация по селекторам и тегам. Дополнительно используются attributes and ARIA properties, чтобы определить соответствие требованиям доступности.

  • ARIA checks: проверка правильного использования ролей, свойств и состояний ARIA.
  • Contrast checks: проверка контрастности текста и фона, вычисляется на основе цветовых значений CSS.
  • Structural checks: проверка семантической структуры документа (заголовки, списки, формы).

Конфигурация и расширяемость

Конфигурация выполняется через объект настроек:

axe.configure({
  rules: [
    { id: 'color-contrast', enabled: true },
    { id: 'label', enabled: false }
  ],
  reporter: 'v2'
});

Можно добавлять собственные правила, используя API:

axe.registerRule({
  id: 'custom-rule',
  selector: 'button',
  evaluate: function(node) {
    return node.textContent.trim() !== '';
  },
  tags: ['wcag2a']
});

Расширяемость реализована так, чтобы новые правила и плагины не требовали изменения ядра библиотеки.


Асинхронная обработка и производительность

Axe-core поддерживает асинхронный режим для работы с динамическим контентом. Это особенно важно для современных SPA (Single Page Applications), где элементы DOM могут загружаться и изменяться после первичной загрузки страницы.

  • Параллельные проверки: библиотека разделяет правила на группы и применяет их параллельно для разных частей DOM.
  • Debouncing: оптимизация при частом изменении DOM, предотвращающая повторные ненужные проверки.
  • Lazy evaluation: правила, зависящие от стилей или сложных вычислений, выполняются только при необходимости.

Интеграция с инструментами тестирования

Axe-core проектировался с учетом интеграции в автоматизированные тестовые фреймворки:

  • Cypress: интеграция через cypress-axe для проверки доступности во время E2E-тестов.
  • Selenium/WebDriver: возможность запускать анализ на страницах в разных браузерах.
  • Jest/React Testing Library: проверка компонентов в изолированной среде с использованием axe-core API.

Результаты интеграции легко экспортируются в CI/CD пайплайны, что позволяет автоматически фиксировать и отслеживать нарушения доступности.


Архитектура Axe-core сочетает модульность, производительность и широкие возможности расширения, что делает её универсальным инструментом для обеспечения доступности веб-приложений. Основные принципы — четкая структура правил, эффективный обход DOM, поддержка асинхронного анализа и интеграция с внешними инструментами — позволяют библиотеке оставаться актуальной и гибкой при масштабировании проектов.