- Accueil
- Conteneur de développement
- Tests
- Test d'enregistrement d'écran
Test d'enregistrement d'écran
Ce test vérifie l’ensemble de la pile VNC/navigateur en enregistrant une session de navigateur en mode graphique dans un fichier MP4. Il prouve que :
- Xvfb est en cours d’exécution et accepte les connexions sur
:99 - Chromium peut se lancer en mode graphique sur l’affichage virtuel
- ffmpeg peut capturer l’affichage via x11grab
- Le fichier MP4 résultant est une vidéo valide et lisible
Fonctionnement
Section intitulée « Fonctionnement »- Interroge
xdpyinfo -display :99jusqu’à ce que l’affichage X soit prêt (même méthode que le point d’entrée) - Démarre l’enregistrement ffmpeg de l’affichage à 10 fps
- Lance Chromium en mode graphique via la
sync_apide Playwright - Navigue vers
https://example.com(pause de 3 s), puishttps://httpbin.org(pause de 3 s) - Envoie SIGTERM à ffmpeg pour une finalisation propre du MP4
- Affiche le chemin de sortie et la taille du fichier
Enregistrez le contenu suivant sous le nom vnc-browser-test.py à l’intérieur du conteneur, ou copiez-le depuis le répertoire docs/tests/ de ce dépôt :
#!/usr/bin/env python3"""VNC/browser stack integration test.
Proves that Xvfb, headed Chromium (via Playwright), and ffmpeg screenrecording all work together inside the devcontainer by recording abrowser navigating to two websites and producing an MP4 video.
Usage: python3 vnc-browser-test.py [output_path]Default output: /tmp/recording.mp4"""
import osimport signalimport subprocessimport sysimport time
DISPLAY = os.environ.get("DISPLAY", ":99")DEFAULT_OUTPUT = "/tmp/recording.mp4"RESOLUTION = "1280x1024"FRAMERATE = "10"XVFB_TIMEOUT = 50 # iterations (~5 s at 0.1 s each)SITES = [ ("https://example.com", 3), ("https://httpbin.org", 3),]
def wait_for_xvfb(): """Poll xdpyinfo until the X display is ready (mirrors entrypoint.sh).""" print(f"Waiting for Xvfb on {DISPLAY} ...") for i in range(XVFB_TIMEOUT): result = subprocess.run( ["xdpyinfo", "-display", DISPLAY], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, ) if result.returncode == 0: print(f" Display ready after {i * 0.1:.1f}s") return time.sleep(0.1) sys.exit(f"ERROR: Xvfb display {DISPLAY} not ready after {XVFB_TIMEOUT * 0.1:.1f}s")
def start_recording(output_path): """Start ffmpeg x11grab recording and return the process.""" cmd = [ "ffmpeg", "-y", "-f", "x11grab", "-video_size", RESOLUTION, "-framerate", FRAMERATE, "-i", f"{DISPLAY}.0", "-c:v", "libx264", "-preset", "ultrafast", "-pix_fmt", "yuv420p", output_path, ] print(f"Starting ffmpeg recording -> {output_path}") return subprocess.Popen( cmd, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, )
def stop_recording(proc): """Send SIGTERM and wait for ffmpeg to finalize the MP4.""" print("Stopping ffmpeg ...") proc.send_signal(signal.SIGTERM) try: proc.wait(timeout=10) except subprocess.TimeoutExpired: proc.kill() proc.wait()
def browse_sites(): """Launch headed Chromium via Playwright and visit each site.""" from playwright.sync_api import sync_playwright # noqa: PLC0415
with sync_playwright() as pw: browser = pw.chromium.launch( headless=False, args=[ "--no-sandbox", "--disable-gpu", f"--display={DISPLAY}", ], ) page = browser.new_page(viewport={"width": 1280, "height": 1024})
for url, pause in SITES: print(f" Navigating to {url} ...") try: page.goto(url, timeout=15000) except Exception as exc: # noqa: BLE001 print(f" Warning: navigation error ({exc}), continuing") time.sleep(pause)
browser.close()
def main(): output_path = sys.argv[1] if len(sys.argv) > 1 else DEFAULT_OUTPUT
wait_for_xvfb()
ffmpeg = start_recording(output_path) # Give ffmpeg a moment to initialize before browser activity time.sleep(1)
try: browse_sites() finally: stop_recording(ffmpeg)
if os.path.isfile(output_path): size = os.path.getsize(output_path) print(f"\nSUCCESS: {output_path} ({size:,} bytes)") else: sys.exit(f"ERROR: output file not created: {output_path}")
if __name__ == "__main__": main()Exécution du test
Section intitulée « Exécution du test »python3 vnc-browser-test.py /tmp/recording.mp4podman run --rm \ -v $(pwd)/output:/output \ ghcr.io/f5-sales-demo/devcontainer:latest \ python3 vnc-browser-test.py /output/recording.mp4Sortie attendue
Section intitulée « Sortie attendue »Waiting for Xvfb on :99 ... Display ready after 0.3sStarting ffmpeg recording -> /tmp/recording.mp4 Navigating to https://example.com ... Navigating to https://httpbin.org ...Stopping ffmpeg ...
SUCCESS: /tmp/recording.mp4 (1,234,567 bytes)Le fichier MP4 devrait montrer la fenêtre Chromium affichant les deux sites web sur le bureau fluxbox. Lisez-le avec ffplay, vlc, ou téléchargez-le depuis le conteneur pour vérifier.
Signification d’un échec
Section intitulée « Signification d’un échec »| Symptôme | Cause probable |
|---|---|
Xvfb display :99 not ready | Xvfb non démarré — vérifiez que le point d’entrée a lancé la pile VNC |
ffmpeg: x11grab error | Inadéquation de l’affichage ou ffmpeg ne supporte pas x11grab |
Playwright launch error | Chromium non installé ou --no-sandbox manquant |
| Le MP4 fait 0 octet | ffmpeg a été arrêté avant l’écriture — vérifiez la gestion du SIGTERM |