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

使用GeckoDriver与Firefox时遇ClosedByInterruptException连接异常求助

解决Firefox+Geckodriver长时间运行Selenium测试中断问题

你遇到的这个问题在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:48:45