1

背景

Selenium-Jupiter是一个 JUnit 5 扩展,旨在通过下载和缓存每个测试所需的 WebDriver 二进制文件来简化 Selenium WebDriver 的使用,具体取决于要使用的本地安装的 Web 浏览器。它通过包装WebDriverManager(实际上仅用于 JUnit 4 测试)来做到这一点。

问题

通过在测试类中调用测试方法时传递所需的 WebDriver 来完成(根据docs中的说明)的使用。事实上,Karate 可以通过这种方式成功启动一个 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());
    }
}

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

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

编辑:

感谢@Peter,他带领我走上了正确的道路!

我现在实际上已经使用 WebDriverManager(而不是 Selenium-Jupiter)仅在测试类中执行 ChromeDriver-Setup,并将以这种方式确定的可执行路径传输到我在 karate-config.js 中使用的系统属性中:

在我的 Java 测试类中:

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

在 karate-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 实例的设置和启动是一次性完成的。

4

1 回答 1

-1

空手道当然不是为此而设计的,所以让我先解决这个问题。你只能靠自己。欢迎任何人贡献代码以“改进”空手道,但需要接受审查。

driver你在空手道中看到的与“WebDriver”完全无关。请记住,Karate 为您提供了对 WebDriver 的抽象——然后是 Playwright 和 Chrome(本机)CDP。我们不建议将 WebDriver 混入空手道测试的主要原因是因为它可能适合单线程测试,但如果您想并行运行测试,则会遇到麻烦。您链接的线程已经链接到所有血腥细节。并且该线程说您可以(可能)使用WebDriverManager来设置空手道测试的可执行文件,而不是实际的 JavaWebDriver实例。

也就是说,Karate 具有出色的 Java 互操作性,因此我相信您将能够将 WebDriver 实例放入空手道测试中,如下所示:

* def browser = MyJavaClass.someStaticMethod()

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

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

于 2021-08-17T16:44:37.643 回答