- Что это
- Как это работает
- Appium Server
- Драйверы
- Клиентские библиотеки
- Плагины
- Inspector
- Doctor
- В чем разница между архитектурой Selenium и Appium
Хорошее понимание архитектуры Appium важно для использования его потенциала для автоматизации мобильного тестирования.
В этом блоге мы рассмотрим архитектуру Appium, а также примеры сочетания различных компонентов Appium для эффективной автоматизации мобильных приложений.
Описание Appium
Appium — инструмент автоматизации мобильных приложений с открытым исходным кодом, который поддерживает автоматизацию пользовательского интерфейса для различных платформ, таких как мобильные, веб-приложения, десктопные приложения и приложения смарт-ТВ.
Он позволяет писать тесты для нативных, гибридных и мобильных веб-приложений, используя единый API, независимый от платформы. Appium поддерживает множество языков программирования, таких как Java, Python, JavaScript и другие, что делает его удобным для абсолютного большинства разработчиков и тестировщиков.
Он не требует модификации тестируемого мобильного приложения или добавления чего-либо дополнительного, что означает, что вы можете автоматизировать тесты без изменения кода вашего мобильного приложения.
Как работает Appium
Appium — это расширение Selenium WebDriver, поэтому он следует стандартам W3C, которые также известны как спецификации WebDriver. Для веб-приложений почти все браузеры реализуют автоматизацию, следуя спецификациям WebDriver.
Поскольку проект Appium был изначально нацелен на автоматизацию мобильных интерфейсов, создатели решили принять за основу спецификации W3C WebDriver. Поскольку пользовательский интерфейс веб-приложений и мобильных приложений всегда в некоторой степени схож, пользователю сначала нужно определить и найти элементы на пользовательском интерфейсе, чтобы выполнить над ними действия.
API-спецификации W3C WebDriver предоставляют согласованный набор методов для поиска элементов и взаимодействия с ними. Это сокращает время, необходимое тестировщикам для изучения Appium, поскольку они как правило уже хорошо знакомы с Selenium WebDriver.
Погружение в архитектуру
Appium состоит из многих компонентов.
На рисунке ниже показана архитектура Appium v2.x.
Для написания тестового сценария вы можете использовать привязку-байндинг к языку в зависимости от того, какой язык предпочитаете. Этот клиент Appium будет взаимодействовать с сервером Appium, запущенным на вашей или удаленной машине, передавая параметры возможностей (capability options) целевой платформы.
Сервер Appium, который представляет собой API-сервер Node.js, будет принимать эти параметры возможностей и перенаправлять команды пользователя экземпляру драйвера, подключенному к экземпляру сервера Appium, в зависимости от параметров возможностей.
Драйвер Appium будет использовать фреймворк, специфичный для нативной платформы, перенаправляя эти пользовательские команды на те фреймворки, которые фактически выполняют эти пользовательские команды на целевых устройствах. На приведенной выше диаграмме архитектуры Appium также видно, что если вы настроите какие-либо плагины Appium на сервере Appium, он также будет выполнять команды плагинов Appium во время выполнения команд, связанных с тестовыми сценариями.
Appium не построен на одном компоненте, как это было в версии 1.x. С выходом версии 2.x Appium был разделен на независимые компоненты, что помогает писать более надежные тестовые сценарии. Appium использует драйверы для конкретной платформы, которые используют нативные фреймворки, такие как XCUITest для платформы iOS и UiAutomator2 для платформы Android, поскольку эти фреймворки обеспечивают поддержку для более эффективного взаимодействия с девайсом.
Далее подробно разберем каждый из компонентов Appium с примерами того, как использовать каждый из этих компонентов.
Appium Server
Appium server — это сервер API на Node.js. Сервер должен быть запущен на целевой машине, к которой подключены мобильные устройства. Он выступает в качестве точки контакта для сценария автоматизации, где привязка клиента Appium будет передавать данные о целевом устройстве и приложении через параметры возможностей.
Сервер Appium затем будет анализировать опции, предоставленные клиентом Appium, определяя, на каком из доступных мобильных устройств следует запустить сессию Appium. Чтобы установить сервер Appium, необходимо убедиться, что на вашей машине установлен Node.js версии 18.x или выше. Рекомендуемый способ установки Node.js — использование Node Version Manager (NVM).
Чтобы установить NVM, выполните следующую команду в терминале:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
Это приведет к установке NVM. Теперь вы можете выполнить команду nvm list, чтобы проверить все поддерживаемые версии Node.js. Рекомендуется установить v18.x LTS, которая в списке NVM значится как lts/hydrogen. Итак, чтобы установить Node.js версии 18.x, выполните следующую команду:
nvm install lts/hydrogen
Эта команда установит последнюю версию v18.x LTS. После установки Node.js вы можете установить сервер Appium, выполнив следующую команду в терминале:
npm i -g appium
Чтобы убедиться в успешной установке Appium, можно выполнить команду appium -v и проверить последнюю установленную версию сервера Appium. В этом блоге, посвященном архитектуре Appium, мы используем сервер Appium версии v2.11.1.
Чтобы запустить сессию сервера Appium, выполните следующую команду в терминале:
appium server --address 127.0.0.1 --port 4723
Эта команда запустит сессию сервера Appium, где вы сможете настроить свой сценарий автоматизации для подключения и автоматизации мобильного приложения. По умолчанию эта команда будет использовать все установленные драйверы Appium.
Драйверы Appium
Драйверы Appium — это мост между клиентом Appium и целевым устройством. Сервер Appium в основном управляет взаимодействием между клиентом Appium и драйвером Appium. Команды Appium, которые выполняет клиент Appium, перенаправляются на соответствующий драйвер Appium, который запускает сессию с сервером Appium.
Драйверы Appium реализуют методы API спецификации WebDriver. Каждый драйвер при реализации использует нативные технологии своей платформы. Например, драйвер XCUITest будет использовать WebDriverAgent, разработанный с использованием языка программирования Swift и нативных команд Xcode, а UiAutomator2 будет использовать нативные методы Android в своих драйверах.
В Appiums v2.x драйверы полностью отделены от собственно серверного пакета Appium, который мы установили ранее. Теперь вы можете установить только те драйверы, которые вам действительно необходимы.
Давайте проверим список драйверов Appium с помощью следующей команды в терминале:
appium driver list
Эта команда отобразит все поддерживаемые драйверы, как показано на скриншоте:
Теперь, чтобы установить конкретный драйвер, вы можете выполнить следующую команду:
appium driver install <driver-name>
В этой команде вы можете указать имя драйвера, отображаемое в команде list, выполненной ранее, заменив <driver-name> в приведенной выше команде.
Чтобы проверить, есть ли обновления для любого из установленных драйверов, вы можете выполнить следующую команду, и она выведет список всех драйверов с указанием текущей установленной версии и новой версии, которая доступна для обновления:
appium driver list --updates
Чтобы обновить конкретный драйвер, необходимо выполнить следующую команду в терминале:
appium driver update <driver-name>
В этой команде просто замените <driver-name> на фактическое имя драйвера, который вы хотите обновить.
Чтобы использовать определенный драйвер Appium в сессии сервера Appium, вам нужно указать дополнительный аргумент -use-drivers в команде сервера Appium, который вы видели в предыдущем разделе, и указать все необходимые имена драйверов, разделяя каждое имя через запятую.
Например, ниже приведена команда для запуска сессии сервера Appium только для Android:
appium server --address 127.0.0.1 --port 4723 --use-drivers uiautomator2
Выполнив вышеуказанную команду, вы увидите в терминале следующий результат:
Теперь вы готовы подключиться к этой сессии сервера Appium с помощью выбранного вами клиента Appium.
Клиентские библиотеки
Поскольку Appium основан на спецификации W3C WebDriver, в нем реализована клиент-серверная архитектура. Сервер включает в себя Appium-сервер, который использует установленные драйверы вместе с любыми плагинами Appium и отвечает за управление тестируемым устройством.
Клиент, который вы используете для написания тестов в Appium, будет отправлять команды серверу по HTTP. Сервер выполнит команду и вернет клиенту в ответе код состояния, по которому клиент определит, была ли команда выполнена сервером успешно или произошла ошибка.
Команды, которые клиент Appium отправляет на сервер Appium, на самом деле являются конечными точками API для каждой отдельной команды. Поскольку API не зависит от языка, совершенно неважно, какой язык программирования вы используете. Поэтому Appium поддерживает несколько клиентских привязок.
Чтобы подключиться к уже запущенной сессии сервера Appium с помощью клиента Appium, мы будем использовать в качестве примера клиент Appium Java. Давайте посмотрим, как подключить наш тестовый скрипт Appium к серверу Appium. Во-первых, необходимо добавить зависимость Appium Java client в файл pom.xml, как показано ниже:
<dependencies> <dependency> <groupId>io.appium</groupId> <artifactId>java-client</artifactId> <version>9.2.3</version> </dependency> </dependencies>
После этого вы можете создать UiAutomator2Options, который описывает целевое устройство вместе с тестируемым приложением. Затем с помощью этой опции можно создать сессию Appium для уже запущенного сервера Appium.
var options = new UiAutomator2Options () .setDeviceName ("Pixel 8 Pro") .setPlatformVersion ("13") .setAvd ("Pixel_8_Pro") .setApp (Path.of (System.getProperty ("user.dir"), "src/test/resources", "wdio-demo.apk").toString ()); var driver = new AndroidDriver (“http://127.0.0.1:4723”, options);
Подключение к серверу Appium с помощью других языков привязки клиента может быть выполнено аналогичным образом.
Вам не обязательно запускать сервер Appium через терминал; вы также можете запустить сервер Appium программно, используя привязку Appium.
Давайте посмотрим на примере Java-клиента Appium, как запустить сервер и подключиться к нему:
var builder = new AppiumServiceBuilder (); var service = builder.withIPAddress ("127.0.0.1") .usingPort (4723) .withArgument (GeneralServerFlag.LOG_LEVEL, "info") .withArgument (GeneralServerFlag.USE_DRIVERS, "uiautomator2") .withArgument (GeneralServerFlag.SESSION_OVERRIDE) .build (); service.start(); . . . var driver = new AndroidDriver (service.getUrl (), options); . . . service.stop(); driver.quit();
Вам нужно убедиться, что вы запустили сервер, вызвав метод service.start(), до инициализации экземпляра драйвера, потому что мы используем метод service.getUrl() при инициализации драйвера, который вернет фактический URL, по которому сервер Appium был запущен нашим тестовым скриптом.
Плагины
Appium предоставляет новый расширяемый и опциональный подход для расширения и модификации поведения Appium во время live-сессии, добавляя новые и кастомные функции для тестировщиков без необходимости модифицировать основной сервер Appium. Эта возможность Appium известна как плагины Appium. Эта возможность появилась с выходом версии 2.x Appium.
С появлением плагинов Appium вы можете создать собственную реализацию плагина, которая поможет вам решить определенную проблему или внедрить новую функцию в Appium. Если вы не хотите создавать свой собственный плагин Appium, вы можете воспользоваться уже созданными плагинами других авторов или разработчиков ядра Appium.
Некоторые из полезных плагинов Appium, которые вы можете использовать, — appium-device-farm и appium-dashboard-plugin.
Есть несколько официально поддерживаемых плагинов, которые поддерживает команда разработчиков Appium, и которые вы можете проверить, выполнив следующую команду в терминале:
appium plugin list
На экране появится результат, как показано ниже:
Чтобы установить любой плагин, даже те, которые не отображаются в выводе вышеприведенной команды, необходимо выполнить следующую команду:
appium plugin install --source=npm <plugin-name>
Вам просто нужно заменить <plugin-name> на фактическое имя плагина. Для каждого плагина обновляется документация, в которой указывается название плагина.
Аналогично драйверу Appium, вы можете проверить наличие обновлений для всех установленных плагинов Appium, выполнив следующую команду:
appium plugin list --updates
Если вы хотите обновить какой-либо плагин, просто выполните следующую команду в терминале:
appium plugin update <plugin-name>
Эта команда установит последнюю доступную версию плагина.
Чтобы использовать любые плагины, необходимо передать дополнительный аргумент -use-plugins команде Appium server при запуске сессии Appium server.
Например, посмотрите на следующую команду, которая запустит сессию Appium server для устройств Android вместе с плагином appium-device-farm:
appium server --address 127.0.0.1 --port 4723 --use-drivers uiautomator2 --use-plugins=device-farm --plugin-device-farm-platform=android
Вы заметили дополнительный аргумент -plugin-device-farm-platform? Этот аргумент зависит от конкретного плагина.
Inspector
Appium Inspector (здесь подробный обзор) — это одна из полезных функций мобильной автоматизации, которая позволяет найти элемент, с которым вы хотите взаимодействовать. Appium предоставляет приложение-инспектор с пользовательским интерфейсом, с помощью которого вы можете подключиться к целевому устройству, установить тестируемое приложение и найти локатор элемента, с которым впоследствии можно взаимодействовать при автоматизации с помощью клиента Appium.
Вы можете загрузить последнюю версию Appium Inspector, перейдя на страницу релиза репозитория GitHub. Выберите установщик в зависимости от вашей операционной системы. После загрузки файла откройте его и запустите программу установки, чтобы установить Appium Inspector на ваш компьютер.
После установки Appium Inspector при первом запуске появится следующий экран:
На этом экране вы можете настроить возможности (capabilities) Appium для целевого устройства и тестируемого приложения. После настройки возможностей вы можете сохранить их в качестве предустановки, которую можно будет использовать позже. Следует помнить, что перед нажатием на кнопку Start Session необходимо запустить сервер Appium на вашей машине.
После запуска сессии Appium Inspector на целевом устройстве с тестируемым приложением вы должны увидеть следующий экран, на котором вы можете осмотреть элементы и найти локаторы:
С помощью Appium Inspector можно не только найти целевой элемент, над которым нужно выполнить различные типы действий, но и выполнить различные типы команд действий на устройстве и эмулировать различные жесты пальцами на экране устройства или элементе.
Подробно об эмуляции жестов в Appium
Doctor
Настройка машины для Appium — сложный процесс, и если вы упустите какую-либо настройку, вы не сможете автоматизировать платформу. Чтобы помочь пользователям правильно настроить машину, экосистема Appium предоставляет утилиту командной строки Appium Doctor, которая проверяет настройку для отдельных платформ.
Например, если вы хотите проверить настройку для конкретной платформы, вы можете выполнить следующую команду в терминале:
appium driver doctor <driver-name>
Если вы хотите проверить установку Android, замените <driver-name> на драйвер Android, например uiautomator2, а для iOS можно использовать xcuitest.
После завершения выполнения этой команды вы увидите следующий результат:
Как видите, он проверяет, все ли обязательные и дополнительные пакеты установлены на вашей машине; если нет, то он укажет, как установить необходимые или дополнительные пакеты.
В чем разница между архитектурой Selenium и Appium
Selenium предназначен в первую очередь для веб-сайтов и веб-приложений, которые используют WebDriver для взаимодействия с браузерами, в то время как Appium использует клиент-серверную модель для автоматизации мобильных приложений с помощью драйверов для конкретных платформ, таких как UIAutomator для Android и XCUITest для iOS.
Резюме
Удивительно видеть, как развивался Appium за последние 12 лет. С постоянно растущим сообществом Appium и контрибьюторами эти особенности архитектуры Appium также будут расширяться.