Библиотека Axe-core является мощным инструментом для автоматического тестирования доступности веб-приложений. Одной из ключевых возможностей является точечная проверка элементов DOM, и здесь селекторы CSS играют фундаментальную роль. Они позволяют точно указать, какие элементы должны быть проверены, какие исключены и как масштабировать правила проверки.
В Axe-core селекторы CSS используются главным
образом в конфигурационных объектах, таких как include и
exclude. Эти свойства позволяют управлять областью
анализа:
const axeConfig = {
include: [['#main-content', '.interactive-widget']],
exclude: [['.ads', '#tracking-pixels']]
};
Селекторы могут быть комбинированными, дочерними, атрибутными и использовать псевдоклассы, что обеспечивает гибкость фильтрации:
const config = {
include: [['main article > section']],
exclude: [['[aria-hidden="true"]', '.visually-hidden']]
};
Здесь проверка охватывает все <section> внутри
<article> в <main>, но исключает
скрытые элементы.
Поддержка селекторов: Axe-core полностью
поддерживает стандартные CSS3-селекторы, включая классы, идентификаторы,
атрибутные селекторы, псевдоклассы вроде :first-child или
:nth-of-type(n). Однако динамические псевдоклассы типа
:hover или :active не учитываются, так как
библиотека анализирует статическое состояние DOM.
Сложные селекторы: При указании сложных селекторов, состоящих из нескольких уровней вложенности, Axe-core применяет их как фильтр элементов перед запуском правил проверки. Это позволяет оптимизировать производительность, исключая лишние узлы DOM из анализа.
Влияние псевдоэлементов: Селекторы
::before и ::after не участвуют в анализе, так
как Axe-core работает с реальным DOM, а не с визуальными
псевдоэлементами.
Некоторые правила Axe-core позволяют указывать target непосредственно для конкретного теста. Например:
const ruleOverrides = {
rules: {
'color-contrast': {
enabled: true,
selector: '.highlight, .important-text'
}
}
};
selector фильтрует элементы только для этого
правила.include и
exclude, но не подходит под селектор конкретного правила,
проверка по этому правилу не выполняется.Такой подход полезен для случаев, когда нужно тестировать контрастность только для текстовых блоков или интерактивных элементов, игнорируя декоративные элементы.
В реальных приложениях часто требуется формировать селекторы динамически на основе состояния страницы:
const interactiveSections = document.querySelectorAll('.interactive');
const targets = Array.from(interactiveSections).map(el => `#${el.id}`);
axe.run(document, { include: [targets] }).then(results => {
console.log(results.violations);
});
#main-content,
.form-wrapper), избегая глобальных селекторов вроде
body *..ads, [aria-hidden="true"] помогает уменьшить количество
ложных срабатываний.[['#header'], ['#footer']]) позволяет
группировать элементы по логическим блокам..button, .dropdown, .modal позволяют целенаправленно
проверять элементы, с которыми взаимодействует пользователь.Чем более точный и лаконичный селектор используется, тем быстрее
Axe-core завершает анализ. Слишком общие селекторы, например
div *, приводят к проверке тысяч узлов DOM, что замедляет
тестирование. Оптимизация селекторов — ключевой фактор при интеграции
Axe-core в CI/CD пайплайны.
const axeFullConfig = {
include: [['#main-content', '.interactive-widget']],
exclude: [['.ads', '[aria-hidden="true"]']],
rules: {
'color-contrast': { enabled: true, selector: '.text, .highlight' },
'label': { enabled: true, selector: 'input, textarea, select' }
}
};
axe.run(document, axeFullConfig).then(results => {
results.violations.forEach(v => {
console.log(`${v.id}: ${v.nodes.length} элементов`);
});
});
Такой подход позволяет:
Селекторы CSS в Axe-core становятся инструментом стратегического контроля за качеством доступности, обеспечивая точность и производительность анализа.