Что это
Selenoid — проект с открытым кодом на языке Golang. Часть команды — разработчики из России. Это один из вариантов контейнеризации параллельного запуска Selenium-тестов, дающий некоторые преимущества перед стандартным Docker/Selenium.
Как гласит официальное описание проекта,
«Selenoid — это мощная реализация Selenium hub, использующая контейнеры Docker для запуска браузеров».
Особенностью Selenoid является предоставление отдельного окружения-контейнера для каждого теста:

При запуске теста создается контейнер, тест выполняется в нем, и контейнер удаляется.
Если же вместо этого использовать docker-selenium, то для всего тестового набора используются одни и те же контейнеры, что может привести к нестабильным или противоречивым результатам, что является распространенной проблемой автоматизации.
Конфигурация
Прежде всего, необходимо установить docker на свою машину. Для установки можно воспользоваться официальной документацией [там на Ubuntu]. В основном применяются три конфигурации.

* https://github.com/aerokube/cm/releases
** https://github.com/aerokube/selenoid/releases
Загрузить cm в среде Linux, не поддерживающей GUI, можно с помощью приведенного ниже кода:
LATEST_BINARY_URL=`curl -s \ https://api.github.com/repos/aerokube/cm/releases/latest | \ grep "browser_download_url" | grep linux | cut -d : -f 2,3 | tr -d \"` curl -L -o cm $LATEST_BINARY_URL chmod +x ./cm
Примечание: для Chrome-образов в файле browser.json
используется "/"
вместо "/wd/hub"
Можно или запустить selenoid в docker-контейнере, или как отдельный бинари-файл.

При запуске cm сначала проверяет, есть ли docker. Если находит docker, загружает нужные docker-образы. Если docker не установлен, то загружаются standalone-бинарники.
Все, установка готова, но у нас нет UI-интерфейса.
У Aerokube [компании, разработавшей Selenoid] есть еще один проект с открытым кодом под названием selenoid-ui. Это пользовательский интерфейс, позволяющий отслеживать происходящее во время выполнения теста. Для запуска selenoid-ui можно воспользоваться командой cm
:

В качестве альтернативы можно загрузить бинарник selenoid-ui, дать разрешение на выполнение и запустить его.
Проверяем http://localhost:8080
Если все нормально, увидим следующее:

В этой панели выводятся активные сессии, очереди выполняемых тестов. При успешном выполнении тестов на UI-панель должна выглядеть следующим образом:

Теперь можно остановить его командой: ./cm selenoid stop
Другие команды cm:

Дополнительная конфигурация
Выше показаны основные возможности. Теперь посмотрим, что еще доступно в cm. Например список доступных флагов можно получить с помощью команды ./cm selenoid args

Как видим выше, много вариантов действий. Но большинство из них недоступны из cm, поскольку они hardcoded в менеджере конфигураций. Поэтому будем вручную настраивать эти конфигурации.
Допустим, нам нужно запустить тесты, но:
- С конфиг-файлом браузера в другой папке,
- Ограничим максимальное количество параллельных сессий,
- Изменим папку вывода видео,
- Ограничим использование памяти и процессора.
Для этого запускаем следующей командой:
docker run -d --name selenoid \ -p 4444:4444 \ -v ~/.aerokube/selenoid/:/etc/selenoid/:ro \ -v /var/run/docker.sock:/var/run/docker.sock \ aerokube/selenoid:latest-release \ -conf /etc/selenoid/browsers.json -limit 10 \ -video-output-dir /opt/selenoid/video/ -mem 1g -cpu 1.0
То есть просто добавляем это в конец команды docker.
Примечание: Если используете бинарник selenoid вместо образа docker, то аргументы передаем так:
./selenoid -conf /etc/selenoid/browsers.json \ -limit 10 -video-output-dir /opt/selenoid/video/ \ -mem 1g -cpu 1.0
Параллельные сессии
По умолчанию лимит параллельных сессий равен 5, но можно переопределить больше. Сколько тестов можно запускать параллельно?
Aerokube рекомендует максимальное количество параллельных сессий по формуле:
Количество ядер * 1,5 — 2
Если сильно превысить это значение, может случиться следующее:

Примечание: это касается не только Selenoid, все остальные решения тоже не очень. Если возникла реальная необходимость параллельного запуска большого количества тестов:
- Апгрейдить оборудование
- Кластерное решение типа Ggr [это тоже проект Aerokube]
- Облачное решение типа Sauce Labs или Testinium
В любом случае варианты есть.
Другие функции
В Selenoid предусмотрены специальные возможности, которые можно активировать в своих тестах.
Live Browser Screen
Возможность визуальной отладки параметром -vnc
./cm selenoid start -vnc
Он загружает образы, включенные в VNC, и запускает Selenoid. Не забудьте включить enableVNC, в данном случае:
ChromeOptions options = new ChromeOptions();
options.setCapability("enableVNC", true);
Теперь сессии Chrome могут работать с VNC.

Примечание: Если используется последняя версия, можно использовать VNC, даже если у вас нет VNC-образов. Команда Aerokube решила, что два образа занимают всего 10 Мб и нет смысла поддерживать два типа образов. Я пробовал использовать selenoid/chrome (tag: 67), и это работало.
Кастомные имена тестов
Можно задать имя сессии, установив «name«, в моем случае:
ChromeOptions options = new ChromeOptions();
options.setCapability("name", testName);
Запись видео
Примечание: Для этого нужно иметь video-recorder image. Если его нет, воспользуйтесь приведенной ниже командой для извлечения изображения:
$ docker pull selenoid/video-recorder
В Selenoid есть видеозапись, ее можно активировать, передав характеристике enableVideo значение true:
ChromeOptions options = new ChromeOptions();
options.setCapability("enableVideo",true);
Видео хранится в папке ~/.aerokube/selenoid/video
Имя видео, частота кадров, разрешение экрана и частота кадров — настраиваются.
videoName : string
videoScreenSize : string
videoFrameRate : int
Разрешение экрана
Разрешение экрана задается так:
screenResolution: <width>x<height>x<colors-depth>
Кроме перечисленных, есть и другие тонкие настройки, такие как PerSession Timezone
, PerSession Environment variables
, Custom DNS Server
и пр.
Итак
Selenoid является альтернативой Selenium Grid и docker-selenium. Он обеспечивает гибко настраиваемую среду выполнения. Основная фича: создает отдельную сессию браузера для каждого теста. Также существует активное комьюнити.