Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

Использование Selenium с браузером Chrome в Docker

1800
6 минут чтения
Средний рейтинг статьи: 2.4

Бывает полезно работать с Selenium Python в Docker-контейнере. В связи с этим возникают вопросы о выгоде использования таких инструментов, согласовании версий chromedriver и Chromium, а также о нюансах их реализации. В этой статье мы рассмотрим основные вопросы и приведём решения часто встречающихся проблем.

Зачем запускать Selenium в Docker?

Запуск Selenium в контейнере дает целый ряд преимуществ. 

Во-первых, вы легко переносите окружение между разными машинами, избегая конфликтов версий и зависимости от конкретной операционной системы. 

Во-вторых, контейнер с Selenium можно быстро заменить или обновить, не затрагивая другие компоненты на сервере.

В-третьих, Selenium с Docker помогает при организации CI/CD-процессов: вы можете поднять среду тестирования «с нуля» каждый раз, когда необходимо проверить вашу систему.

Облачные серверы

Масштабируемые вычислительные ресурсы
по всему миру с почасовой оплатой.

Подготовка сервера с ОС Ubuntu к работе с Selenium под Docker

Шаг первый. Установка Docker и Docker Compose

Сперва нужно удостовериться, что Docker и Docker Compose установлены на сервере:

    
docker --version docker compose version

Обратите внимание, что в некоторых версиях Docker Compose в терминале используется команда docker-compose, вместо docker compose.

Если инструменты установлены, вы увидите следующий ответ:

Image6

Если Docker и Docker Compose не установлены, воспользуйтесь инструкцией из другой статьи.

Шаг второй. Установка прокси для Docker Hub от Timeweb Cloud

Этот шаг необязателен, но его выполнение рекомендуется, чтобы избежать ошибок при загрузке образов из Docker Hub.

У Timeweb Cloud есть собственные бесплатные прокси для dockerhub.io. Для установки воспользуйтесь короткой инструкцией. Это займет не более пяти минут.

Пример работы с Selenium в Docker

При развертывании Selenium в контейнерах Docker важно учитывать архитектуру хоста, требования к функциональности и производительность. Официальные образы selenium/standalone-* предназначены для процессоров AMD64 (x86_64), в то время как seleniarm/standalone-* адаптированы для ARM-архитектур, таких как процессоры Apple silicon и серверные ARM64-процессоры.

Сперва создадим файл docker-compose.yml в корне проекта. Он будет содержать два сервиса:

    
version: "3" services: app: build: . restart: always volumes: - .:/app depends_on: - selenium platform: linux/amd64 selenium: image: selenium/standalone-chromium:latest # Для AMD64 # image: seleniarm/standalone-chromium:latest # Для ARM64 container_name: selenium-container restart: unless-stopped shm_size: 2g ports: - "4444:4444" # Selenium WebDriver API - "7900:7900" # VNC Viewer environment: - SE_NODE_MAX_SESSIONS=1 - SE_NODE_OVERRIDE_MAX_SESSIONS=true - SE_NODE_SESSION_TIMEOUT=300 - SE_NODE_GRID_URL=http://localhost:4444 - SE_NODE_DETECT_DRIVERS=false

Обратите внимание, что в предложенном примере файла нужно самостоятельно выбрать образ в зависимости от архитектуры системы и раскомментировать требуемую строку.

Сервис app будет использоваться для исполнения основного Python-кода. Пропишем стандартный Dockerfile для этого сервиса:

    
# Используем минимальный образ Python FROM python:3.11-slim # Устанавливаем рабочую директорию WORKDIR /app # Устанавливаем зависимости Python COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt # Копируем файлы проекта COPY . /app/ # Переменные окружения (Chromium уже в другом контейнере) ENV SELENIUM_REMOTE_URL="http://selenium:4444/wd/hub" # Запускаем Python-скрипт CMD ["python", "main.py"]

Этот Dockerfile использует образ Python и автоматически устанавливает зависимости.

Далее пропишем скрипт с инициализацией драйвера в main.py:

    
import time # Используем для создания задержки при проверке работоспособности браузера import os from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options # Настройки для WebDriver chrome_options = Options() chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--disable-webrtc") chrome_options.add_argument("--hide-scrollbars") chrome_options.add_argument("--disable-notifications") chrome_options.add_argument("--start-maximized") SELENIUM_REMOTE_URL = os.getenv("SELENIUM_REMOTE_URL", "http://selenium:4444/wd/hub") driver = webdriver.Remote( command_executor=SELENIUM_REMOTE_URL, options=chrome_options ) # Открываем тестовую страницу driver.get("https://www.timeweb.cloud") time.sleep(9999) # Завершаем работу WebDriver driver.quit()

В файле requirements.txt можно прописать стандартный пакет зависимостей, устанавливаемый вместе с Selenium:

    
attrs==25.1.0 certifi==2025.1.31 h11==0.14.0 idna==3.10 outcome==1.3.0.post0 PySocks==1.7.1 selenium==4.28.1 sniffio==1.3.1 sortedcontainers==2.4.0 trio==0.28.0 trio-websocket==0.11.1 typing_extensions==4.12.2 urllib3==2.3.0 websocket-client==1.8.0 wsproto==1.2.0

Теперь можно запустить контейнеры:

    
docker compose up -d

Ожидаемый вывод:

Image3

Проверим правильность запуска:

    
docker compose ps

Image1

Видим два созданных контейнера. Значит, все загружено верно. Теперь в main.py можно интегрировать скрипт для работы с любым сайтом.

Отладка Selenium Docker с помощью VNC

В официальных Docker-образах Selenium (включая seleniarm/standalone-chromium, selenium/standalone-chrome и т.д.) доступ к Chrome DevTools Protocol напрямую практически всегда «перебивается» Selenium Grid. Он генерирует собственный порт для каждого сеанса и проксирует через WebSocket. Параметры вроде --remote-debugging-port=9229 игнорируются и перезаписываются Selenium, поэтому прямой доступ к порту браузера извне невозможен.

Но взаимен Docker-образы предлагают встроенную технологию VNC — Virtual Network Computing. Она похожа на TeamViewer или AnyDesk, но работает немного иначе.

Для работы VNC необходимо отключить режим headless, так как VNC передаёт изображение экрана, а если экран пуст, то и в VNC ничего не будет видно.

Подключимся к веб-сервису VNC по адресу:http://<server_ip>:7900

Image4

Далее при подключении будет запрошен пароль. Чтобы его сгенерировать, подключитесь к созданному ранее selenium-container через терминал:

    
docker exec -it selenium-container bash

Image2

Затем введём команду:

    
x11vnc -storepasswd

В интерактивном режиме появится предложение ввести пароль и подтвердить его.

Image5

Теперь введите созданный пароль в веб-интерфейсе VNC. Вы перейдете к управлению браузера, под управлением Selenium в Docker.

Тут же можно открыть DevTools для просмотра элементов в DOM-дереве или отладить получение запросов.

Подготовили для вас выгодные тарифы на облачные серверы

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Заключение

Таким образом, запуск Selenium в Docker-контейнерах облегчает переносимость окружения и снижает риск конфликта версий между инструментами, а при необходимости позволяет визуально отлаживать тесты через VNC. Важно лишь правильно выбрать образ для нужной архитектуры и не забыть отключить режим headless, если планируется использование графического интерфейса. Всё это обеспечивает более гибкую и удобную инфраструктуру для тестирования и ускоряет интеграцию Selenium в CI/CD-пайплайн.

1800
6 минут чтения
Средний рейтинг статьи: 2.4
Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
Пока нет комментариев