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

在Karate Docker容器中通过代码启动Driver的问题及解决

在GitHub Actions中通过Karate启动第二个Chrome实例的问题与解决

问题背景

需要执行一个双用户同时登录的测试,参考Karate相关文档启动第二个Chrome实例,本地运行正常,但在GitHub Actions中使用karatelabs/karate-chrome镜像时出现启动失败问题。

初始尝试代码

Java工具类代码

import com.intuit.karate.driver.Driver;
import java.util.HashMap;
import java.util.Map;

public class SecondChromeInstance
{
    public static void Test(boolean running_in_ci)
    {
        Map<String, Object> options = new HashMap<String, Object>();
        options.put("type", "chrome");
        if (running_in_ci)
        {
            options.put("host", "host.docker.internal");
            options.put("port", 9222);
        }
        Driver driver = Driver.start(options);
    }     
}     

Feature文件调用方式

* def SecondChromeInstance = Java.type('utilities.SecondChromeInstance')
* SecondChromeInstance.Test(running_in_ci)

报错信息

org.graalvm.polyglot.PolyglotException: driver config / start failed: http call failed after 1 milliseconds for url: http://host.docker.internal:9222/json
java.net.UnknownHostException: host.docker.internal, options: {port=9222, host=host.docker.internal, type=chrome}
- com.intuit.karate.driver.DriverOptions.start(DriverOptions.java:323)
- com.intuit.karate.driver.Driver.start(Driver.java:56)
- utilities.SecondChromeInstance.Test(SecondChromeInstance.java:48)
- <js>.:program(Unnamed:1)

解决后的可用示例

从默认Driver实例获取配置参数

* def opt = driver.getOptions()
* def port = opt.port
* def host = opt.host
* def target = opt.options.get("target")

修正后的Java配置代码

import com.intuit.karate.driver.Driver;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class SecondChromeInstance {
    public static void Test(boolean runningInCI, int port, String host, String target) {
        Map<String, Object> options = new HashMap<String, Object>();
        options.put("type", "chrome");
        options.put("addOptions", Arrays.asList("--remote-allow-origins=*"));
        
        if (runningInCI) {
            options.put("port", port);
            options.put("start", false);
            options.put("host", host);
            options.put("showDriverLog", true);
            options.put("target", target);
            options.put("docker", "ptrthomas/karate-chrome");
        }

        Driver driver = Driver.start(options);
        try {
            driver.setUrl("XXX"); // 替换为实际测试URL
            // 执行测试逻辑
        } finally {
            driver.quit();
        }
    }
}

当前状态与后续需求

  • 目前CI生成的Karate报告仅捕获最后一个Driver实例的视频,该情况可接受。
  • 后续希望实现将Java实例的日志输出到Karate报告中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:42:48