0
点赞
收藏
分享

微信扫一扫

Selenium:操作Cookie

自由情感小屋 2022-03-23 阅读 160
python

什么是Cookie

1、Cookie用于辨别用户身份,访问服务器时保持登录状态等功能(用于服务器识别当前访问的是哪个用户)

2、在网站中,http请求是无状态的(在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要立新的链接)
    ⑴也就是说即使第一次和服务器连接并且登录成功后,第二次请求服务器的时候服务器仍然不能知道当前是哪个用户的请求
    ⑵cookie的出现就是为了解决这个问题

3、第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存到本地,当该用户第二次请求服务器响应的时候,就会自动的把上次请求存储的cookie数据携带给服务器,服务器通过浏览器携带的cookie数据就能判断当前是哪个用户请求数据了
    ⑴第一次访问页面时,服务器将Cookie信息放在响应头中发送给客户端。此后浏览器再次访问时网站时就将Cookie信息放在请求头中发送给服务器
    ⑵感觉是:首次访问网站时服务器返回Cookie信息(用户已登录),在访问这个网站其他网页时就只需要接收Cookie就能根据Cookie确定当前是哪个用户了

4、常见的网页cookie信息

 

Selenium中的Cookie操作

1、在Web自动化测试中,有时会需要获取浏览器中的Cookie,用来验证存储的Cookie是否正确

2、因此Selenium WebDriver提供了操作Cookie的相关方法,可以获取、删除和添加cookie信息

3、常见的Cookie操作方法如下

方法名 描述
add_cookie(cookie_dict)添加Cookie,"cookie_dict"指字典对象,必须有name和value值
get_cookies() 获得所有Cookie信息
get_cookie(name)返回Cookie信息中key为"name"的值
delete_all_cookies() 删除所有Cookie信息
delete_cookie(name,optionsString)删除浏览器中部分Cookie信息。"name"是要删除的cookie的名称,"optionsString"是该Cookie的选项,目前支持的选项包括"路径","域"

 

获取全部Cookie

1、方法名:get_cookies()                                

2、作用:获取当前网页所有Cookie信息

3、该方法的返回值为一个列表:嵌套了字典的列表    
    ⑴每一个字典就是一组Cookie键值对

例1:

import time
from selenium import webdriver

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入粉笔网首页
driver.get('https://fenbi.com/page/home')
# 点击登录
driver.find_element_by_xpath('//*[@id="headercontent"]/div[2]/div/div[1]').click()
time.sleep(1)
# 输入账号、密码
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[1]/input').send_keys("账号")
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[2]/input').send_keys("密码")
# 勾选用户协议
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[6]/div[1]').click()
# 点击登录
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[4]/div/div').click()
time.sleep(2)

# 获取用户登录后服务器返回的所有Cookie信息
allCookies = driver.get_cookies()
print(allCookies)

"""
# 这个是直接在网页获取的cookie信息(删除了部分值)
sid=-170001; 
sess=PQPhFKrXBhCG/q/ei9ABm/JnQGyErcviKs=; 
userid=71188;
persistent=bPayNyTQy1qKcbA==; 
sensorsdata2015jssdkcross={"distinct_id":"71187248",ece80486","60"}

# 这个是通过代码获取的Cookie信息。可以看到两个是差不多的,因此平台不一样,所以会有稍微差异。但重要数据时一样的
[
{'httpOnly': False, 'name': 'sensorsdata2015jssdkcross', 'value': '%7B%22sear%%9%282%7D', 'path': '/', 'expiry': 7955132020, 'secure': False, 'domain': '.fenbi.com'}, 
{'httpOnly': True, 'name': 'persistent', 'value': 'bPayNyTQfk+Ln66BhqL36+h9Stj+g==', 'path': '/', 'expiry': 1679468020, 'secure': False, 'domain': '.fenbi.com'},
{'httpOnly': True, 'name': 'userid', 'value': '7118', 'secure': False, 'path': '/', 'domain': '.fenbi.com'},
{'httpOnly': True, 'name': 'sid', 'value': '1466', 'path': '/', 'expiry': 1679468018, 'secure': False, 'domain': '.fenbi.com'}, 
{'httpOnly': True, 'name': 'sess', 'value': 'PQPhqQDBhiOw0=', 'secure': False, 'path': '/', 'domain': '.fenbi.com'}, 
{'httpOnly': False, 'name': 'sajssdk_2015_cross_new_user', 'value': '1', 'path': '/', 'expiry': 1647964799, 'secure': False, 'domain': '.fenbi.com'}
]
"""

注:上面例子中的返回的字典中键值对的意义
1、name:cookie的名称
2、value:cookie对应的值,动态生成的
3、domain:服务器域名
4、expiry:Cookie有效终止日期
5、path:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie
6、httpOnly:防脚本攻击
7、secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时

获取指定Cookie

1、方法名:get_cookie(name)                                

