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)
这对我有用,我不再收到错误。
就我而言,先前的答案无效。我不得不从对象中删除过期密钥。
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)
小智 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)