Тестирование доступности

Тестирование доступности (Accessibility, сокращённо a11y) является ключевым аспектом разработки интерфейсов, обеспечивая удобство использования приложений людьми с различными ограничениями. В Vue.js, как и в любом современном фронтенд-фреймворке, существуют инструменты и подходы для интеграции проверок доступности на уровне компонентов и всего приложения.


Основные принципы доступности

  1. Семантическая разметка Использование правильных HTML-элементов обеспечивает корректное взаимодействие с ассистивными технологиями (скринридерами, голосовыми помощниками).

    • <button> вместо <div> для кнопок.
    • <label> для форм, связывающий текст с полем ввода через атрибут for.
    • Заголовки <h1><h6> для структурирования контента.
  2. Атрибуты ARIA ARIA (Accessible Rich Internet Applications) расширяет семантику стандартных элементов. Vue.js позволяет динамически управлять ARIA-атрибутами через реактивные свойства:

    <button :aria-pressed="isActive">{{ isActive ? 'Включено' : 'Выключено' }}</button>
  3. Фокус и навигация с клавиатуры Все интерактивные элементы должны быть доступны через Tab. Vue поддерживает управление фокусом через директивы и refs:

    <input ref="username" type="text" />
    <button @click="$refs.username.focus()">Фокус на поле</button>
  4. Контраст и цвет Текст и элементы интерфейса должны иметь достаточный контраст по стандартам WCAG. Vue-компоненты можно стилизовать динамически с учётом состояния доступности:

    <p :style="{ color: isDisabled ? '#999' : '#000' }">Текст</p>

Инструменты для тестирования доступности

  1. eslint-plugin-vuejs-accessibility ESLint-плагин, проверяющий компоненты на ошибки доступности. Позволяет обнаруживать:

    • отсутствие alt у <img>
    • некорректные ARIA-атрибуты
    • элементы управления без фокусируемых тегов

    Установка и настройка:

    npm install eslint-plugin-vuejs-accessibility --save-dev

    Конфигурация .eslintrc.js:

    module.exports = {
      plugins: ['vuejs-accessibility'],
      extends: ['plugin:vuejs-accessibility/recommended'],
    };
  2. axe-core и vue-axe Автоматизированный анализ доступности с детальными отчетами о нарушениях. Подключение во Vue 3:

    import { createApp } from 'vue'
    import App from './App.vue'
    import VueAxe from 'vue-axe'
    
    const app = createApp(App)
    app.use(VueAxe, { config: { rules: [] } })
    app.mount('#app')
  3. Cypress + cypress-axe Тестирование доступности на уровне e2e. Позволяет интегрировать проверки в CI/CD. Пример теста:

    import 'cypress-axe'
    
    it('Проверка доступности главной страницы', () => {
      cy.visit('/')
      cy.injectAxe()
      cy.checkA11y()
    })

Тестирование компонентов Vue

  1. Модульное тестирование с Jest Проверка доступности отдельных компонентов:

    import { mount } from '@vue/test-utils'
    import { toHaveNoViolations } from 'jest-axe'
    import MyButton from '@/components/MyButton.vue'
    import { axe, toHaveNoViolations } from 'jest-axe'
    
    expect.extend(toHaveNoViolations)
    
    test('MyButton должен быть доступен', async () => {
      const wrapper = mount(MyButton)
      const results = await axe(wrapper.element)
      expect(results).toHaveNoViolations()
    })
  2. Реактивная доступность Vue позволяет динамически менять доступность элементов через реактивные данные:

    <template>
      <button :disabled="!isActive" aria-label="Сохранить">Сохранить</button>
    </template>
    
    <script>
    export default {
      data() {
        return { isActive: false }
      }
    }
    </script>

Практические советы по обеспечению доступности

  • Всегда использовать семантические теги вместо декоративных.
  • Проверять визуальные состояния: hover, focus, disabled.
  • Интегрировать автоматические проверки доступности в процесс CI/CD.
  • Учитывать локализацию: скринридеры корректно читают текст на разных языках при правильных атрибутах lang.
  • Не полагаться только на цвета для передачи информации — использовать иконки, текст, текстовые метки.

Особенности Vue 3

  • Composition API упрощает управление фокусом и состоянием ARIA:

    import { ref, onMounted } from 'vue'
    
    export default {
      setup() {
        const inputRef = ref(null)
        onMounted(() => inputRef.value.focus())
        return { inputRef }
      }
    }
  • Teleport позволяет выводить элементы модально, при этом сохраняя доступность для скринридеров.

  • Suspense и динамическая загрузка компонентов требуют внимательного контроля за доступностью загружаемых элементов.


Тестирование доступности во Vue.js — это не просто проверка наличия атрибутов, а комплексный процесс, включающий семантическую разметку, управление фокусом, автоматизированные тесты и динамическое управление состояниями компонентов. Эффективная интеграция этих практик гарантирует, что приложение будет удобно использовать широкому кругу пользователей.