将Cookie添加到chromedriver中时,如何在Selenium中修复“无效的参数:无效的'expiry'”?

时间:2019-07-08 05:57:56

标签: selenium cookies pickle

“无效的参数:无效的“到期””

我正在尝试将Cookie添加到浏览器,但是出现以下错误: 将Cookie添加到chromedriver中时,如何解决Selenium中的“无效参数:无效的'expiry'”?

pickle.dump( driver.get_cookies() , open("cookies.pkl","wb"))

driver.get ( URL )
sleep ( 2 )

cookies = pickle.load(open("cookies.pkl", "rb")) 
for cookie in cookies: 
    driver.add_cookie(cookie)
    sleep(2)

driver.get ( URL )

print(driver.get_cookies())
pickle.dump( driver.get_cookies() , open("cookies.pkl","wb"))

错误消息

selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid 'expiry'
  (Session info: chrome=75.0.3770.100)

3 个答案:

答案 0 :(得分:2)

首先点击评论链接,将泡菜更改为字典
另请参阅
https://www.w3.org/TR/webdriver/#add-cookie点6
到期时间现在应该是int而不是float

for cookie in cookies:
    if isinstance(cookie.get('expiry'), float):
        cookie['expiry'] = int(cookie['expiry'])
    driver.add_cookie(cookie)

答案 1 :(得分:2)

较新版本的chromedriver拒绝“过期”值的原因是由于此更改:https://chromium.googlesource.com/chromium/src/+/c83119b466cfd63fd1eb616ee86b22ede5db3c4e%5E%21/#F4

当chromedriver处于w3c兼容模式时,它现在要求“ expiry”为int64,而在旧模式下,它将继续接受旧的float值。

问题(可能是chromedriver中的错误)是driver.get_cookies()继续以浮点数返回“过期”值,而driver.add_cookie(...)不接受这些cookie。

因此,为了解决这个问题,您有两种选择:

  1. 将到期密钥转换为整数(将它们乘以1000得到毫秒):cookie["expiry"] = int(cookie["expiry"]*1000),然后将其传递给driver.add_cookie(...)

  1. 通过向ChromeOptions添加实验性标志来禁用chromedriver会话的w3c兼容性:
from selenium import webdriver

opt = webdriver.ChromeOptions()
opt.add_experimental_option('w3c', False)
driver = webdriver.Chrome(chrome_options=opt)

答案 2 :(得分:0)

此问题已在ChromeDriver-83中修复 并发布了该版本:

Resolved issue 3331: The get_cookies() method is returning 'expiry' keys of type double, but should be int64 in w3c mode