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的Django框架生成PDF文件的教程
Jul 22 Python
python 全文检索引擎详解
Apr 25 Python
Python守护线程用法实例
Jun 23 Python
Python用sndhdr模块识别音频格式详解
Jan 11 Python
django框架实现一次性上传多个文件功能示例【批量上传】
Jun 19 Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 Python
Python 读取 YUV(NV12) 视频文件实例
Dec 09 Python
wxPython修改文本框颜色过程解析
Feb 14 Python
Django认证系统user对象实现过程解析
Mar 02 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
Jul 28 Python
无惧面试,带你搞懂python 装饰器
Aug 17 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 带逗号千位符数字的处理方法
2012/01/10 PHP
鸡肋的PHP单例模式应用详解
2013/06/03 PHP
PHP截断标题且兼容utf8和gb2312编码
2013/09/22 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
javaScript对象和属性的创建方法
2007/01/15 Javascript
比较搞笑的js陷阱题
2010/02/07 Javascript
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
jQuery实现延迟跳转的方法
2015/06/05 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
简单说说angular.json文件的使用
2018/10/29 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
详细介绍Ruby中的正则表达式
2015/04/10 Python
判断网页编码的方法python版
2016/08/12 Python
老生常谈Python序列化和反序列化
2017/06/28 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
python列表list保留顺序去重的实例
2018/12/14 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
Python基于template实现字符串替换
2020/11/27 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
中职招生先进个人材料
2014/08/31 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
七个Python必备的GUI库
2021/04/27 Python
Python自动化爬取天眼查数据的实现
2021/06/15 Python