如何使用Selenium-Jupiter搭配Karate自动匹配本地浏览器对应WebDriver
背景
Selenium-Jupiter是一款JUnit 5扩展,它通过封装仅支持JUnit 4测试的WebDriverManager,可根据待使用的本地安装浏览器,自动下载并缓存各测试所需的WebDriver二进制文件,降低Selenium WebDriver的使用门槛。
问题
根据官方文档说明,需在测试类调用测试方法时传入指定WebDriver来使用对应驱动。通过如下方式,Karate可成功启动Chrome实例,但在运行到对应feature文件的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在feature文件中通过driver关键字访问、控制该浏览器窗口。是否有方法可以让Karate使用Selenium-Jupiter管理的浏览器实例?
说明:相关人员已查阅对应Stack Overflow帖子,其中仅提及WebDriverManager可轻松对接Karate但未做实际验证,且该方案至少需要降级到JUnit 4,即便降级后也无法明确Karate如何接管WebDriverManager已启动的浏览器实例。
编辑补充解决方案:
感谢@Peter提供的正确思路,最终选择使用WebDriverManager而非Selenium-Jupiter实现需求:仅在测试类中完成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; // 获取系统属性 'karate.env' let driverType = karate.properties['driverType']; // 可选获取命令行通过 "-DdriverType=..." 传入的系统属性 let driverExecutable = karate.properties['driverExecutable']; // 可选获取命令行通过 "-DdriverExecutable=..." 传入的系统属性 if (env == 'win64-java-chrome-headful') { karate.configure( 'driver', { type: driverType, executable: driverExecutable, showDriverLog: true } ); }
该方案无法适配Selenium-Jupiter,因为Selenium-Jupiter中WebDriver实例的初始化与启动是同步完成的。
内容的提问来源于stack exchange,提问作者Drunda Nibel

