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

如何让Chrome WebDriver在新会话中使用本地缓存的脚本?

解决思路

一、优化Chrome原生缓存配置

Chrome的用户数据目录(user-data-dir)本身包含缓存,但旧版headless模式下缓存行为异常,搭配明确的缓存参数可确保复用:

  • 替换旧版headless参数为--headless=new,新版headless的缓存逻辑和正常浏览器完全一致;
  • 显式指定独立缓存目录和容量,避免默认目录被系统清理:
    chrome_options = Options()
    chrome_options.add_argument("user-data-dir=./01profile")
    chrome_options.add_argument('--headless=new')
    chrome_options.add_argument('--disk-cache-dir=./chrome_cache')  # 指定专属缓存目录
    chrome_options.add_argument('--disk-cache-size=1073741824')  # 设置1GB缓存容量
    
  • 确保代码中没有添加--disable-cache这类禁用缓存的参数,同时确认目标JS的响应头确实包含max-age=31536000或对应过期时间的Expires字段。

二、用Seleniumwire拦截请求并返回本地缓存

直接拦截目标JS的请求,返回预先保存的本地文件,彻底避免重复下载:

  1. 首次运行时,拦截目标JS的响应并保存到本地;
  2. 后续会话直接读取本地文件返回,无需请求服务器;
    示例代码:
from seleniumwire import webdriver
from selenium.webdriver.chrome.options import Options
import os

# 替换为目标JS的实际URL
TARGET_JS_URL = "https://your-target-domain/path/to/script.js"
# 本地缓存文件路径
LOCAL_CACHED_JS = "./cached_target_script.js"

def request_interceptor(request):
    if request.url == TARGET_JS_URL:
        if os.path.exists(LOCAL_CACHED_JS):
            # 读取本地缓存并构造响应返回
            with open(LOCAL_CACHED_JS, 'r', encoding='utf-8') as f:
                js_content = f.read()
            request.create_response(
                status_code=200,
                headers={
                    'Content-Type': 'application/javascript',
                    'Cache-Control': 'max-age=31536000'
                },
                body=js_content.encode('utf-8')
            )
        else:
            # 首次请求时保存响应到本地
            def save_response(response):
                with open(LOCAL_CACHED_JS, 'wb') as f:
                    f.write(response.body)
            request.response_interceptor = save_response

# 配置Chrome选项
chrome_options = Options()
chrome_options.add_argument("user-data-dir=./01profile")
chrome_options.add_argument('--headless=new')

# 初始化驱动并绑定拦截器
driver = webdriver.Chrome(options=chrome_options)
driver.request_interceptor = request_interceptor

# 后续业务逻辑...

三、无需长期保持WebDriver会话

不需要让WebDriver持续运行一周,这种方式资源占用高且易出现崩溃、内存泄漏等稳定性问题。上述两种方案都支持每次启动新会话时复用缓存,只要本地缓存文件或Chrome缓存目录未被删除即可。

四、排查缓存失效的常见原因

  • 检查目标JS的响应头:确认服务器返回的Cache-Control或Expires字段符合预期,若服务器返回no-cache、must-revalidate等强制刷新的头,浏览器不会复用缓存;
  • 验证缓存文件:确认Chrome缓存目录或本地保存的JS文件存在,且文件权限正常可读取;
  • 避免强制刷新操作:代码中不要模拟F5刷新,也不要给请求添加Cache-Control: no-cache这类会绕过缓存的头。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:43:14