- الرئيسية
- حاوية التطوير
- Tests
- اختبار تسجيل الشاشة
اختبار تسجيل الشاشة
يتحقق هذا الاختبار من مجموعة VNC/المتصفح الكاملة عن طريق تسجيل جلسة متصفح مرئي إلى ملف MP4. يثبت أن:
- Xvfb يعمل ويقبل الاتصالات على
:99 - Chromium يمكنه الإقلاع في الوضع المرئي على العرض الافتراضي
- ffmpeg يمكنه التقاط العرض عبر x11grab
- ملف MP4 الناتج هو فيديو صالح وقابل للتشغيل
كيف يعمل
Section titled “كيف يعمل”- يستطلع
xdpyinfo -display :99حتى يصبح عرض X جاهزًا (نفس النمط المستخدم في نقطة الدخول) - يبدأ تسجيل ffmpeg للعرض بمعدل 10 إطارات في الثانية
- يُطلق Chromium في الوضع المرئي عبر
sync_apiالخاصة بـ Playwright - ينتقل إلى
https://example.com(توقف 3 ثوانٍ)، ثمhttps://httpbin.org(توقف 3 ثوانٍ) - يرسل SIGTERM إلى ffmpeg لإنهاء ملف MP4 بشكل نظيف
- يعرض مسار الإخراج وحجم الملف
السكربت
Section titled “السكربت”احفظ الملف التالي باسم vnc-browser-test.py داخل الحاوية، أو انسخه من مجلد docs/tests/ في هذا المستودع:
#!/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()تشغيل الاختبار
Section titled “تشغيل الاختبار”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.mp4الإخراج المتوقع
Section titled “الإخراج المتوقع”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)يجب أن يُظهر ملف MP4 نافذة Chromium وهي تعرض كلا الموقعين على سطح مكتب fluxbox. قم بتشغيله باستخدام ffplay أو vlc، أو قم بتنزيله من الحاوية للتحقق.
ماذا يعني الفشل
Section titled “ماذا يعني الفشل”| العَرَض | السبب المحتمل |
|---|---|
Xvfb display :99 not ready | لم يتم تشغيل Xvfb — تحقق من أن نقطة الدخول قامت بتشغيل مجموعة VNC |
ffmpeg: x11grab error | عدم تطابق في العرض أو عدم دعم ffmpeg لـ x11grab |
Playwright launch error | Chromium غير مثبت أو خيار --no-sandbox مفقود |
| ملف MP4 بحجم 0 بايت | تم إنهاء ffmpeg قبل الكتابة — تحقق من معالجة SIGTERM |