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生成随机验证码(中文验证码)示例
Apr 03 Python
Python实现多线程HTTP下载器示例
Feb 11 Python
Python新手们容易犯的几个错误总结
Apr 01 Python
Python数据处理numpy.median的实例讲解
Apr 02 Python
python爬取基于m3u8协议的ts文件并合并
Apr 26 Python
FFrpc python客户端lib使用解析
Aug 24 Python
Pycharm+Python工程,引用子模块的实现
Mar 09 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
解决python中import文件夹下面py文件报错问题
Jun 01 Python
Python3爬虫中Splash的知识总结
Jul 10 Python
如何快速理解python的垃圾回收机制
Sep 01 Python
python如何实现图片压缩
Sep 11 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学习笔记之面向对象
2014/11/08 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
使用Javascript接收get传递的值的代码
2011/11/30 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
jQuery Dom元素操作技巧
2018/02/04 jQuery
Vue render深入开发讲解
2018/04/13 Javascript
js中的数组对象排序分析
2018/12/11 Javascript
VUE组件中的 Drawer 抽屉实现代码
2019/08/06 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
详解Python中的__init__和__new__
2014/03/12 Python
在Python中使用itertools模块中的组合函数的教程
2015/04/13 Python
Python中if __name__ == '__main__'作用解析
2015/06/29 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
2017/06/02 Python
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
德国在线订购鲜花:Fleurop
2018/08/25 全球购物
乌鸦喝水教学反思
2014/02/07 职场文书
万年牢教学反思
2014/02/15 职场文书
我的长生果教学反思
2014/04/28 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
停车场管理协议书范本
2014/10/08 职场文书
部队2014年终工作总结
2014/11/27 职场文书
2015年党员个人剖析材料
2014/12/18 职场文书
新郎接新娘保证书
2015/05/08 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
bat批处理之字符串操作的实现
2022/03/16 Python
MySQL添加索引特点及优化问题
2022/07/23 MySQL