You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在AWS EC2上用xvfbwrapper运行Xvfb录制Selenium无头会话无视频文件问题

问题分析与解决方案

你的代码仅完成了启动Xvfb虚拟显示、运行Selenium测试的基础功能,完全没有配置视频录制逻辑——xvfbwrapper本身只是用于创建和管理虚拟X服务器,并不自带屏幕录制能力,这就是找不到视频文件的核心原因。

实现视频录制的两种可行方案

方案1:用ffmpeg直接录制Xvfb虚拟屏幕

Xvfb启动后会占用一个显示端口(可手动指定),通过ffmpeg抓取该端口的画面即可生成视频。修改代码如下:

from selenium import webdriver
from xvfbwrapper import Xvfb
import subprocess
import unittest

class TestPages(unittest.TestCase):

    def setUp(self):
        # 启动Xvfb,指定显示端口为:99,分辨率与色深
        self.xvfb = Xvfb(width=1280, height=720, colordepth=24, display_num=99)
        self.xvfb.start()
        self.addCleanup(self.xvfb.stop)
        
        # 启动ffmpeg录屏,保存到当前目录的test_recording.mp4
        self.ffmpeg_proc = subprocess.Popen([
            'ffmpeg',
            '-f', 'x11grab',
            '-r', '25',  # 设置录制帧率
            '-s', '1280x720',  # 分辨率需与Xvfb一致
            '-i', ':99',  # 对应Xvfb的显示端口
            '-c:v', 'libx264',
            '-preset', 'ultrafast',
            'test_recording.mp4'
        ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
        self.addCleanup(self.ffmpeg_proc.terminate)
        
        self.browser = webdriver.Chrome()
        self.addCleanup(self.browser.quit)

    def testUbuntuHomepage(self):
        self.browser.get('http://www.ubuntu.com')
        self.assertIn('Ubuntu', self.browser.title)

    def testGoogleHomepage(self):
        self.browser.get('http://www.google.com')
        self.assertIn('Google', self.browser.title)


if __name__ == '__main__':
    unittest.main()

先在EC2实例安装ffmpeg依赖:

sudo apt update && sudo apt install ffmpeg -y

方案2:用pyvirtualdisplay替代xvfbwrapper,集成录屏功能

pyvirtualdisplay支持直接对接录屏工具,步骤如下:

  1. 安装依赖包:
sudo apt install xvfb x11vnc ffmpeg -y
pip install pyvirtualdisplay selenium screen-recorder
  1. 修改测试代码:
from selenium import webdriver
from pyvirtualdisplay import Display
from screen_recorder_sdk import screen_recorder
import unittest

class TestPages(unittest.TestCase):

    def setUp(self):
        # 启动虚拟显示
        self.display = Display(size=(1280, 720))
        self.display.start()
        self.addCleanup(self.display.stop)
        
        # 初始化录屏,保存到当前目录
        screen_recorder.start_video_recording("test_recording.mp4", 5, 10)
        self.addCleanup(screen_recorder.stop_video_recording)
        
        self.browser = webdriver.Chrome()
        self.addCleanup(self.browser.quit)

    def testUbuntuHomepage(self):
        self.browser.get('http://www.ubuntu.com')
        self.assertIn('Ubuntu', self.browser.title)

    def testGoogleHomepage(self):
        self.browser.get('http://www.google.com')
        self.assertIn('Google', self.browser.title)


if __name__ == '__main__':
    unittest.main()

视频文件位置说明

执行测试后,视频文件会生成在你运行测试脚本的当前工作目录下,而非主目录或/tmp。若不确定当前路径,可在代码中添加打印:

import os
print("当前工作目录:", os.getcwd())

同时需确保运行脚本的用户对当前目录有写入权限,EC2默认用户(如ubuntu)通常具备该权限。

内容的提问来源于stack exchange,提问作者PiotrK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:25:18