Проект стал возможным благодаря добровольным участникам, которые потратили тысячи часов своего времени и предоставили исходный код в свободный доступ по лицензии Apache License 2.0.
Эти образы Docker содержат несколько тегов, упрощающих их использование. Ознакомьтесь с ними в одном из наших выпусков.
Чтобы получать уведомления о новых выпусках, добавьте себя в список наблюдателей «Только выпуски».
Эти изображения публикуются в реестре Docker Hub в Selenium Docker Hub.
Вам нужна помощь в использовании этих образов Docker? Свяжитесь с нами по адресу https://www.selenium.dev/support/.
--shm-size="2g"
docker run -d -p 4444:4444 -p 7900:7900 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
Направьте свои тесты WebDriver на http://localhost:4444.
Вот и все!
(Необязательно) Чтобы увидеть, что происходит внутри контейнера, перейдите по адресу http://localhost:7900/?autoconnect=1&resize=scale&password=secret.
Дополнительные сведения о визуализации активности контейнера см. в разделе «Отладка».
☝️ При запуске docker run
для образа, содержащего браузер, используйте флаг --shm-size=2g
чтобы использовать общую память хоста.
☝️ Всегда используйте изображение Docker с полным тегом, чтобы закрепить определенный браузер и версию Grid. Подробности см. в разделе Соглашения о тегах.
Начиная с тега изображения, основанного на 4.21.0
, архитектуры, поддерживаемые этим проектом, следующие:
Архитектура | Доступный |
---|---|
x86_64 (он же amd64) | ✅ |
aarch64 (он же Arm64/armv8) | ✅ |
ArmHF (он же Arm32/armv7l) | ❌ |
Следующие браузеры доступны в многоархивных образах:
Архитектура | Хром | Хром | Firefox | Край |
---|---|---|---|---|
x86_64 (он же amd64) | ✅ | ✅ | ✅ | ✅ |
aarch64 (он же Arm64/armv8) | ❌ | ✅ | ✅ | ❌ |
ArmHF (он же Arm32/armv7l) | ❌ | ❌ | ❌ | ❌ |
Примечание:
Google не создает Chrome ( google-chrome
) для платформ Linux/ARM. Следовательно, образы Chrome (узловые и автономные) доступны только для AMD64. Аналогично, Microsoft не создает Edge ( microsoft-edge
) для платформ Linux/ARM.
Запуск образа AMD64 в режиме эмуляции на платформе ARM64 не рекомендуется из-за проблем с производительностью и стабильностью.
Для Linux/ARM используйте браузер Chromium с открытым исходным кодом. Образы Chromium (узловые и автономные) доступны в мультиархивной версии.
$ docker run --rm -it -p 4444:4444 -p 5900:5900 -p 7900:7900 --shm-size 2g selenium/standalone-chromium:latest
Многоархивные образы тестируются на CircleCI с классом ресурсов Linux/ARM64. Смотрите статус ниже.
Для экспериментальных образов контейнеров Docker, которые работают на таких платформах, как Apple M-серии или Raspberry Pi, репозиторий seleniumhq-community/docker-seleniarm предоставил образы, которые публикуются в реестре Seleniarm Docker Hub.
Дополнительную информацию об этих изображениях см. в выпуске № 1076.
Теперь форк seleniumhq-community/docker-seleniarm был объединен.
Мы рекомендуем включить экспериментальную функцию хранилища образов контейнеров в Docker Engine. containerd
понимает мультиплатформенные образы, где один тег изображения может относиться к различным вариантам, охватывающим ряд ОС и аппаратных архитектур. Это упрощает процесс создания, хранения и распространения изображений на разных платформах.
Одна команда для включения этой функции в Docker Engine:
make set_containerd_image_store
Чтобы собрать все образы для мультиплатформенности, выполните следующую команду:
PLATFORMS=linux/amd64,linux/arm64 make build
Чтобы создать образы для конкретной платформы, выполните следующую команду:
PLATFORMS=linux/arm64 make build
По умолчанию, без указания переменной PLATFORMS
, образы создаются для платформы linux/amd64
.
Образы Nightly созданы на основе сборки Nightly на основе вышестоящего проекта Selenium с последними изменениями в основной ветке этого репозитория. Тег изображения — nightly
. Не рекомендуется использовать изображения в производстве. Это только для целей тестирования.
$ docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:nightly
Ознакомьтесь с Docker Compose, чтобы начать работу с Nightly images docker-compose-v3-full-grid-nightly.yml
Чтобы запускать тесты или иным образом работать с предварительными версиями браузеров, Google, Mozilla и Microsoft поддерживают канал выпуска Dev и Beta для тех, кому нужно увидеть, что скоро будет выпущено для широких слоев населения.
Вот инструкции по их запуску в автономном режиме:
Хром Бета:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-chrome:beta
Разработчик Chrome:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-chrome:dev
Бета-версия Firefox:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-firefox:beta
Разработчик Firefox:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-firefox:dev
Крайняя бета-версия:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-edge:beta
Крайний разработчик:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-edge:dev
docker-compose-v3-beta-channel.yml:
# To execute this docker compose yml file use `docker compose -f docker-compose-v3-beta-channel.yml up`
# Add the `-d` flag at the end for detached execution
# To stop the execution, hit Ctrl+C, and then `docker compose -f docker-compose-v3-beta-channel.yml down`
version: " 3 "
services:
chrome:
image: selenium/node-chrome:beta
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
edge:
image: selenium/node-edge:beta
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
firefox:
image: selenium/node-firefox:beta
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium-hub:
image: selenium/hub:latest
container_name: selenium-hub
ports:
- " 4442:4442 "
- " 4443:4443 "
- " 4444:4444 "
docker-compose-v3-dev-channel.yml:
# To execute this docker compose yml file use `docker compose -f docker-compose-v3-dev-channel.yml up`
# Add the `-d` flag at the end for detached execution
# To stop the execution, hit Ctrl+C, and then `docker compose -f docker-compose-v3-dev-channel.yml down`
version: " 3 "
services:
chrome:
image: selenium/node-chrome:dev
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
edge:
image: selenium/node-edge:dev
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
firefox:
image: selenium/node-firefox:dev
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium-hub:
image: selenium/hub:latest
container_name: selenium-hub
ports:
- " 4442:4442 "
- " 4443:4443 "
- " 4444:4444 "
Дополнительные сведения об образах контейнеров каналов разработки и бета-версии см. в записи блога о браузерах каналов разработки и бета-версии через Docker Selenium.
Firefox
docker run -d -p 4444:4444 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
Хром
docker run -d -p 4444:4444 --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
Край
docker run -d -p 4444:4444 --shm-size= " 2g " selenium/standalone-edge:4.26.0-20241101
Примечание. Одновременно на порту 4444
может работать только один автономный контейнер .
Существуют разные способы запуска изображений и создания сетки с концентратором и узлами. Проверьте следующие параметры.
Хаб и узлы будут созданы в одной сети и будут узнавать друг друга по имени контейнера. В качестве первого шага необходимо создать сеть Docker.
$ docker network create grid
$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-chrome:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-edge:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-firefox:4.26.0-20241101
$ docker network create grid
$ docker run - d - p 4442 - 4444 : 4442 - 4444 -- net grid -- name selenium - hub selenium / hub: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
-- shm - size = " 2g " `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
selenium / node - chrome: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
-- shm - size = " 2g " `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
selenium / node - edge: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
-- shm - size = " 2g " `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
selenium / node - firefox: 4.26 . 0 - 20241101
Когда вы закончите использовать Grid и контейнеры завершатся, сеть можно удалить с помощью следующей команды:
# Removes the grid network
$ docker network rm grid
Хаб и узлы будут созданы на разных машинах/виртуальных машинах. Для правильного взаимодействия им необходимо знать IP-адреса друг друга. Если на одном компьютере/виртуальной машине будет работать более одного узла, они должны быть настроены на предоставление разных портов.
$ docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d -p 5555:5555 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 2> selenium/node-chrome:4.26.0-20241101
$ docker run - d - p 5555 : 5555 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 2> ` selenium / node - chrome: 4.26 . 0 - 20241101
$ docker run -d -p 5555:5555 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 3> selenium/node-edge:4.26.0-20241101
$ docker run - d - p 5555 : 5555 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 3> ` selenium / node - edge: 4.26 . 0 - 20241101
$ docker run -d -p 5555:5555 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 4> selenium/node-firefox:4.26.0-20241101
$ docker run - d - p 5555 : 5555 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 4> ` selenium / node - firefox: 4.26 . 0 - 20241101
$ docker run -d -p 5556:5556 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 4> -e SE_NODE_PORT=5556 selenium/node-chrome:4.26.0-20241101
$ docker run - d - p 5556 : 5556 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 4> ` - e SE_NODE_PORT = 5556 ` selenium / node - chrome: 4.26 . 0 - 20241101
Docker Compose — это самый простой способ запустить Grid. Используйте указанные ниже ресурсы, сохраните их локально и проверьте инструкции по выполнению поверх каждого файла.
docker-compose-v2.yml
docker-compose-v3.yml
Чтобы остановить Grid и очистить созданные контейнеры, запустите docker compose down
.
docker-compose-v3-swarm.yml
Можно запустить Selenium Grid со всеми его компонентами. Для простоты будет предоставлен только пример с Docker Compose. Сохраните файл локально и проверьте инструкции по выполнению поверх него.
docker-compose-v3-full-grid.yml
Переменная среды | Вариант | Тип | Значение по умолчанию | Описание |
---|---|---|---|---|
SE_REJECT_UNSUPPORTED_CAPS | --reject-unsupported-caps | логическое значение | false | Разрешить Дистрибьютору немедленно отклонить запрос, если Grid не поддерживает запрошенную возможность. |
SE_HEALTHCHECK_INTERVAL | --healthcheck-interval | интервал | 120 | Это гарантирует, что сервер сможет успешно пропинговать все узлы после определенного интервала. |
Выполнение тестов можно записать с помощью Docker-образа selenium/video:ffmpeg-7.1-20241101
. Для каждого контейнера, в котором запущен браузер, необходим один контейнер. Это означает, что если вы используете 5 узлов/автономных контейнеров, вам понадобится 5 видеоконтейнеров, сопоставление 1-1.
В настоящее время единственный способ выполнить это сопоставление — вручную (запуск контейнеров вручную или через docker compose
). Мы повторяем этот процесс, и, вероятно, в будущем эта настройка станет более простой.
Предоставляемый нами видеообраз Docker основан на образе ffmpeg Ubuntu, предоставленном проектом jrottenberg/ffmpeg. Благодарим вас за предоставление этого образа и упрощение нашей работы.
Начиная с тега изображения, основанного на 4.20.0
, видео-образ Docker основан на образе FFmpeg Ubuntu, предоставленном проектом linuxserver/docker-ffmpeg, поскольку образ доступен для нескольких платформ. Благодарим вас за упрощение нашего проекта и помощь в продвижении вперед благодаря поддержке нескольких архитектур.
Примечания :
/videos
внутри видеоконтейнера. Сопоставьте локальный каталог для получения видео.FILE_NAME
, чтобы избежать неожиданных результатов.В этом примере показано, как запустить контейнеры вручную:
$ docker network create grid
$ docker run -d -p 4444:4444 -p 6900:5900 --net grid --name selenium --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
$ docker run -d --net grid --name video -v /tmp/videos:/videos selenium/video:ffmpeg-7.1-20241101
# Run your tests
$ docker stop video && docker rm video
$ docker stop selenium && docker rm selenium
После того как контейнеры будут остановлены и удалены, вы должны увидеть видеофайл в каталоге /tmp/videos
вашего компьютера.
Вот пример использования концентратора и нескольких узлов:
docker-compose-v3-video.yml
На основе поддержки метаданных в тестах. Когда видеомагнитофон развернут с узлом браузера с включением SE_VIDEO_FILE_NAME=auto
и добавлением метаданных в ваши тесты, имя видеофайла извлечет значение возможности se:name
и будет использовать его в качестве имени видеофайла.
Например, в привязке Python:
from selenium . webdriver . chrome . options import Options as ChromeOptions
from selenium import webdriver
options = ChromeOptions ()
options . set_capability ( 'se:name' , 'test_visit_basic_auth_secured_page (ChromeTests)' )
driver = webdriver . Remote ( options = options , command_executor = "http://localhost:4444" )
driver . get ( "https://selenium.dev" )
driver . quit ()
Имя выходного видеофайла будет test_visit_basic_auth_secured_page_ChromeTests_
.
Если имя вашего теста обрабатывается платформой тестирования и оно наверняка уникально, вы также можете отключить добавление идентификатора сеанса к имени видеофайла, установив SE_VIDEO_FILE_NAME_SUFFIX=false
.
Имя файла будет сокращено до 255 символов, чтобы избежать длинных имен файлов. При этом space
будет заменен на _
, а в имени файла останутся только символы алфавита, цифры, -
(дефис), _
(подчеркивание).
Регулярное выражение обрезки можно настроить, установив переменную среды SE_VIDEO_FILE_NAME_TRIM_REGEX
. Значение по умолчанию — [:alnum:]-_
. Регулярное выражение должно быть совместимо с командой tr
в bash.
На уровне развертывания контейнер рекордера всегда включен. Кроме того, вы можете отключить процесс записи видео с помощью возможности сеанса se:recordVideo
. Например, в привязке Python:
options . set_capability ( 'se:recordVideo' , False )
В контейнере рекордера будет выполняться запрос GraphQL в Hub на основе Node SessionId и извлекать значение se:recordVideo
из возможностей, прежде чем принять решение начинать процесс записи видео или нет.
Примечания. Чтобы достичь конечной точки GraphQL, контейнеру записи необходимо знать URL-адрес концентратора. URL-адрес хаба можно передать через переменную среды SE_NODE_GRID_URL
. Например, SE_NODE_GRID_URL
— это http://selenium-hub:4444
.
RCLONE устанавливается в образ видеорегистратора. Вы можете использовать его для загрузки видео в облачное хранилище. Помимо упомянутой выше видеозаписи, вы можете включить функцию загрузки, установив следующие переменные среды:
version : " 3 "
services :
chrome_video :
image : selenium/video:ffmpeg-7.1-20241101
depends_on :
- chrome
environment :
- DISPLAY_CONTAINER_NAME=chrome
- SE_VIDEO_FILE_NAME=auto
- SE_VIDEO_UPLOAD_ENABLED=true
- SE_UPLOAD_DESTINATION_PREFIX=s3://mybucket/path
- RCLONE_CONFIG_S3_TYPE=s3
- RCLONE_CONFIG_S3_PROVIDER=GCS
- RCLONE_CONFIG_S3_ENV_AUTH=true
- RCLONE_CONFIG_S3_REGION=asia-southeast1
- RCLONE_CONFIG_S3_LOCATION_CONSTRAINT=asia-southeast1
- RCLONE_CONFIG_S3_ACL=private
- RCLONE_CONFIG_S3_ACCESS_KEY_ID=xxx
- RCLONE_CONFIG_S3_SECRET_ACCESS_KEY=xxx
- RCLONE_CONFIG_S3_ENDPOINT=https://storage.googleapis.com
- RCLONE_CONFIG_S3_NO_CHECK_BUCKET=true
SE_VIDEO_FILE_NAME=auto
будет использовать идентификатор сеанса в качестве имени видеофайла. Это гарантирует, что имя видеофайла будет уникальным для загрузки. Создание имени видеофайла автоматически работает на основе конечной точки /status
узла (и необязательной конечной точки GraphQL) для получения идентификатора сеанса и возможностей.
SE_VIDEO_UPLOAD_ENABLED=true
включит функцию загрузки видео. В фоновом режиме он создаст конвейерный файл с файлом и местом назначения, который загрузчик сможет использовать и продолжить.
SE_VIDEO_INTERNAL_UPLOAD=true
будет использовать для загрузки RCLONE, установленный в контейнере. Если вы хотите использовать для загрузки другой дополнительный контейнер, установите для него значение false
.
Переменные ENV для каждого режима | Хаб/Узлы | Автономные роли | Динамическая сетка |
---|---|---|---|
SE_VIDEO_RECORD_STANDALONE (обязательно) | false (по умолчанию) | true | true |
DISPLAY_CONTAINER_NAME (обязательно) | пользовательский ввод | пользовательский ввод | (не обязательно) |
SE_NODE_PORT (необязательно) | 5555 | 4444 | (не обязательно) |
SE_NODE_GRID_URL (необязательно) | пользовательский ввод | (не обязательно) | (не обязательно) |
Для переменных среды с префиксом RCLONE_
используется для передачи удаленной конфигурации в RCLONE. Более подробную информацию о конфигурации RCLONE можно найти здесь. При использовании в динамической сетке эти переменные следует комбинировать с префиксом SE_
, например SE_RCLONE_
. Более подробную информацию смотрите в ссылке ниже.
Настройте запись и загрузку видео для Hub и Nodes: docker-compose-v3-video-upload.yml
Настройте запись и загрузку видео для автономных ролей: docker-compose-v3-video-upload-standalone.yml
Настройте запись и загрузку видео для Dynamic Grid (node-docker): docker-compose-v3-video-upload-dynamic-grid.yml
Настройте запись и загрузку видео для автономной системы Dynamic Grid (standalone-docker):tests/docker-compose-v3-test-standalone-docker.yaml.
Переменная среды | Значение по умолчанию | Описание |
---|---|---|
SE_UPLOAD_RETAIN_LOCAL_FILE | false | Сохранять локальный файл после успешной загрузки |
SE_UPLOAD_COMMAND | copy | Команда RCLONE используется для передачи файла. Принудительное move , когда сохранение локального файла имеет false |
SE_UPLOAD_OPTS | -P --cutoff-mode SOFT --metadata --inplace | Могут быть установлены и другие параметры, относящиеся к команде RCLONE. |
SE_UPLOAD_CONFIG_FILE_NAME | upload.conf | Файл конфигурации для удаленного хоста вместо установки через префикс переменной env SE_RCLONE_* |
SE_UPLOAD_CONFIG_DIRECTORY | /opt/bin | Каталог файла конфигурации (измените его, если файл конфигурации установлен в другом каталоге) |
Grid 4 имеет возможность запускать Docker-контейнеры по требованию. Это означает, что он запускает Docker-контейнер в фоновом режиме для каждого нового запроса сеанса, там выполняется тест, а когда тест завершается, контейнер выбрасывается.
Этот режим выполнения можно использовать как в роли Автономный, так и в роли узла. «Динамическому» режиму выполнения необходимо указать, какие образы Docker использовать при запуске контейнеров. Кроме того, Grid должен знать URI демона Docker. Эту конфигурацию можно поместить в локальный файл toml
.
Вы можете сохранить этот файл локально и назвать его, например, config.toml
.
[ docker ] # Configs have a mapping between the Docker image to use and the capabilities that need to be matched to # start a container with the given image. configs = [ " selenium/standalone-firefox:4.26.0-20241101 " , ' {"browserName": "firefox"} ' , " selenium/standalone-chrome:4.26.0-20241101 " , ' {"browserName": "chrome"} ' , " selenium/standalone-edge:4.26.0-20241101 " , ' {"browserName": "MicrosoftEdge"} ' ] host-config-keys = [ " Dns " , " DnsOptions " , " DnsSearch " , " ExtraHosts " , " Binds " ] # URL for connecting to the docker daemon # Most simple approach, leave it as http://127.0.0.1:2375, and mount /var/run/docker.sock. # 127.0.0.1 is used because internally the container uses socat when /var/run/docker.sock is mounted # If var/run/docker.sock is not mounted: # Windows: make sure Docker Desktop exposes the daemon via tcp, and use http://host.docker.internal:2375. # macOS: install socat and run the following command, socat -4 TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock, # then use http://host.docker.internal:2375. # Linux: varies from machine to machine, please mount /var/run/docker.sock. If this does not work, please create an issue. url = " http://127.0.0.1:2375 " # Docker image used for video recording video-image = " selenium/video:ffmpeg-7.1-20241101 " # Uncomment the following section if you are running the node on a separate VM # Fill out the placeholders with appropriate values # [server] # host =# port =
С дополнительным ключом конфигурации host-config-keys
в разделе [docker] в файле config.toml (или параметром CLI --docker-host-config-keys). Пользователи могут указать список ключей конфигурации хоста Docker, которые должны быть переданы в контейнеры браузера.
Допустимые имена ключей для конфигурации хоста Docker можно найти в документации Docker API или с помощью команды docker inspect
контейнер node-docker.
Если вы хотите получить доступ к каталогу загрузки в контейнерах браузера узлов (например, /home/seluser/Downloads
) через конфигурацию томов контейнера Dynamic Grid, вы можете добавить следующую конфигурацию в файл config.toml
[ docker ]
host-config-keys = [ " Binds " ]
Конфигурация томов в файле компоновки Docker
services :
node-docker :
image : selenium/node-docker:latest
volumes :
- ./assets:/opt/selenium/assets
- ./config.toml:/opt/selenium/docker.toml
- ./downloads:/home/seluser/Downloads
- /var/run/docker.sock:/var/run/docker.sock
environment :
- SE_NODE_DOCKER_CONFIG_FILENAME=docker.toml
/opt/selenium/config.toml
— это путь по умолчанию для файла конфигурации во всех образах. Как только конфигурация томов будет передана в контейнеры браузера узла, ее config.toml
может быть перезаписан файлом конфигурации контейнера node-docker.
В этом случае смонтируйте файл config.toml
в /opt/selenium/docker.toml
в контейнере node-docker. И установите переменную среды SE_NODE_DOCKER_CONFIG_FILENAME=docker.toml
чтобы указать имя файла конфигурации для сценария запуска.
См. пример docker-compose-v3-test-node-docker.yaml.
Это можно расширить до полного развертывания Grid, при этом все компоненты развертываются индивидуально. Общая идея состоит в том, чтобы разместить Хаб на одной виртуальной машине, а каждый из Нодов — на отдельных, более мощных виртуальных машинах.
$ docker network create grid
$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/node-docker:4.26.0-20241101
$ docker network create grid
$ docker run - d - p 4442 - 4444 : 4442 - 4444 -- net grid -- name selenium - hub selenium / hub: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
- v ${PWD} / config.toml: / opt / selenium / config.toml `
- v ${PWD} / assets: / opt / selenium / assets `
- v / var / run / docker.sock: / var / run / docker.sock `
selenium / node - docker: 4.26 . 0 - 20241101
Чтобы сохранить ресурсы на вашем хосте, смонтируйте путь хоста к /opt/selenium/assets
.
Когда вы закончите использовать Grid и контейнеры завершатся, сеть можно удалить с помощью следующей команды:
# Removes the grid network
$ docker network rm grid
docker run --rm --name selenium-docker -p 4444:4444
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/standalone-docker:4.26.0-20241101
docker run --rm --name selenium-docker -p 4444:4444 `
-v ${PWD} /config.toml:/opt/selenium/config.toml `
-v ${PWD} /assets:/opt/selenium/assets `
-v /var/run/docker.sock:/var/run/docker.sock `
selenium/standalone-docker:4.26.0-20241101
$ docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d -p 5555:5555
-e SE_EVENT_BUS_HOST= < ip-from-machine- 1>
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/node-docker:4.26.0-20241101
$ docker run -d -p 5555:5555 `
-e SE_EVENT_BUS_HOST= < ip-from-machine- 1> `
-e SE_EVENT_BUS_PUBLISH_PORT=4442 `
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 `
-v ${PWD} /config.toml:/opt/selenium/config.toml `
-v ${PWD} /assets:/opt/selenium/assets `
-v /var/run/docker.sock:/var/run/docker.sock `
selenium/node-docker:4.26.0-20241101
Заполните раздел [server]
в файле config.toml
.
[ docker ] # Configs have a mapping between the Docker image to use and the capabilities that need to be matched to # start a container with the given image. configs = [ " selenium/standalone-firefox:4.26.0-20241101 " , " { " browserName " : " firefox " } " , " selenium/standalone-chrome:4.26.0-20241101 " , " { " browserName " : " chrome " } " , " selenium/standalone-edge:4.26.0-20241101 " , " { " browserName " : " MicrosoftEdge " } " ] # URL for connecting to the docker daemon # Most simple approach, leave it as http://127.0.0.1:2375, and mount /var/run/docker.sock. # 127.0.0.1 is used because interally the container uses socat when /var/run/docker.sock is mounted # If var/run/docker.sock is not mounted: # Windows: make sure Docker Desktop exposes the daemon via tcp, and use http://host.docker.internal:2375. # macOS: install socat and run the following command, socat -4 TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock, # then use http://host.docker.internal:2375. # Linux: varies from machine to machine, please mount /var/run/docker.sock. If this does not work, please create an issue. url = " http://127.0.0.1:2375 " # Docker image used for video recording video-image = " selenium/video:ffmpeg-7.1-20241101 " # Uncomment the following section if you are running the node on a separate VM # Fill out the placeholders with appropriate values [ server ] host = < ip-from-node-machine> port = < port-from-node-machine>
Чтобы сохранить ресурсы на вашем хосте, смонтируйте путь хоста к /opt/selenium/assets
.
Вот пример использования концентратора и узла:
docker-compose-v3-dynamic-grid.yml
Контейнеры можно дополнительно настроить с помощью переменных среды, таких как SE_NODE_SESSION_TIMEOUT
и SE_OPTS
. При создании дочернего контейнера все переменные среды с префиксом SE_
будут перенаправлены и установлены в контейнере. Вы можете установить нужные переменные среды в контейнерах standalone-docker
или node-docker
. В следующем примере время ожидания сеанса устанавливается равным 700 секундам для всех сеансов:
docker run --rm --name selenium-docker -p 4444:4444
-e SE_NODE_SESSION_TIMEOUT=700
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/standalone-docker:4.26.0-20241101
docker run --rm --name selenium-docker -p 4444:4444 `
-e SE_NODE_SESSION_TIMEOUT=700 `
-v ${PWD} /config.toml:/opt/selenium/config.toml `
-v ${PWD} /assets:/opt/selenium/assets `
-v /var/run/docker.sock:/var/run/docker.sock `
selenium/standalone-docker:4.26.0-20241101
Чтобы записать сеанс WebDriver, вам необходимо добавить поле se:recordVideo
со значением true
. Вы также можете установить часовой пояс и разрешение экрана, например:
{
"browserName" : " firefox " ,
"platformName" : " linux " ,
"se:recordVideo" : " true " ,
"se:timeZone" : " US/Pacific " ,
"se:screenResolution" : " 1920x1080 "
}
После запуска теста проверьте путь, который вы подключили к контейнеру Docker ( ${PWD}/assets
), и вы должны увидеть видео и информацию о сеансе.
Из привязок языка вы можете настроить возможность se:name
для динамического изменения имени выходного видеофайла. Например, в привязке Python:
from selenium . webdriver . chrome . options import Options as ChromeOptions
from selenium import webdriver
options = ChromeOptions ()
options . set_capability ( 'se:recordVideo' , True )
options . set_capability ( 'se:screenResolution' , '1920x1080' )
options . set_capability ( 'se:name' , 'test_visit_basic_auth_secured_page (ChromeTests)' )
driver = webdriver . Remote ( options = options , command_executor = "http://localhost:4444" )
driver . get ( "https://selenium.dev" )
driver . quit ()
После выполнения теста в разделе ( ${PWD}/assets
) вы можете увидеть имя видеофайла по пути /
Имя файла будет сокращено до 255 символов, чтобы избежать длинных имен файлов. Более того, символ space
будет заменен на _
, а в имени файла останутся только символы алфавита, цифры -
(дефис) и _
(подчеркивание). (Этот навык станет доступен после объединения этого PR)
tzdata
устанавливается в основанные образы, и вы можете установить часовой пояс в контейнере, используя переменную env TZ
. По умолчанию часовой пояс установлен на UTC
. Список поддерживаемых часовых поясов можно найти здесь. Например:
$ docker run --rm --entrypoint= " " -e TZ=Asia/Ho_Chi_Minh selenium/node-chromium:latest date +%FT%T%Z
2024-08-28T18:19:26+07
Мы предлагаем диаграмму Helm для развертывания этих образов Docker в Kubernetes. Более подробную информацию можно найти в файле readme Helm.
Вы можете передать переменную SE_OPTS
с дополнительными параметрами командной строки для запуска хаба или узла.
$ docker run -d -p 4444:4444 -e SE_OPTS= " --log-level FINE " --name selenium-hub selenium/hub:4.26.0-20241101
Вы можете передать переменную среды SE_JAVA_OPTS
в процесс Java.
$ docker run -d -p 4444:4444 -e SE_JAVA_OPTS=-Xmx512m --name selenium-hub selenium/hub:4.26.0-20241101
Вместо добавления аргументов через параметры браузера из привязок языка, например:
options = ChromeOptions ()
options . add_argument ( '--incognito' )
options . add_argument ( '--disable-dev-shm-usage' )
driver = webdriver . Remote ( options = options , command_executor = "http://localhost:4444/wd/hub" )
Вы также можете заранее принудительно применить аргументы непосредственно из переменных среды контейнера (узла, автономного узла или узла-докера). Определите переменную среды, имя которой начинается с SE_BROWSER_ARGS_
, а следующий за ней ключ конфигурации зависит от вас (убедитесь, что они уникальны, когда вы определяете несколько аргументов). Например:
docker run -d -p 4444:4444
-e SE_BROWSER_ARGS_INCOGNITO=--incognito
-e SE_BROWSER_ARGS_DISABLE_DSHM=--disable-dev-shm-usage
selenium/standalone-chrome:latest
Для справки перечислите аргументы командной строки Chrome.
Примечание. В настоящее время это применимо для браузеров узлов Chrome/Chromium, Edge.
Узлы регистрируются через шину событий. Когда Grid запускается в своей типичной настройке Hub/Node, Hub будет действовать как шина событий, а когда Grid запускается со всеми пятью отдельными элементами, шина событий будет работать сама по себе.
В обоих случаях необходимо сообщить узлу, где находится шина событий, чтобы он мог зарегистрироваться. Для этого используются переменные среды SE_EVENT_BUS_HOST
, SE_EVENT_BUS_PUBLISH_PORT
и SE_EVENT_BUS_SUBSCRIBE_PORT
.
В некоторых случаях, например, если вы хотите пометить узел, может потребоваться указать собственный стереотип в конфигурации узла. Переменная среды SE_NODE_STEREOTYPE
устанавливает запись стереотипа в config.toml
узла. Пример файла config.toml можно найти здесь: Настройка пользовательских возможностей для сопоставления определенных узлов.
Вот пример со значениями по умолчанию для этих переменных среды:
$ docker run -d
-e SE_EVENT_BUS_HOST= < event_bus_ip | event_bus_name >
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_STEREOTYPE= " { " browserName " : " ${SE_NODE_BROWSER_NAME} " , " browserVersion " : " ${SE_NODE_BROWSER_VERSION} " , " platformName " : " Linux " } "
--shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
Передача команд конечной точке службы, поддерживающей WebDriver. Полезно подключить к Selenium Grid внешний сервис, поддерживающий WebDriver. Примером такой услуги может быть облачный провайдер или сервер Appium. Таким образом, Grid может обеспечить больший охват платформ и версий, не присутствующих локально.
Ниже приведен пример команд реле конфигурации.
docker-compose-v3-test-node-relay.yml
Если вы хотите передавать только команды, для этой цели подойдет selenium/node-base
. Если вы хотите настроить узел как с помощью браузеров, так и с помощью команд ретрансляции, можно использовать соответствующие изображения узла.
Чтобы использовать переменные среды для создания конфигураций ретрансляции, установите SE_NODE_RELAY_URL
и другие переменные, как показано ниже.
[ relay ]
url = " ${SE_NODE_RELAY_URL} "
status-endpoint = " ${SE_NODE_RELAY_STATUS_ENDPOINT} "
protocol-version = " ${SE_NODE_RELAY_PROTOCOL_VERSION} "
configs = [ ' ${SE_NODE_RELAY_MAX_SESSIONS} ' , ' {"browserName": "${SE_NODE_RELAY_BROWSER_NAME}", "platformName": "${SE_NODE_RELAY_PLATFORM_NAME}", "appium:platformVersion": "${SE_NODE_RELAY_PLATFORM_VERSION}"} ' ]
Чтобы запустить образец теста с ретранслируемым узлом, вы можете клонировать проект и попробовать следующую команду:
make test_node_relay
По умолчанию Selenium доступен по адресу http://127.0.0.1:4444/
. Selenium можно настроить на использование собственного подпути, указав переменную среды SE_SUB_PATH
. В приведенном ниже примере Selenium доступен по адресу http://127.0.0.1:4444/selenium-grid/
$ docker run -d -p 4444:4444 -e SE_SUB_PATH=/selenium-grid/ --name selenium-hub selenium/hub:4.26.0-20241101
По умолчанию узлы начинаются с разрешения экрана 1920 x 1080 с глубиной цвета 24 бита и разрешением 96 точек на дюйм. Эти параметры можно настроить, указав переменные среды SE_SCREEN_WIDTH
, SE_SCREEN_HEIGHT
, SE_SCREEN_DEPTH
и/или SE_SCREEN_DPI
при запуске контейнера.
docker run -d -e SE_SCREEN_WIDTH=1366 -e SE_SCREEN_HEIGHT=768 -e SE_SCREEN_DEPTH=24 -e SE_SCREEN_DPI=74 selenium/standalone-firefox:4.26.0-20241101
В некоторых случаях вам может потребоваться установить URL-адрес сетки для узла, например, если вы хотите получить доступ к конечной точке BiDi/CDP. Это также необходимо, если вы хотите использовать новый RemoteWebDriver.builder()
или Augmenter()
присутствующий в Selenium 4 (поскольку они неявно настраивают соединение BiDi/CDP). Это можно сделать с помощью переменной среды SE_NODE_GRID_URL
, например -e SE_NODE_GRID_URL=http://
. Установка этой переменной env необходима, если вы хотите видеть просмотр в реальном времени во время выполнения сеансов.
У Grid тайм-аут сеанса по умолчанию составляет 300 секунд, при этом сеанс может находиться в устаревшем состоянии до тех пор, пока не будет завершен. Вы можете использовать SE_NODE_SESSION_TIMEOUT
, чтобы перезаписать это значение за секунды.
Новый запрос сеанса помещается в очередь сеансов перед его обработкой, и запрос остается в очереди до тех пор, пока не будет найден соответствующий слот среди зарегистрированных узлов. Однако время ожидания нового запроса сеанса может истечь, если слот не найден. По умолчанию запрос будет оставаться в очереди до 300 секунд, прежде чем истечет время ожидания. Кроме того, попытка обработки запроса осуществляется каждые 5 секунд (по умолчанию).
Эти значения можно переопределить с помощью переменных среды в Hub и SessionQueue ( SE_SESSION_REQUEST_TIMEOUT
и SE_SESSION_RETRY_INTERVAL
). Например, таймаут в 500 секунд будет SE_SESSION_REQUEST_TIMEOUT=500
, а интервал повтора в 2 секунды будет SE_SESSION_RETRY_INTERVAL=2
.
По умолчанию для каждого контейнера настроен только один сеанс через переменную среды SE_NODE_MAX_SESSIONS
. Это число можно увеличить до максимально доступного количества процессоров, поскольку большая стабильность достигается, когда в одном контейнере/браузере работает 1 процессор.
Однако, если вы измерили производительность и на основании этого считаете, что в каждом контейнере может быть выполнено больше сеансов, вы можете переопределить максимальный предел, установив для SE_NODE_MAX_SESSIONS
желаемое число, а для SE_NODE_OVERRIDE_MAX_SESSIONS
значение true
. Тем не менее, не рекомендуется запускать больше сеансов браузера, чем доступные процессоры, поскольку вы будете перегружать ресурсы.
Переопределение этого параметра имеет нежелательный побочный эффект, если включена запись видео, поскольку в одном видео может быть записано более одного сеанса браузера.
Firefox, Chrome, при использовании безгласного режима нет необходимости запускать сервер Xvfb.
Чтобы избежать запуска сервера, вы можете установить для переменной среды SE_START_XVFB
значение false
(или любое другое значение, кроме true
), например:
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub -e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_START_XVFB=false --shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
Дополнительные сведения см. в этом выпуске GitHub.
Отмеченный:
SE_START_XVFB
необходимо установить значение true
для работы в режиме --headless=new
. В некоторых средах, таких как Docker Swarm или Kubernetes, полезно завершать работу узла Node или автономного контейнера после выполнения N тестов. Например, это можно использовать в Kubernetes для завершения работы модуля и последующего масштабирования нового после N сеансов. Установите для переменной среды SE_DRAIN_AFTER_SESSION_COUNT
значение выше нуля, чтобы включить такое поведение.
$ docker run -e SE_DRAIN_AFTER_SESSION_COUNT=5 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
При использовании предыдущей команды автономный контейнер отключится после выполнения 5 сеансов.
В долго работающих контейнерах может случиться так, что браузеры оставят какие-то остатки. Это могут быть зависшие процессы браузера, задания, которые уже завершились, но не удалось полностью остановить браузер, или временные файлы, записанные в файловую систему /tmp
(особенно в браузерах на базе Chrome). Чтобы избежать заполнения таких ресурсов, как идентификаторы процессов и использование файловой системы в контейнере, в контейнерах узлов каждый час запускается сценарий автоматической очистки. Это очистит старые процессы и старые временные файлы. По умолчанию это отключено. Если этот параметр включен, будут очищены браузеры, работающие более 2 часов, и файлы старше 1 дня. Их можно включить и настроить с помощью следующих переменных среды:
SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP
: значение по умолчанию false
, установлено значение true
, чтобы включить очистку.SE_BROWSER_LEFTOVERS_INTERVAL_SECS
: значение по умолчанию 3600
(1 час), интервал очистки в секундах.SE_BROWSER_LEFTOVERS_PROCESSES_SECS
: значение по умолчанию 7200
(2 часа), браузеры, работающие дольше этого времени, будут закрыты.SE_BROWSER_LEFTOVERS_TEMPFILES_DAYS
: значение по умолчанию 1
(1 день), файлы, созданные браузерами на базе Chrome в /tmp
будут удалены по истечении этого количества дней (игнорируются при использовании Firefox). Если вы используете Selenium для длительных сеансов и ожидаете, что браузеры будут работать более 2 часов, либо не устанавливайте для SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP
значение true
(оставьте значение по умолчанию false
), либо настройте SE_BROWSER_LEFTOVERS_PROCESSES_SECS
, чтобы установить значение выше ожидаемого долгого времени. запуск процессов браузера.
$ docker run -e SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP=true --shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
С помощью предыдущей команды очистка будет включена с таймингами по умолчанию.
$ docker run -e SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP=true
-e SE_BROWSER_LEFTOVERS_INTERVAL_SECS=7200
-e SE_BROWSER_LEFTOVERS_PROCESSES_SECS=3600
-e SE_BROWSER_LEFTOVERS_TEMPFILES_DAYS=2
--shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
С помощью предыдущей команды очистка будет включена, но будет запускаться каждые 2 часа (вместо 1), будет завершать работу браузеров, работающих дольше 1 часа (вместо 2 часов), и удалять временные файлы старше 2 дней (вместо 1).
Некоторые выходные переменные, такие как пароль, секрет и т. д., маскируются в журналах консоли. В целях отладки вы можете отключить его, установив для SE_MASK_SECRETS
значение false
При создании сценария bash вы можете замаскировать вывод, используя синтаксическое echo "Current value is $(mask ${YOUR_VARIABLE})
SE_MASK_SECRETS_MIN_LENGTH
по умолчанию — 3
. Это означает, что длинная строка будет замаскирована до ***
, чтобы избежать раскрытия длины для атаки методом перебора.
По умолчанию в образе доступны самозаверяющие сертификаты по умолчанию в папке /opt/selenium/secrets
включая
server.jks
: файл хранилища доверенных сертификатов для настройки для JVM через системное свойство javax.net.ssl.trustStore
при запуске сервера.server.pass
: файл содержит пароль хранилища доверенных сертификатов для JVM через системное свойство javax.net.ssl.trustStorePassword
.tls.crt
: для сертификата сервера для https-соединения установлена опция Selenium --https-certificate
.tls.key
: Закрытый ключ сервера (в формате PKCS8) для соединения https установлен в параметр Selenium --https-private-key
.Существуют переменные среды для настройки безопасного соединения:
Переменные среды | По умолчанию | Вариант | Описание |
---|---|---|---|
SE_ENABLE_TLS | false | Включить безопасное соединение с конфигурациями по умолчанию | |
SE_JAVA_SSL_TRUST_STORE | /opt/selenium/secrets/server.jks | JVM | |
SE_JAVA_SSL_TRUST_STORE_PASSWORD | /opt/selenium/secrets/server.pass | JVM | |
SE_JAVA_DISABLE_HOSTNAME_VERIFICATION | true | JVM | Отключить внутреннюю проверку компонентов хоста |
SE_HTTPS_CERTIFICATE | /opt/selenium/secrets/tls.crt | Селен | Установите параметр CLI --https-certificate |
SE_HTTPS_PRIVATE_KEY | /opt/selenium/secrets/tls.key | Селен | Установите параметр CLI --https-private-key |
С помощью монтирования тома вы можете заменить сертификаты по умолчанию своими собственными сертификатами.
Клиент также должен доверять самозаверяющему сертификату (добавьте в систему доверенный центр сертификации), чтобы избежать сообщения об ошибке, связанного с подтверждением SSL при создании RemoteWebDriver.
Обратитесь к образцу: docker-compose-v3-full-grid-secure.yml
В разных браузерах предусмотрены разные способы установки языка и локали для привязки.
Firefox можно настроить на использование определенного языка и локали, установив предпочтения профиля при создании WebDriver из привязки. Кроме того, чтобы язык пользовательского интерфейса браузера вступил в силу, необходимо установить языковой пакет в качестве дополнения. Например, чтобы установить язык браузера и локаль vi-VN
, вы можете выполнить следующие действия:
Получите последний языковой пакет Firefox для нужного языка, например https://download.mozilla.org/?product=firefox-langpack-latest-SSL&lang=vi. Затем вы можете установить языковой пакет в качестве дополнения при создании экземпляра RemoteWebDriver.
profile = webdriver . FirefoxProfile ()
profile . set_preference ( 'intl.accept_languages' , 'vi-VN,vi' )
profile . set_preference ( 'intl.locale.requested' , 'vi-VN,vi' )
options = FirefoxOptions ()
options . profile = profile
driver = webdriver . Remote ( options = options , command_executor = "http://selenium-hub:4444/wd/hub" )
webdriver . Firefox . install_addon ( driver , "/local/path/to/vi.xpi" )
driver . get ( 'https://google.com' )
Существует скрипт для получения всех доступных языковых пакетов для данной версии Firefox. Вы можете запустить сценарий, чтобы загрузить языковые пакеты в исходный код. Например:
FIREFOX_VERSION= $( docker run --rm --entrypoint= " " selenium/node-firefox:latest firefox --version | awk ' {print $3} ' )
&& ./NodeFirefox/get_lang_package.sh ${FIREFOX_VERSION} /local/path/to/download
Или вы можете смонтировать каталог контейнера /home/seluser/firefox/distribution/extensions
к каталогу хоста, чтобы получить доступ к пакетам, предварительно созданным в контейнере, для использования в вашем тестовом сценарии.
Supervisor используется для управления процессами и журналами в контейнере. Некоторые конфигурации supervisord
можно настроить с помощью переменных среды, как показано ниже:
Переменные среды | По умолчанию | конфигурация supervisord |
---|---|---|
SE_SUPERVISORD_LOG_LEVEL | info | уровень супервизора.loglevel |
SE_SUPERVISORD_CHILD_LOG_DIR | /tmp | супервизор.childlogdir |
SE_SUPERVISORD_LOG_FILE | /tmp/supervisord.log | файл супервизора.logfile |
SE_SUPERVISORD_PID_FILE | /tmp/supervisord.pid | файл супервизора.pid |
Клонируйте репозиторий, и из корня каталога проекта вы сможете собрать все, запустив:
$ VERSION=local make build
Если вам нужно настроить переменные среды для создания образа (например, http-прокси), просто установите переменную среды BUILD_ARGS
, которая содержит дополнительные переменные для передачи в контекст докера (это будет работать только с докером >= 1.9).
$ BUILD_ARGS= " --build-arg http_proxy=http://acme:3128 --build-arg https_proxy=http://acme:3128 " make build
Примечание. Если не указать VERSION=local
образы будут построены с использованием выпущенной версии, но дата будет заменена на текущую.
Если вы хотите создать образ с UID/GID хоста, просто установите переменную среды BUILD_ARGS
$ BUILD_ARGS= " --build-arg UID= $( id -u ) --build-arg GID= $( id -g ) " make build
Если вы хотите создать образ с другим пользователем/паролем по умолчанию, просто установите переменную среды BUILD_ARGS
$ BUILD_ARGS= " --build-arg SEL_USER=yourseluser --build-arg SEL_PASSWD=welcome " make build
Основываясь на последнем DockerFile (путем клонирования репо и из корня каталога проекта), вы можете создать изображения с определенной комбинацией сетки селена и версий браузера.
Например, вы хотели бы создать образы node-chrome
и standalone-chrome
с версией 4.17.0
, версий браузера Chrome 119
, 120
, 123
соответственно.
$ ./tests/build-backward-compatible/bootstrap.sh 4.17.0 119,120,123 chrome
В общем, сценарий принимает следующие аргументы:
$1
(обязательно): версия селена. Детали получают из файла Matrix$2
(обязательно): основная версия браузера, несколько значений, разделенных запятыми. Детали получают из файла Matrix$3
(необязательно): имя браузера. Если не предоставлено, он будет повторять все браузеры ( chrome
, edge
, firefox
)$4
(необязательно): PUSH IMAGE в реестр. По умолчанию это false
. Если вы хотите подтолкнуть изображение в реестр, установите его на true
(требуется вход Docker в ваше пространство имен, сделанное перед запуском сценария). Чтобы установить пространство имен для изображений, вы можете установить NAME
переменной среды перед запуском сценария. Например:
$ export NAME=artifactory.yourcompany.com/selenium
$ ./tests/build-backward-compatible/bootstrap.sh 4.17.0 119,120,123 chrome
После запуска сценария вы увидите изображения списка с полным тегом, чтобы прикрепить определенную сетку и версию браузера после соглашений о тегах
Сервер Selenium, браузер и драйвер предварительно установлены на изображении. Если вы хотели бы остаться на той же версии селена и просто обновить браузер и его драйвер до последних. Вы можете выполнить ниже шаги
Клонировать репо и из корнета каталогов проекта, вы можете обновить, запустив:
$ VERSION= $EXPECTED_SELENIUM_VERSION make chrome_upgrade_version
Например: VERSION=4.16.1 make chrome_upgrade_version
Новое изображение имеет tag $VERSION_YYYYMMDD
, где YYYYMMDD
является текущей датой.
$ VERSION= $SELENIUM_VERSION make firefox_upgrade_version
$ VERSION= $SELENIUM_VERSION make edge_upgrade_version
Вы можете обратиться к подробным командам в файле Makefile.
Сначала хорошая практика, чтобы проверить, готова ли сетка и готова к получению запросов, это может быть сделано путем проверки конечной точки /wd/hub/status
.
Сетка, которая готова, состоящая из концентратора и двух узлов, может выглядеть так:
{
"value" : {
"ready" : true ,
"message" : " Selenium Grid ready. " ,
"nodes" : [
{
"id" : " 6c0a2c59-7e99-469d-bbfc-313dc638797c " ,
"uri" : " http: u002fu002f 172.19.0.3:5555 " ,
"maxSessions" : 4 ,
"stereotypes" : [
{
"capabilities" : {
"browserName" : " firefox "
},
"count" : 4
}
],
"sessions" : [
]
},
{
"id" : " 26af3363-a0d8-4bd6-a854-2c7497ed64a4 " ,
"uri" : " http: u002fu002f 172.19.0.4:5555 " ,
"maxSessions" : 4 ,
"stereotypes" : [
{
"capabilities" : {
"browserName" : " chrome "
},
"count" : 4
}
],
"sessions" : [
]
}
]
}
}
"ready": true
значение указывает на то, что сетка готова получить запросы. Этот статус может быть опробован с помощью сценария перед проведением какого -либо теста, или его можно добавить в качестве здоровья при запуске контейнера Docker.
Скрипт-grid.sh, который включен в изображения, может использоваться для опроса статуса сетки.
Этот пример проверяет статус сетки каждые 15 секунд, он имеет тайм -аут 30 секунд, когда проверка выполняется, и он возвращается до 5 раз, пока контейнер не будет отмечен как нездоровый. Пожалуйста, используйте скорректированные значения, чтобы соответствовать вашим потребностям, (при необходимости) замените параметры --host
и --port
для тех, которые используются в вашей среде.
$ docker network create grid
$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub
--health-cmd= ' /opt/bin/check-grid.sh --host 0.0.0.0 --port 4444 '
--health-interval=15s --health-timeout=30s --health-retries=5
selenium/hub:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-chrome:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-edge:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-firefox:4.26.0-20241101
ПРИМЕЧАНИЕ. Делимитер line не будет работать на терминалах на основе Windows, попробуйте либо
^
, либо на обратном обработке.
Состояние здоровья контейнера может быть проверено, выполнив docker ps
и проверив статус (healthy)|(unhealthy)
или осмотрев его следующим образом:
$ docker inspect --format= ' {{json .State.Health.Status}} ' selenium-hub
" healthy "
Общая проблема, известная в Docker, заключается в том, что работающий контейнер не всегда означает, что приложение внутри него готово. Простой способ справиться с этим-с помощью сценария «ожидания для его», здесь можно увидеть больше информации.
Следующий сценарий является примером того, как это можно сделать, используя BASH, но тот же принцип применяется, если вы хотите сделать это с языком программирования, используемом для написания тестов. В приведенном ниже примере сценарий будет опросить конечную точку состояния каждую секунду. Если сетка не станет готовой в течение 30 секунд, сценарий выйдет с кодом ошибки.
#! /bin/bash
# wait-for-grid.sh
set -e
url= " http://localhost:4444/wd/hub/status "
wait_interval_in_seconds=1
max_wait_time_in_seconds=30
end_time= $(( SECONDS + max_wait_time_in_seconds ))
time_left= $max_wait_time_in_seconds
while [ $SECONDS -lt $end_time ] ; do
response= $( curl -sL " $url " | jq -r ' .value.ready ' )
if [ -n " $response " ] && [ " $response " ] ; then
echo " Selenium Grid is up - executing tests "
break
else
echo " Waiting for the Grid. Sleeping for $wait_interval_in_seconds second(s). $time_left seconds left until timeout. "
sleep $wait_interval_in_seconds
time_left= $(( time_left - wait_interval_in_seconds ))
fi
done
if [ $SECONDS -ge $end_time ] ; then
echo " Timeout: The Grid was not started within $max_wait_time_in_seconds seconds. "
exit 1
fi
Потребует
jq
установленного черезapt-get
, иначе сценарий будет продолжать печататьWaiting
без завершения выполнения.
Примечание. При необходимости замените localhost
и 4444
для правильных значений в вашей среде. Кроме того, этот сценарий проходит на неопределенный срок, вы можете настроить его и установить тайм -аут.
Допустим, обычная команда для выполнения ваших тестов - это mvn clean test
. Вот способ использовать приведенный выше сценарий и выполнить ваши тесты:
$ ./wait-for-grid.sh && mvn clean test
Таким образом, сценарий будет опросить, пока сетка не будет готова, а затем начнутся ваши тесты.
По умолчанию изображение на основе установлено libnss3-tools
и инициализирует /home/seluser/.pki/nssdb
, поэтому вы можете добавить свои сертификаты без рутинных. Если вам необходимо установить пользовательские сертификаты, CA, промежуточные сертификаты CA или клиента (например, Interprise Internal CA), вы можете создать собственное изображение Docker из изображения Node Selenium. Браузер на основе хрома использует nssdb
в качестве хранилища сертификатов. Затем вы можете установить все необходимые внутренние сертификаты в DockerFile, как это:
В изображении есть сценарий утилиты, который можно использовать для добавления ваших сертификатов в магазин nssdb
и пакет ок. Сценарий- /opt/bin/add-cert-helper.sh
.
Создайте DockerFile, который использует изображение узла селена в качестве основания и копирует скрипт в контейнер и выполняет его. Например, Dockerfile
Если вам нужно создать набор разных сертификатов и изображений узлов. Вы можете создать сценарий начальной загрузки, чтобы сделать это за один выстрел. Например, Bootstrap.sh
Приведенный выше пример можно проверить со следующей командой:
make test_custom_ca_cert
# ./tests/customCACert/bootstrap.sh
Вы можете найти дополнительную информацию здесь
Таким образом, сертификаты будут установлены, и узел запустится автоматически, как и раньше.
В качестве альтернативы вы можете добавить свои файлы сертификатов к существующим изображениям селена. В этом практическом примере предполагается, что у вас есть известное изображение для использования в качестве изображения сборки, и у вас есть способ опубликовать новые изображения в ваш локальный реестр докеров.
В этом примере используется дистрибуция на основе Redhat в качестве изображения сборки (Rocky Linux), но это может быть любое изображение Linux по вашему выбору. Обратите внимание, что инструкция по сборке будет варьироваться в зависимости от распределений. Вы можете проверить инструкции для Ubuntu в предыдущем примере.
В примере также предполагается, что ваш внутренний CA уже находится в /etc/pki/ca-rust/source/anchors/your_ca.pem , расположение по умолчанию для Rocky Linux. В качестве альтернативы, вы также можете предоставить эти файлы от вашего хоста и скопировать их в изображении сборки.
Для браузеров Chrome и Edge рецепт одинаково, просто адаптируйте имя изображения (узло-хрома или узловой):
# Get a standard image for creating nssdb file
FROM rockylinux:8.6 as build
RUN yum install -y nss-tools
RUN mkdir -p -m755 /seluser/.pki/nssdb
&& certutil -d sql:/seluser/.pki/nssdb -N --empty-password
&& certutil -d sql:/seluser/.pki/nssdb -A -t "C,," -n YOUR_CA -i /etc/pki/ca-trust/source/anchors/YOUR_CA.pem
&& chown -R 1200:1201 /seluser
# Start from Selenium image and add relevant files from build image
FROM selenium/node-chrome:4.26.0-20241101
USER root
COPY --from=build /seluser/ /home/seluser/
USER seluser
Пример для Firefox:
# Get a standard image for working on
FROM rockylinux:8.6 as build
RUN mkdir -p "/distribution" "/certs" &&
cp /etc/pki/ca-trust/source/anchors/YOUR_CA*.pem /certs/ &&
echo '{ "policies": { "Certificates": { "Install": ["/opt/firefox-latest/YOUR_CA.pem"] }} }' >"/distribution/policies.json"
# Start from Selenium image and add relevant files from build image
FROM selenium/node-firefox:4.26.0-20241101
USER root
COPY --from=build /certs /opt/firefox-latest
COPY --from=build /distribution /opt/firefox-latest/distribution
USER seluser
Этот проект использует X11VNC в качестве VNC -сервера, чтобы пользователи могли проверять то, что происходит внутри контейнера. Пользователи могут подключаться к этому серверу двумя способами:
VNC -сервер прослушивает порт 5900, вы можете использовать клиент VNC и подключиться к нему. Не стесняйтесь составить карту порта 5900 на любой бесплатный внешний порт, который вы пожелаете.
Внутренний порт 5900 остается прежним, потому что это настроенный порт для сервера VNC, работающего внутри контейнера. Вы можете переопределить его с помощью переменной среды SE_VNC_PORT
, если вы хотите использовать --net=host
.
Вот пример с автономными изображениями, та же концепция относится к изображениям узлов.
$ docker run -d -p 4444:4444 -p 5900:5900 --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
$ docker run -d -p 4445:4444 -p 5901:5900 --shm-size= " 2g " selenium/standalone-edge:4.26.0-20241101
$ docker run -d -p 4446:4444 -p 5902:5900 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
Затем вы будете использовать в своем клиенте VNC:
Если вы получите подсказку с просьбой о пароле, это: secret
. Если вы хотите изменить это, вы можете установить переменную среды SE_VNC_PASSWORD
.
Если вы хотите запустить VNC без аутентификации пароля, вы можете установить переменную среды SE_VNC_NO_PASSWORD=1
.
Если вы хотите запустить VNC в режиме только для просмотра, вы можете установить переменную среды SE_VNC_VIEW_ONLY=1
.
Если вы хотите изменить предел дескриптора открытого файла для процесса VNC Server, вы можете установить переменную среды SE_VNC_ULIMIT=4096
.
Этот проект использует NOVNC, чтобы позволить пользователям осматривать визуальную активность контейнеров со своим браузером. Это может пригодиться, если вы не можете установить клиент VNC на вашем компьютере. Порт 7900 используется для запуска NOVNC, поэтому вам нужно будет подключиться к этому порту с вашим браузером.
Подобно предыдущему разделу, не стесняйтесь отображать порт 7900 на любой свободный внешний порт, который вы пожелаете. Вы также можете переопределить его с помощью переменной среды SE_NO_VNC_PORT
, если вы хотите использовать --net=host
.
Вот пример с автономными изображениями, та же концепция относится к изображениям узлов.
$ docker run -d -p 4444:4444 -p 7900:7900 --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
$ docker run -d -p 4445:4444 -p 7901:7900 --shm-size= " 2g " selenium/standalone-edge:4.26.0-20241101
$ docker run -d -p 4446:4444 -p 7902:7900 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
Тогда вы бы использовали в своем браузере:
Если вы получите подсказку с просьбой о пароле, это: secret
.
Если у вас мало ресурсов или просто не нужно проверять бегущие сеансы, можно вообще не запускать VNC. Просто установите SE_START_VNC=false
Environment для запуска сетки.
Чтобы включить отслеживание в контейнере селена, можно выполнить следующие команды:
docker network create grid
docker run -d -p 16686:16686 -p 4317:4317 --net grid --name jaeger jaegertracing/all-in-one:1.54
docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.26.0-20241101
docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_ENABLE_TRACING=true
-e SE_OTEL_TRACES_EXPORTER=otlp
-e SE_OTEL_EXPORTER_ENDPOINT=http://jaeger:4317
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-chrome:4.26.0-20241101
docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_ENABLE_TRACING=true
-e SE_OTEL_TRACES_EXPORTER=otlp
-e SE_OTEL_EXPORTER_ENDPOINT=http://jaeger:4317
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-edge:4.26.0-20241101
docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_ENABLE_TRACING=true
-e SE_OTEL_TRACES_EXPORTER=otlp
-e SE_OTEL_EXPORTER_ENDPOINT=http://jaeger:4317
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-firefox:4.26.0-20241101
Вы также можете обратиться к приведенным ниже Docker Compose YAML -файлам, чтобы иметь возможность запустить простую сетку (или) динамическую сетку.
Вы можете просмотреть пользовательский интерфейс Jaeger и проследить свой запрос.
По умолчанию отслеживание включено в компонентах сетки. Без конечной точки экспортера трассировки он будет искать локальный экземпляр, например, localhost/[0:0:0:0:0:0:0:1]:4117
. В журналах контейнеров вы можете увидеть несколько строк, как ниже:
ERROR (ThrottlingLogger.dolog) Failed to export spans.
The request could not be executed. Error message: Failed to connect to localhost/[0:0:0:0:0:0:0:1]:4117
java.net.ConnectException: Failed to connect to localhost/[0:0:0:0:0:0:0:1]:4317
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:297)
at okhttp3.internal.connection. ExchangeFinder.findConnection (Exchangefinder.kt: 226)
at okhttp3.internal.connection.okhttps.internal.connection.RealConnection.connect(RealConnection.kt:207)
В этом случае просто установите SE_ENABLE_TRACING=false
на все контейнер компонентов, чтобы отключить трассировку (каждый компонент экспортирует свои собственные следы).
Весь вывод отправляется в Stdout, поэтому его можно проверить, работая:
$ docker logs -f < container-id | container-name >
Вы можете увеличить выходной выход, передавая переменную среды в контейнеры:
SE_OPTS="--log-level FINE"
--shm-size="2g"
Зачем нужен --shm-size 2g
?
Это известный обходной путь, чтобы избежать падения браузера в контейнере Docker, вот задокументированные проблемы для Chrome и Firefox. Размер SHM 2 ГБ является произвольным, но, как известно, хорошо работает, ваш конкретный вариант использования может потребоваться другое значение, рекомендуется настроить это значение в соответствии с вашими потребностями.
Если вы видите следующие исключения селена:
Message: invalid argument: can't kill an exited process
или
Message: unknown error: Chrome failed to start: exited abnormally
или
[DriverServiceSessionFactory.apply] - Error while creating session with the driver service. Stopping driver service: java.util.concurrent.TimeoutException
Причина может заключаться в том, что вы установили переменную среды SE_START_XVFB
на false
, но забыли фактически запустить Firefox, Chrome или Edge в режиме без головы.
Общим сценарием является установка тома в контейнер браузера для получения загруженных файлов. Это хорошо работает в Windows и MacOS, но не без обходных путей в Linux. Для получения более подробной информации проверьте эту хорошо документированную проблему.
Например, при использовании Linux вы можете запустить контейнер следующим образом:
docker run -d -p 4444:4444 --shm-size= " 2g "
-v /home/ubuntu/files:/home/seluser/Downloads
selenium/standalone-chrome:4.26.0-20241101
Это установит каталог хоста /home/ubuntu/files
в каталог /home/seluser/Downloads
внутри контейнера (каталог загрузки браузера по умолчанию). Проблема происходит потому, что объем будет установлен как root
; Следовательно, браузер не может записать файл в этот каталог, потому что он работает под пользователем seluser
. Это происходит потому, что именно так Docker увеличивает объемы в Linux, более подробная информация в этом выпуске.
Обходной путь для этого состоит в том, чтобы создать каталог на хосте и изменить его разрешения перед установкой объема . В зависимости от ваших разрешений пользователя, вам может потребоваться использовать sudo
для некоторых из этих команд:
mkdir /home/ubuntu/files
chown 1200:1201 /home/ubuntu/files
После этого вы сможете загружать файлы в монтированный каталог. Если у вас есть лучший обходной путь, пришлите нам запрос на вытяжение!
Аналогично объемам монтирования для получения загруженных файлов. Для видеофайлов вам может понадобиться то же самое
mkdir /tmp/videos
chown 1200:1201 /tmp/videos