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

如何在Selenium WebDriver中关闭两个浏览器实例(TestNG并行场景)

解决方案

可以关闭两个浏览器实例,核心是通过线程安全的Driver实例跟踪机制适配TestNG并行执行场景:

1. 全局维护线程专属的Driver集合

创建Driver管理类,用ThreadLocal<Set<WebDriver>>存储当前线程启动的所有浏览器实例,确保并行执行时各线程的Driver互不干扰:

public class DriverManager {
    private static final ThreadLocal<Set<WebDriver>> threadDrivers = ThreadLocal.withInitial(HashSet::new);

    // 注册新启动的Driver实例
    public static void registerDriver(WebDriver driver) {
        threadDrivers.get().add(driver);
    }

    // 关闭当前线程所有Driver实例
    public static void shutdownAllDrivers() {
        for (WebDriver driver : threadDrivers.get()) {
            try {
                if (driver != null) {
                    driver.quit();
                }
            } catch (Exception e) {
                // 记录日志,避免关闭失败影响后续操作
                e.printStackTrace();
            }
        }
        threadDrivers.remove(); // 清理线程本地数据
    }
}

2. 修改浏览器启动逻辑

在CommonLibrary.newBrowserLaunch()中,每启动一个新Driver就注册到集合:

public class CommonLibrary {
    public static WebDriver newBrowserLaunch() {
        WebDriver driver = new ChromeDriver(); // 根据实际浏览器调整
        DriverManager.registerDriver(driver);
        return driver;
    }
}

3. 调整TestNG后置处理方法

将原有@AfterMethod中的单个Driver关闭逻辑替换为调用DriverManager.shutdownAllDrivers(),这样每个测试方法执行完毕后,当前线程的所有浏览器实例都会被关闭:

@AfterMethod
public void tearDown() {
    DriverManager.shutdownAllDrivers();
}

如果是类级别的并行执行,也可以改用@AfterClass,确保整个测试类执行完成后清理所有Driver实例。

这种方式既解决了多浏览器实例无法全部关闭的问题,又适配了TestNG并行执行的线程隔离要求,不会出现跨线程关闭Driver的情况。


内容的提问来源于stack exchange,提问作者Vaibhav Karkera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:46:36