You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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运行器实现:

  1. 新增测试套件入口类:
@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();
        }
    }
}
  1. 保留原有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:57:03