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.本方法并不适合所有的网站,一般像博客园这种记住登录状态的才会适合

 

posted @ 2019-01-03 20:14  风聆  阅读(21)  评论(0)    收藏  举报