Привет! Я тут взялся за изучение Appium. В числе прочего, попалась мне книжка Appium Essentials:
Ниже приведен перевод первой главы. В планах опубликовать перевод целиком. Публиковать буду или по главам, или по осмысленным логическим блокам.
Местами, в книге будут комментарии от меня [вот в таких скобках]. Они будут небольшие, просто для уточнения контекста, где необходимо. И еще одно: иногда, редко, буду пропускать какие-то совсем уж очевидные вещи из разряда как прописать JAVA_HOME. Пропущенные куски буду обозначать.
А в целом, с удовольствием принимаю указания на неточности перевода (с потерей смысла).
Надеюсь, перевод будет полезен. Поехали!
Глава 1. Важные концепции.
В этой главе мы поговорим об архитектуре Appium, JSON wire protocol, сессиях Appium, а также получим представление о Desired capabilities для запуска Appium.
- Архитектура Appium
- Selenium JSON wire protocol
- Сессии Appium
- Desired capabilities
- Сервер Appium server и клиентские библиотеки
Архитектура Appium
Appium — это HTTP-сервер, напиванный на NodeJS, который создает и обрабатывает WebDriver-сессии. Appium придерживается того же подхода, что и Selenium WebDriver, который получает HTTP-запросы в формате JSON от клиентов и преобразует их в зависимости от платформы, на которой он работает.
Давайте обсудим, как Appium работает с iOS и Android.
Appium и iOS
На iOS-устройстве, Appium использует Apple's UIAutomation API, чтобы взаимодействовать с UI-элементами. UIAutomation — это JavaScript-библиотека, разработанная Apple для написания тестовых сценариев. Appium использует эти же библиотеки для автоматизации iOS-приложений.
Давайте посмотрим на архитектуру, которая представлена ниже:
Исполняемый скрипт предается HTTP-запросом Appium-серверу в виде JSON. Appium-сервер шлет команду инструментам (UIAutomation). Инструменты ищут файл bootstrap.js
, который Appium-сервер передал iOS-устройству. Затем, команды, указанные в файле bootstrap.js
исполняются окружением iOS-инструментов. Выполнив команду, клиент отправляет серверу отчет с деталями выполнения этой команды.
Похожая архитектура работает и в связке Appium-Android.
Appium и Android
На Android-устройстве, Appium использует UIAutomator, чтобы автоматизировать приложение. UIAutomator — фреймворк, созданный командой разработчиков Android для тестирования пользовательского интерфейса.
Давайте посмотрим на архитектуру, которая представлена ниже:
На диаграмме выше у нас представлен UIAutomator/Selendroid вместо инструментов Apple и, вместо bootstrap.js
передается bootstrap.jar
. Appium поддерживает Android версии 17 и выше. Для более ранних версий, используется Selendroid. Во время выполнения теста, Appium отправляет команды к UIAutomator или Selendroid, в зависимости от версии Android. Здесь, bootstrap.jar
играет роль TCP-сервера, который мы можем использовать, чтобы отправлять команды. Команды, в свою очередь выполняются на Android-устройстве средствами Selendroid или UIAutomator.
Selenium JSON wire protocol
JSON wire protocol (JSONWP) — механизм, созданный командой разработчиков WebDriver. Этот протокол представляет собой набор четко определенных стандартизированных конечных точек (endpoints), открытых через RESTful API. Предназначение WebDriver и JSONWP — автоматизировать тестирование сайтов через браузер таких как Firefox driver, IE driver, Chrome driver и т.д.
Appium реализует Mobile JSONWP — расширение Selenium JSONWP — и контролирует различное поведение мобильных устройств, например установка/удаление приложения за сессию.
Вот несколько примеров конечных точек из API, которые используются для взаимодействия с мобильными приложениями:
/session/:sessionId
/session/:sessionId/element
/session/:sessionId/elements
/session/:sessionId/element/:id/click
/session/:sessionId/source
/session/:sessionId/url
/session/:sessionId/timeouts/implicit_wait
Appium предоставляет клиентские библиотеки, похожие на библиотеки WebDriver, чтобы взаимодействовать с REST API. В этих библиотеках функции выглядят, примерно, так:
AppiumDriver.getPageSource();
Этот метод вызовет HTTP-запрос, и получит ответ от конечной точки [можно, я дальше буду писать «эндпоинта»? Сил уже нет] из API. Конкретно в этом примере, эндпоинт, который обрабатывает метод getPageSource
, выглядят так:
/session/:sessionId/source
Драйвер выполнит тестовый скрипт, который приходит в JSON-формате от AppiumDriver сервера, чтобы получить source
страницы. Назад вернется page source
в формате строки. В случае не-HTML платформ (нативные приложения), Appium вернет XML-документ, представляющие иерархию UI-элементов. Структура документа может отличаться, в зависимости от платформы.
Сессии Appium
Сессия — среда, в которой происходит отправка команд конкретному приложению; команда всегда исполняется в контексте текущей сессии. Как мы видели в предыдущем разделе, клиент использует идентификатор сессии — параметр sessionId
— до выполнения самой команды. Клиентская библиотека шлет запрос серверу на создание сессии. Затем, сервер возвращает sessionId
, который используется в последующих командах для взаимодействия с тестируемым приложением.
Desired capabilities
Desired capabilities [желаемые возможности] — JSON-объект (набор пар ключ-значение), отправленный клиентом серверу. DC описывает особенности создаваемой сессии.
Давайте рассмотрим все имеющиеся возможности. Сперва, мы увидим возможности для Appium-сервера:
Необходимо импортировать библиотеку org.openqa.Selenium.remote.DesiredCapabilities
[пример для Java], чтобы работать с DC.
Возможность | Пояснение |
automationName | Использутеся, чтобы определить исполнителя команд. Если вы хотите работать с Android SDK версии ниже 17, нужно указать значение Selendroid . Иначе, по дефорту будет установлено значение Appium . Пример:
Также можно определять возможожности, используя библиотеку Appium. Нужно импортировать библиотеку
В случае работы с iOS эту возможность испольовать не нужно. |
platformName | Указывает операционную систему на мобильном устройстве. Допустимые значения: iOS , Android и FirefoxOS . Пример:
Или с использованием библиотеки Appium:
|
platformVersion | Определяет версию операционной системы. Пример:
Или с использованием библиотеки Appium:
|
deviceName | Устанавливает тип устройства или эмулятора, например iPhone Simulator , iPad Simulator , iPhone Retina 4-inch , Android Emulator , Moto x , Nexus 5 и так далее. Пример:
Или с использованием библиотеки Appium:
|
app | Абсолютный путь до файла или URL для скачивания файла в формате .ipa , .apk , или .zip . Appium сначала установит приложение на соответствующее устройство. Отметим, что если для Android определить возможности appPackage и appActivity (о них рассказывается ниже), то app указывать не нужно. Пример:
Или с использованием библиотеки Appium:
|
browserName | Используется при тестировании веб-приложений на мобильном устройстве. Определяет браузер для тестирования. Пример:
Или с использованием библиотеки Appium:
|
newCommandTimeout | Appium ждет новую команду от клиента в течение некоторого времени, после чего [если команд не поступало], решает, что клиент выключен и завершает сессию. Значение по умолчанию 60 [секунд]. Пример:
Или с использованием библиотеки Appium:
|
autoLaunch | Устанавливает автозапуск тестируемого приложения. По дефолту стоит значение true . Пример:
|
language | Устанавливает язык на эмуляторе. К примеру fr , es и так далее. Пример:
|
locale | Устанавливает локаль на эмуляторе. К примеру fr_CA , tr_TR и так далее. Пример:
|
udid | Уникальный идентификатор девайса (unique device identifier) обычно используется для идентификации конкретного iOS-устройства. Представляет собой строку в 40 символов (например, 1be204387fc072g1be204387fc072g4387fc072g). udid указывается при автоматизации приложений на реальных iOS-устройствах. Udid устройстваfrom можно легко получить через iTunes, кликнув на Serial Number в инфо об устройстве. Пример:
|
orientation | Устанавливает ориентацию устройства при работе с эмулятором. Допустимые значения: LANDSCAPE и PORTRAIT . Пример:
|
autoWebview | Если вы тестируете гибридное приложение и хотите взаимодействовать с Webview, вам нужно установить такую возможность; по умолчанию стоит значение false . Пример:
|
noReset | Сбрасывать текущее состояние приложения перед стартом сессии. Дефолт: false . Пример:
|
fullReset | Для iOS: удалит всю папку симулятора. Для Android: вместо удаления всего из папки приложения, можно удалить само приложение, чтобы сбросить состояние. Также, приложение будет удалено по окончанию жизни сессии. По умолчанию false . Пример:
|
Android capabilities
Возможность | Пояснение |
appPackage | Определяет, какой Java-пакет должен быть запущен. Например: com.android.calculator2 или com.android.settings
Или с использованием библиотеки Appium:
|
appActivity | Определяет, какую Activity необходимо запустить из указанного пакета. Например: MainActivity , .Settings , com.android.calculator2.Calculator
Или с использованием библиотеки Appium:
|
appWaitActivity | Определяет, какую Activity, при запуске, нужно дождаться.
Или с использованием библиотеки Appium:
|
appWaitPackage | Определяет, какую пакет Android-приложения, при запуске, нужно дождаться.
|
deviceReadyTimeout | Определяет, таймаут (в секундах), в течение которого ожидается готовность девайса. По дефолту 5 .
Или с использованием библиотеки Appium:
|
enablePerformanceLogging | Активирует Chrome driver perfomance logging. Доступно только при работе с Chrome и WebView. По умолчанию значение false
|
androidDeviceReadyTimeout | Устанавливает таймаут в секундах, сколько ждать, пока девайс станет готовым после включения.
|
androidDeviceSocket | Используется для установки DevTools socket name. Необходимо только когда приложение — Chromium-embedding browser. Браузер открывает сокет и ChromeDriver подключается к нему как DevTools client. Например, chrome_DevTools_remote
|
avd | Задает имя avd [Android virtual device] для запуска.
|
avdLaunchTimeout | В милисекундах задает время на ожидание запуска указанного avd . По умолчанию 120000 .
|
avdReadyTimeout | В милисекундах задает время на ожидание, когда закончатся анимации запуска avd . По умолчанию 120000 .
|
avdArgs | Позволяет передать дополнительные параметры при запуске avd [startup options].
|
autoWebviewTimeout | Задает время ожидания (в милисекундах), в течение которого ожидается WebView context, прежде чем, переключиться на него. По умолчанию 2000
|
intentAction | Intent action обычно используется, чтобы запустить activity. По дефолту: android.intent.action.MAIN
|
intentCategory | Определяет категорию Intent для запуска activity. По дефолту: android.intent.category.LAUNCHER
|
intentFlags | Флаги, используемые при запуске Activity. По дефолту: 0x10200000
|
intentFlags | Разрешает ввод юникода. По дефолту: false
|
resetKeyboard | Сбрасывает клавиатуру до ее исходного состояния. По дефолту: false
|
iOS capabilities
Возможность | Пояснение |
calendarFormat | Задает формат календаря для симулятора iOS. Пример:
|
bundleId | Используется для запуска приложения на реальном девайсе. Пример:
|
launchTimeout | Задает время ожидания (в милисекундах) инструментов. По истечению времени, Appium решает, что там все повисло и сессия закрывается.
|
locationServicesEnabled | включает location Services
|
locationServicesAuthorized | Используется в симуляторе. Если значение true , в приложении не будет всплывать поп-ап с запросом доступа к location services. Для использования требуется явно указывать bundleId . По дефолту: false
|
autoAcceptAlerts | Автоматически разрешаются доступы приложению к фото, контактам, камере т.д. По дефолту: false
|
nativeInstrumentsLib | Подключает библиотеку native instruments
|
nativeWebTap | При работе с Safari имитирует событие tap. По дефолту: false . Работает не идеально и зависит от viewport's size/ratio
|
safariAllowPopups | Используется только на симуляторе. Позволяет открывать в Safari новые окна средствами JavaScript
|
safariIgnoreFraudWarning | Используется только на симуляторе. Запрещает Safari показывать сообщения, что сайт мошеннический.
|
safariOpenLinksInBackground | Используется только на симуляторе. Позволяет Safari открывать новые вкладки.
|
keepKeyChains | Используется только на симуляторе. Позволяет хранить связки ключей при запуске/отключении сессии.
|
processArguments | Позволяет передавать аргументы при использовании instruments.
|
interKeyDelay | Задает в милисеукундах длительность нажатия на элемент.
|
Сервер Appium server и клиентские библиотеки
Appium-сервер используется для взаимодействия с разными платформами (iOS и Android). Он создает сессию, чтобы взаимодействовать с мобильными приложениями. Это — HTTP-сервер, написанный на NodeJS и использует ту же идею, что и Selenium Server, который определяет HTTP-запросы от клиентских библиотек и шлет свои запросы соответствующим платформам. Чтобы запустить Appium-сервер, небходимо скачать исходники или установить из npm. Также у Appium есть GUI-версия сервера. Ее можно скачать с официального сайта http://appium.io. В следующих главах мы рассмотрим GUI-версию подоробнее.
Одним из плюсов Appium является то, что это — просто REST API. И код, с помощью которого вы взаимодействуете с этим API, может быть написан на разных языках, таких как Java, C#, Ruby, Python и других. Appium расширяет библиотеку WebDriver и добавляет команды для работы с мобильными устройствами. Он предоставляет клиентские библиотеки, поддерживающие расширения Appium для протокола WebDriver. Именно из-за этих расширений важно использовать клиентские библиотеки, специфичные для Appium, чтобы писать автоматизированные тесты или процедуры вместо общих клиентских библиотек WebDriver.
Appium добавил несколько интересных фич в работе с мобильными устройствами, таких как мультитач или работа с ориентацией экрана. Позже мы увидим их практическое применение.
Заключение
К концу главы, у нас должно появиться понимание архитектуры Appium, JSON wire protocol, desired capabilities и как ими пользоваться. мы также узнали об Appium-сервере и клиентских библиотеках на разных языках программирования.
Мы рассмотрели JSONWP и Appium сессии, которые используются для отправки дополнительных команд для взаимодействия с приложением. В последнем разделе мы получили некоторую информацию о сервере Appium и его клиентских библиотеках, специфичных для языка.
В следующей главе, мы посмотрим, что необходимо, чтобы начать работу с Appiumь работу с Appium
Автор: EreminD