Перевод книги Appium Essentials. Глава 1

Привет Хабр! Я тут взялся за изучение Appium. В числе прочего, попалась мне книжка Appium Essentials:

image

Ниже приведен перевод первой главы. В планах опубликовать перевод целиком. Публиковать буду или по главам, или по осмысленным логическим блокам.

Местами, в книге будут комментарии от меня [вот в таких скобках]. Они будут небольшие, просто для уточнения контекста, где необходимо. И еще одно: иногда, редко, буду пропускать какие-то совсем уж очевидные вещи из разряда как прописать JAVA_HOME. Пропущенные куски буду обозначать.

На данный момент есть перевод главы 1 (ниже),
Главы 2
и Главы 3

А в целом, с удовольствием принимаю указания на неточности перевода (с потерей смысла).
Надеюсь, перевод будет полезен. Поехали!

Глава 1. Важные концепции.


В этой главе мы поговорим об архитектуре Appium, JSON wire protocol, сессиях Appium, а также получим представление о Desired capabilities для запуска Appium.




Архитектура Appium


Appium — это HTTP-сервер, написанный на Nodes, который создает и обрабатывает 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. Пример:

DesiredCapabilities caps = new DesiredCapabilities(); // создали объект
caps.setCapability("automationName","Selendroid"); // установили значение

Также можно определять возможности, используя библиотеку Appium. Нужно импортировать библиотеку io.appium.java_client.remote.MobileCapabilityType:

caps.setCapability(MobileCapabilityType.AUTOMATION_NAME,"Selendroid");

В случае работы с iOS эту возможность использовать не нужно.
platformName Указывает операционную систему на мобильном устройстве. Допустимые значения: iOS, Android и FirefoxOS. Пример:

caps.setCapability("platformName","Android");

Или с использованием библиотеки Appium:

caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
platformVersion Определяет версию операционной системы. Пример:

caps.setCapability("platformVersion","4.4.4");

Или с использованием библиотеки Appium:

caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4.4");
deviceName Устанавливает тип устройства или эмулятора, например iPhone Simulator, iPad Simulator, iPhone Retina 4-inch, Android Emulator, Moto x, Nexus 5 и так далее. Пример:

caps.setCapability("deviceName", "Nexus 5");

Или с использованием библиотеки Appium:

caps.setCapability(MobileCapabilityType.DEVICE_NAME,"Nexus 5");
app Абсолютный путь до файла или URL для скачивания файла в формате .ipa, .apk, или .zip. Appium сначала установит приложение на соответствующее устройство. Отметим, что если для Android определить возможности appPackage и appActivity (о них рассказывается ниже), то app указывать не нужно. Пример:

caps.setCapability("app","/apps/demo/demo.apk or http://app.com/app.ipa");

Или с использованием библиотеки Appium:

caps.setCapability(MobileCapabilityType.APP,"/apps/demo/demo.apk or http://app.com/app.ipa");
browserName Используется при тестировании веб-приложений на мобильном устройстве. Определяет браузер для тестирования. Пример:

caps.setCapability("browserName", "Safari");

Или с использованием библиотеки Appium:

caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Safari");
newCommandTimeout Appium ждет новую команду от клиента в течение некоторого времени, после чего [если команд не поступало], решает, что клиент выключен и завершает сессию. Значение по умолчанию 60 [секунд]. Пример:

caps.setCapability("newCommandTimeout", "30");

Или с использованием библиотеки Appium:

caps.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT,"30");
autoLaunch Устанавливает автозапуск тестируемого приложения. По дефолту стоит значение true. Пример:

caps.setCapability("autoLaunch","false");
language Устанавливает язык на эмуляторе. К примеру fr, es и так далее. Пример:

caps.setCapability("language","fr");
locale Устанавливает локаль на эмуляторе. К примеру fr_CA, tr_TR и так далее. Пример:

caps.setCapability("locale","fr_CA");
udid Уникальный идентификатор девайса (unique device identifier) обычно используется для идентификации конкретного iOS-устройства. Представляет собой строку в 40 символов (например, 1be204387fc072g1be204387fc072g4387fc072g). udid указывается при автоматизации приложений на реальных iOS-устройствах. Udid устройства можно легко получить через iTunes, кликнув на Serial Number в инфо об устройстве. Пример:

caps.setCapability("udid", "1be204387fc072g1be204387fc072g4387fc072g");
orientation Устанавливает ориентацию устройства при работе с эмулятором. Допустимые значения: LANDSCAPE и PORTRAIT. Пример:

caps.setCapability("orientation", "PORTRAIT");
autoWebview Если вы тестируете гибридное приложение и хотите взаимодействовать с Webview, вам нужно установить такую возможность; по умолчанию стоит значение false. Пример:

caps.setCapability("autoWebview", "true");
noReset Сбрасывать текущее состояние приложения перед стартом сессии. Дефолт: false. Пример:

caps.setCapability("noReset", "true");
fullReset Для iOS: удалит всю папку симулятора. Для Android: вместо удаления всего из папки приложения, можно удалить само приложение, чтобы сбросить состояние. Также, приложение будет удалено по окончанию жизни сессии. По умолчанию false. Пример:

caps.setCapability("fullReset", "true");

Android capabilities


Возможность Пояснение
appPackage Определяет, какой Java-пакет должен быть запущен. Например: com.android.calculator2 или com.android.settings

caps.setCapability("appPackage", "com.android.calculator2");

Или с использованием библиотеки Appium:

caps.setCapability(MobileCapabilityType.APP_PACKAGE, "com.android.calculator2");
appActivity Определяет, какую Activity необходимо запустить из указанного пакета. Например: MainActivity, .Settings, com.android.calculator2.Calculator

