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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:27:01