因為用心,才會喜歡

粥雨

Selenium - Cookie操作

Selenium - Cookie操作

转载:https://blog.csdn.net/ytraister/article/details/106033630


简介

在进行自动化测试的时候,用户登录都是通过页面输入账号密码,但是有些网站登录需要邮件、手机、验证码来验证登录;

虽然花点时间可以实现,但是我们还可以用更简单的方法 —— Cookie 。


常用操作

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')

# 获取所有cookie信息
driver.get_cookies()

# 获取指定name的cookie
driver.get_cookie(name值)

# 清除指定cookie
driver.delete_cookie(name)

# 清除所有cookie
driver.delete_all_cookies()

# 添加cookie值
driver.add_cookie(cookie_dict)


使用实战

  • 登录账号后,可以通过F12 的请求中,获取到我们的cookie信息。

  • 获取Cookies信息后,在后面多次运行自动化时,就可以添加cookies信息,就不用再进行账号密码登录;

image-20220915113433800


获取Cookie

  • 我们可以通过自动化获取到cookies信息,并保存为json格式。
    • 步骤1:使用selenium访问百度页面;
    • 步骤2:通过手工登录账号;
    • 步骤3:将登录后的Cookies信息保存到本地;(在项目目录下已经有了一个名称为 cookies.json 的文件)
from selenium import webdriver
import time
import json

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://www.baidu.com')

# 程序打开网页后30秒内 “手动登陆账户” 
time.sleep(30)

# 将cookies信息保存为json格式
with open('cookies.json','w') as f:
    f.write(json.dumps(driver.get_cookies()))

driver.close()

添加Cookie

方法一

from selenium import webdriver
import time
import json

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://www.baidu.com')

# 首先清除由于浏览器打开已有的cookies
driver.delete_all_cookies()

with open('cookies.json','r') as f:
    # 使用json读取cookies 注意读取的是文件 所以用load而不是loads
    cookies_list = json.load(f)
    for cookie in cookies_list:
        driver.add_cookie(cookie)
        
# 刷新页面,检查用户登录状态
driver.refresh()
time.sleep(10)

driver.close()

运行后,可能会发现出现报错,在插入cookie的时候 有返回如下错误:
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid 'expiry'

这个 expirycookie 生命周期,也就是失效时间。

我们有两种解决办法:

  • 方法1—— 将 expiry 类型变为 int(其实不太清楚为什么变为 int 就可以)
  • 方法2—— 删除该字段

方法二

from selenium import webdriver
import json

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://www.baidu.com')

# 首先清除由于浏览器打开已有的cookies
driver.delete_all_cookies()


with open('cookies.json', 'r') as f:
    cookies_list = json.load(f)

    # 方法1 将expiry类型变为int
    for cookie in cookies_list:
        # 并不是所有cookie都含有expiry 所以要用dict的get方法来获取
        if isinstance(cookie.get('expiry'), float):
            cookie['expiry'] = int(cookie['expiry'])
        driver.add_cookie(cookie)
        
    # 方法2删除该字段:该字段有问题所以删除就可以 
    # for cookie in cookieslist:
    #     if 'expiry' in cookie:
    #         del cookie['expiry']
    #     driver.add_cookie(cookie)

# 刷新页面,检查用户登录状态
driver.refresh()
time.sleep(10)

driver.close()

posted @ 2022-09-15 20:14  粥雨  阅读(561)  评论(0编辑  收藏  举报