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对象或避免报错,有两种选择:
- 使用
driver.close()替代driver.quit()关闭窗口,保留Service的可用状态; - 每次创建新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
相关产品推荐
相关产品推荐

