selenium-jupiter 如何与 Karate 一起使用以自动使用与当前安装的 Chrome/Firefox 等匹配的 WebDriver?

How can selenium-jupiter be used with Karate to automatically use the WebDriver matching the currently installed Chrome/Firefox etc.?

背景

Selenium-Jupiter is a JUnit 5 extension aimed to ease the use of Selenium WebDriver by downloading and caching the WebDriver binaries required for each test, depending on which locally installed web browser is to be used. It does this by wrapping WebDriverManager(实际上仅用于 JUnit 4 测试)。

问题

所需的 WebDriver 的使用是通过在测试 class 中调用测试方法时传递它来完成的(根据 docs 中的说明)。事实上,空手道可以通过这种方式成功启动一个Chrome实例,但是在到达相应特征文件中的driver关键字之前:

@ExtendWith(SeleniumJupiter.class)
public class KarateTest {
    @Test
    public void test(ChromeDriver driver) {        
        Results results = Runner.path("classpath:feature")
        generateReport(results.getReportDir());
        assertEquals(0, results.getFailCount(), results.getErrorMessages());
    }
}

不幸的是,我无法使用功能文件中的驱动程序关键字让 Karate 访问和控制此浏览器 window。是否有可能以某种方式在空手道中使用由 Selenium-Jupiter 管理的浏览器实例?

注意: 我已经阅读了 this thread,它只是假设在不调查这一点的情况下将 WebDriverManager 与空手道一起使用应该很容易。但显然你至少必须降级到 Junit 4。但即使在那之后我也不明白空手道如何能够接管已经由 WebDriverManager 启动的浏览器实例。

编辑:

感谢@Peter,是他带领我走上了正轨!

我现在已经真正使用WebDriverManager(而不是Selenium-Jupiter)只执行测试中的ChromeDriver-Setup class并将这样确定的可执行路径转移到我在空手道中使用的系统 属性-config.js:

在我的 Java 测试中 class:

    @BeforeAll
    public static void setupClass() {
        WebDriverManager.chromedriver().setup();
        System.setProperty("driverExecutable", System.getProperty("webdriver.chrome.driver"));
    }

空手道-config.js:

  let env = karate.env; // get system property 'karate.env'
  let driverType = karate.properties['driverType']; // get system property 'driverType' optionally given on command line by "-DdriverType=..."
  let driverExecutable = karate.properties['driverExecutable']; // get system property 'driverExecutable' optionally given on command line by "-DdriverExecutable=..."


  if (env == 'win64-java-chrome-headful') {
    karate.configure(
      'driver', {
        type: driverType,
        executable: driverExecutable,
        showDriverLog: true
      }
    );
  }

使用 Selenium-Jupiter 这似乎是不可能的,因为 WebDriver 实例的设置和启动是一次性完成的。

空手道当然不是为此而设计的,所以让我先把它弄清楚。你只能靠自己。欢迎任何人贡献代码以“改进”空手道,并接受审查。

而您在空手道中看到的 driver 与“WebDriver”完全无关。请记住,空手道为您提供了对 WebDriver 的抽象 - 然后是 Playwright 和 Chrome(本机)CDP。而我们不建议将 WebDriver 混入 Karate 测试的主要原因是因为它对于单线程测试可能没问题,但你 运行 惹上麻烦如果你想 运行 并行测试。您链接的主题已经有指向 的链接。该线程说您可以(可能)使用 WebDriverManager 为空手道测试设置 可执行文件 而不是 实际 Java WebDriver 实例.

也就是说,空手道有 excellent Java interop,所以我相信您将能够像这样将 WebDriver 实例用于空手道测试:

* def browser = MyJavaClass.someStaticMethod()

然后你就可以做很多你想做的事,甚至更多。任何 Java 方法都可以在你弄清楚后调用。

为了完整起见,让我提一下空手道还有一个 Java API:https://github.com/intuit/karate#java-api