Axe-core — это библиотека для автоматизированного тестирования доступности веб-приложений, написанная на JavaScript. Она предоставляет API для анализа DOM-дерева страницы и выявления проблем доступности (accessibility issues). Одним из ключевых аспектов работы с Axe-core является асинхронность, так как большинство операций по сканированию и генерации отчётов выполняются через промисы.
Методы Axe-core, такие как axe.run(), возвращают промис,
который разрешается объектом с результатами анализа. В стандартной схеме
использования промиса важно учитывать два состояния:
resolved (успешно выполнено) и
rejected (ошибка или исключение). Игнорирование
отклонённых промисов может привести к неожиданным сбоям тестов и
пропущенным ошибкам доступности.
Пример базового вызова:
axe.run(document).then(results => {
console.log(results.violations);
}).catch(error => {
console.error('Ошибка при запуске Axe-core:', error);
});
Здесь .catch() обеспечивает обработку отклонённого
промиса, который может возникнуть из-за:
Современные проекты часто используют синтаксис
async/await, что делает код более читаемым и
структурированным. Важно оборачивать асинхронный вызов в
try/catch блок для надёжной обработки отклонённых
промисов:
async function runAccessibilityTest() {
try {
const results = await axe.run(document);
console.log(results.violations);
} catch (error) {
console.error('Ошибка Axe-core:', error);
}
}
Особенность работы с await заключается в том, что любая
ошибка внутри промиса будет выброшена как исключение, что требует
обязательной обработки через try/catch.
Недоступный или пустой DOM Если переданный в
axe.run() объект документа не содержит элементов, промис
может быть отклонён с сообщением о невозможности проведения
анализа.
Некорректная конфигурация правил Настройка
правил через объект axe.configure() должна содержать
корректные ключи и значения. Ошибки конфигурации напрямую вызывают
отклонение промиса.
Проблемы с внешними ресурсами Стили, шрифты или
скрипты, которые не загрузились до вызова axe.run(), могут
привести к ошибкам в вычислении видимости элементов.
Если требуется запуск Axe-core на нескольких частях приложения
одновременно, полезно использовать Promise.allSettled() для
предотвращения остановки всех тестов при отклонении одного промиса:
const targets = [document.querySelector('#header'), document.querySelector('#main')];
const results = await Promise.allSettled(targets.map(target => axe.run(target)));
results.forEach((result, index) => {
if (result.status === 'fulfilled') {
console.log(`Результаты для элемента ${index}:`, result.value.violations);
} else {
console.error(`Ошибка для элемента ${index}:`, result.reason);
}
});
Такой подход позволяет сохранить информацию о каждой попытке анализа и не потерять данные из-за одной ошибки.
В автоматизированном тестировании важно различать ошибки выполнения Axe-core и реальные нарушения доступности:
rejected promise) —
проблемы с самим анализом, требующие корректировки кода или
конфигурации.Рекомендуется отделять эти два типа обработки, чтобы CI/CD не падал из-за мелких ошибок и в то же время фиксировались реальные проблемы доступности.
.catch() или try/catch
для обработки отклонённых промисов.axe.run().Promise.allSettled() при параллельной
проверке нескольких элементов.Обеспечение правильной обработки отклонённых промисов повышает стабильность тестов доступности и позволяет получать надёжные отчёты без пропуска критических проблем в интерфейсе.