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



背景

SeleniumJupiter是一个JUnit5扩展,旨在通过下载和缓存每次测试所需的WebDriver二进制文件来简化SeleniumWebDriver的使用,具体取决于要使用的是本地安装的web浏览器。它通过包装WebDriverManager(实际上只用于JUnit4测试)来实现这一点。

问题

所需WebDriver的使用是通过在调用测试类中的测试方法时传递它来完成的(根据文档中的说明)。事实上,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());
}
}

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

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

编辑:

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

实际上,我现在已经使用WebDriverManager(而不是SeleniumJupiter)在测试类中只执行ChromeDriver设置,并将以这种方式确定的可执行路径传输到我在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
}
);
}

对于SeleniumJupiter,这似乎是不可能的,因为WebDriver实例的设置和启动是一次性完成的。

空手道当然不是为这个而设计的,所以让我先把它排除在外。你要靠自己。欢迎任何人贡献代码,尽管";改进";空手道,有待审查。

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

也就是说,Karate具有出色的Java互操作,所以我相信您将能够将WebDriver实例放入这样的Karate测试中:

* def browser = MyJavaClass.someStaticMethod()

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

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

最新更新