如何延长Selenium ChromeDriver内置的10分钟渲染器无响应超时时间?
解决ChromeDriver远程文件上传10分钟渲染器超时问题
我之前也碰到过类似的长耗时文件上传导致ChromeDriver提前终止的情况,你遇到的这个10分钟限制是ChromeDriver与Chrome渲染器进程之间的内置通信超时阈值,和你设置的页面加载超时不是同一个维度的配置。下面是几个经过验证的解决方案:
1. 修改Chrome启动参数,延长渲染器超时
Chrome的渲染器进程默认有10分钟的无响应超时限制,你可以通过启动参数直接调整这个值:
from selenium import webdriver options = webdriver.ChromeOptions() # 设置渲染器超时为30分钟(单位:毫秒) options.add_argument("--renderer-timeout=1800000") # 额外添加这个参数,避免Linux环境下/dev/shm空间不足导致的意外崩溃 options.add_argument("--disable-dev-shm-usage") # 连接远程服务器 driver = webdriver.Remote( command_executor="http://你的远程服务器地址:4444/wd/hub", options=options )
提示:
--renderer-timeout的单位是毫秒,你可以根据实际需求设置,比如30分钟就是1800000,60分钟则是3600000。
2. 配置ChromeDriver的全局超时参数
除了渲染器的设置,还要确保代码里的各类超时参数足够长,避免其他环节提前终止会话:
# 设置页面加载超时为30分钟(单位:秒) driver.set_page_load_timeout(1800) # 设置异步脚本执行超时为30分钟 driver.set_script_timeout(1800)
3. 定期发送心跳请求维持通信
如果修改参数后还是偶尔出现超时,可以在上传过程中定期发送一个简单的JavaScript命令,让ChromeDriver知道渲染器仍在正常工作:
import time from threading import Thread def send_heartbeat(driver): while 上传未完成的判断条件: try: # 发送一个简单的脚本请求 driver.execute_script("return 'heartbeat';") time.sleep(60) # 每分钟发送一次 except Exception: # 上传完成或出现异常时退出循环 break # 启动上传流程前开启心跳线程 heartbeat_thread = Thread(target=send_heartbeat, args=(driver,)) heartbeat_thread.start() # 执行上传操作 # ... # 上传完成后终止心跳线程 heartbeat_thread.join()
这个方法的核心是避免ChromeDriver长时间收不到渲染器的响应,从而不会触发“未收到渲染器响应”的终止逻辑。
4. 检查Selenium Grid的会话超时(如果使用)
如果你是通过Selenium Grid连接远程服务器,还要确保Grid的会话超时设置匹配你的需求:
- 启动Grid Hub时添加参数:
java -jar selenium-server.jar hub --session-timeout 1800(单位:秒,30分钟) - 启动Grid Node时同步设置:
java -jar selenium-server.jar node --session-timeout 1800
这样可以避免Grid因会话超时提前回收你的上传任务。
内容的提问来源于stack exchange,提问作者James




