Я из компании Luxoft.
Предисловие из поста:
Selenoid — это программа, которая позволяет управлять браузерами и Android-эмуляторами с помощью специальных драйверов. Умеет запускать каждый из них изолированно в Docker-контейнере.
Основная идея Selenoid состоит в том, чтобы запускать новый контейнер для каждой сессии (запуска нового браузера или эмулятора) и останавливать его сразу же после закрытия сессии.
Selenoid позволяет поддерживать высокую нагрузку без дополнительных ресурсозатрат.
В этом посте будет запуск простых тестов в Android-эмуляторе.
Подготовка
Предварительно проверьте что ваша система может запускать виртуальные машины.
Аппаратная виртуализация должна поддерживаться вашим процессором. Это означает, что требуются расширения процессора IntelVT или AMDV. Чтобы убедиться, поддерживает ли про��ессор одно из них, выполните команду:
egrep '(vmx|svm)' /proc/cpuinfoDocker
На вашей операционной системе обязательно должен быть установлен и запущен 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 stopaerokube-cm selenoid startReloading configuration
Можно сделать Reloading configuration. Подробности по ссылке:
https://aerokube.com/selenoid/latest/#_reloading_configuration
Проверяем что docker контейнер запустился и образы скачались.
docker ps
docker images
Запуск Selenoid UI используя Configuration manager
aerokube-cm selenoid-ui start --registry https://docker-registryИли
aerokube-cm selenoid-ui startПроверяем что docker контейнер запустился и образы скачались.
docker ps
docker images
Заходим в selenoid-ui по адресу ip-где-вы-запускали-selenoid-и-selenoid-ui:8080
У вас должно быть гореть зеленым 2 слова CONNECTED и написано android и chrome.

Чтобы получить доступ из Android на хостовую нужно в тестах использовать полное или короткое имя виртуальной машины, где запускается selenoid.
Чтобы узнать имя виртуальной машины просто используйте команду hostname.
DEMO TEST
Скачиваем https://github.com/aerokube/demo-tests
Во всех трех java файлах меняем путь в RemoteWebDriver на полное или короткое имя виртуальной машины, где запускается selenoid (надо поменять скриншот).

или на другой адрес, там где вы запустили selenoid.
В файле AndroidRemoteApkTest.java меняем путь где можно скачать вашу APK.
device.setCapability("app", "http://ci.example.com/game2048.apk");на
device.setCapability("app", "http:/полное-или-короткое-имя-виртуальной-машины-где-запускается-selenoid/ваша-apk");
По этой ссылке http:/полное-или-короткое-имя-виртуальной-машины-где-запускается-selenoid/ваша-apk вы должны скачивать APK как с виртуальной машины так внутри docker образов (в том числе и android).
Можно протестировать так:
curl http:/полное-или-короткое-имя-виртуальной-машины-где-запускается-selenoid/ваша-apk --output ваша-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 чтобы получилось примерно так.

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

Чтобы сделать доступной для скачивания файлы из текущей директории, можно запустить в текущей консоли сервис static-server-in-dir:
yum -y install yum-plugin-copr
yum copr enable antonpatsev/static-server-in-dir
yum -y install static-server-in-dir
cd to directory
static-server-in-dir start
файлы в текущей директории будут доступны по порту 8000
выполнить тест
static-server-in-dir stopЗапуск тестов
В директории 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

В поле Remote host указываем адрес сервера, где запущен Selenoid.
В поле Remote Port указываем port, на котором запущен Selenoid — обычно это 4444.
В поле Remote Path указываем /wd/hub
В Desired Capabiliting указываем нужные вам Capabilities.
Минимальный JSON получается такой:
{
"browserName": "chrome",
"browserVersion": "mobile-75.0",
"enableVNC": true
}После старта сессии у вас появится вот такая картина:

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

Телеграм чаты:
https://t.me/aerokube — chat Aerokube
https://t.me/atinfo_chat — chat for test automation engineers
