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

Selenium ChromeDriver退出超时问题求助(附代码及异常信息)

Selenium ChromeDriver退出时偶现超时异常的解决方法

问题

使用Selenium + ChromeDriver开发的爬虫整体运行正常,但偶尔在调用quit()退出驱动时会抛出以下超时异常:

org.openqa.selenium.WebDriverException: Timed out waiting for driver server to stop.
Build info: version: '4.1.3', revision: '7b1ebf28ef'
System info: host: '45-79-216-229.ip.linodeusercontent.com', ip: '45.79.216.229', os.name: 'Linux', os.arch: 'amd64', os.version: '4.18.0-348.12.2.el8_5.x86_64', java.version: '11.0.14'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Command: [66aa12cc87af0a6cf095436a6bbece90, quit {}]
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 102.0.5005.61, chrome: {chromedriverVersion: 102.0.5005.61 (0e59bcc00cc4..., userDataDir: /tmp/.com.google.Chrome.DhJaWB}, goog:chromeOptions: {debuggerAddress: localhost:45009}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: LINUX, platformName: LINUX, proxy: Proxy(), se:cdp: ws://localhost:45009/devtoo..., se:cdpVersion: 102.0.5005.61, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true}
Session ID: 66aa12cc87af0a6cf095436a6bbece90
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:132)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:567)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:622)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:626)
    at org.openqa.selenium.remote.RemoteWebDriver.quit(RemoteWebDriver.java:463)
    at org.openqa.selenium.chromium.ChromiumDriver.quit(ChromiumDriver.java:293)

原实现代码

public class SeleniumScraper {

    private WebDriver driver;

    public SeleniumScraper() {
        WebDriverManager.chromedriver().setup();
        ChromeOptions options = this.getDefaultChromeOptions();
        this.driver = new ChromeDriver(options);
        driver.manage().window().maximize();
    }

    public WebDriver getPage(String url) {
        this.driver.get(url);
        return driver;
    }

    public boolean quitDriver() {
        this.driver.quit();
        return true;
    }

    protected ChromeOptions getDefaultChromeOptions() {
        HashMap<String, Object> chromePrefs = new HashMap<>(2);
        chromePrefs.put("profile.default_content_settings.popups", false);
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("prefs", chromePrefs);
        options.setHeadless(true);
        return options;
    }
}

解决思路与优化代码

核心原因

该异常是因为Selenium默认的驱动停止超时时间(10秒)不足以让ChromeDriver彻底关闭浏览器进程,尤其是Linux环境下,Chrome可能因资源占用过高导致退出缓慢。

优化方案

  1. 延长驱动服务的停止超时时间
  2. 捕获退出异常,强制终止驱动服务与残留进程
  3. 添加Chrome启动参数减少资源占用,加速退出

修改后的代码

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.chrome.ChromeDriverService;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;

public class SeleniumScraper {

    private WebDriver driver;
    private ChromeDriverService service;

    public SeleniumScraper() {
        WebDriverManager.chromedriver().setup();
        ChromeOptions options = this.getDefaultChromeOptions();
        // 自定义驱动服务,延长停止超时时间至30秒
        service = new ChromeDriverService.Builder()
                .usingAnyFreePort()
                .withTimeout(30, TimeUnit.SECONDS)
                .build();
        this.driver = new ChromeDriver(service, options);
        driver.manage().window().maximize();
    }

    public WebDriver getPage(String url) {
        this.driver.get(url);
        return driver;
    }

    public boolean quitDriver() {
        try {
            if (driver != null) {
                driver.quit();
            }
        } catch (Exception e) {
            // 捕获超时异常,强制停止驱动服务
            if (service != null && service.isRunning()) {
                service.stop();
            }
            // Linux下强制杀掉残留的Chrome进程
            try {
                Runtime.getRuntime().exec("pkill -f chrome");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        } finally {
            // 清理资源
            driver = null;
            service = null;
        }
        return true;
    }

    protected ChromeOptions getDefaultChromeOptions() {
        HashMap<String, Object> chromePrefs = new HashMap<>(2);
        chromePrefs.put("profile.default_content_settings.popups", false);
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("prefs", chromePrefs);
        options.setHeadless(true);
        // 添加优化参数,减少资源占用并加速退出
        options.addArguments("--no-sandbox");
        options.addArguments("--disable-dev-shm-usage");
        options.addArguments("--disable-gpu");
        options.addArguments("--disable-extensions");
        options.addArguments("--force-close");
        options.addArguments("--disable-background-networking");
        return options;
    }
}

关键修改说明

  • 自定义ChromeDriverService:通过withTimeout()将驱动停止超时时间从默认10秒延长至30秒,给Chrome足够的关闭时间
  • 异常处理与强制终止:当quit()抛出异常时,直接调用service.stop()强制停止驱动,同时通过系统命令杀掉残留的Chrome进程,避免资源泄漏
  • Chrome参数优化:添加--no-sandbox、--disable-dev-shm-usage解决Linux下的资源限制问题,--force-close让浏览器退出更彻底,减少超时概率
  • 资源清理:在finally块中置空driver和service,避免内存泄漏

内容的提问来源于stack exchange,提问作者Sardar Fahad Ashfaq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:21:15