Я из компании Luxoft.
Предисловие из поста:
Selenoid — это программа, которая позволяет управлять браузерами и Android-эмуляторами с помощью специальных драйверов. Умеет запускать каждый из них изолированно в Docker-контейнере.
Основная идея Selenoid состоит в том, чтобы запускать новый контейнер для каждой сессии (запуска нового браузера или эмулятора) и останавливать его сразу же после закрытия сессии.
Selenoid позволяет поддерживать высокую нагрузку без дополнительных ресурсозатрат.
В этом посте будет запуск простых тестов в Android-эмуляторе.
Подготовка
Предварительно проверьте что ваша система может запускать виртуальные машины.
Аппаратная виртуализация должна поддерживаться вашим процессором. Это означает, что требуются расширения процессора IntelVT или AMDV. Чтобы убедиться, поддерживает ли процессор одно из них, выполните команду:
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
Запуск 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