cookie相关操作
来自:https://www.cnblogs.com/yoyoketang/p/6535391.html
https://www.cnblogs.com/yoyoketang/p/6536253.html
https://www.jb51.net/article/128560.htm
前言
虽然cookie相关操作在平常ui自动化中用得少,偶尔也会用到,比如登录有图形验证码,可以通过绕过验证码方式,添加cookie方法登录。
登录后换账号登录时候,也可作为后置条件去删除cookie然后下个账号登录。
一、获取cookies:get_cookies()
1.获取cookies方法直接用:get_cookies()
2.先启动浏览器,获取cookies,打印出来发现是空:[]
3.打开redmine后,重新获取cookies,打印出来,就有值了
from selenium import webdriver driver = webdriver.Chrome() cookies1 = driver.get_cookies() print(cookies1) driver.get("http://192.168.2.125/") cookies2 = driver.get_cookies() print(cookies2)
二、登录后的cookies
1.先登录redmine
2.重新获取cookies,发现跟之前获取的不一样了
3.主要是找到这一个cookie,发现它的name和value发生了变化,这就是未登录和已登录的区别了(对比上下两次结果)
from selenium import webdriver import time driver = webdriver.Chrome() driver.maximize_window() driver.get("http://192.168.2.125/") print(driver.get_cookies()) # 查看登录前cookies driver.find_element_by_xpath("//a[@class='login']").click() # 点击进入登录页面 driver.find_element_by_id("username").send_keys("xxx") driver.find_element_by_id("password").send_keys("xxx") driver.find_element_by_id("login-submit").click() print(driver.get_cookies()) # 查看登录后cookies
三、获取指定name的cookie:driver.get_cookie(name)
1.获取cookies发现里面可能有多个cookie,有时候我们只需要其中的一个,把重要的提出来,比如登录的cookie
2.这里用get_cookie(name),指定对应的cookie的name值就行了,比如redmine博客的:_redmine_session
from selenium import webdriver import time driver = webdriver.Chrome() driver.maximize_window() driver.get("http://192.168.2.125/") print(driver.get_cookies()) # 查看登录前cookies driver.find_element_by_xpath("//a[@class='login']").click() # 点击进入登录页面 driver.find_element_by_id("username").send_keys("xxx") driver.find_element_by_id("password").send_keys("xxx") driver.find_element_by_id("login-submit").click() print(driver.get_cookies()) # 查看登录后cookies print(driver.get_cookie('_redmine_session')) # 获取指定name的cookie
四、清除指定cookie:delete_cookie()
1.为了进一步验证上一步获取到的就是登录的cookie,可以删除它看看页面什么变化
2.删除这个cookie后刷新页面,发现刚才的登录已经失效了,变成未登录状态了
from selenium import webdriver import time driver = webdriver.Chrome() driver.maximize_window() driver.get("http://192.168.2.125/") print(driver.get_cookies()) # 查看登录前cookies driver.find_element_by_xpath("//a[@class='login']").click() # 点击进入登录页面 driver.find_element_by_id("username").send_keys("xxx") driver.find_element_by_id("password").send_keys("xxx") driver.find_element_by_id("login-submit").click() print(driver.get_cookies()) # 查看登录后cookies print(driver.get_cookie('_redmine_session')) # 获取指定name的cookie time.sleep(2) # 清除指定name的cookie driver.delete_cookie(name='_redmine_session') print(driver.get_cookies()) # 查看清除后cookies # 为了验证此cookie是登录的,可以删除后刷新页面 driver.refresh()
五、清除所有cookies:delete_all_cookies()
1.清除所有cookies后登录状态也失效了,cookies为空[]
from selenium import webdriver import time driver = webdriver.Chrome() driver.maximize_window() driver.get("http://192.168.2.125/") print(driver.get_cookies()) # 查看登录前cookies driver.find_element_by_xpath("//a[@class='login']").click() # 点击进入登录页面 driver.find_element_by_id("username").send_keys("user") driver.find_element_by_id("password").send_keys("1q2w3e4r") driver.find_element_by_id("login-submit").click() print(driver.get_cookies()) # 查看登录后cookies time.sleep(2) # 清除所有的cookies driver.delete_all_cookies() print(driver.get_cookies()) # 查看清除后cookies # 为了验证此cookie是登录的,可以删除后刷新页面 driver.refresh()
六、cookie操作的几个方法
1.get_cookies():获取所有cookies
2.driver.get_cookie(name):获取指定name的cookie
3.delete_cookie(name=xxx):清除指定name的cookie
4.delete_all_cookies():清除所有cookies
5.add_cookie(cookie_dict):添加cookie的值(下面重点介绍)

