如何为Selenium远程驱动批量添加Cookie以解决单个add_cookie过慢问题
错误原因
你自定义ActionChain实现批量加Cookie的思路不符合W3C Webdriver的Actions协议规范,该协议仅支持键盘、指针、滚轮三类输入设备的指定动作,不存在addCookie类型的动作定义,Chrome Driver收到不符合要求的动作参数就会抛出你遇到的报错,这条路不可行。
可行方案(无需修改Chrome Driver)
方案1:调用Chrome DevTools Protocol(CDP)批量添加(推荐,Selenium4+ 原生支持)
CDP提供了Network.setCookies接口,支持单次传入所有Cookie数组完成批量添加,全程只需要和远程Chrome Driver交互1次,速度不受Cookie数量影响,且支持httpOnly、sameSite等所有Cookie属性。
示例代码:
# 转换为CDP兼容的Cookie格式,缺省字段补默认值 cdp_cookies = [] target_domain = driver.current_url.split("/")[2] for cookie in cookies: cdp_cookie = { "name": cookie["name"], "value": cookie["value"], "domain": cookie.get("domain", target_domain), "path": cookie.get("path", "/"), "secure": cookie.get("secure", False), "httpOnly": cookie.get("httpOnly", False), "sameSite": cookie.get("sameSite", "Lax") # 其他需要的自定义字段可自行补充 } cdp_cookies.append(cdp_cookie) # 一次请求完成所有Cookie添加 driver.execute_cdp_cmd("Network.setCookies", {"cookies": cdp_cookies})
方案2:执行JS脚本批量添加(兼容Selenium3)
如果还在使用Selenium3不支持CDP调用,可以构造JS脚本在浏览器端一次性执行所有Cookie的添加操作,全程也只需要和远程Chrome Driver交互1次,缺点是无法添加带有httpOnly属性的Cookie。
示例代码:
add_cookie_js = """ const cookieList = arguments[0]; cookieList.forEach(c => { let str = `${c.name}=${c.value};`; if(c.domain) str += `domain=${c.domain};`; if(c.path) str += `path=${c.path};`; if(c.secure) str += `secure;`; if(c.expiry) str += `expires=${new Date(c.expiry * 1000).toUTCString()};`; document.cookie = str; }); """ # 一次执行所有Cookie添加 driver.execute_script(add_cookie_js, cookies)
注意事项
- 无论使用哪种方案,添加Cookie前必须先导航到目标域名下的任意页面,否则浏览器会因安全策略拒绝设置Cookie
- 如果需要跨域名设置Cookie,仅CDP方案支持,只需在Cookie参数中指定对应domain即可
内容的提问来源于stack exchange,提问作者Axiom Lemma
相关产品推荐
相关产品推荐

