Selenium¶
perfshop-selenium fournit un Selenium Grid standalone Chrome qui sert de backend WebDriver à toutes les exécutions de tests E2E de la stack QA (Robot Framework + SeleniumLibrary, pytest + selenium, plus tard éventuellement Cypress ou Playwright).
Source de vérité
Cette page est tirée du bloc perfshop-selenium des fichiers compose.
Image et mode¶
perfshop-selenium:
image: selenium/standalone-chrome:latest
container_name: perfshop-selenium
shm_size: 2gb
environment:
- SE_NODE_MAX_SESSIONS=2
- SE_VNC_NO_PASSWORD=1
- SE_START_XVFB=true
ports:
- "${SELENIUM_HTTP_PORT:-4444}:4444"
- "${SELENIUM_VNC_PORT:-7900}:7900"
PerfShop utilise l'image officielle selenium/standalone-chrome:latest. Le mode « standalone » signifie que hub, node et navigateur sont dans le même container — pas de Grid distribué à gérer. C'est largement suffisant pour les besoins pédagogiques de PerfShop (un ou deux tests simultanés), et ça simplifie énormément le déploiement.
Variables d'environnement critiques¶
| Variable | Valeur | Effet |
|---|---|---|
SE_NODE_MAX_SESSIONS=2 |
— | Maximum 2 sessions WebDriver simultanées par node. Permet à un étudiant de lancer un test via Scripts UI pendant qu'une campagne Squash TM tourne en parallèle. |
SE_VNC_NO_PASSWORD=1 |
— | Désactive le mot de passe noVNC. Cela permet à un étudiant d'ouvrir http://localhost:7900 sans avoir à entrer « secret » (le mot de passe par défaut de l'image), ce qui serait un obstacle pédagogique. |
SE_START_XVFB=true |
— | Force le démarrage d'un serveur X virtuel (Xvfb). Nécessaire pour que Chrome tourne en mode headless-compatible dans le container, tout en restant capturable par VNC. |
shm_size: 2gb — mémoire partagée¶
Cette option Docker alloue 2 Go de mémoire partagée (/dev/shm) au container Selenium. C'est une contrainte dure de Chrome : sans cette allocation, Chrome crashe de façon imprévisible lors de l'ouverture d'onglets ou de l'exécution de scripts JavaScript complexes, avec des erreurs du type DevToolsActivePort file doesn't exist ou des segfaults silencieux.
L'image officielle Selenium documente cette exigence. PerfShop l'applique systématiquement.
Deux ports exposés¶
flowchart LR
TR["perfshop-test-runner<br/>(Robot Framework / pytest)"]
subgraph SEL["perfshop-selenium"]
direction TB
WD["WebDriver endpoint<br/>:4444/wd/hub"]
VNC["noVNC server<br/>:7900"]
CHROME["Google Chrome<br/>(headless / Xvfb)"]
WD --> CHROME
VNC --> CHROME
end
USER["Formateur<br/>ou étudiant"]
TR -->|"POST /wd/hub/session<br/>GET /wd/hub/status"| WD
USER -->|"http://localhost:7900<br/>(noVNC web client)"| VNC
Port 4444 — WebDriver¶
C'est le port standard Selenium. Tous les clients WebDriver (Java, Python, JavaScript, Robot Framework) parlent à cet endpoint en HTTP. L'URL complète du hub est http://perfshop-selenium:4444/wd/hub (en DNS interne) ou http://localhost:4444/wd/hub (depuis l'hôte).
C'est cette URL qui est passée aux test-runner via la variable d'environnement SELENIUM_REMOTE_URL (voir test-runner.md).
Port 7900 — noVNC¶
Le port 7900 est une fonctionnalité pédagogique majeure. Il expose un client noVNC (VNC sur WebSocket dans le navigateur) qui permet à n'importe qui d'ouvrir un onglet http://localhost:7900 et de voir en direct la session Chrome qui exécute le test.
sequenceDiagram
autonumber
actor E as Étudiant
participant NAV as Navigateur<br/>(onglet 1)
participant SEL as perfshop-selenium<br/>:7900 noVNC
participant CHROME as Chrome dans le container<br/>(Xvfb)
participant TR as perfshop-test-runner
E->>NAV: Ouvre http://localhost:7900
NAV->>SEL: WebSocket noVNC
SEL->>CHROME: Capture framebuffer
CHROME-->>SEL: Pixels
SEL-->>NAV: Flux vidéo WebSocket
NAV-->>E: Affiche Chrome en direct
Note over E,TR: Pendant ce temps, un test tourne
TR->>SEL: POST /wd/hub/session (launch Chrome)
SEL->>CHROME: Navigue, clique, remplit des formulaires
Note over NAV,CHROME: L'étudiant voit tout en temps réel<br/>dans son onglet noVNC
Concrètement, pendant qu'un test Robot Framework tourne depuis le test-runner, l'étudiant peut ouvrir noVNC sur un deuxième écran et regarder Chrome naviguer, cliquer, remplir les formulaires — exactement comme s'il partageait l'écran d'une machine virtuelle.
C'est particulièrement utile pour :
- Debugger un test qui échoue : voir où Chrome s'arrête, quel élément n'est pas trouvé
- Démontrer un scénario : le formateur lance un test, les étudiants regardent le déroulement en direct
- Comprendre WebDriver : visualiser concrètement qu'un test pilote un vrai navigateur
Pas de mot de passe noVNC¶
Avec SE_VNC_NO_PASSWORD=1, le client noVNC s'ouvre directement sur la session Chrome sans prompt de mot de passe. C'est un choix pédagogique : un étudiant qui découvre l'outil ne doit pas se heurter à une invite de mot de passe secret non documentée.
Ports alternatifs selon l'environnement
Les variables SELENIUM_HTTP_PORT (défaut 4444) et SELENIUM_VNC_PORT (défaut 7900) permettent de remapper les ports hôtes en cas de conflit. Les ports internes (4444 et 7900) sont fixes — ils sont définis par l'image Selenium officielle.
Pas de dépendance déclarée¶
Selenium n'a aucun depends_on dans le compose : il démarre en parallèle des autres services. C'est cohérent — le test-runner lui enverra une requête WebDriver uniquement au moment où un test commence, et si Selenium n'est pas encore prêt à ce moment, le test-runner retry ou échoue proprement.
En pratique, Selenium démarre en 10 à 20 secondes (téléchargement Chrome, démarrage Xvfb, lancement du hub). C'est plus rapide que Squash TM qui a un start_period: 120s, donc Selenium est toujours prêt avant la première exécution.
Cas d'usage typique — Robot Framework¶
Voici à quoi ressemble l'utilisation de Selenium depuis un test Robot Framework qui tourne dans le test-runner :
*** Settings ***
Library SeleniumLibrary
*** Variables ***
${SELENIUM_URL} %{SELENIUM_REMOTE_URL}
${FRONTEND_URL} %{PERFSHOP_FRONTEND_INTERNAL}
*** Test Cases ***
Login Étudiant
Open Browser ${FRONTEND_URL}/login chrome
... remote_url=${SELENIUM_URL}
... options=add_argument("--no-sandbox"); add_argument("--disable-dev-shm-usage")
Input Text id=email demo@perfshop.io
Input Password id=password demo
Click Button Se connecter
Wait Until Page Contains Mon compte
Close Browser
Points-clés :
${SELENIUM_URL}est lu depuis la variable d'environnementSELENIUM_REMOTE_URL=http://perfshop-selenium:4444/wd/hubpassée au test-runner par le compose.--no-sandboxet--disable-dev-shm-usagesont les flags Chrome classiques pour fonctionner dans un container (même avecshm_size: 2gb, certains patterns d'exécution en bénéficient).${FRONTEND_URL}pointe vers le frontend en DNS interne Docker (http://perfshop-frontend:80), pas verslocalhost. Le container Chrome voit le réseau Docker, pas le réseau hôte.
Ports¶
| Service | Port hôte par défaut | Port container | Variable d'env |
|---|---|---|---|
perfshop-selenium |
4444 | 4444 | SELENIUM_HTTP_PORT |
perfshop-selenium |
7900 | 7900 | SELENIUM_VNC_PORT |
Pour aller plus loin¶
- Test Runner — consommateur principal de Selenium
- Scripts UI — lance des tests RF qui utilisent Selenium
- Squash Orchestrator — déclenche les mêmes tests via SSH
- Stack QA — Vue d'ensemble — workflow complet