如何让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的请求,返回预先保存的本地文件,彻底避免重复下载:
- 首次运行时,拦截目标JS的响应并保存到本地;
- 后续会话直接读取本地文件返回,无需请求服务器;
示例代码:
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
相关产品推荐
相关产品推荐

