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可能因资源占用过高导致退出缓慢。
优化方案
- 延长驱动服务的停止超时时间
- 捕获退出异常,强制终止驱动服务与残留进程
- 添加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
相关产品推荐
相关产品推荐

