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

远程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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:59:10