Открыть сервис

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-инъекции в контекст загруженной страницы, что позволяет ему:

  1. Находить элементы по сложным селекторам.
  2. Имитировать действия пользователя: клики, ввод текста, свайпы.
  3. Проверять состояние элементов (видимость, доступность, наличие атрибутов).
  4. Выполнять произвольный 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
SwebSwiftПолноценно (WebKit)iOS
AppiumЛюбой (через API)ПолноценноiOS, Android
XCUITestSwiftОграниченно (через accessibility)iOS

Главное отличие Sweb от XCUITest заключается в том, что XCUITest «видит» веб-вью как единый нативный элемент и не имеет доступа к внутренней структуре HTML. Sweb же работает на уровне DOM, что позволяет проверять тексты, атрибуты и взаимодействовать с элементами, скрытыми от стандартной accessibility-разметки.

Актуальность и развитие

На сегодняшний день Sweb продолжает поддерживаться сообществом, хотя темпы разработки замедлились из-за появления альтернативных решений и изменений в самой iOS-платформе. Тем не менее, он остаётся востребованным в легаси-проектах, где уже накоплена большая тестовая база, написанная на нём. Архитектурные решения, заложенные в Sweb, оказали влияние на более новые инструменты, а его документация и примеры кода по-прежнему используются разработчиками как справочный материал по тестированию гибридных приложений.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →