Karate Cucumber测试报告UI视频空白,Docker环境视频自动复制失败求助
在使用Docker化的Chrome容器(karatelabs/karate-chrome)执行Karate UI测试时,Cucumber测试报告中的视频显示空白。已确认容器内存在视频文件/tmp/karate.mp4,手动复制到本地正常,但测试结束后Karate无法自动完成复制操作。
配置代码
Scenario: Chrome Docker Instance Initializer * configure driverTarget = { docker: 'karatelabs/karate-chrome' ,start:false, showDriverLog: true, beforeStart: 'supervisorctl start ffmpeg', afterStop: 'supervisorctl stop ffmpeg',videoFile: '/tmp/karate.mp4'} * configure retry = { count: 7, interval: 5000 }
关键错误日志
13:21:44.447 [1722239504276-out] DEBUG com.intuit.karate - symlink 5185464003818643869 C:\GitHub-ABCTEST\myPROJECT\target\karate-chrome_e231184e93ff.com.google.Chrome.H2kL8Q\SingletonCookie: A required privilege is not held by the client.
13:21:44.474 [1722239504276] WARN com.intuit.karate.shell.Command - exit code was non-zero: 1 - [docker, cp, e231184e93ffd78336a7475ee965dd4f427659d7d4a08fcb8be8f3a828e627fa:/tmp, target\karate-chrome_e231184e93ff] working dir: null
13:21:44.704 [pool-2-thread-1] WARN com.intuit.karate - video file missing: target\karate-chrome_e231184e93ff\karate.mp4
从日志可以看出,Karate自动复制整个/tmp目录时,遇到Chrome生成的符号链接文件,Windows系统下复制符号链接需要管理员权限,导致docker cp命令失败,最终视频文件未被复制到本地。以下是针对性解决方法:
1. 只复制指定视频文件
修改driverTarget配置,添加dockerCopyTarget参数,指定仅复制目标视频文件,跳过/tmp下的其他文件(包括Chrome的符号链接):
* configure driverTarget = { docker: 'karatelabs/karate-chrome', start: false, showDriverLog: true, beforeStart: 'supervisorctl start ffmpeg', afterStop: 'supervisorctl stop ffmpeg', videoFile: '/tmp/karate.mp4', dockerCopyTarget: '/tmp/karate.mp4' }
2. 以管理员权限运行测试
如果必须复制整个目录,确保运行测试的命令行、IDE或构建工具以管理员权限启动,让docker cp拥有复制符号链接的权限。
3. 自定义视频存储目录
在容器内创建专门的视频存储目录,避免和Chrome临时文件混在一起,从根源上避开符号链接问题:
* configure driverTarget = { docker: 'karatelabs/karate-chrome', start: false, showDriverLog: true, beforeStart: 'mkdir -p /karate-videos && supervisorctl start ffmpeg', afterStop: 'supervisorctl stop ffmpeg', videoFile: '/karate-videos/karate.mp4' }
4. 手动执行复制命令
在afterStop钩子中手动调用docker cp复制视频,绕过Karate的自动复制逻辑,利用Karate内置的${dockerId}变量获取当前容器ID:
* configure driverTarget = { docker: 'karatelabs/karate-chrome', start: false, showDriverLog: true, beforeStart: 'supervisorctl start ffmpeg', afterStop: 'supervisorctl stop ffmpeg && docker cp ${dockerId}:/tmp/karate.mp4 target/karate-videos/karate-${dockerId}.mp4', videoFile: '/tmp/karate.mp4' }
内容的提问来源于stack exchange,提问作者Shashikant Rangwar