七、添加cookie方法:driver.add_cookie()
1.add_cookie(cookie_dict)方法里面参数是cookie_dict,说明里面参数是字典类型。
2.源码官方文档介绍:
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})
3.从官方的文档里面可以看出,添加cookie时候传入字典类型就可以了,等号左边的是name,等号左边的是value。
4.用抓包工具fidller只能看到cookie的name和value两个参数,实际上cookie还有其它参数(具体可通过get_cookies()查看)
5.add_cookie接收的字典格式,如(若cookie参数没有给够,可能会导致跑步起来,实际参数参考抓包结果):
cookie = { # "domain": ".58.com", #Firefox浏览器不能写domain,如果写了会报错,谷歌需要写否则也是报错,这里就是一个坑。其他浏览器没测试不知道情况。 'name': name, 'value': value, "expires": "", 'path': '/', 'httpOnly': False, 'HostOnly': False, 'Secure': False, }
- name:cookie的名称
- value:cookie对应的值,动态生成的
- domain:服务器域名
- expiry:Cookie有效终止日期
- path:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie
- httpOnly:防脚本攻击
- secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时,浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即为HTTPS。
6.应用场景:
举个栗子:
验证码这种问题是比较头疼的,对于验证码的处理,不要去想破解方法,这个验证码本来就是为了防止别人自动化登录的。如果你能破解,说明你们公司的验证码码安全级别不高,那就需要提高级别了。
对于验证码,要么是让开发在测试环境弄个万能的验证码,如:1234,要么就是尽量绕过去,如下面介绍的添加cookie的方法。(登录csdn博客)
from selenium import webdriver import time driver = webdriver.Chrome() driver.maximize_window() driver.get("https://www.csdn.net") time.sleep(2) print(driver.get_cookies()) # 查看登录前cookies # # driver.find_element_by_xpath("//li[@class='userinfo']/a[1]").click() # 点击进入登录页面 # driver.find_element_by_xpath("//div[@class='main-select']/ul/li[1]/a").click() # 点击切换成账号登录 # driver.find_element_by_id("all").send_keys("xxx") # driver.find_element_by_id("password-number").send_keys("xxx") # driver.find_element_by_xpath("//button[@class='btn btn-primary']").click() # 点击登录 # 如果这是有验证码的页面,也可以通过加延时手动填写验证码 # time.sleep(2) # print(driver.get_cookies()) # 查看登录后cookies # 通过对比,提取出未登录和登录后区别的cookie数据 # 添加cookies cookies_list = [{'domain': '.csdn.net', 'expiry': 1549111113.485155, 'httpOnly': False, 'name': 'UserName', 'path': '/', 'secure': False, 'value': 'xxx'}, {'domain': '.csdn.net', 'expiry': 1578055114, 'httpOnly': False, 'name': 'Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac', 'path': '/', 'secure': False, 'value': '5744*1*xxx'}, {'domain': '.csdn.net', 'expiry': 1549111113.48533, 'httpOnly': True, 'name': 'UserToken', 'path': '/', 'secure': False, 'value': 'bbfac393c6924a3fbbe20xxx'}, {'domain': '.csdn.net', 'httpOnly': True, 'name': 'SESSION', 'path': '/', 'secure': False, 'value': '41b762e1-7fb5-4c1f-b8db-xxx'}, {'domain': '.csdn.net', 'expiry': 1549111113.48524, 'httpOnly': True, 'name': 'UserInfo', 'path': '/', 'secure': False, 'value': 'bbfac393c6924a3fbbe209xxx'}, {'domain': '.csdn.net', 'expiry': 1549111113.485427, 'httpOnly': False, 'name': 'UserNick', 'path': '/', 'secure': False, 'value': 'xxx'}, {'domain': '.csdn.net', 'expiry': 1549111113.485485, 'httpOnly': False, 'name': 'AU', 'path': '/', 'secure': False, 'value': 'xxx'}, {'domain': '.csdn.net', 'expiry': 1578055113.485525, 'httpOnly': False, 'name': 'UN', 'path': '/', 'secure': False, 'value': 'xxx'}, {'domain': '.csdn.net', 'expiry': 1578055113.485561, 'httpOnly': False, 'name': 'BT', 'path': '/', 'secure': False, 'value': 'xxx'}, {'domain': 'www.csdn.net', 'expiry': 1549111114, 'httpOnly': False, 'name': 'tipShow', 'path': '/', 'secure': False, 'value': 'true'}] for cookie in cookies_list: driver.add_cookie(cookie) time.sleep(2) driver.refresh() # 为了验证添加cookies后是已登录,可以添加后刷新页面查看
验证成功!
有几点需要注意(之前没注意,这几点待确认):
1.登录时候要勾选下次自动登录按钮。
2.add_cookie()只添加name和value,对于博客园的登录是不成功。
3.本方法并不适合所有的网站,一般像博客园这种记住登录状态的才会适合。

浙公网安备 33010602011771号