一. 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中键名的含义

这些键名都代表什么意思呢?参考博文《selenium3.7+ python3 添加cookie模拟登陆》,罗列如下

  • name:cookie的名称

  • value:cookie对应的值,动态生成的

  • domain:服务器域名

  • expiry:Cookie有效终止日期

  • path:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie

  • httpOnly:防脚本攻击

  • secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时

三. 实例(以课堂派的登录为例)

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

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

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

1 from selenium import webdriver
2
3 driver = webdriver.Chrome()
4 cookies = {'value': 'think%3A%7B%22username%210293%31628193MDAwMDAwMLOGpZaIudFqhc6Gl7LQetmZtmfOk2RhbQ%22%2C%22expire%sfdaaswMDAwMDAwMLOGud6Gqb-whbiCmLOmdZ4%22%2C%22token%22%3A%22MDAwMDAwMDAwMMurrpWavLehhs1-3LLfgduEt4OWepuo123456123KZq6HQxtOK0ZCme5p-q6iZu2yrn4uNhJ3KedDYk7ivboS4it6910926YW0%22%7D',
5 'name': 'ketangpai_home_remember'}
6
7 driver.add_cookie(cookie_dict=cookies)
8 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: Trying to log in with cookies and get the errorMessage - “Can only set cookies for current domain” or "Unable to set Cookie"

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

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

1 from selenium import webdriver
2
3 driver = webdriver.Chrome()
4 cookies = {'value': 'think%3A%7B%22username%210293%31628193MDAwMDAwMLOGpZaIudFqhc6Gl7LQetmZtmfOk2RhbQ%22%2C%22expire%sfdaaswMDAwMDAwMLOGud6Gqb-whbiCmLOmdZ4%22%2C%22token%22%3A%22MDAwMDAwMDAwMMurrpWavLehhs1-3LLfgduEt4OWepuo123456123KZq6HQxtOK0ZCme5p-q6iZu2yrn4uNhJ3KedDYk7ivboS4it6910926YW0%22%7D',
5 'name': 'ketangpai_home_remember'}
6
7 driver.get("https://www.ketangpai.com/User/login.html")
8 driver.add_cookie(cookie_dict=cookies)
9 driver.get("https://www.ketangpai.com/Main/index.html")

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

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

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

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

 1 from selenium import webdriver
2 import time
3
4 #driver1登录网站,获得cookie并保存
5 driver1 = webdriver.Chrome()
6 driver1.get("https://www.ketangpai.com/User/login.html")
7 driver1.maximize_window()
8 time.sleep(2)
9
10 #第一次通过send_keys向输入框发送用户名密码登录
11 driver1.find_element_by_xpath("//input[@name='account']").send_keys("your username")
12 driver1.find_element_by_xpath("//input[@name='pass']").send_keys("your password")
13 time.sleep(2)
14 driver1.find_element_by_xpath("//div[@class='padding-cont pt-login']//a[@class='auto-login fl']").click()
15 time.sleep(3)
16 driver1.find_element_by_xpath("//div[@class='padding-cont pt-login']//a[@class='btn-btn']").click()
17 time.sleep(6)
18 #用get_cookies的方法得到登录后的cookie,这个cookie是个列表,列表中两个元素都是字典,第一个是登录前的cookie,第二个是登录后的cookie
19 #将cookie保存在变量savedCookies中
20 savedCookies = driver1.get_cookies()
21 print(savedCookies)
22
23 #driver2得到driver1的cookie,先删除自己的所有cookie,再将driver1的cookie添加进来
24 driver2 = webdriver.Chrome()
25 #必须首先加载网站,这样selenium才知道cookie是属于哪个网站的
26 driver2.get("https://www.ketangpai.com/User/login.html")
27 #一旦加载网站,即使没登录,也会产生一个cookie,所以这个cookie被删除了
28 driver2.delete_all_cookies()
29 #遍历savedCookies中的两个元素
30 for cookie in savedCookies:
31 #k代表着add_cookie的参数cookie_dict中的键名,这次我们要传入这5个键
32 for k in {'name', 'value', 'domain', 'path', 'expiry'}:
33 #cookie.keys()属于'dict_keys'类,通过list将它转化为列表
34 if k not in list(cookie.keys()):
35 #saveCookies中的第一个元素,由于记录的是登录前的状态,所以它没有'expiry'的键名,我们给它增加
36 if k == 'expiry':
37 t = time.time()
38 cookie[k] = int(t) #时间戳s
39 #将每一次遍历的cookie中的这五个键名和键值添加到cookie
40 driver2.add_cookie({k: cookie[k] for k in {'name', 'value', 'domain', 'path', 'expiry'}})
41
42 #加载我们想要看到的页面的url
43 driver2.get("https://www.ketangpai.com/Main/index.html")
44 #再次打印driver2的cookie
45 print(driver2.get_cookies())

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

