Тестирование доступности (Accessibility) мобильного приложения
VoiceOver на iPhone читает кнопку «Button» вместо «Добавить в корзину» — потому что у UIImageView с иконкой корзины не задан accessibilityLabel. Пользователь с нарушениями зрения нажимает вслепую. Это не теоретическая ситуация: 2.2 миллиарда человек имеют нарушения зрения, и Apple/Google начали отклонять приложения с грубыми Accessibility-нарушениями при ревью.
Что ломается чаще всего
Отсутствие или неверные accessibilityLabel. Кастомные компоненты — слайдеры, кастомные кнопки, иконки без текста — не имеют автоматических меток. VoiceOver читает координаты или имя класса. На iOS нужно явно ставить accessibilityLabel и accessibilityHint. На Android — contentDescription в XML или через ViewCompat.setAccessibilityDelegate.
Неправильный фокус. После закрытия модалки фокус VoiceOver/TalkBack остаётся на элементах, которых больше нет на экране — пользователь теряется. На iOS управляем через UIAccessibility.post(notification: .screenChanged, argument: targetView). На Android — ViewCompat.setAccessibilityPaneTitle и sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED).
Мелкие touch targets. Apple HIG требует минимум 44×44 pt. Google Material требует 48×48 dp. Иконки 24dp с минимальным padding — распространённая ошибка. Пользователи с моторными нарушениями не могут точно нажать.
Контрастность текста. WCAG 2.1 Level AA требует 4.5:1 для обычного текста и 3:1 для большого (18pt+). Серый текст на светлом фоне, популярный в плейсхолдерах и подписях, часто падает ниже нормы.
Инструменты тестирования
Accessibility Inspector (Xcode). Запускается через Xcode → Open Developer Tool → Accessibility Inspector. Аудит одним кликом — находит отсутствующие метки, мелкие touch targets, проблемы с контрастом. Работает на симуляторе и на реальном устройстве.
Accessibility Scanner (Android). Приложение от Google, сканирует экран и выдаёт список проблем с классификацией по типу. Интегрируется в Espresso через AccessibilityChecks.enable() — автоматически запускает проверки при каждом действии в тесте:
@Before
fun setup() {
AccessibilityChecks.enable()
.setRunChecksFromRootView(true)
}
Каждый Espresso-тест теперь дополнительно проверяет a11y — любое нарушение роняет тест.
Ручное тестирование с VoiceOver/TalkBack. Проходим ключевые сценарии: регистрация, покупка, основной user flow — только через жесты скринридера, без визуального контроля. Это выявляет семантические проблемы, которые автоматика не поймёт: логический порядок чтения элементов, непонятные формулировки меток, потерянный фокус.
axe DevTools Mobile. Коммерческий инструмент с более детальной классификацией нарушений по WCAG. Выдаёт отчёт с severity и ссылками на критерии. Полезен при подготовке к EU Accessibility Act compliance.
Матрица проверок
| Нарушение | Автотест | Ручной тест |
|---|---|---|
| Отсутствие accessibilityLabel | Accessibility Scanner / Inspector | VoiceOver |
| Неверный порядок фокуса | — | VoiceOver / TalkBack |
| Touch target < 44pt/48dp | Accessibility Inspector | — |
| Контрастность | Colour Contrast Analyser | — |
| Анимации при reduce motion | — | Settings → Accessibility |
Процесс работы
Аудит через Accessibility Inspector и Scanner — получаем список нарушений с приоритизацией. Добавляем AccessibilityChecks.enable() в Espresso-тесты. Ручной прогон ключевых сценариев с VoiceOver и TalkBack. Финальный отчёт с классификацией по WCAG 2.1 (A/AA) и рекомендациями по правке.
Сроки — 2–3 дня на средний проект. Если приложение готовится к EU Accessibility Act compliance — полная документация добавляет ещё 1–2 дня.







