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计算N天之后日期的方法
Mar 31 Python
Python的SQLAlchemy框架使用入门
Apr 29 Python
python实现下载文件的三种方法
Feb 09 Python
Python实现替换文件中指定内容的方法
Mar 19 Python
pyhton列表转换为数组的实例
Apr 04 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
python中while和for的区别总结
Jun 28 Python
Python tkinter和exe打包的方法
Feb 05 Python
python实现滑雪者小游戏
Feb 22 Python
Python MySQLdb 执行sql语句时的参数传递方式
Mar 04 Python
Python Django view 两种return的实现方式
Mar 16 Python
Python面向对象实现方法总结
Aug 12 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
改进的IP计数器
2006/10/09 PHP
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
Laravel5中contracts详解
2015/03/02 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
PHP读MYSQL中文乱码的快速解决方法
2016/10/01 PHP
Function.prototype.call.apply结合用法分析示例
2013/07/03 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
JS 数字转换研究总结
2013/12/26 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
Javascript变量的作用域和作用域链详解
2015/04/02 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
python使用json序列化datetime类型实例解析
2018/02/11 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
Python猫眼电影最近上映的电影票房信息
2020/09/18 Python
Python使用pickle进行序列化和反序列化的示例代码
2020/09/22 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
建筑学推荐信
2013/11/03 职场文书
护理专业推荐信
2013/11/07 职场文书
学校创先争优活动总结
2014/08/28 职场文书
超强台风观后感
2015/06/09 职场文书
spring boot中nativeQuery的用法
2021/07/26 Java/Android
MySQL 用 limit 为什么会影响性能
2021/09/15 MySQL
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript
DQL数据查询语句使用示例
2022/12/24 MySQL