selenium webdriver 如何添加cookie的更多相关文章

  1. selenium webdriver如何添加cookie

    一. webdriver中常用的cookie方法 webdriver中提供了操作cookie的相关方法: get_cookies()                  获得cookie信息 add_c ...

  2. selenium webdriver处理浏览器Cookie

    有时候我们需要验证浏览器中是否存在某个cookie,因为基于真实的cookie 的测试是无法通过白盒和集成测试完成的.WebDriver 提供了操作Cookie 的相关方法可以读取.添加和删除cook ...

  3. selenium webdriver(6)---cookie相关操作

    介绍selenium操作cookie之前,先简单介绍一下cookie的基础知识 cookie cookie一般用来识别用户身份和记录用户状态,存储在客户端电脑上.IE的cookie文件路径(win7) ...

  4. selenium - webdriver - cookie操作

    WebDriver提供了操作Cookie的相关方法,可以读取.添加和删除cookie信息. WebDriver操作cookie的方法: get_cookies(): 获得所有cookie信息. get ...

  5. Selenium WebDriver 处理cookie

    在使用webdriver测试中,很多地方都使用登陆,cookie能够实现不必再次输入用户名密码进行登陆. 首先了解一下Java Cookie类的一些方法. 在jsp中处理cookie数据的常用方法: ...

  6. Selenium WebDriver对cookie进行处理绕过登录验证码

    现在几乎所有登录页面都会带一个验证码,做起自动化这块比较麻烦, 所以要绕过网站的验证码. 首先需要手动登录一次你的测试网站,去chrome的F12里获取这个网站的cookie信息,找到对应的保存登录信 ...

  7. Selenium WebDriver 对Cookie进行处理绕过登录验证码

    首先需要手动登录一次你的测试网站,去Chrome的F12中获取这个网站的cookie信息,找到对应的保存登录信息的cookie,接下来在代码中将上述的cookie信息通过webdriver写入的自动化 ...

  8. selenium添加cookie切换到不同环境

    背景:网站中需要切环境到预发布,在用谷歌浏览器可以使用工具,但是在selenium启动时,是不会带任何插件,向开发了解下,切换环境本质是添加cookie值,那么这个就简单了 1.使用selenium中 ...

  9. 转:python webdriver API 之cookie 处理

    有时候我们需要验证浏览器中是否存在某个 cookie,因为基于真实的 cookie 的测试是无法通过白盒和集成测试完成的.webdriver 可以读取.添加和删除 cookie 信息.webdrive ...

随机推荐

  1. Linux常用硬盘分区工具简介

    1.fdisk 查看当前硬盘分区: [root@yqtrack-zabbix /]# fdisk -l 2.cfdisk 查看当前硬盘分区: 3.sfdisk 查看当前分区: 4.parted 查看当 ...

  2. 转:centos 7 安装音频视频解码器

    (原文:https://blog.csdn.net/zhou1519/article/details/39035233/) 1.安装额外的软件源epel和nux-dextop rpm -Uvh htt ...

  3. python 发送post和get请求

    摘自:http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201231085444250/ 测试用CGI,名字为test.py,放在ap ...

  4. css at @ 规则

    css相信我们都不陌生,但是我们真的对它非常了解吗? css主要分为两种规则组成: 一种被称为 at-rule,也就是 at 规则 另一种是 qualified rule,也就是普通规则 今天让我们来 ...

  5. ZooKeeper-客户端命令 zkCli

    执行 bin/zkCli 文件进入客户端 查看帮助 help ZooKeeper -server host:port cmd args stat path [watch] set path data ...

  6. Educational Codeforces Round 52 (Rated for Div. 2)

    题目链接 A. Vasya and Chocolate 题意 已知钱,价格,赠送规则求最多获得巧克力数 思路常规算即可 代码 #include <bits/stdc++.h> #defin ...

  7. Anaconda+django安装问题

    Anaconda使用中常遇到如下问题: 如果Anaconda不是最新版本,可在Anaconda Prompt中使用如下命令更新至最新版 conda update -n base -c defaults ...

  8. 解压unzip的用法

    1.把文件解压到当前目录下 [root@instance-q6z0ksfb xmerge_test]# unzip db1.zip 2.把文件解压到指定的目录下,需要用到-d参数. unzip -d ...

  9. 16、使用limit offset 分页时,为什么越往后翻越慢?如何解决?

    在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦. 当一个表数据有几百万的数据的时候成了问题! 如 * f ...

  10. 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN

    object detection我的理解,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别.object detection要解决的问题就是物体在哪里,是什么这整个流程的问题.然而,这个问题 ...