测试间重启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
相关产品推荐
相关产品推荐

