В библиотеке axe-core таймауты играют важную роль при автоматизированном анализе доступности веб-страниц. Основная цель использования таймаутов — предотвращение зависаний сканера на страницах с большим количеством динамического контента или сложными компонентами.
axe-core проводит проверку элементов DOM асинхронно, особенно при интеграции с браузерными средами через Puppeteer, Playwright или Selenium. По умолчанию большинство операций имеют внутренние ограничения времени выполнения, чтобы предотвратить бесконечное ожидание элементов, которые не рендерятся или изменяются динамически.
Таймауты можно разделить на несколько типов:
Общий таймаут анализа страницы Задаёт максимальное время, которое axe-core тратит на проверку всей страницы. Если время превышено, анализ прерывается и возвращается частичный результат.
Таймаут ожидания элементов Применяется при
асинхронной обработке элементов DOM. Например, если используется
context для анализа конкретного блока страницы, axe-core
ожидает появления всех элементов в этом блоке до заданного
времени.
Таймаут правил Некоторые правила могут выполняться медленнее из-за необходимости глубокого анализа структуры DOM или стилей. Для таких правил можно устанавливать индивидуальные ограничения по времени выполнения.
Таймауты задаются через параметры конфигурации при инициализации анализатора. Для работы в Node.js или браузере через Puppeteer это делается следующим образом:
const axe = require('axe-core');
const config = {
runOnly: ['wcag2a', 'wcag2aa'],
timeout: 10000 // Общий таймаут в миллисекундах
};
axe.run(document, config).then(results => {
console.log(results.violations);
});
timeout — задаёт максимальное время анализа страницы в
миллисекундах.В современных веб-приложениях элементы DOM часто создаются динамически. В таких случаях таймауты помогают корректно дождаться рендеринга:
const context = {
include: [['#main-content']],
timeout: 5000 // Таймаут ожидания элементов внутри контекста
};
axe.run(context).then(results => {
console.log(results.violations);
});
timeout, axe-core
возвращает результаты по найденным элементам, а оставшиеся
пропускаются.Правильная настройка таймаутов критически важна для крупных веб-приложений. Недостаточно большой таймаут может привести к неполным результатам проверки, а чрезмерно большой — к зависаниям скриптов и увеличению времени выполнения тестов.
Рекомендуется придерживаться следующих практик:
При использовании axe-core вместе с Puppeteer или Playwright таймауты накладываются поверх таймаутов браузера. Важно учитывать, что если таймаут браузера меньше, чем таймаут axe-core, анализ может завершиться преждевременно.
Пример интеграции с Playwright:
const { chromium } = require('playwright');
const axe = require('axe-core');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
const axeResults = await page.evaluate(async () => {
return await axe.run(document, { timeout: 15000 });
});
console.log(axeResults.violations);
await browser.close();
})();
axe.run гарантирует завершение анализа даже
при сложном DOM.waitForSelector перед запуском
axe-core.Таймауты в axe-core позволяют достичь баланса между полнотой анализа и производительностью, обеспечивая стабильность автоматизированных проверок доступности в любых условиях.