
在 selenium 自动化测试中,为每个测试用例单独启动并关闭浏览器虽能保证环境隔离,但显著降低执行效率;更优实践是复用浏览器会话,并在测试间主动清理状态(如 cookies、缓存、本地存储),以兼顾稳定性与性能。
在实际工程实践中,不建议为每个 @Test 方法都调用 driver.quit() 再重新初始化 WebDriver。以您提供的 LoginTest.java 为例:
@Test(description = "send invalid username")
void loginWithIncorrectUsername() { /* ... */ }
@Test(description = "send invalid password")
void loginWithIncorrectPassword() { /* ... */ }
@Test(description = "send valid credentials")
void loginWithCorrectCredentials() { /* ... */ }若每个方法都独立启停浏览器,三次测试将产生至少三次浏览器进程启动/销毁开销(尤其在 Chrome 或 Edge 中可能耗时 2–5 秒/次),严重拖慢整体执行速度,且增加资源竞争与不稳定风险(如端口占用、驱动残留)。
✅ 推荐方案:单浏览器实例 + 状态重置
-
在测试类级别管理 WebDriver 生命周期
使用 TestNG 的 @BeforeClass 初始化驱动,@AfterClass 统一退出;或更精细地使用 @BeforeMethod / @AfterMethod 进行会话级清理(不退出浏览器):
private WebDriver driver;
@BeforeClass
public void setUp() {
driver = new ChromeDriver(); // 或通过 WebDriverManager 自动管理
driver.manage().window().maximize();
}
@AfterMethod
public void tearDownEachTest() {
// 清理会话状态,而非关闭浏览器
driver.manage().deleteAllCookies(); // 删除所有 cookies
driver.executeScript("window.localStorage.clear();");
driver.executeScript("window.sessionStorage.clear();");
driver.navigate().to("about:blank"); // 重置页面上下文
}-
为什么不能只靠 quit()?
driver.quit() 会彻底终止浏览器进程,下次测试需重建整个渲染引擎、加载扩展、解析配置——这是高成本操作;而 deleteAllCookies() + localStorage.clear() 等操作毫秒级完成,且能精准消除登录态、表单缓存等干扰因素。
⚠️ 注意事项:
- 若被测应用强依赖服务端 Session 绑定(如 JWT 刷新机制、IP 关联校验),仅前端清理可能不足,需配合后端 API 退出或使用无状态测试账号;
- 避免在 @AfterMethod 中调用 driver.close()(仅关闭当前 tab),易导致后续测试因无可用窗口而失败;
- 在 CI 环境中,建议结合 --headless=new 和合理超时配置,进一步提升稳定性和资源利用率。
? 总结:
高效可靠的 Selenium 测试 = 一次启动 + 每次清理 + 显式断言。优先复用浏览器会话,通过标准化的清理逻辑保障测试独立性,而非依赖昂贵的进程重启——这既是性能最佳实践,也是可维护自动化套件的核心设计原则。