2、作用:获取Cookie中指定键的值

3、若Cookie中无传入的键名,则返回None

例2:

import time
from selenium import webdriver

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入粉笔网首页
driver.get('https://fenbi.com/page/home')
# 点击登录
driver.find_element_by_xpath('//*[@id="headercontent"]/div[2]/div/div[1]').click()
time.sleep(1)
# 输入账号、密码
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[1]/input').send_keys("账号")
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[2]/input').send_keys("密码")
# 勾选用户协议
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[6]/div[1]').click()
# 点击登录
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[4]/div/div').click()
time.sleep(2)

# 获取指定cookie的值
Cookie = driver.get_cookie("sid")
print(Cookie)

"""
{'name': 'sid', 'domain': '.fenbi.com', 'httpOnly': True, 'path': '/', 'secure': False, 'expiry': 1679468648, 'value': '-2682712'}
"""

删除Cookie

1、方法名:
    ⑴删除所有Cookie信息:delete_all_cookies()    
    ⑵删除部分Cookie信息:delete_cookie(name,optionsString)

例3:

import time
from selenium import webdriver

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入粉笔网首页
driver.get('https://fenbi.com/page/home')
# 点击登录
driver.find_element_by_xpath('//*[@id="headercontent"]/div[2]/div/div[1]').click()
time.sleep(1)
# 输入账号、密码
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[1]/input').send_keys("账号")
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[2]/input').send_keys("密码")
# 勾选用户协议
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[6]/div[1]').click()
# 点击登录
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[4]/div/div').click()
time.sleep(2)

# 获取指定Cookie
print(driver.get_cookie("sid"))

# 删除指定cookie的值
driver.delete_cookie("sid")
print(driver.get_cookie("sid"))

"""
{'domain': '.fenbi.com', 'name': 'sid', 'secure': False, 'value': '-34910', 'path': '/', 'expiry': 1670, 'httpOnly': True}
None
"""

添加Cookie

1、添加Cookie的话,我感觉有两个应用场景
    ⑴向已存在的Cookie信息中添加键值对
    ⑵通过添加Cookie信息模拟用户登录(类似于requests库中的Cookies参数)

2、第一种应用场景,我感觉意义不大,毕竟Cookie是由服务器生成的,我们添加(修改)来也没啥用,影响不到服务器

3、第二种应用场景感觉还有点用。不过Cookie都是有有效时间的,如果过了有效期又需要修改Cookie还是挺麻烦的
    ⑴有些页面必须是用户登录之后才能看到的。但如果用户登录过程中需要滑动来进行登录,通常滑动处理起来比较麻烦(验证码)
    ⑵那么我们可以通过跳过这个滑动,简单方法,让开发在测试版本中屏蔽滑动模块,如果开发不愿意屏蔽,那么可以通过cookies来进行模拟登陆,跳过登陆验证

4、源码:

    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"
"""

例4:场景1

import time
from selenium import webdriver

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入粉笔网首页
driver.get('https://fenbi.com/page/home')
# 点击登录
driver.find_element_by_xpath('//*[@id="headercontent"]/div[2]/div/div[1]').click()
time.sleep(1)
# 输入账号、密码
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[1]/input').send_keys(账号)
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[2]/input').send_keys("密码")
# 勾选用户协议
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[6]/div[1]').click()
# 点击登录
driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[4]/div/div').click()
time.sleep(2)

# 添加Cookie
driver.add_cookie({"name":"name","value":"mouse"})

# 获取刚添加的cookie信息
print(driver.get_cookie("name"))

"""
{'domain': 'fenbi.com', 'httpOnly': False, 'value': 'mouse', 'name': 'name', 'path': '/', 'secure': True}
"""

例5:

import time
from selenium import webdriver

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入页面:直接打开目标页面(需要登录才能看到的页面)
driver.get('https://www.fenbi.com/spa/pwa/mycourse/index?original=fenbiweb')

# 组装所需Cookie信息(自己试了下这种场景下最好带上domain参数)
cookie1 = {
    "domain": "fenbi.com",            # 服务器地址
    "name":"sid",                     # cookie名字
    "value":"-1700201"                  # cookie值
}
cookie2 = {
    "domain": "fenbi.com",
    "name":"sess",
    "value":"PQPhqog9fOafe1ed4lKAviKs="
}
cookie3 = {
    "domain": "fenbi.com",
    "name":"userid",
    "value":"7148"
}
cookie4 = {
    "domain": "fenbi.com",
    "name":"persistent",
    "value":"bPayr1qKcbA=="    # cookie值
}
# 添加Cookie
driver.add_cookie(cookie_dict=cookie1)
driver.add_cookie(cookie2)
driver.add_cookie(cookie3)
driver.add_cookie(cookie4)
time.sleep(3)
# 页面刷新
driver.refresh()
source = driver.page_source
print(source)
举报

相关推荐

0 条评论