使用GeckoDriver与Firefox时遇ClosedByInterruptException连接异常求助
你遇到的这个问题在Linux环境下长时间运行Firefox自动化测试时非常典型——Chrome能稳定跑完16小时的测试,但Firefox跑3-4个套件就出现ClosedByInterruptException和连接失败的错误,核心原因大概率是进程资源泄漏或者版本兼容性带来的稳定性问题,结合你的环境(Selenium 3.11、Geckodriver 0.20.1、Firefox 57、TestNG 6.9.8),我整理了几个针对性的解决方案:
1. 强制清理Firefox/Geckodriver残留进程(最优先尝试)
Linux下driver.quit()有时候无法彻底杀死Firefox的子进程或Geckodriver进程,长时间积累会耗尽系统端口、文件句柄等资源,导致后续连接失败。你可以在afterClass中补充进程查杀逻辑:
@AfterClass public void tearDown() { try { // 先执行标准退出 if (driver != null) { driver.quit(); } // 强制清理残留的Firefox和Geckodriver进程 Runtime.getRuntime().exec("pkill -f firefox"); Runtime.getRuntime().exec("pkill -f geckodriver"); } catch (Exception e) { // 忽略清理时的异常,避免影响测试报告生成 e.printStackTrace(); } }
注意:如果测试机上有其他非测试用的Firefox进程,建议用更精准的进程匹配(比如通过父PID筛选),避免误杀。
2. 升级Geckodriver和Firefox版本
你的Geckodriver 0.20.1是2018年的老版本,针对长时间运行场景存在已知的资源泄漏问题,而Firefox 57作为量子引擎的第一个正式版,稳定性也不如后续ESR版本:
- 将Geckodriver升级到v0.29.0(这个版本对Firefox 57-91全版本兼容,修复了大量进程管理漏洞)
- 若允许,将Firefox升级到Firefox 60 ESR,ESR版本专为企业级稳定场景设计,长时间运行可靠性更高
3. 优化Selenium超时与Driver初始化策略
长时间运行的测试中,超时配置不合理或单一Driver实例内存泄漏也会导致崩溃:
调整超时参数
在初始化FirefoxDriver时增加更宽松的超时设置,避免因页面加载慢或脚本执行超时触发连接中断:
FirefoxOptions options = new FirefoxOptions(); // 可添加无头模式等配置 options.addArguments("--headless"); FirefoxDriver driver = new FirefoxDriver(options); // 设置页面加载超时 driver.manage().timeouts().pageLoadTimeout(90, TimeUnit.SECONDS); // 设置异步脚本超时 driver.manage().timeouts().setScriptTimeout(60, TimeUnit.SECONDS); // 设置隐式等待 driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
改用Per-Method的Driver生命周期
如果当前每个套件共用一个Driver(beforeClass初始化),可以尝试改为每个测试方法创建独立Driver(beforeMethod初始化,afterMethod销毁),虽然会增加少量执行时间,但能彻底避免单一实例的内存累积问题:
private WebDriver driver; @BeforeMethod public void setUp() { FirefoxOptions options = new FirefoxOptions(); driver = new FirefoxDriver(options); } @AfterMethod public void tearDown() { if (driver != null) { driver.quit(); // 同样补充进程清理逻辑 try { Runtime.getRuntime().exec("pkill -f firefox"); Runtime.getRuntime().exec("pkill -f geckodriver"); } catch (Exception e) { e.printStackTrace(); } } }
4. 检查Linux系统资源限制
长时间运行16小时的测试,Linux系统的默认资源限制可能不足以支撑:
- 查看当前文件句柄限制:执行
ulimit -n,如果数值低于65535,可修改/etc/security/limits.conf提高限制:* soft nofile 65535 * hard nofile 65535 - 实时监控端口占用:执行
ss -tulpn | grep geckodriver,查看是否有大量未释放的端口,验证进程清理逻辑是否生效
从错误日志中的ClosedByInterruptException来看,也有可能是TestNG在中断测试时没有正确触发afterClass逻辑,建议将Driver销毁代码放在finally块中,确保无论测试成功/失败都会执行清理。
内容的提问来源于stack exchange,提问作者Bohdan Nesteruk

