Shadow DOM — это ключевой механизм веб-компонентов, позволяющий инкапсулировать внутреннюю структуру элемента, стили и логику, изолируя их от глобального DOM. Для инструментов тестирования доступность контента внутри Shadow DOM представляет особую сложность, поскольку стандартные методы обхода DOM могут не проникать внутрь теневого дерева.
Библиотека Axe-core — мощный инструмент для автоматизированной проверки доступности веб-приложений. Она способна анализировать элементы внутри Shadow DOM, но требует правильной конфигурации и понимания структуры компонентов.
Автоматическое обнаружение теневых деревьев
Axe-core начиная с версии 4 поддерживает рекурсивный обход Shadow DOM по
умолчанию. Это значит, что при вызове метода axe.run()
элементы внутри теневого DOM будут включены в анализ доступности без
дополнительных действий.
Вложенные Shadow DOM Shadow DOM может быть глубоко вложенным, что создает сложность для обходчиков. Axe-core поддерживает обход таких вложений, используя рекурсивные функции обхода. При этом каждая глубина Shadow DOM обрабатывается отдельно, что позволяет точно идентифицировать проблемы доступности на любом уровне компонента.
Параметры конфигурации для Shadow DOM При
необходимости можно управлять обходом Shadow DOM через опцию
includeShadowDom:
axe.run(document, {
includeShadowDom: true
}).then(results => {
console.log(results.violations);
});
Ключевой момент: значение true
гарантирует, что все теневые деревья будут включены в анализ, даже если
они вложены в несколько уровней.
Игнорирование теневых деревьев Для оптимизации
анализа или исключения специфических компонентов можно использовать
селекторы exclude или rules:
axe.run(document, {
includeShadowDom: true,
rules: {
'color-contrast': { enabled: false }
},
exclude: ['#custom-component']
});
Это позволяет настроить Axe-core для обхода Shadow DOM выборочно, отключая ненужные проверки и исключая определенные компоненты.
Стили и наследование: Shadow DOM инкапсулирует стили, поэтому проверки контраста текста и фона внутри Shadow DOM корректно работают только при анализе внутреннего теневого дерева. Axe-core учитывает стили, примененные к компоненту, а не глобальные стили документа.
Динамическая загрузка компонентов: Если Shadow
DOM создается динамически через JavaScript, Axe-core корректно проверяет
элементы только после того, как дерево полностью смонтировано. В таких
случаях рекомендуется вызывать axe.run() после события
DOMContentLoaded или после завершения рендеринга
компонента.
Слоты (<slot>): Элементы,
переданные через слоты в Shadow DOM, анализируются как часть теневого
дерева, что позволяет выявлять проблемы доступности контента, который
изначально находится в Light DOM.
Для тестирования доступности компонентов с Shadow DOM в JavaScript можно использовать комбинацию Axe-core с библиотеками для тестирования DOM, например Jest или Testing Library:
import { render } from '@testing-library/react';
import axe from 'axe-core';
import MyComponent from './MyComponent';
test('MyComponent should have no accessibility violations', async () => {
const { container } = render(<MyComponent />);
const results = await axe.run(container, { includeShadowDom: true });
expect(results.violations).toHaveLength(0);
});
includeShadowDom: обязательна
для проверки внутренних теневых деревьев.violations
содержит подробное описание каждого нарушения с указанием селектора,
роли и рекомендаций по исправлению.includeShadowDom: true, если
компонент использует Shadow DOM.Shadow DOM в сочетании с Axe-core позволяет строить современные веб-компоненты с гарантией доступности. Корректная настройка и понимание особенностей обхода теневых деревьев обеспечивают точный и полный анализ интерфейса.