You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何延长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

火山引擎 最新活动