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

and*_*kin 4 python selenium selenium-chromedriver

我正在尝试将Cookie添加到浏览器,但是出现以下错误:

消息:无效的参数:无效的“到期”(会话信息:chrome = 75.0.3770.90)

此代码显示了我如何加载和添加cookie。

for cookie in pickle.load(open(r'{0}\{1}_cookie.pkl'.format(settings.COOKIES_PATH, self.tv_username), 'rb')):
    self.browser.add_cookie(cookie)
Run Code Online (Sandbox Code Playgroud)

Cookie的值:

{'__utmc': '226258911', '_sp_id.cf1a': '0b243b32-8dee-46d9-a243-bb4d2bfcb805.1560942815.1.1560942821.1560942815.5941cbc0-0500-4a17-8f6c-4ee3f133f67c', 'km_vs': '1', '__utmt': '1', '__utma': '226258911.510671571.1560942814.1560942814.1560942814.1', 'km_ai': 'm6caeIAUtEqx%2BIWda%2F7klZER%2F1Y%3D', 'kvcd': '1560942821112', '__utmb': '226258911.2.10.1560942814', 'km_lv': '1560942821', '__utmz': '226258911.1560942814.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)', 'etg': 'undefined', '_sp_ses.cf1a':'*'}
Run Code Online (Sandbox Code Playgroud)

与旧版chrome搭配使用时效果很好。任何帮助,将不胜感激!

Sco*_*ers 13

在我的 python 和 selenium 版本中,我发现 Selenium 输出 cookie 到期值的方式与其导入它们的方式之间存在差异。当你使用

driver.get_cookies()
Run Code Online (Sandbox Code Playgroud)

驱动程序可以输出浮点数而不是整数的到期值。这些浮点数似乎是纪元时间单位(自 1970 年 1 月 1 日以来的秒数)。如果您尝试将这些确切的 cookie 添加回驱动程序,它们将失败,因为驱动程序仅接受具有整数到期值的 cookie。在这一行:

driver.add_cookie({'name': name, 'value': value, 'expiry': expiry})
Run Code Online (Sandbox Code Playgroud)

expiry 的值必须是一个整数。否则,您将收到值错误。我使用以下代码修复了这个问题。

# Saving current cookies and reformatting them
cookies = driver.get_cookies()
for cookie in cookies:
    if 'expiry' in cookie:
        cookie['expiry'] = int(cookie['expiry'])
    # Adding cookies back into the driver
    driver.add_cookie(cookie)
Run Code Online (Sandbox Code Playgroud)

这对我有用,我不再收到错误。


Yoa*_*ler 9

就我而言,先前的答案无效。我不得不从对象中删除过期密钥。

 for cookie in pickle.load(open(PATH, "rb")):
     if 'expiry' in cookie:
         del cookie['expiry']

     self.driver.add_cookie(cookie)
Run Code Online (Sandbox Code Playgroud)

如果您以前从驱动程序返回时直接将Cookie腌制,则会发生这种情况,例如:

pickle.dump(browser.get_cookies(), open(PATH, "wb"))
Run Code Online (Sandbox Code Playgroud)

  • 较新版本的 chromedriver 拒绝“过期”值的原因是由于此更改:https://chromium.googlesource.com/chromium/src/+/c83119b466cfd63fd1eb616ee86b22ede5db3c4e%5E%21/#F4 (2认同)
  • 当您的 chromedriver 处于 w3c 兼容模式时,它现在要求“expiry”为 int64,而在传统模式下它将接受双精度数。因此,您可以将到期密钥转换为整数(将它们乘以 1000 以获得毫秒),或者您可以在初始化会话时通过 ChromeOptions 禁用 w3c 合规性: ```chrome_options.add_experimental_option("w3c", False)``` (2认同)
  • 这已被确认为 chromedriver 中的错误,并将在未来版本中修复:https://bugs.chromium.org/p/chromedriver/issues/detail?id=3331 (2认同)
  • 如果您不关心“过期”,那么这是可行的,但它在技术上修改了原始cookie。要保留原始cookie,请参阅我的答案:/sf/answers/4329200921/ (2认同)

小智 4

问题是您正在尝试添加与 selenium 期望的格式不同的 cookie。

python selenium api 参考说你必须用这样的字典插入cookie

driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
Run Code Online (Sandbox Code Playgroud)

所以你必须调整你的循环以使用键、值格式

for key, value in pickle.load(open(r'{0}\{1}_cookie.pkl'.format(settings.COOKIES_PATH, self.tv_username), 'rb')):
    self.browser.add_cookie({'name' : key, 'value' : value})
Run Code Online (Sandbox Code Playgroud)