远程Selenium环境下Protractor测试视频录制异常解决方案咨询
解决远程Selenium服务器上Protractor视频录制的问题
我完全懂你遇到的麻烦:本地跑Protractor时视频录制正常,切换到远程VM的Selenium服务器后,录的却是自己的本地桌面。核心原因很简单——protractor-video-reporter默认是在本地机器调用ffmpeg,而不是远程VM。要让录制工作在远程端完成,我们需要调整配置,让ffmpeg在远程VM上执行,同时处理好权限和路径的问题。
下面是具体的解决方案步骤:
1. 先搞定远程VM的基础环境
首先要在远程VM上完成这些准备工作:
- 安装ffmpeg,记好它的完整路径(比如
C:/FFmpeg/bin/ffmpeg.exe) - 手动测试ffmpeg能否正常录制桌面:打开命令行执行
ffmpeg -f gdigrab -framerate 30 -video_size wsxga -i desktop test.mpg,确认生成的视频是VM的桌面画面 - 确保远程VM的桌面会话处于活跃状态:如果用RDP连接,断开时Windows会锁定桌面,gdigrab根本捕获不到画面。可以改用VNC连接,或者修改组策略禁用会话锁定,也可以设置自动登录保持会话一直活跃
- 确保你用来远程执行命令的用户,在VM上有执行ffmpeg和访问桌面的权限
2. 用远程执行工具调用VM上的ffmpeg
我们需要借助远程执行工具(比如Sysinternals的psexec,或者PowerShell远程命令),让本地Protractor脚本触发远程VM上的ffmpeg录制。
方案A:用psexec(简单易上手)
先下载psexec.exe到本地机器,或者把它加入系统PATH。然后修改VideoReporter的配置:
const VideoReporter = require('protractor-video-reporter'); const path = require('path'); let config = { // ... 你的其他Protractor配置 ... onPrepare: () => { // ... 其他onPrepare逻辑 ... jasmine.getEnv().addReporter(new VideoReporter({ baseDirectory: './test-output/videoreport', createSubtitles: false, saveSuccessVideos: true, singleVideo: true, // 用psexec作为执行命令 ffmpegCmd: "psexec.exe", ffmpegArgs: [ // 指定远程VM的IP或机器名 "\\\\192.168.1.100", // 远程VM的用户凭证(注意:硬编码密码不安全,建议用环境变量传递) "-u", "VM-ADMIN-USER", "-p", "VM-USER-PASSWORD", // 远程VM上ffmpeg的完整路径 "C:/FFmpeg/bin/ffmpeg.exe", // 录制参数(针对VM桌面) '-f', 'gdigrab', '-framerate', '30', '-video_size', 'wsxga', '-i', 'desktop', '-q:v', '10', // 视频先保存到远程VM的临时路径,之后同步到本地 path.join('C:/test-output/videoreport', 'protractor-specs.mpg') ] })); } }; export { config };
方案B:用PowerShell远程执行(更安全,需配置WinRM)
如果不想用psexec,可以配置WinRM远程管理,用PowerShell的Invoke-Command执行远程ffmpeg:
jasmine.getEnv().addReporter(new VideoReporter({ // ... 其他配置 ... ffmpegCmd: "powershell.exe", ffmpegArgs: [ "-Command", // 这里用环境变量传递密码,避免硬编码 "Invoke-Command -ComputerName 192.168.1.100 -Credential (New-Object System.Management.Automation.PSCredential('VM-ADMIN-USER', (ConvertTo-SecureString $env:VM_PASSWORD -AsPlainText -Force))) -ScriptBlock { & 'C:/FFmpeg/bin/ffmpeg.exe' -f gdigrab -framerate 30 -video_size wsxga -i desktop -q:v 10 'C:/test-output/videoreport/protractor-specs.mpg' }" ] }));
3. 把远程视频同步到本地测试目录
上面的配置会把视频存在远程VM上,你需要在测试完成后,把视频复制到本地的./test-output/videoreport目录。可以在Protractor的onComplete钩子中添加同步逻辑,比如用robocopy或者PowerShell的Copy-Item:
onComplete: () => { // 用robocopy同步远程VM的视频到本地 const { execSync } = require('child_process'); execSync('robocopy \\\\192.168.1.100\\C$/test-output/videoreport ./test-output/videoreport protractor-specs.mpg /COPYALL'); }
关键注意事项
- 凭证安全:绝对不要在代码里硬编码密码,建议用环境变量或者Windows凭据管理器来存储加密的凭证
- 会话活跃:远程VM的桌面必须处于活跃状态,不能是锁定或断开的RDP会话,否则gdigrab无法捕获画面
- 权限问题:远程用户必须有足够的权限执行ffmpeg,并且能访问桌面会话(不要用系统账户运行Selenium,要用普通用户账户)
内容的提问来源于stack exchange,提问作者Debasish Mukherjee
相关产品推荐
相关产品推荐

