- Inicio
- Contenedor de desarrollo
- Tests
- Prueba de Grabación de Pantalla
Prueba de Grabación de Pantalla
Esta prueba verifica la pila completa VNC/navegador mediante la grabación de una sesión de navegador en modo headed a un archivo MP4. Demuestra que:
- Xvfb está en ejecución y aceptando conexiones en
:99 - Chromium puede iniciarse en modo headed en la pantalla virtual
- ffmpeg puede capturar la pantalla mediante x11grab
- El MP4 resultante es un video válido y reproducible
Cómo Funciona
Sección titulada «Cómo Funciona»- Consulta
xdpyinfo -display :99hasta que la pantalla X esté lista (mismo patrón que el entrypoint) - Inicia la grabación de ffmpeg de la pantalla a 10 fps
- Lanza Chromium en modo headed a través de la
sync_apide Playwright - Navega a
https://example.com(pausa de 3 s), luego ahttps://httpbin.org(pausa de 3 s) - Envía SIGTERM a ffmpeg para la finalización limpia del MP4
- Reporta la ruta de salida y el tamaño del archivo
Guarde lo siguiente como vnc-browser-test.py dentro del contenedor, o cópielo desde el directorio docs/tests/ de este repositorio:
#!/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()Ejecución de la Prueba
Sección titulada «Ejecución de la Prueba»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.mp4Salida Esperada
Sección titulada «Salida Esperada»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)El MP4 debería mostrar la ventana de Chromium renderizando ambos sitios web en el escritorio de fluxbox. Reprodúzcalo con ffplay, vlc, o descárguelo del contenedor para verificarlo.
Qué Significa un Fallo
Sección titulada «Qué Significa un Fallo»| Síntoma | Causa probable |
|---|---|
Xvfb display :99 not ready | Xvfb no se inició — verifique que el entrypoint ejecutó la pila VNC |
ffmpeg: x11grab error | Discrepancia de pantalla o ffmpeg sin soporte para x11grab |
Playwright launch error | Chromium no está instalado o falta --no-sandbox |
| El MP4 tiene 0 bytes | ffmpeg fue terminado antes de escribir — verifique el manejo de SIGTERM |