В библиотеке Axe-core механизм сравнения результатов доступности играет ключевую роль при автоматизации тестирования интерфейсов. В большинстве случаев требуется не просто запуск аудита и получение отчёта, но и выявление изменений между двумя состояниями приложения. Для этого используется концепция diff результатов, которая позволяет детектировать новые, исправленные или оставшиеся ошибки доступности.
Результат аудита в Axe-core представляет собой
объект, содержащий массивы violations,
incomplete, passes и
inapplicable. Каждый элемент массива содержит
уникальный id правила, описание, рекомендации по
исправлению, селекторы элементов и дополнительные метаданные.
Diff — это сравнение двух таких объектов: предыдущего состояния (baseline) и текущего состояния (actual). Цель сравнения — определить:
Для корректного определения различий между результатами необходимо учитывать несколько факторов:
id правила и target элементов, на которых
ошибка проявляется.data-testid вместо сложных CSS-путей).helpUrl и tags, позволяют классифицировать
ошибки и фильтровать их при сравнении.Простейший алгоритм diff:
function diffAxeResults(previous, current) {
const prevMap = new Map();
previous.violations.forEach(v => {
v.nodes.forEach(node => {
prevMap.set(`${v.id}-${node.target.join(',')}`, v);
});
});
const newViolations = [];
const resolvedViolations = [];
const persistentViolations = [];
current.violations.forEach(v => {
v.nodes.forEach(node => {
const key = `${v.id}-${node.target.join(',')}`;
if (prevMap.has(key)) {
persistentViolations.push({ ...v, node });
prevMap.delete(key);
} else {
newViolations.push({ ...v, node });
}
});
});
prevMap.forEach((v, key) => {
resolvedViolations.push(v);
});
return { newViolations, resolvedViolations, persistentViolations };
}
id правил. Это позволяет
видеть, какие категории нарушений чаще всего появляются или
исчезают.node и использовать его при определении уникальности.
Например, можно хешировать сочетание id, html,
target.Diff результатов особенно полезен при автоматизированном тестировании:
Пример использования в пайплайне:
const previousResults = require('./baseline.json');
const currentResults = await axe.run(document);
const { newViolations, resolvedViolations } = diffAxeResults(previousResults, currentResults);
if (newViolations.length > 0) {
console.warn('Обнаружены новые ошибки доступности:', newViolations);
}
// Сохраняем текущий результат для следующего сравнения
fs.writeFileSync('./baseline.json', JSON.stringify(currentResults, null, 2));
Для облегчения анализа изменений рекомендуется строить таблицы diff с указанием:
id)target)help)Можно использовать генерацию HTML-таблиц с цветовой маркировкой:
Это помогает сразу видеть динамику изменений доступности на страницах.
impact) — иногда low-приоритетные ошибки можно
игнорировать на стадии diff, чтобы сосредоточиться на критических
нарушениях.Дифф результатов в Axe-core превращает обычный аудит в инструмент контроля качества, позволяя не только обнаруживать нарушения, но и отслеживать их эволюцию во времени, интегрируя результаты в процессы разработки и поддержки веб-приложений.