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

如何在Ruby的After Hook中修改Selenoid录制视频的文件名?

解决Selenoid视频文件名改为「时间戳+场景名」的问题

你的代码失效核心原因有两个:一是执行顺序错误——当前在After钩子中先执行重命名再退出Driver,但Selenoid要等Driver退出后才会把临时的selenoidxxxx.mp4重命名为session_id.mp4;二是文件匹配逻辑有问题,Dir.glob未正确遍历目标目录下的视频文件。

修正后的实现代码

重命名函数

def rename_video_files(session_id, scenario, failed = false)
  video_dir = "/end-to-end-test/test-reports/video-logs"
  target_file = File.join(video_dir, "#{session_id}.mp4")

  # 等待Selenoid完成视频文件重命名,最多等待10秒
  10.times do
    break if File.exist?(target_file)
    sleep 1
  end

  # 若文件仍不存在,直接返回
  return nil unless File.exist?(target_file)

  # 生成合规的新文件名:时间戳+场景名+失败标识
  timestamp = Time.now.strftime('%Y-%m-%d_%H-%M-%S')
  sanitized_scenario_name = scenario.name.gsub(/[^0-9A-Za-z.\-]/, '_')
  failure_suffix = failed ? '-FAILED' : ''
  new_filename = "#{timestamp}_#{sanitized_scenario_name}#{failure_suffix}.mp4"
  new_file_path = File.join(video_dir, new_filename)

  # 执行重命名并返回新文件名
  File.rename(target_file, new_file_path)
  new_filename
end

After钩子代码

After('@ui') do |scenario|
  session_id = page.driver.browser.session_id
  # 先退出Driver,触发Selenoid完成视频文件的最终命名
  page.driver.quit
  
  # 执行重命名并记录日志
  new_video_name = rename_video_files(session_id, scenario, scenario.failed?)
  logger.info "Recorded video name: #{new_video_name}" if new_video_name
end

关键修复点

  1. 调整执行顺序:必须先退出Driver,让Selenoid完成临时文件到session_id.mp4的重命名,才能找到目标文件。
  2. 添加等待逻辑:Driver退出后,Selenoid可能需要几秒处理视频文件,循环等待确保文件存在后再操作。
  3. 精准匹配文件:直接针对当前测试的session_id文件操作,避免多测试并行时误修改其他视频。
  4. 修复返回值:函数返回新文件名,确保日志能正确输出视频名称。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:34:54