SkateJS — это библиотека для создания веб-компонентов на JavaScript, которая сочетает декларативный подход с полной поддержкой стандартов Web Components. При разработке компонентов важно обеспечить их доступность (accessibility, A11y), чтобы интерфейс был удобен для всех пользователей, включая людей с ограниченными возможностями. Тестирование доступности является ключевым этапом качества компонента.
Тестирование доступности в SkateJS обычно проводится на уровне компонентов с использованием библиотек для автоматизированной проверки. Наиболее популярные инструменты — axe-core и jest-axe, которые позволяют проверять DOM-компоненты на соответствие стандартам WCAG.
Пример установки необходимых пакетов:
npm install --save-dev axe-core jest-axe @testing-library/dom
После установки можно создавать тесты для компонентов SkateJS.
SkateJS использует стандартный DOM API, что позволяет тестировать компоненты с использованием @testing-library/dom или @testing-library/jest-dom.
Пример теста доступности для простого компонента:
import { define } from 'skatejs';
import { html, render } from 'skatejs';
import { axe, toHaveNoViolations } from 'jest-axe';
expect.extend(toHaveNoViolations);
class AccessibleButton extends HTMLElement {
connectedCallback() {
render(html`<button>Click Me</button>`, this);
}
}
define('accessible-button', AccessibleButton);
test('доступность компонента AccessibleButton', async () => {
const el = document.createElement('accessible-button');
document.body.appendChild(el);
const results = await axe(el);
expect(results).toHaveNoViolations();
});
Ключевые моменты:
jest-axe выполняет проверку DOM на наличие нарушений
доступности.Для повышения доступности компонентов SkateJS необходимо использовать атрибуты ARIA и корректные роли HTML-элементов.
Пример добавления ARIA:
class ToggleSwitch extends HTMLElement {
connectedCallback() {
this.setAttribute('role', 'switch');
this.setAttribute('aria-checked', 'false');
this.addEventListener('click', () => {
const checked = this.getAttribute('aria-checked') === 'true';
this.setAttribute('aria-checked', String(!checked));
});
render(html`<div>Toggle</div>`, this);
}
}
define('toggle-switch', ToggleSwitch);
Объяснение:
role="switch" сообщает вспомогательным
технологиям, что элемент — интерактивный переключатель.aria-checked динамически отражает состояние
компонента.Для полноценной проверки доступности важно имитировать взаимодействие пользователя: клики, клавиши, фокус. Testing Library позволяет это сделать:
import { fireEvent } from '@testing-library/dom';
const toggle = document.createElement('toggle-switch');
document.body.appendChild(toggle);
fireEvent.click(toggle);
expect(toggle.getAttribute('aria-checked')).toBe('true');
Тест проверяет, что компонент корректно обновляет ARIA-состояние при взаимодействии, что является частью стандартов доступности.
Доступность компонентов подразумевает возможность управления клавиатурой. Для SkateJS это требует явного управления фокусом и обработкой событий клавиатуры:
class KeyboardButton extends HTMLElement {
connectedCallback() {
render(html`<button>Press Enter</button>`, this);
this.addEventListener('keydown', (e) => {
if (e.key === 'Enter') {
this.setAttribute('data-activated', 'true');
}
});
}
}
define('keyboard-button', KeyboardButton);
Тестирование клавиатуры:
const btn = document.createElement('keyboard-button');
document.body.appendChild(btn);
btn.querySelector('button').focus();
fireEvent.keyDown(btn, { key: 'Enter', code: 'Enter' });
expect(btn.getAttribute('data-activated')).toBe('true');
Это гарантирует, что компоненты работают не только мышью, но и клавиатурой.
Автоматическое тестирование доступности удобно интегрировать в
процессы CI/CD. Все тесты, использующие jest-axe, можно
запускать при каждом коммите. Это предотвращает появление нарушений WCAG
при добавлении новых компонентов или изменении существующих.
Пример конфигурации в package.json:
"scripts": {
"test": "jest --coverage",
"test:a11y": "jest --testPathPattern='.*\\.a11y\\.test\\.js$'"
}
Правильная организация тестов доступности обеспечивает высокое качество компонентов и соблюдение стандартов WCAG, что особенно важно при разработке интерфейсов для широкой аудитории.