Selenium 添加cookie失败 assert cookie_dict[‘sameSite‘] in [‘Strict‘, ‘Lax‘] AssertionError()的解决方法

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 keyvalue
Strict最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。
LaxLax规则稍稍放宽,大多数情况也是不发送第三方 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']
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值