Il est parfois utile d’exécuter Selenium en Python dans un conteneur Docker. Cela soulève plusieurs questions : quels sont les avantages de cette approche, comment assurer la compatibilité entre ChromeDriver et Chromium, et quelles sont les subtilités de la mise en œuvre ? Dans cet article, nous aborderons ces points essentiels et proposerons des solutions aux problèmes les plus fréquents.
L’exécution de Selenium dans un conteneur offre de nombreux avantages :
🧩 Portabilité – Vous pouvez facilement transférer votre environnement d’une machine à une autre sans conflit de versions ni dépendances spécifiques à un système d’exploitation.
🧱 Isolation – Le conteneur Selenium peut être remplacé ou mis à jour rapidement sans affecter d’autres composants du serveur.
Avant de commencer, assurez-vous que Docker et Docker Compose sont installés :
docker --version && docker compose version
💡 Dans certaines versions, la commande est docker-compose (avec un tiret) au lieu de docker compose.
Si les outils sont installés, leurs versions s’afficheront. Sinon, installez-les avant de poursuivre.
Lors du déploiement de Selenium dans des conteneurs Docker, il faut prendre en compte :
l’architecture de l’hôte,
les besoins fonctionnels,
et la performance attendue.
Les images officielles selenium/standalone-* sont prévues pour les processeurs AMD64 (x86_64), tandis que seleniarm/standalone-* sont adaptées aux architectures ARM (comme Apple Silicon ou les serveurs ARM64).
Créez un fichier docker-compose.yml à la racine de votre projet :
version: "3"
services:
app:
build: .
restart: always
volumes:
- .:/app
depends_on:
- selenium
platform: linux/amd64
selenium:
image: selenium/standalone-chromium:latest # For AMD64
# image: seleniarm/standalone-chromium:latest # For 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
Sélectionnez l’image adaptée à votre système en décommentant la bonne ligne. Le service app contiendra votre code Python principal.
Voici un Dockerfile standard :
# Use a minimal Python image
FROM python:3.11-slim
# Set working directory
WORKDIR /app
# Install Python dependencies
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
# Copy project files
COPY . /app/
# Set environment variables (Chromium is in a separate container)
ENV SELENIUM_REMOTE_URL="http://selenium:4444/wd/hub"
# Run Python script
CMD ["python", "main.py"]
Cette configuration utilise une image Python minimale et installe automatiquement les dépendances requises.
import time # Used to create a delay for checking browser functionality
import os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
# WebDriver settings
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
)
# Open a test page
driver.get("https://www.hostman.com")
time.sleep(9999)
# Shut down WebDriver
driver.quit()
requirements.txt
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
Démarrez les conteneurs :
docker compose up -d
Docker construira et lancera les conteneurs en arrière-plan.
Pour vérifier leur état :
docker compose ps
Vous devriez voir deux conteneurs en cours d’exécution, indiquant que tout fonctionne correctement. Vous pouvez désormais interagir avec des sites web via le script Selenium.
Dans les images officielles Selenium (comme selenium/standalone-chrome ou seleniarm/standalone-chromium), l’accès direct au Chrome DevTools Protocol (CDP) est géré par Selenium Grid. Chaque session crée un nouveau port WebSocket, ce qui rend l’accès direct impossible depuis l’extérieur du conteneur.
Les options telles que --remote-debugging-port=9229 sont donc ignorées ou remplacées.
À la place, ces images incluent un serveur VNC (Virtual Network Computing) intégré, similaire à TeamViewer ou AnyDesk.
⚠️ Le mode headless doit être désactivé, car VNC diffuse l’écran réel du navigateur.
Connectez-vous à l’interface web VNC via :
http://<server_ip>:7900
Lors de la première connexion, un mot de passe sera demandé. Générez-le dans le conteneur Selenium :
docker exec -it selenium-container bash
x11vnc -storepasswd
Entrez et confirmez le mot de passe, puis utilisez-le sur l’interface VNC. Vous pourrez alors visualiser et contrôler le navigateur géré par Selenium directement dans Docker. Cela permet d’ouvrir les DevTools, d’inspecter le DOM ou de suivre les requêtes réseau.
Exécuter Selenium dans des conteneurs Docker simplifie la gestion des environnements, réduit les conflits de versions et améliore la portabilité. Grâce à l’intégration de VNC, vous pouvez également effectuer des débogages visuels.
Veillez simplement à :
choisir l’image adaptée à votre architecture (AMD64 ou ARM64),
et désactiver le mode headless si une interface graphique est nécessaire.
Cette configuration offre une infrastructure de test flexible, stable et adaptée aux pipelines CI/CD modernes.