Бывает полезно работать с Selenium Python в Docker-контейнере. В связи с этим возникают вопросы о выгоде использования таких инструментов, согласовании версий chromedriver
и Chromium, а также о нюансах их реализации. В этой статье мы рассмотрим основные вопросы и приведём решения часто встречающихся проблем.
Запуск Selenium в контейнере дает целый ряд преимуществ.
Во-первых, вы легко переносите окружение между разными машинами, избегая конфликтов версий и зависимости от конкретной операционной системы.
Во-вторых, контейнер с Selenium можно быстро заменить или обновить, не затрагивая другие компоненты на сервере.
В-третьих, Selenium с Docker помогает при организации CI/CD-процессов: вы можете поднять среду тестирования «с нуля» каждый раз, когда необходимо проверить вашу систему.
cloud
Сперва нужно удостовериться, что Docker и Docker Compose установлены на сервере:
docker --version
docker compose version
Обратите внимание, что в некоторых версиях Docker Compose в терминале используется команда docker-compose
, вместо docker compose
.
Если инструменты установлены, вы увидите следующий ответ:
Если Docker и Docker Compose не установлены, воспользуйтесь инструкцией из другой статьи.
Этот шаг необязателен, но его выполнение рекомендуется, чтобы избежать ошибок при загрузке образов из Docker Hub.
У Timeweb Cloud есть собственные бесплатные прокси для dockerhub.io
. Для установки воспользуйтесь короткой инструкцией. Это займет не более пяти минут.
При развертывании 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
можно интегрировать скрипт для работы с любым сайтом.
В официальных 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-пайплайн.