JS-инъекция для iOS-тестов: как подружить WKWebView и XCTest
di_smirnov 24 минуты назад JS-инъекция для iOS-тестов: как подружить WKWebView и XCTest Простой 8 мин 632 Блог компании Ozon Банк iOS * Тестирование мобильных приложений * Кейс Меня зовут Даниил Смирнов, я эксперт по...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: di_smirnov 24 минуты назад JS-инъекция для iOS-тестов: как подружить WKWebView и XCTest Простой 8 мин 632 Блог компании Ozon Банк iOS * Тестирование мобильных приложений * Кейс Меня зовут Даниил Смирнов, я эксперт по автоматизации мобильного тестирования в Ozon Банке. Мы пишем UI-тесты для Ozon Банка, и примерно каждый второй экран — с WebView. Оферты, платёжные формы, веб-флоу — всё это рендерится внутри WKWebView.
И здесь XCTest оказывается почти бессилен. С чем столкнулисьXCTest из коробки работает только с accessibility-деревом iOS. Система обходит экран и собирает все элементы, попавшие в это дерево: их видит и VoiceOver, и XCTest.
Технические детали
Элементы попадают туда автоматически, если это стандартные UIKit-компоненты, или если разработчик явно задал accessibilityLabel / accessibilityIdentifier для кастомной вёрстки. WKWebView — не исключение: он тоже может экспортировать элементы в accessibility-дерево, но делает это выборочно и только для определённых HTML-атрибутов. Движок WebKit маппит их в нативные accessibility-свойства iOS:HTML-атрибутiOS accessibility-свойствоaria-labelaccessibilityLabelroleaccessibilityTraits (например, role="button" → trait кнопки)alt (на )accessibilityLabelaria-labelledbyпривязка к лейблу через ссылку на ID другого элементаtitleaccessibilityLabel (если нет aria-label)Именно эти атрибуты может найти XCTest внутри WebView.
А data-testid — это кастомный data-атрибут, для которого нет соответствия в accessibility-спецификации. WebKit его игнорирует, в дерево accessibility он не попадает, и XCTest его не видит. Посмотрим на конкретном примере.
Допустим, есть платёжная форма с такими элементами: Оплатить Договор оферты Баланс: 1 000 ₽ А вот что из этого увидит XCTest через accessibility-дерево:Button: "Оплатить" Link: "Договор оферты" TextField: <нет лейбла> Текстовое поле в дерево попало (WKWebView экспортирует как TextField), но без accessibilityLabel — у него нет aria-label, а placeholder в лейбл не маппится. Найти такой элемент можно только по индексу или порядковому номеру, что ненадёжно. Информационный блок () в дерево не попал — это статичный неинтерактивный элемент.
Отраслевые последствия
А data-testid внутри этих тегов WebKit и вовсе игнорирует — XCTest их не найдёт, хотя в DOM они есть. staticTexts не получится, даже если у элемента есть data-testid="submit-button". Мы рассмотрели несколько вариантов.
Вариант 1 — aria-label. Фронтенд их проставляет, но они заточены под VoiceOver, а не под тесты. Лейблы бывают неуникальными, перегруженными текстом и зависят от локализации.
Поменяли «Оплатить» на «Внести платёж» — тест упал. Вариант 2 — поиск по координатам. Хрупкий и медленный подход.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.






