ChromeDriver构造失败对象为null但进程残留应如何处理?
问题根因
ChromeDriver的初始化是分两步执行的:
- 先启动本地的
chromedriver后台进程 - 进程启动后,再尝试和Chrome浏览器建立会话、完成握手逻辑
你遇到的Chrome崩溃发生在第二步,此时chromedriver进程已经启动成功,但WebDriver实例还没完成初始化赋值给你的driver变量,所以finally块判断driver为null不会执行quit操作,就留下了残留进程。
解决方案
方案1:使用ChromeDriverService统一管理进程生命周期(推荐)
不要直接实例化ChromeDriver,而是先显式创建ChromeDriverService,由service来管控进程的启停,不管后续driver初始化是否成功,都可以直接停service释放进程:
ChromeOptions options = new ChromeOptions(); options.addArguments("--headless=new", "--no-sandbox", "--disable-dev-shm-usage"); ChromeDriverService service = new ChromeDriverService.Builder().usingAnyFreePort().build(); WebDriver driver = null; try { service.start(); // 显式启动chromedriver进程 driver = new ChromeDriver(service, options); // 后续业务逻辑 } finally { if(driver != null) { logger.info("Quitting the driver..."); driver.quit(); } // 不管driver是否初始化成功,都停止service,直接杀掉对应的chromedriver进程 if(service.isRunning()) { service.stop(); } }
该方案可以精准匹配到本次启动的chromedriver进程,不会误杀其他测试任务的进程,是最稳妥的处理方式。
方案2:主动清理残留进程(仅适合单实例运行场景)
如果你的服务同一时间只会运行一个Selenium任务,也可以在finally块判断driver为null时,执行系统命令清理所有chromedriver进程:
Linux下执行命令:ps -ef | grep chromedriver | grep -v grep | awk '{print $2}' | xargs kill -9
Java代码示例:
} else { logger.info("Driver is null, cleaning residual chromedriver process"); Runtime.getRuntime().exec("ps -ef | grep chromedriver | grep -v grep | awk '{print $2}' | xargs kill -9"); }
注意这个方案会杀掉所有chromedriver进程,多任务并行场景不要使用。
方案3:从根源减少Chrome崩溃概率
你遇到的Chrome启动崩溃很多是Linux环境的资源限制导致的,可以给ChromeOptions增加以下参数降低崩溃概率:
--no-sandbox:关闭沙箱模式,解决Linux root用户启动Chrome失败的问题--disable-dev-shm-usage:禁用/dev/shm共享内存,解决小内存环境Chrome崩溃问题--headless=new:使用新版无头模式,兼容性更好
内容的提问来源于stack exchange,提问作者Giulia Fois
相关产品推荐
相关产品推荐

