Spring Bean场景下如何正确关闭Selenium WebDriver并实现按需启动?
一、测试套件执行完成后自动关闭浏览器实现
你之前配置@Bean(destroyMethod = "quit")不生效,本质是Cucumber与JUnit集成时的上下文生命周期顺序问题,测试场景下Spring上下文的销毁流程没有触发Bean的销毁回调。可以使用以下无依赖限制的稳妥方案:
直接修改你的WebDriver初始化逻辑,注册JVM关闭钩子,JVM在所有测试执行完成后退出前,会自动执行钩子内的浏览器关闭逻辑,完全符合你的限制条件:
@Configuration public class MyWebDriver { @Bean(destroyMethod = "quit") public WebDriver initWebdriver(){ // 你的原有WebDriver初始化逻辑 ChromeDriver driver = new ChromeDriver(); // 注册JVM关闭钩子,退出前自动关闭浏览器 Runtime.getRuntime().addShutdownHook(new Thread(driver::quit)); return driver; } }
如果不想使用shutdown hook,也可以套一层JUnit Suite运行器实现:
- 新增测试套件入口类:
@RunWith(Suite.class) @Suite.SuiteClasses({CucumberTestEntry.class}) public class TestSuite { private static WebDriver driver; @Autowired public void setDriver(WebDriver driver) { TestSuite.driver = driver; } @AfterClass public static void afterAllTests() { if(driver != null){ driver.quit(); } } }
- 保留原有Cucumber启动类不变,后续直接运行
TestSuite类即可,@AfterClass会在所有用例执行完成后才触发,此时Spring上下文尚未销毁,可以正常拿到WebDriver实例执行关闭。
二、WebDriver懒加载实现
仅需要在@Bean注解上追加@Lazy注解即可,Spring会在该Bean第一次被依赖注入、或者显式调用getBean获取时才执行初始化逻辑,也就是只有代码第一次用到WebDriver的时候才会启动浏览器,不会在测试启动阶段就初始化实例:
@Configuration public class MyWebDriver { @Bean(destroyMethod = "quit") @Lazy // 新增该注解实现懒加载 public WebDriver initWebdriver(){ // 你的原有WebDriver初始化逻辑 ChromeDriver driver = new ChromeDriver(); Runtime.getRuntime().addShutdownHook(new Thread(driver::quit)); return driver; } }
如需显式配置可写为@Lazy(true),效果完全一致。
内容的提问来源于stack exchange,提问作者Krwasch
相关产品推荐
相关产品推荐

