driver.close()报java.net.SocketException: Connection reset问题
根本原因
该异常是Selenium 4及以上版本使用CDP协议通信时,资源关闭流程不符合规范引发的底层连接异常,触发逻辑如下:
driver.close()与driver.quit()的核心行为差异:driver.close()仅负责关闭当前获得焦点的浏览器窗口,不会主动断开Selenium与浏览器之间的WebSocket长连接,不会终止驱动侧的Netty事件监听线程,也不会清理后台运行的chromedriver/geckodriver等驱动进程。driver.quit()会执行完整的优雅退出流程:先关闭所有打开的浏览器窗口,向浏览器发送WebSocket双向断连指令,停止驱动侧的事件监听线程,最后终止所有关联的WebDriver后台进程,整个断连过程有完整的双向确认,不会触发连接异常。
- 具体触发链路:在
@AfterTest阶段调用driver.close()时,当前唯一的浏览器窗口被直接关闭,浏览器端会直接重置对应TCP连接并发送RST包;但此时驱动侧的Netty NIO线程(即堆栈中显示的NioEventLoop线程)仍在持续监听WebSocket端口的消息,收到RST包后就会抛出java.net.SocketException: Connection reset告警。该异常是驱动内部监听器捕获的未处理异常,不会向上抛出影响测试断言,仅会打印错误堆栈。
测试代码中执行的window.stop()JS脚本和该异常没有直接关联,核心触发原因是close()方法未完成完整的连接资源清理。
处理方案
按优先级从高到低选择:
- 测试用例销毁阶段统一使用
driver.quit()替代driver.close():这是Selenium官方推荐的测试收尾逻辑,既能从根源消除连接重置告警,也能避免残留的WebDriver进程占用系统端口、内存资源,是最规范的处理方式。 - 多标签页测试场景下如果必须中途调用
driver.close()关闭单个标签页,关闭后需要立即切换到剩余的有效窗口句柄,避免驱动持有已失效页面的连接监听,示例代码:
// 关闭当前标签页 driver.close(); // 切换到剩余的有效窗口,避免连接悬空 for (String windowHandle : driver.getWindowHandles()) { driver.switchTo().window(windowHandle); }
- 兜底方案:如果因特殊场景限制无法修改关闭逻辑,可以调整日志配置,将
org.openqa.selenium.remote.http.WebSocket类的日志级别设置为SEVERE,屏蔽这个不影响测试结果的WARNING级别告警,该方案仅作临时处理使用,不推荐优先选择。
补充说明:该Connection reset告警本身不会导致测试用例执行失败,也不会影响断言结果,仅为资源清理不规范导致的底层提示信息。
内容的提问来源于stack exchange,提问作者ChinmoyJ
相关产品推荐
相关产品推荐

