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实现通过shelve修改对象实例
Sep 26 Python
Python的re模块正则表达式操作
May 25 Python
python 截取 取出一部分的字符串方法
Mar 01 Python
Django 实现下载文件功能的示例
Mar 06 Python
TensorFlow模型保存和提取的方法
Mar 08 Python
python写程序统计词频的方法
Jul 29 Python
Django 查询数据库并返回页面的例子
Aug 12 Python
pytorch 模型可视化的例子
Aug 17 Python
Python Django 简单分页的实现代码解析
Aug 21 Python
在Python中使用turtle绘制多个同心圆示例
Nov 23 Python
如何利用python web框架做文件流下载的实现示例
Jun 02 Python
python3爬虫中异步协程的用法
Jul 10 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
PHP4引用文件语句的对比
2006/10/09 PHP
php zend解密软件绿色版测试可用
2008/04/14 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
JSON JQUERY模板实现说明
2010/07/03 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
学习JavaScript设计模式(继承)
2015/11/26 Javascript
基于canvas实现的钟摆效果完整实例
2016/01/26 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
bootstrap实现每隔5秒自动轮播效果
2016/12/20 Javascript
bootstrap手风琴制作方法详解
2017/01/11 Javascript
JSON 数据详解及实例代码分析
2017/01/20 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
2017/01/22 Javascript
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
详解JavaScript按概率随机生成事件
2017/08/02 Javascript
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
python实现多线程采集的2个代码例子
2014/07/07 Python
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
pandas object格式转float64格式的方法
2018/04/10 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
2021/02/20 Python
模具专业求职信
2014/06/26 职场文书
施工安全责任书范本
2014/07/24 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
2014年最新领导班子整改方案
2014/09/27 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书
英文慰问信
2015/02/14 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
经营场所证明范本
2015/06/19 职场文书
环保证明
2015/06/23 职场文书
小数乘法教学反思
2016/02/22 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书