在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
相关产品推荐
相关产品推荐

