Aller au contenu

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

shm_size: 2gb

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'environnement SELENIUM_REMOTE_URL=http://perfshop-selenium:4444/wd/hub passée au test-runner par le compose.
  • --no-sandbox et --disable-dev-shm-usage sont les flags Chrome classiques pour fonctionner dans un container (même avec shm_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 vers localhost. 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