在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支持直接对接录屏工具,步骤如下:
- 安装依赖包:
sudo apt install xvfb x11vnc ffmpeg -y pip install pyvirtualdisplay selenium screen-recorder
- 修改测试代码:
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
相关产品推荐
相关产品推荐

