<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Публичное облако на базе VMware с управлением через vCloud Director
Вход / Регистрация

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

Роман Панков
Роман Панков
Технический писатель
25 февраля 2025 г.
129
6 минут чтения
Средний рейтинг статьи: 5

Бывает полезно работать с 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.

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

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-дереве или отладить получение запросов.

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

Заключение

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

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