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

Selenium 4.14.0执行driver.quit()后创建新驱动报ValueError问题咨询

Selenium 4.14.0升级后复用Service对象报错:ValueError: I/O operation on closed file

问题描述

此前在Selenium 4.13.0及更早版本中,以下代码可正常执行,但升级到4.14.0后,执行driver2 = webdriver.Chrome(service=service, options=options)时会抛出ValueError: I/O operation on closed file错误。将driver.quit()替换为driver.close()后代码恢复正常,请问原因是什么?

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# Set up the Chrome browser
service = Service()
options = webdriver.ChromeOptions()

url = "https://www.google.com" 

driver = webdriver.Chrome(service=service, options=options)
driver.get(url)
time.sleep(2)
driver.quit()

time.sleep(2)

driver2 = webdriver.Chrome(service=service, options=options)
driver2.get(url)
time.sleep(2)
driver2.quit()

原因分析

  • driver.quit()的行为变更:Selenium 4.14.0版本调整了quit()方法的实现——调用该方法时,除了关闭浏览器窗口、终止浏览器进程,还会关闭与Service对象绑定的标准输出/标准错误流文件句柄,并将Service标记为已终止状态。
  • 复用已终止Service触发错误:当尝试用同一个service对象创建driver2时,Selenium会尝试向已关闭的文件句柄写入日志,从而触发ValueError: I/O operation on closed file。
  • driver.close()的差异:close()方法仅关闭当前浏览器窗口,不会终止Service进程,也不会关闭相关文件句柄,因此Service对象仍可被复用,后续创建新driver时不会出现IO错误。

解决方案

如果需要复用Service对象或避免报错,有两种选择:

  1. 使用driver.close()替代driver.quit()关闭窗口,保留Service的可用状态;
  2. 每次创建新driver时重新实例化Service对象,示例如下:
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

options = webdriver.ChromeOptions()
url = "https://www.google.com" 

# 第一个driver,创建独立Service
driver = webdriver.Chrome(service=Service(), options=options)
driver.get(url)
time.sleep(2)
driver.quit()

time.sleep(2)

# 第二个driver,重新创建Service
driver2 = webdriver.Chrome(service=Service(), options=options)
driver2.get(url)
time.sleep(2)
driver2.quit()

内容的提问来源于stack exchange,提问作者Sez Yez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:16:04