- Home
- Contenitore di sviluppo
- Tests
- Test di registrazione dello schermo
Test di registrazione dello schermo
Questo test verifica l’intero stack VNC/browser registrando una sessione del browser in modalità headed in un file MP4. Dimostra che:
- Xvfb è in esecuzione e accetta connessioni su
:99 - Chromium può essere avviato in modalità headed sul display virtuale
- ffmpeg può catturare il display tramite x11grab
- Il file MP4 risultante è un video valido e riproducibile
Come funziona
Sezione intitolata “Come funziona”- Interroga
xdpyinfo -display :99fino a quando il display X è pronto (stesso pattern dell’entrypoint) - Avvia la registrazione ffmpeg del display a 10 fps
- Lancia Chromium in modalità headed tramite la
sync_apidi Playwright - Naviga su
https://example.com(pausa di 3 s), poi suhttps://httpbin.org(pausa di 3 s) - Invia SIGTERM a ffmpeg per la finalizzazione pulita del file MP4
- Riporta il percorso di output e la dimensione del file
Salvate il seguente script come vnc-browser-test.py all’interno del container, oppure copiatelo dalla directory docs/tests/ di questo repository:
#!/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()Esecuzione del test
Sezione intitolata “Esecuzione del 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.mp4Output previsto
Sezione intitolata “Output previsto”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)Il file MP4 dovrebbe mostrare la finestra di Chromium che renderizza entrambi i siti web sul desktop fluxbox. Riproducetelo con ffplay, vlc, oppure scaricatelo dal container per verificare.
Significato di un errore
Sezione intitolata “Significato di un errore”| Sintomo | Causa probabile |
|---|---|
Xvfb display :99 not ready | Xvfb non avviato — verificare che l’entrypoint abbia eseguito lo stack VNC |
ffmpeg: x11grab error | Mismatch del display o ffmpeg privo del supporto x11grab |
Playwright launch error | Chromium non installato o mancanza di --no-sandbox |
| MP4 di 0 byte | ffmpeg è stato terminato prima della scrittura — verificare la gestione di SIGTERM |