Selenium webdriver添加cookie实现过程详解


Posted in Python onAugust 12, 2020

一. webdriver中常用的cookie方法

webdriver中提供了操作cookie的相关方法:

  • get_cookies()

    获得cookie信息

  • add_cookie(cookie_dict) 添加cookie
  • delete_cookie(name) 删除特定(部分)的cookie
  • delete_all_cookies() 删除所有的cookie

二. add_cookie()的用法

1. 源码中的解释

源码中简略的向我们展示了如何添加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"

    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})

    """
    self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})

从中可以看出add_cookie()这个函数有一个参数cookie_dict,它是以字典的形式传入的,字典中必选的键是"name"和"value",可选的键是"path", "domin", "secure", "expiry",其实源码中还漏了一个:"httponly"

2. cookie中键名的含义

  • name:cookie的名称
  • value:cookie对应的值,动态生成的
  • domain:服务器域名
  • expiry:Cookie有效终止日期
  • path:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie
  • httpOnly:防脚本攻击
  • secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时

三. 实例

第一步:我们先手工做一次登录,打开chrome的调试工具(F12),选择Network—Preserve log—XHR

Selenium webdriver添加cookie实现过程详解

第二步:点击登录,打开调试工具中的login,可以看到右边Response Headers下面就出现了服务器返回给浏览器的cookie

Selenium webdriver添加cookie实现过程详解

第三步:python代码的实现,最容易出现问题的可能是这一步

from selenium import webdriver

driver = webdriver.Chrome()
cookies = {'value': 'think%3A%7B%22username%210293%31628193MDAwMDAwMLOGpZaIudFqhc6Gl7LQetmZtmfOk2RhbQ%22%2C%22expire%sfdaaswMDAwMDAwMLOGud6Gqb-whbiCmLOmdZ4%22%2C%22token%22%3A%22MDAwMDAwMDAwMMurrpWavLehhs1-3LLfgduEt4OWepuo123456123KZq6HQxtOK0ZCme5p-q6iZu2yrn4uNhJ3KedDYk7ivboS4it6910926YW0%22%7D',
      'name': 'ketangpai_home_remember'}

driver.add_cookie(cookie_dict=cookies)
driver.get(https://www.ketangpai.com/Main/index.html)

运行结果后发现报错了:Message: unable to set cookie

Traceback (most recent call last):
 File "D:/python_workshop/python6/selenium_webdriver/add_cookies的使用(二).py", line 9, in <module>
  driver.add_cookie(cookie_dict=cookies)
 File "D:\Program\python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 872, in add_cookie
  self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
 File "D:\Program\python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 312, in execute
  self.error_handler.check_response(response)
 File "D:\Program\python34\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
  raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unable to set cookie
 (Session info: chrome=66.0.3359.139)
 (Driver info: chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),platform=Windows NT 6.1.7600 x86_64)

第四步:修改代码,解决问题

"技术提示:必须首先加载网站,这样Selenium 才能知道cookie 属于哪个网站,即使加载网站的行为对我们没任何用处"

只需要给原来的代码加上一句(红色部分),这个url填"https://www.ketangpai.com/User/login.html"或"https://www.ketangpai.com/Main/index.html"都行,只要是同一个domain就行,浏览器会自动跳转到登录页面:

from selenium import webdriver

driver = webdriver.Chrome()
cookies = {'value': 'think%3A%7B%22username%210293%31628193MDAwMDAwMLOGpZaIudFqhc6Gl7LQetmZtmfOk2RhbQ%22%2C%22expire%sfdaaswMDAwMDAwMLOGud6Gqb-whbiCmLOmdZ4%22%2C%22token%22%3A%22MDAwMDAwMDAwMMurrpWavLehhs1-3LLfgduEt4OWepuo123456123KZq6HQxtOK0ZCme5p-q6iZu2yrn4uNhJ3KedDYk7ivboS4it6910926YW0%22%7D',
      'name': 'ketangpai_home_remember'}

driver.get("https://www.ketangpai.com/User/login.html")
driver.add_cookie(cookie_dict=cookies)
driver.get(https://www.ketangpai.com/Main/index.html)

再次运行,发现已经成功了

Selenium webdriver添加cookie实现过程详解

四. 获取cookie的方法不止一种

cookie的可以通过浏览器调试来获取,当然也可以通过抓包工具获取,那么能不能用代码来获取呢?答案是肯定的

参照上面那篇博文,我们完成以下代码,第一次通过driver1发送用户名和密码登录,获取cookie并保存,第二次driver2添加driver1保存的cookie,达到绕过登录的目录

from selenium import webdriver
import time

#driver1登录网站,获得cookie并保存
driver1 = webdriver.Chrome()
driver1.get("https://www.ketangpai.com/User/login.html")
driver1.maximize_window()
time.sleep(2)

#第一次通过send_keys向输入框发送用户名密码登录
driver1.find_element_by_xpath("//input[@name='account']").send_keys("your username")
driver1.find_element_by_xpath("//input[@name='pass']").send_keys("your password")
time.sleep(2)
driver1.find_element_by_xpath("//div[@class='padding-cont pt-login']//a[@class='auto-login fl']").click()
time.sleep(3)
driver1.find_element_by_xpath("//div[@class='padding-cont pt-login']//a[@class='btn-btn']").click()
time.sleep(6)
#用get_cookies的方法得到登录后的cookie,这个cookie是个列表,列表中两个元素都是字典,第一个是登录前的cookie,第二个是登录后的cookie
#将cookie保存在变量savedCookies中
savedCookies = driver1.get_cookies()
print(savedCookies)

#driver2得到driver1的cookie,先删除自己的所有cookie,再将driver1的cookie添加进来
driver2 = webdriver.Chrome()
#必须首先加载网站,这样selenium才知道cookie是属于哪个网站的
driver2.get("https://www.ketangpai.com/User/login.html")
#一旦加载网站,即使没登录,也会产生一个cookie,所以这个cookie被删除了
driver2.delete_all_cookies()
#遍历savedCookies中的两个元素
for cookie in savedCookies:
  #k代表着add_cookie的参数cookie_dict中的键名,这次我们要传入这5个键
  for k in {'name', 'value', 'domain', 'path', 'expiry'}:
    #cookie.keys()属于'dict_keys'类,通过list将它转化为列表
    if k not in list(cookie.keys()):
      #saveCookies中的第一个元素,由于记录的是登录前的状态,所以它没有'expiry'的键名,我们给它增加
      if k == 'expiry':
        t = time.time()
        cookie[k] = int(t)  #时间戳s
  #将每一次遍历的cookie中的这五个键名和键值添加到cookie
  driver2.add_cookie({k: cookie[k] for k in {'name', 'value', 'domain', 'path', 'expiry'}})

#加载我们想要看到的页面的url
driver2.get("https://www.ketangpai.com/Main/index.html")
#再次打印driver2的cookie
print(driver2.get_cookies())

注意:cookie有两种,一种是会话级别的,一种是有有效期的,会话级别的cookie就不能用add_cookie的方法了,因为一次会话过程(从打开浏览器到关闭浏览器,断开连接)结束后它就失效了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
深入源码解析Python中的对象与类型
Dec 11 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
Aug 30 Python
python实现抖音视频批量下载
Jun 20 Python
Python单向链表和双向链表原理与用法实例详解
Aug 31 Python
详解python分布式进程
Oct 08 Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
python字符串替换re.sub()实例解析
Feb 09 Python
在Django中预防CSRF攻击的操作
Mar 13 Python
keras 模型参数,模型保存,中间结果输出操作
Jul 06 Python
python破解同事的压缩包密码
Oct 14 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 Python
Python如何设置指定窗口为前台活动窗口
Aug 12 #Python
Python面向对象实现方法总结
Aug 12 #Python
Python命名空间及作用域原理实例解析
Aug 12 #Python
python将字典内容写入json文件的实例代码
Aug 12 #Python
Python调用jar包方法实现过程解析
Aug 11 #Python
如何用python免费看美剧
Aug 11 #Python
Pythonic版二分查找实现过程原理解析
Aug 11 #Python
You might like
PHP使用JSON和将json还原成数组
2015/02/12 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
JavaScript 函数式编程的原理
2009/10/16 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
2016/03/25 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
jQuery实现鼠标拖拽登录框移动效果
2020/09/13 jQuery
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
Python中无限元素列表的实现方法
2014/08/18 Python
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
浅谈dataframe中更改列属性的方法
2018/07/10 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
浅谈django url请求与数据库连接池的共享问题
2019/08/29 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
美国著名首饰网站:BaubleBar
2016/08/29 全球购物
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
打架检讨书100字
2014/01/08 职场文书
党校学习自我鉴定
2014/02/24 职场文书
社会稳定风险评估方案
2014/06/02 职场文书
学生抄袭作业的检讨书
2014/10/02 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
省级三好学生主要事迹材料
2015/11/03 职场文书
三好学生竞选稿
2015/11/21 职场文书
在Django中使用MQTT的方法
2021/05/10 Python
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL