Тестирование android приложений с использованием selenoid. Поиск location в мобильном приложении с помощью Appium

Предисловие из поста:

Selenoid — это программа, которая позволяет управлять браузерами и Android-эмуляторами с помощью специальных драйверов. Умеет запускать каждый из них изолированно в Docker-контейнере.

Основная идея Selenoid состоит в том, чтобы запускать новый контейнер для каждой сессии (запуска нового браузера или эмулятора) и останавливать его сразу же после закрытия сессии.

Selenoid позволяет поддерживать высокую нагрузку без дополнительных ресурсозатрат.

В этом посте будет запуск простых тестов в Android-эмуляторе.


Подготовка

Предварительно проверьте что ваша система может запускать виртуальные машины.

Аппаратная виртуализация должна поддерживаться вашим процессором. Это означает, что требуют­ся расширения процессора Intel­VT или AMD­V. Чтобы убедиться, поддерживает ли процессор одно из них, выполните команду:

egrep '(vmx|svm)' /proc/cpuinfo


Docker

На вашей операционной системе обязательно должен быть установлен и запущен Docker.


Установка Selenoid

Если у вас Redhat-based операционная система, вы можете использовать мой репозиторий для установки Configuration manager.

yum -y install yum-plugin-copr
yum copr enable antonpatsev/aerokube-cm-rpm
yum -y install aerokube-cm

Если у вас не Redhat-based операционная система, то вы можете скачать и использовать бинарник Configuration manager.


Запуск Selenoid используя Configuration manager и формирование browsers.json

Если у вас нет прямого доступа в инет и docker образы вы скачиваете через registry:

aerokube-cm selenoid start --force --browsers "android:6.0;chrome:78" --args "-session-attempt-timeout 2m -service-startup-timeout 2m" --registry ваш-docker-registry

Если у вас есть прямой доступ в инет.

aerokube-cm selenoid start --force --browsers "android:6.0;chrome:78" --args "-session-attempt-timeout 2m -service-startup-timeout 2m"

Ключ --args "-session-attempt-timeout 2m -service-startup-timeout 2m" нужен если у вас apk большого размера долго устанавливается.

Ключ --force перезаписывает файл browsers.json

Так как Selenoid Configuration manager пока что не умеет формировать browsers.json для мобильного Chrome, то его нужно поправить самостоятельно.

По умолчанию browsers.json формируется в директории ~/.aerokube/selenoid.

Итоговый файл browsers.json для тестирования Android приложений и Chrome внутри Android эмулятора.

{
    "android": {
        "default": "6.0",
        "versions": {
            "6.0": {
                "image": "docker-registry:443/selenoid/android:6.0",
                "port": "4444",
                "path": "/wd/hub"
            }
        }
    },
    "chrome": {
        "default": "mobile-75.0",
        "versions": {
            "mobile-75.0": {
                "image": "docker-registry:443/selenoid/chrome-mobile:75.0",
                "port": "4444",
                "path": "/wd/hub"
            }
        }
    }
}

Пока что версия мобильного хрома отстает от версии обычного хрома.
Скачиваем образ мобильного хрома

docker pull selenoid/chrome-mobile:75.0


Изменение browsers.json

При изменении файла browsers.json нужно перезагрузить selenoid

aerokube-cm selenoid stop
aerokube-cm selenoid start

Reloading configuration
Можно сделать Reloading configuration. Подробности по ссылке:
https://aerokube.com/selenoid/latest/#_reloading_configuration

Проверяем что docker контейнер запустился и образы скачались.

docker ps
docker images

6uxe4sj8mr1whgda1ayt6pceoos.png


Запуск Selenoid UI используя Configuration manager

aerokube-cm selenoid-ui start --registry https://docker-registry

Или

aerokube-cm selenoid-ui start

Проверяем что docker контейнер запустился и образы скачались.

docker ps
docker images

-xpdcwppkyiael9ly2agw0opgv4.png

