Библиотека Axe-core предназначена для автоматической проверки доступности веб-приложений и компонентов. В контексте Angular она используется для обеспечения соответствия стандартам WCAG и улучшения опыта пользователей с ограниченными возможностями.
Для работы с Angular чаще всего применяются подходы через unit-тесты, end-to-end тесты и интеграцию с компонентами.
Axe-core может быть установлена через npm:
npm install axe-core --save-dev
Для использования в тестах с Angular обычно подключают пакет @axe-core/angular или используют Axe через Protractor или Cypress. Пример для Protractor:
npm install protractor-axe-html-report-plugin --save-dev
Настройка в protractor.conf.js может выглядеть так:
const AxeProtractorPlugin = require('protractor-axe-html-report-plugin');
exports.config = {
plugins: [{
package: 'protractor-axe-html-report-plugin',
options: {
outputPath: 'accessibility-reports'
}
}]
};
Это позволяет интегрировать проверки доступности прямо в процесс e2e-тестирования Angular.
Для unit-тестов компонентов Angular удобно применять Axe через Jasmine и TestBed.
Пример:
import { TestBed, ComponentFixture } from '@angular/core/testing';
import { AxeBuilder } from 'axe-core';
import { MyComponent } from './my.component';
describe('MyComponent Accessibility', () => {
let fixture: ComponentFixture<MyComponent>;
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [MyComponent]
}).compileComponents();
fixture = TestBed.createComponent(MyComponent);
fixture.detectChanges();
});
it('should have no accessibility violations', async () => {
const results = await new AxeBuilder({ element: fixture.nativeElement }).analyze();
expect(results.violations.length).toBe(0);
});
});
Ключевые моменты:
fixture.nativeElement указывает на корневой
DOM-компонент.violations содержит список найденных нарушений
стандартов доступности.Для полноценного тестирования приложения в браузере используют Cypress или Protractor.
Пример интеграции с Cypress:
npm install cypress-axe --save-dev
// cypress/support/commands.js
import 'cypress-axe';
Cypress.Commands.add('checkAccessibility', () => {
cy.injectAxe();
cy.checkA11y(null, {
runOnly: {
type: 'tag',
values: ['wcag2aa']
}
});
});
describe('Accessibility test', () => {
it('Home page should be accessible', () => {
cy.visit('/');
cy.checkAccessibility();
});
});
Особенности:
injectAxe() внедряет скрипт Axe в DOM.checkA11y() выполняет проверку доступности и может
выдавать отчет в консоль или файл.wcag2a,
wcag2aa).Axe-core поддерживает детальную настройку правил:
const builder = new AxeBuilder({ element: fixture.nativeElement })
.disableRules(['color-contrast'])
.withRules({
'label': { enabled: true },
'image-alt': { enabled: true }
});
disableRules — отключает правила,
которые временно не применяются.withRules — включает или настраивает
определённые правила.Angular активно использует динамические компоненты, что может создавать трудности при тестировании доступности.
Подходы:
fixture.detectChanges() и fixture.whenStable()
гарантировать, что все асинхронные изменения завершены:await fixture.whenStable();
const results = await new AxeBuilder({ element: fixture.nativeElement }).analyze();
cy.visit('/lazy-page');
cy.checkAccessibility();
Axe-core позволяет формировать отчёты для удобного анализа:
Пример генерации HTML отчета в Protractor:
const AxeProtractorPlugin = require('protractor-axe-html-report-plugin');
plugins: [{
package: 'protractor-axe-html-report-plugin',
options: {
outputPath: 'accessibility-reports',
reportFileName: 'home-page-report.html'
}
}]
В CI/CD можно настроить автоматическое прерывание сборки при найденных нарушениях, что гарантирует постоянное соблюдение стандартов доступности.
AxeBuilder({ element: fixture.nativeElement.querySelector('#main') }).wcag2a,
wcag2aa) для ускорения анализа.Компоненты UI-библиотек, таких как Angular Material, часто имеют встроенную доступность, но проверка с Axe помогает:
При использовании Axe-core в Angular с TypeScript важно подключить типы:
npm install --save-dev @types/axe-core
Типизация позволяет:
AxeBuilder.