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

测试间重启WebDriver浏览器遇NoSuchSessionException问题咨询

问题根源与解决方案

我来帮你拆解这个问题的核心原因,然后一步步实现每个测试用例前重启浏览器的需求:

为什么会抛出NoSuchSessionException?

你的问题出在DriverFactory中的静态WebDriver实例没有被正确重置。

看你的DriverFactory代码,driver是一个静态变量:第一次调用getDriver()时,它会创建新的浏览器驱动实例;但当你在@AfterMethod里调用quit()或close()后,这个静态driver对象并没有被置为null——它只是关联的浏览器会话被销毁了,但对象本身还存在内存中。

当下一个测试方法执行@BeforeMethod时,再次调用getDriver(),代码里的if (driver==null)判断不成立,直接返回了这个已经失效的driver实例,自然就会抛出会话不存在的异常。

修复步骤

1. 给DriverFactory添加重置驱动的方法

我们需要新增一个静态方法,用来在测试结束后彻底销毁驱动会话,并把静态driver变量置为null,这样下一次调用getDriver()时会重新创建新的实例。

修改后的DriverFactory关键代码:

public class DriverFactory {
    static PropertyBase propertyBase = new PropertyBase();
    Properties prop = new Properties();
    private static WebDriver driver;

    // 保留你原有的setChromeDriverPath、setFireFoxDriverPath、configureDriver等方法不变

    // 新增:重置驱动的方法
    public static void quitDriver() {
        if (driver != null) {
            try {
                driver.quit(); // 彻底销毁浏览器会话
            } finally {
                driver = null; // 关键:必须把静态对象置空,让下一次getDriver()能创建新实例
            }
        }
    }

    public static WebDriver getDriver() {
        String browserType = propertyBase.getProperty("browser");
        switch (browserType) {
            case "chrome":
                if (driver == null) {
                    driver = createChromeDriver();
                }
                break;
            case "firefox":
                if (driver == null) {
                    driver = createFireFoxDriver();
                }
                break;
        }
        configureDriver();
        return driver;
    }

    // 保留你原有的createChromeDriver、createFireFoxDriver等方法不变
}

2. 调整测试类的@AfterMethod

把原来的loginPage.quitDriver()或closeDriver(),改成直接调用DriverFactory的重置方法,或者让LoginPage的quit方法内部调用这个新方法:

方式一:直接在测试类调用

@AfterMethod
public void afterTest() {
    DriverFactory.quitDriver();
}

方式二:封装到LoginPage中(保持原有调用方式)

在LoginPage类里修改quitDriver()方法:

public void quitDriver() {
    DriverFactory.quitDriver();
}

为什么之前的close/quit操作无效?

  • 调用driver.quit():会彻底销毁浏览器会话,但静态driver变量仍指向原对象,没有被置空,导致下一次getDriver()复用失效实例。
  • 调用driver.close():仅关闭当前窗口,如果是最后一个窗口,会话也会被销毁,但同样静态driver变量没有被置空,后续调用依然返回失效实例。

额外优化:支持并行测试(可选)

如果未来需要开启多线程并行测试,建议用ThreadLocal存储驱动实例,避免线程间的冲突:

public class DriverFactory {
    static PropertyBase propertyBase = new PropertyBase();
    Properties prop = new Properties();
    // 用ThreadLocal存储每个线程独立的驱动实例
    private static ThreadLocal<WebDriver> driverThreadLocal = new ThreadLocal<>();

    // 调整configureDriver方法,传入当前驱动实例
    private static void configureDriver(WebDriver driver) {
        driver.manage().deleteAllCookies();
        driver.manage().window().maximize();
    }

    public static void quitDriver() {
        WebDriver driver = driverThreadLocal.get();
        if (driver != null) {
            try {
                driver.quit();
            } finally {
                driverThreadLocal.remove(); // 移除当前线程的驱动实例
            }
        }
    }

    public static WebDriver getDriver() {
        String browserType = propertyBase.getProperty("browser");
        if (driverThreadLocal.get() == null) {
            switch (browserType) {
                case "chrome":
                    driverThreadLocal.set(createChromeDriver());
                    break;
                case "firefox":
                    driverThreadLocal.set(createFireFoxDriver());
                    break;
            }
            configureDriver(driverThreadLocal.get());
        }
        return driverThreadLocal.get();
    }

    // 保留你原有的createChromeDriver、createFireFoxDriver等方法不变
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:29:34