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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:39:17