Библиотека axe-core представляет собой мощный инструмент для автоматизированного тестирования доступности веб-приложений. Для корректной работы с TypeScript требуется не только установка основной библиотеки, но и подключение соответствующих типов, чтобы обеспечить строгую типизацию и автодополнение в редакторе.
npm install axe-core --save-dev
npm install @types/axe-core --save-dev
После установки библиотеку можно импортировать стандартным способом:
import axe from 'axe-core';
При использовании TypeScript важно учитывать, что типы позволяют строго определять структуру результатов сканирования, отчётов и конфигураций.
Основным объектом для настройки является axe.run(),
который принимает два параметра:
Пример типизированной конфигурации:
const options: axe.RunOptions = {
runOnly: {
type: 'tag',
values: ['wcag2aa']
},
resultTypes: ['violations', 'incomplete'],
};
const target: HTMLElement = document.getElementById('main-content')!;
Здесь ключевое значение имеет строгая типизация параметров, позволяющая избежать ошибок на этапе компиляции.
Результаты сканирования axe-core представлены объектом
axe.AxeResults. Основные поля:
violations: axe.Result[] — список нарушений.passes: axe.Result[] — элементы, которые соответствуют
правилам.incomplete: axe.Result[] — элементы с неполной
проверкой.inapplicable: axe.Result[] — правила, которые не
применимы к текущему DOM.Каждый объект axe.Result имеет следующие ключевые
поля:
id: string — уникальный идентификатор правила.impact: 'minor' | 'moderate' | 'serious' | 'critical' —
уровень серьёзности нарушения.description: string — описание правила.nodes: axe.NodeResult[] — массив элементов, на которых
обнаружено нарушение.Типизация позволяет безопасно обрабатывать результаты:
axe.run(target, options).then((results: axe.AxeResults) => {
results.violations.forEach((violation) => {
console.log(`Нарушение: ${violation.id}, уровень: ${violation.impact}`);
});
});
axe-core поддерживает фильтрацию правил с помощью
тегов. В TypeScript это реализуется через поле runOnly:
const options: axe.RunOptions = {
runOnly: {
type: 'tag',
values: ['wcag2aa', 'section508']
},
};
Также можно отключать отдельные правила:
const options: axe.RunOptions = {
rules: {
'color-contrast': { enabled: false },
'label': { enabled: true },
},
};
Строгая типизация гарантирует, что имена правил будут корректными и соответствовать доступным в библиотеке.
Для React, Angular или Vue важно использовать типы компонентов и элементы DOM корректно. В React пример выглядит следующим образом:
import { render } from '@testing-library/react';
import axe from 'axe-core';
import MyComponent from './MyComponent';
const { container } = render(<MyComponent />);
axe.run(container, options).then((results: axe.AxeResults) => {
console.log(results.violations.length);
});
Использование TypeScript позволяет сразу видеть все поля
container, гарантируя, что проверка будет выполнена
корректно.
Можно создавать свои интерфейсы для более строгого контроля данных:
interface CustomAxeResult extends axe.AxeResults {
customField?: string;
}
const customResults: CustomAxeResult = await axe.run(target, options);
customResults.customField = 'Дополнительная информация';
Это полезно при интеграции с системами отчётности или собственными обработчиками ошибок.
axe.run() возвращает промис с типом
Promise<axe.AxeResults>. В TypeScript рекомендуется
использовать async/await для удобного контроля ошибок и
строгой типизации:
async function runAccessibilityTest(target: HTMLElement) {
try {
const results: axe.AxeResults = await axe.run(target, options);
if (results.violations.length > 0) {
results.violations.forEach(v => console.warn(v));
}
} catch (error) {
console.error('Ошибка при сканировании доступности', error);
}
}
Это позволяет полностью использовать преимущества TypeScript для предотвращения ошибок на этапе разработки и обеспечивает предсказуемость структуры данных.
Типизация и строгие контракты помогают безопасно подключать axe-core к пайплайнам автоматического тестирования. Например, с использованием Jest:
import axe from 'axe-core';
import { render } from '@testing-library/react';
import MyComponent from './MyComponent';
test('Доступность компонента MyComponent', async () => {
const { container } = render(<MyComponent />);
const results: axe.AxeResults = await axe.run(container, options);
expect(results.violations.length).toBe(0);
});
Строгая типизация обеспечивает корректную интеграцию с любыми инструментами CI/CD и предупреждает типовые ошибки до запуска тестов.