Бывает полезно работать с Selenium Python в Docker-контейнере. В связи с этим возникают вопросы о выгоде использования таких инструментов, согласовании версий chromedriver
и Chromium, а также о нюансах их реализации. В этой статье мы рассмотрим основные вопросы и приведём решения часто встречающихся проблем.
Зачем запускать Selenium в Docker?
Запуск Selenium в контейнере дает целый ряд преимуществ.
Во-первых, вы легко переносите окружение между разными машинами, избегая конфликтов версий и зависимости от конкретной операционной системы.
Во-вторых, контейнер с Selenium можно быстро заменить или обновить, не затрагивая другие компоненты на сервере.
В-третьих, Selenium с Docker помогает при организации CI/CD-процессов: вы можете поднять среду тестирования «с нуля» каждый раз, когда необходимо проверить вашу систему.
cloud
Подготовка сервера с ОС Ubuntu к работе с Selenium под Docker
Шаг первый. Установка Docker и Docker Compose
Сперва нужно удостовериться, что Docker и Docker Compose установлены на сервере:
docker --version
docker compose version
Обратите внимание, что в некоторых версиях Docker Compose в терминале используется команда docker-compose
, вместо docker compose
.
Если инструменты установлены, вы увидите следующий ответ:
Если 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
Ожидаемый вывод:
Проверим правильность запуска:
docker compose ps
Видим два созданных контейнера. Значит, все загружено верно. Теперь в 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
Далее при подключении будет запрошен пароль. Чтобы его сгенерировать, подключитесь к созданному ранее selenium-container
через терминал:
docker exec -it selenium-container bash
Затем введём команду:
x11vnc -storepasswd
В интерактивном режиме появится предложение ввести пароль и подтвердить его.
Теперь введите созданный пароль в веб-интерфейсе VNC. Вы перейдете к управлению браузера, под управлением Selenium в Docker.
Тут же можно открыть DevTools для просмотра элементов в DOM-дереве или отладить получение запросов.
Подготовили для вас выгодные тарифы на облачные серверы
Заключение
Таким образом, запуск Selenium в Docker-контейнерах облегчает переносимость окружения и снижает риск конфликта версий между инструментами, а при необходимости позволяет визуально отлаживать тесты через VNC. Важно лишь правильно выбрать образ для нужной архитектуры и не забыть отключить режим headless, если планируется использование графического интерфейса. Всё это обеспечивает более гибкую и удобную инфраструктуру для тестирования и ускоряет интеграцию Selenium в CI/CD-пайплайн.