Заходим в selenoid-ui по адресу ip-где-вы-запускали-selenoid-и-selenoid-ui:8080

У вас должно быть гореть зеленым 2 слова CONNECTED и написано android и chrome.

noicl8rlt7_9tjmaihi2w3l1wia.png


DEMO TEST

Скачиваем https://github.com/aerokube/demo-tests

Во всех трех java файлах меняем путь в RemoteWebDriver на localhost

i-6v3_qo-z7gaxzdx5t_nsdxyrm.png

или на другой адрес, там где вы запустили selenoid.

В файле AndroidRemoteApkTest.java меняем путь где можно скачать вашу APK.

device.setCapability("app", "http://ci.example.com/game2048.apk");

на

device.setCapability («app», «http://ссылка-до-вашей-apk»);

или 

device.setCapability("app", "http://hostname-или-FQDN-сервера-где-лежит-apk:8000/game2048.apk");

Если вы будете ссылаться на localhost из docker, то у вас будет вот такая ошибка, так как вы из сети docker пытаетесь обраться к localhost основного сервера:

Tests in error: 
  browserTest(com.aerokube.selenoid.AndroidRemoteApkTest): An unknown server-side error occurred while processing the command. Original error: Problem downloading app from url http://localhost:8000/apk/game2048.apk: connect ECONNREFUSED 127.0.0.1:8000

Как сделать доступной для скачивания ваши локальные файлы будет ниже.

В файле DemoTest.java добавляем setCapability для запуска chrome на Android чтобы получилось примерно так.

nbat4dgrfnrsjz-u-inkwdo_r8q.png

В каждом файле java вы можете включить или выключить запись видео, удаленный просмотр или управление через VNC и запись логов в файл. Чтобы выключить опцию нужно добавить 2 слеша в начало строки.

bldyjdaxstceqigh7szqsb5qvlo.png

Чтобы сделать доступной для скачивания файлы из текущей директории, нужно запустить в отдельной консоле в этой директории команду:

ruby -rwebrick -e'WEBrick::HTTPServer.new(:Port => 8000, :DocumentRoot => Dir.pwd).start'


Запуск тестов

В директории demo-tests запускаем тесты:

Если вам нужно указать настройки и у вас используется maven-прокси (Nexus, Artifactory)

mvn -s settings.xml clean test

Если запускаем с прямым доступом в инет и без каких-либо настроек

mvn clean test


Скорость

Общее время разворачивания android эмулятора и запуск 1 теста занимает меньше 1 минуты.


Известные баги

https://github.com/aerokube/demo-tests/issues/5


Видеозапись тестов

AndroidDemoTest.java:


AndroidRemoteApkTest.java:


DemoTest.java:



Поиск нужных location в мобильном приложении с помощью Appium

Appium — кроссплатформенный инструмент, т.е. позволяет писать тесты для мобильных платформ (iOS, Android, Windows), используя API. Это один из самых широко используемых инструментов для регрессионного тестирования приложений на смартфонах и планшетах.

Скачиваем и запускаем Appium

Идем в File --> New Session Window

5qriv83ldaz31rwvhtrk2_bm_se.png

В поле Remote host указываем адрес сервера, где запущен Selenoid.

В поле Remote Port указываем port, на котором запущен Selenoid — обычно это 4444.

В поле Remote Path указывем /wd/hub

В Desired Capabiliting указывем нужные вам Capabilities.

Минимальный JSON получается такой:

{
  "browserName": "chrome",
  "browserVersion": "mobile-75.0",
  "enableVNC": true
}

После старта сессии у вас появится вот такая картина:

leyuklvbvy3ivmpqfnnmehxutyu.png

Теперь можно исследовать/искать нужные вам location.

_71q67msm7lgv54-txgslr5cfqm.png

Телеграм чаты:

https://t.me/aerokube — chat Aerokube

https://t.me/atinfo_chat — chat for test automation engineers

© Habrahabr.ru