Sweb: фреймворк для тестирования веб-интерфейсов¶
Sweb — это open-source фреймворк для автоматизированного тестирования веб-приложений, написанный на языке программирования Swift. Он предназначен для интеграционного и UI-тестирования (пользовательского интерфейса) iOS-приложений, использующих технологии WebKit и WKWebView. Sweb позволяет разработчикам и тестировщикам писать стабильные и выразительные тесты на нативном языке Swift, взаимодействуя с веб-контентом внутри нативного приложения через абстракцию, аналогичную популярным инструментам вроде Selenium.
¶История и происхождение
Sweb был создан в 2016 году разработчиком Ильёй Кучеровым. Проект возник как ответ на потребность в инструменте, который позволял бы тестировать гибридные мобильные приложения (сочетающие нативный код и веб-страницы) без необходимости использования сложных связок из нескольких фреймворков. Первоначально разработанный для внутренних нужд, фреймворк был опубликован на платформе GitHub и быстро привлёк внимание сообщества iOS-разработчиков.
Название «Sweb» является аббревиатурой от Swift + Web, что отражает основную концепцию инструмента — тестирование веба средствами языка Swift. В дальнейшем проект получил поддержку компании Avito, где использовался для обеспечения качества крупнейшей российской платформы объявлений, что способствовало его активному развитию и доработке.
¶Архитектура и принцип работы
Sweb построен на базе двух ключевых технологий: фреймворка XCTest от Apple для организации и запуска тестов, и протокола WebDriver, адаптированного для работы с движком WebKit. Основная задача Sweb — преобразовать команды, написанные на Swift, в исполняемый JavaScript-код, который внедряется в веб-страницу, загруженную внутри WKWebView.
¶Основные компоненты
- SwebDriver: центральный класс, управляющий сессией тестирования. Он инициализирует подключение к конкретному экземпляру
WKWebViewи предоставляет доступ к API для поиска элементов. - Page Object: паттерн проектирования, активно используемый в Sweb. Он позволяет инкапсулировать структуру веб-страницы и методы взаимодействия с ней в отдельные классы, что повышает читаемость и переиспользуемость тестового кода.
- Локаторы: механизмы поиска элементов на странице. Sweb поддерживает поиск по CSS-селекторам, XPath, а также по атрибутам, тексту и идентификаторам (
id).
¶Взаимодействие с веб-контентом
В отличие от инструментов, которые перехватывают сетевые запросы, Sweb работает непосредственно с DOM-деревом (Document Object Model) страницы. Фреймворк выполняет JavaScript-инъекции в контекст загруженной страницы, что позволяет ему:
- Находить элементы по сложным селекторам.
- Имитировать действия пользователя: клики, ввод текста, свайпы.
- Проверять состояние элементов (видимость, доступность, наличие атрибутов).
- Выполнять произвольный JavaScript-код для проверки состояния приложения.
Такой подход обеспечивает высокую скорость выполнения тестов, поскольку не требует внешнего сервера-прокси (как, например, Appium) и работает напрямую с движком браузера внутри приложения.
¶Ключевые возможности
Sweb предоставляет широкий спектр функций, ориентированных на специфику гибридных приложений:
- Ожидание условий: встроенные механизмы ожидания (
waitFor,waitForExistence) позволяют синхронизировать выполнение теста с загрузкой асинхронного контента, что снижает вероятность «флейки» (нестабильных) тестов. - Работа с веб-вью: фреймворк умеет корректно переключать контекст между нативным интерфейсом приложения и встроенным веб-представлением, что критично для тестирования гибридных сценариев (например, переход из нативного меню на веб-страницу оплаты).
- Поддержка JavaScript: возможность выполнять пользовательские скрипты для сложных проверок или взаимодействия с элементами, которые не поддерживаются стандартным API.
- Скриншоты и логирование: автоматическое создание снимков экрана на каждом шаге теста и детальное логирование действий помогают быстро диагностировать падения.
¶Применение и практика использования
Sweb применяется в основном в компаниях, разрабатывающих iOS-приложения с большим объёмом веб-контента. К таким приложениям относятся интернет-магазины, банковские клиенты, агрегаторы и социальные сети, где часть функциональности реализована на HTML5.
¶Пример сценария теста
В типичном тесте разработчик создает экземпляр SwebDriver, передавая ему ссылку на WKWebView. Затем, используя Page Object, он находит кнопку по её CSS-классу и выполняет нажатие:
``swift func testLogin() { let driver = swebDriver driver.open(url: "https://example.com/login") let emailField = driver.element(byCSS: "#email") emailField.sendKeys("user@example.com") let submitButton = driver.element(byXPath: "//button[@type='submit']") submitButton.click() // Проверка результата } ``
¶Интеграция с CI/CD
Sweb легко интегрируется в процессы непрерывной интеграции (CI/CD) через инструменты сборки (CocoaPods, Swift Package Manager) и запускается на симуляторах или реальных устройствах в связке с Xcode Server, Jenkins или GitLab CI. Это позволяет выполнять регрессионное тестирование при каждом изменении кода.
¶Преимущества и ограничения
¶Преимущества
- Нативный язык: тесты пишутся на Swift, что снижает порог входа для iOS-разработчиков и позволяет использовать все возможности языка (опциональные типы, замыкания, протоколы).
- Скорость выполнения: отсутствие сетевых задержек с внешним сервером делает тесты быстрее по сравнению с решениями на базе Selenium.
- Стабильность: прямой доступ к WebKit уменьшает количество ложных срабатываний, связанных с таймингами.
¶Ограничения
- Платформенная зависимость: инструмент работает исключительно с iOS и WebKit, что делает его непригодным для тестирования Android-версий приложений.
- Сложность настройки: для работы с реальными устройствами требуется корректная настройка сертификатов и provisioning-профилей.
- Требования к коду приложения: приложение должно открывать доступ к своему
WKWebViewдля внешнего тестового модуля, что требует внесения определённых изменений в код продукта (инъекция зависимостей).
¶Сравнение с альтернативами
На рынке инструментов тестирования iOS Sweb занимает нишу между чисто нативными тестами (XCTest) и кроссплатформенными решениями.
| Инструмент | Язык | Веб-контент | Платформы |
|---|---|---|---|
| XCTest (нативный) | Swift | Ограниченно | iOS |
| Sweb | Swift | Полноценно (WebKit) | iOS |
| Appium | Любой (через API) | Полноценно | iOS, Android |
| XCUITest | Swift | Ограниченно (через accessibility) | iOS |
Главное отличие Sweb от XCUITest заключается в том, что XCUITest «видит» веб-вью как единый нативный элемент и не имеет доступа к внутренней структуре HTML. Sweb же работает на уровне DOM, что позволяет проверять тексты, атрибуты и взаимодействовать с элементами, скрытыми от стандартной accessibility-разметки.
¶Актуальность и развитие
На сегодняшний день Sweb продолжает поддерживаться сообществом, хотя темпы разработки замедлились из-за появления альтернативных решений и изменений в самой iOS-платформе. Тем не менее, он остаётся востребованным в легаси-проектах, где уже накоплена большая тестовая база, написанная на нём. Архитектурные решения, заложенные в Sweb, оказали влияние на более новые инструменты, а его документация и примеры кода по-прежнему используются разработчиками как справочный материал по тестированию гибридных приложений.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →
