Selenium 添加cookie失败 assert cookie_dict[‘sameSite’] in [‘Strict’, ‘Lax’] AssertionError()的解决方法
问题描述:
在使用selenium做浏览器自动化时,当出现操作cookie的场景时,使用webdriver中的add_cookie()方法时,会出现AssertionError()报错信息
原因分析:
Google浏览器对于Cookie跨域的限制问题。
经过查询资料发现:
从Chrome 51开始,浏览器的Cookie新增加了一个SameSite属性,用来防止CSRF攻击和用户追踪。该设置当前默认是关闭的
在Chrome 80之后,该功能默认已开启。
samesite key | value |
---|---|
Strict | 最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。 |
Lax | Lax规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。 |
None | 无限制,可跨域请求 |
导致这个报错的原因其实源自于webdriver中对samesite的检测(部分版本的selenium),具体如下代码所示,在调用这个方法时,首先判断添加的cookie中是否包含sameSite属性,接下来就有意思了,他根本没有判断None值的过程,如果不为“Strict”或“Lax”便直接抛出异常。
那么,只要你添加的cookie中含有sameSite属性且值不为[‘Strict’, ‘Lax’]中的任何一种,那么程序将报错。
//webdriver中添加cookie的源码
def add_cookie(self, cookie_dict):
"""
Adds a cookie to your current session.
:Args:
- cookie_dict: A dictionary object, with required keys - "name" and "value";
optional keys - "path", "domain", "secure", "expiry", "sameSite"
Usage:
driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure':True})
driver.add_cookie({'name': 'foo', 'value': 'bar', 'sameSite': 'Strict'})
"""
if 'sameSite' in cookie_dict:
assert cookie_dict['sameSite'] in ['Strict', 'Lax']
self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
else:
self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
解决方案:
解决方法也非常简单,只要解决了这个判断即可。
1.更换其他版本的selenium
2.直接更改源码,将None属性添加到判断列表中即可
assert cookie_dict['sameSite'] in ['Strict', 'Lax', 'None']