caps.setCapability("appActivity", "com.android.calculator2.Calculator");

Или с использованием библиотеки Appium:

caps.setCapability(MobileCapabilityType.APP_ACTIVITY, "com.android.calculator2.Calculator");
appWaitActivity Определяет, какую Activity, при запуске, нужно дождаться.

caps.setCapability("appWaitActivity","com.android.calculator2.Calculator");

Или с использованием библиотеки Appium:

caps.setCapability(MobileCapabilityType.APP_WAIT_ACTIVITY,"com.android.calculator2.Calculator");
appWaitPackage Определяет, какую пакет Android-приложения, при запуске, нужно дождаться.

caps.setCapability("appWaitPackage","com.example.android.myApp");
deviceReadyTimeout Определяет, таймаут (в секундах), в течение которого ожидается готовность девайса. По дефолту 5.

caps.setCapability("deviceReadyTimeout","10");

Или с использованием библиотеки Appium:

caps.setCapability(MobileCapabilityType.DEVICE_READY_TIMEOUT,"10");
enablePerformanceLogging Активирует Chrome driver performance logging. Доступно только при работе с Chrome и WebView. По умолчанию значение false

caps.setCapability("enablePerformanceLogging", "true");
androidDeviceReadyTimeout Устанавливает таймаут в секундах, сколько ждать, пока девайс станет готовым после включения.

caps.setCapability("androidDeviceReadyTimeout","20");

androidDeviceSocket Используется для установки DevTools socket name. Необходимо только когда приложение — Chromium-embedding browser. Браузер открывает сокет и ChromeDriver подключается к нему как DevTools client. Например, chrome_DevTools_remote

caps.setCapability("androidDeviceSocket","chrome_DevTools_remote");
avd Задает имя avd [Android virtual device] для запуска.

caps.setCapability("avd","AVD_NEXUS_5");
avdLaunchTimeout В миллисекундах задает время на ожидание запуска указанного avd. По умолчанию 120000.

caps.setCapability("avdLaunchTimeout","230000");
avdReadyTimeout В миллисекундах задает время на ожидание, когда закончатся анимации запуска avd. По умолчанию 120000.

caps.setCapability("avdReadyTimeout","240000");
avdArgs Позволяет передать дополнительные параметры при запуске avd [startup options].

caps.setCapability("avdArgs","netfast");
autoWebviewTimeout Задает время ожидания (в миллисекундах), в течение которого ожидается WebView context, прежде чем, переключиться на него. По умолчанию 2000

caps.setCapability("autoWebviewTimeout","3000");
intentAction Intent action обычно используется, чтобы запустить activity. По дефолту: android.intent.action.MAIN

caps.setCapability("intentAction","android.intent.action.VIEW");
intentCategory Определяет категорию Intent для запуска activity. По дефолту: android.intent.category.LAUNCHER

caps.setCapability("intentCategory","android.intent.category.APP_CONTACTS");
intentFlags Флаги, используемые при запуске Activity. По дефолту: 0x10200000

caps.setCapability("intentFlags","0x10200000");
intentFlags Разрешает ввод юникода. По дефолту: false

caps.setCapability("unicodeKeyboard","true");
resetKeyboard Сбрасывает клавиатуру до ее исходного состояния. По дефолту: false

caps.setCapability("resetKeyboard","true");

iOS capabilities


Возможность Пояснение
calendarFormat Задает формат календаря для симулятора iOS. Пример:

caps.setCapability("calendarFormat"," Gregorian");
bundleId Используется для запуска приложения на реальном девайсе. Пример:

caps.setCapability("bundleId"," io.appium.TestApp");
launchTimeout Задает время ожидания (в миллисекундах) инструментов. По истечению времени, Appium решает, что там все повисло и сессия закрывается.

caps.setCapability("launchTimeout","30000");
locationServicesEnabled включает location Services

caps.setCapability("locationServicesEnabled","false");
locationServicesAuthorized Используется в симуляторе. Если значение true, в приложении не будет всплывать поп-ап с запросом доступа к location services. Для использования требуется явно указывать bundleId. По дефолту: false

caps.setCapability("locationServicesAuthorized","true");

autoAcceptAlerts Автоматически разрешаются доступы приложению к фото, контактам, камере т.д. По дефолту: false

caps.setCapability("autoAcceptAlerts","true");
nativeInstrumentsLib Подключает библиотеку native instruments

caps.setCapability("nativeInstrumentsLib","true");
nativeWebTap При работе с Safari имитирует событие tap. По дефолту: false. Работает не идеально и зависит от viewport's size/ratio

caps.setCapability("nativeWebTap","false");
safariAllowPopups Используется только на симуляторе. Позволяет открывать в Safari новые окна средствами JavaScript

caps.setCapability("safariAllowPopups","false");
safariIgnoreFraudWarning Используется только на симуляторе. Запрещает Safari показывать сообщения, что сайт мошеннический.

caps.setCapability("safariIgnoreFraudWarning","false");
safariOpenLinksInBackground Используется только на симуляторе. Позволяет Safari открывать новые вкладки.

caps.setCapability("safariOpenLinksInBackground","true");
keepKeyChains Используется только на симуляторе. Позволяет хранить связки ключей при запуске/отключении сессии.

caps.setCapability("safariOpenLinksInBackground","true");
processArguments Позволяет передавать аргументы при использовании instruments.

caps.setCapability("processArguments","myflag");
interKeyDelay Задает в миллисекундах длительность нажатия на элемент.

caps.setCapability("interKeyDelay","100");



Сервер 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
Метки:
Поделиться публикацией
Комментарии 0

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.