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

Posted

技术标签:

【中文标题】将cookie添加到chromedriver时如何修复Selenium中的“无效参数:无效\'到期\'”?【英文标题】:How to fix "invalid argument: invalid 'expiry'" in Selenium when adding cookies to a chromedriver?将cookie添加到chromedriver时如何修复Selenium中的“无效参数:无效'到期'”? 【发布时间】:2019-11-01 22:58:24 【问题描述】:

我正在尝试将 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)

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':'*'

它适用于以前版本的 chrome。任何帮助将不胜感激!

【问题讨论】:

你试过最新版的chromedriver吗? 我试过并得到:“消息:未创建会话:此版本的 ChromeDriver 仅支持 Chrome 版本 76”。 你能告诉我们cookies的价值吗?? @JoseMartínezPoquet 我在问题描述中添加了值。 【参考方案1】:

就我而言,之前的答案不起作用。我必须从对象中删除过期键。

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

     self.driver.add_cookie(cookie)

如果您之前在从驱动程序返回时直接腌制 cookie,就会发生这种情况,如下所示:

pickle.dump(browser.get_cookies(), open(PATH, "wb"))

【讨论】:

对此我感激不尽。我试过的其他方法都没有。奇怪的是,这只发生在某些配置上。我无法隔离到精确版本的泡菜或精确配置。 新版本的 chromedriver 拒绝“过期”值的原因是由于此更改:chromium.googlesource.com/chromium/src/+/… 当您的 chromedriver 处于 w3c 兼容模式时,它现在要求 'expiry' 为 int64,而在旧模式下它将接受双精度。因此,您可以将到期密钥转换为整数(将它们乘以 1000 以获得 ms),或者您可以在初始化会话时通过 ChromeOptions 禁用 w3c 合规性:chrome_options.add_experimental_option("w3c", False) 这已被确认为 chromedriver 中的一个错误,将在未来的版本中修复:bugs.chromium.org/p/chromedriver/issues/detail?id=3331 如果您不关心expiry,这可行,但它在技术上修改了原始cookie。要保留原始 cookie,请参阅我的回答:***.com/a/61845727/3862439【参考方案2】:

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

driver.get_cookies()

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

driver.add_cookie('name': name, 'value': value, 'expiry': 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)

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

【讨论】:

这也是错误的(它修改了cookie)(需要乘以1000,见1或the answer below) 对于我的版本,这是正确的。将到期时间乘以 1000 得到毫秒。当您重新添加它们时,驱动程序期望“到期”以秒为单位,而不是毫秒。 也许您应该在帖子中提及您的 chrome&chromedriver&selenium 版本。 // 也因为修复了这个错误,在较新的版本中,cookie 也可能被存储为 int64。【参考方案3】:

问题在于您尝试添加的 cookie 格式与 selenium 预期的格式不同。

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

driver.add_cookie('name' : 'foo', 'value' : 'bar')

因此您必须调整循环以使用键值格式

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)

【讨论】:

【参考方案4】:

这是由 chromedriver 中的一个活动错误引起的:https://bugs.chromium.org/p/chromedriver/issues/detail?id=3331

错误是 chromedriver 返回 expiry cookie 和 get_cookies 作为双精度,但不接受带有 add_cookie 的双精度。这是修复:

for cookie in pickle.load(open('cookies.pkl', 'rb')):
    expiry = cookie.get('expiry', None)

    if expiry:
      cookie['expiry'] = int(expiry * 1000)
    browser.add_cookie(cookie)

【讨论】:

为什么要乘以 1000? @ScottDriggers “获取毫秒”***.com/questions/56663666/…

以上是关于将cookie添加到chromedriver时如何修复Selenium中的“无效参数:无效'到期'”?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Django Channels 将 cookie 添加到标头?

如何使用C#中的Selenium Webdriver使用Chrome浏览器的Cookie?

复用浏览器, 获取cookie

将 Cookie 添加到简单的 jQuery 函数 [重复]

如何将 cookie 添加到 vue-apollo 请求中?

如何使用来自 IHttpClientFactory 的 HttpClient 将 cookie 添加到请求中