如何在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
关键修复点
- 调整执行顺序:必须先退出Driver,让Selenoid完成临时文件到
session_id.mp4的重命名,才能找到目标文件。 - 添加等待逻辑:Driver退出后,Selenoid可能需要几秒处理视频文件,循环等待确保文件存在后再操作。
- 精准匹配文件:直接针对当前测试的
session_id文件操作,避免多测试并行时误修改其他视频。 - 修复返回值:函数返回新文件名,确保日志能正确输出视频名称。
内容的提问来源于stack exchange,提问作者desislava_453
相关产品推荐
相关产品推荐

