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

Chrome WebDriver执行driver.get(URL)时卡顿,脚本无法继续迭代

解决Chrome Driver长期运行后卡在driver.get(URL)的问题

问题场景

使用以下undetected-chromedriver初始化代码,脚本运行一段时间后,新迭代会卡在driver.get(URL)步骤无法继续执行:

options = uc.ChromeOptions()
options.add_argument("--excludeSwitches=enable-automation")
options.add_argument("--excludeSwitches=enable-logging")
prefs = {
'credentials_enable_service': False,
'profile': {
    'password_manager_enabled': False
}
}
options.add_experimental_option('prefs', prefs)
options.set_capability('unhandledPromptBehavior', 'dismiss')
options.add_argument('--disable-extensions')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--disable-notifications')
options.add_argument('--disable-popup-blocking')
driver = uc.Chrome(options=options)
driver.maximize_window()
driver.set_page_load_timeout(80)
# Set the script timeout to 20 seconds
driver.set_script_timeout(30)

可行解决措施

1. 定期重启Driver实例

长期运行的Chrome实例会积累内存泄漏、缓存冗余等问题,直接导致请求阻塞。可以设置固定迭代次数或运行时长,到期后销毁当前driver并重新初始化:

iteration_count = 0
max_iterations_before_restart = 10  # 每10次迭代重启一次

while True:
    iteration_count += 1
    if iteration_count % max_iterations_before_restart == 0:
        driver.quit()
        # 重新初始化driver
        driver = uc.Chrome(options=options)
        driver.maximize_window()
        driver.set_page_load_timeout(80)
        driver.set_script_timeout(30)
    
    # 执行业务逻辑
    driver.get(URL)
    # ...后续操作

2. 调整页面加载策略

默认加载策略会等待页面所有资源加载完成,若存在慢加载资源会导致driver.get()阻塞。可以设置为eager(等待DOM加载完成即可)或none(完全不等待,需自行判断页面就绪状态):

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

# 配置加载策略为eager
caps = DesiredCapabilities.CHROME.copy()
caps["pageLoadStrategy"] = "eager"

options.set_capability("pageLoadStrategy", "eager")
driver = uc.Chrome(options=options, desired_capabilities=caps)

3. 增加超时异常捕获与恢复

为driver.get()添加超时捕获,发生超时后强制重启driver并重新请求:

from selenium.common.exceptions import TimeoutException

try:
    driver.get(URL)
except TimeoutException:
    # 超时后销毁旧实例并重建
    driver.quit()
    driver = uc.Chrome(options=options)
    driver.maximize_window()
    driver.set_page_load_timeout(80)
    driver.set_script_timeout(30)
    # 重新发起请求
    driver.get(URL)

4. 启用无痕模式并限制缓存

通过无痕模式隔离会话缓存,同时限制磁盘缓存大小,减少长期运行的缓存积累:

options.add_argument("--incognito")  # 启用无痕模式
options.add_argument("--disk-cache-size=0")  # 禁用磁盘缓存

5. 监控系统资源占用

长期运行的Chrome实例可能耗尽内存或CPU,导致进程卡顿。可以在脚本中监控资源,占用过高时重启driver:

import psutil

def check_driver_resource(driver):
    pid = driver.service.process.pid
    process = psutil.Process(pid)
    mem_usage = process.memory_percent()
    cpu_usage = process.cpu_percent()
    # 内存占用超80%或CPU占用超90%时触发重启
    return mem_usage > 80 or cpu_usage > 90

# 迭代中检查资源状态
if check_driver_resource(driver):
    driver.quit()
    driver = uc.Chrome(options=options)
    driver.maximize_window()
    driver.set_page_load_timeout(80)
    driver.set_script_timeout(30)

内容的提问来源于stack exchange,提问作者Mominur Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:43:29