WebDriver API剖析----Cookie处理

实际工作中经常接触到Cookie与Session。其中Cookie存放在客户端,Session存放 在服务器端,每个客户在服务器端都有与其对应的Session。

在网站中,HTTP请求时无状态的。简单来说即第一次和服务器连接且登录成功后,第二次请求时服务器依然不知道当前请求是哪个用户。而Cookie是为了解决这个问题。用户第一次登录后服务器返回一些数据给浏览器,浏览器会将其保存传递给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个用户了。

Cookie存储的数据量有限,不同的浏览器存储容量也不同,一般不超过4KB,因此Cookie只能存储一些少量的数据。

Cookie可以保持用户的登录信息,待用户下次访问同一网站时,会发现不必输入用户名和密码就已经登录了。但又一些Cookie在用户退出会话的时候就被删除了(用户也可以手工删除本地Cookie),这样可以有效保护个人隐私。

Cookie在生成时会被指定一个Expire值,着就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。有些页面将Cookie的生存周期设置为0或赋值,这样在关闭浏览器时就马上清除Cookie,不会记录用户信息,更加安全。

Cookie所具有的属性一般包括以下几项。

  • Domain:域,表示当前Cookie属于哪个域或子域。对于服务器返回的Set-Cookie,如果没有指定Domain的值,那么其Domain的值默认为当前所提交的HTTP请求所对应的主域名。
  • Path:表示Cookie的所属路径。
  • Expire time/Max-age:Cookie的有效期。Expire time的值是一个时间,过了这个时间该Cookie就失效了;或者是用Max-age指定当前Cookie在多长时间之后失效。如果服务器返回的一个Cookie没有指定其Expire time,那么表明此Cookie的有效期只是当前的Session,即Session Cookie,当前Cookie就被浏览器删除了。
  • secure:表示该Cookie只能用HTTPS传输。一般用户包含认证信息的Cookie,要求人数此Cookie的时候必须用HTTPS传输。
  • httponly:表示此Cookie必须用于HTTP或HTTPS传输。这意外着浏览器脚本(如JavaScript中)是不允许访问操作Cookie的。

对于一些需要输入验证码才能登录的网站,可以采用Cookie来解决问题。

  • 获取Cookie的方法:get_cookies();
  • 获取指定的name的Cookie:driver.get_cookie(name);
  • 清除Cookie:delete_cookie()。

1、获取Cookie

1.1、未登录网站

浏览器,不输入任何网址,先查看Cookie,实现代码如下:

from selenium_demo import webdriver
from time import sleep

driver = webdriver.Firefox()
print("仅仅启动浏览器后的cookies == %s" % driver.get_cookies())
driver.quit()

结果如下:

1.2、仅仅打开网站

启用浏览器,打开51CTO的登录页后再获得Cookies,实现代码如下:

from selenium_demo import webdriver
from time import sleep

driver = webdriver.Firefox()
print("仅仅启动浏览器后的cookies == %s" % driver.get_cookies())
sleep(3)
driver.get("https://home.51cto.com/index?reback=http://www.51cto.com/")
print("打开51CTO网站的Cookie == %s" % driver.get_cookies())
sleep(3)
driver.quit()

结果如下:


1.3、登录后

先登录51CTO网站,再获得Cookie,运行代码,可以看到输出的Cookie有了变化。

from selenium_demo import webdriver
from time import sleep
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()

print("仅仅启动浏览器后的cookies == %s" % driver.get_cookies())
sleep(3)
driver.get("https://home.51cto.com/index?reback=http://www.51cto.com/") # 登录页面
print("打开51CTO网站的Cookie == %s" % driver.get_cookies())
sleep(3)
driver.find_element_by_xpath('//*[@id="login-wechat"]/div[1]').click()  # 切换到验证码登录模块
driver.find_element_by_xpath('//*[@id="login-base"]/div[2]/span[2]').click()    # 切换tab到密码登录
driver.find_element_by_xpath('//*[@id="loginform-username"]').send_keys("185****7242")  # 输入账号
driver.find_element_by_xpath('//*[@id="loginform-password"]').send_keys("123456789")    # 输入密码
driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input[1]').click()   # 点击登录按钮
sleep(2)
print("登录51CTO网站后的cookies == %s" % driver.get_cookies())
sleep(2)
driver.quit()

结果如下:

2、获取指定的Cookie

上面通过get_cookies()获得的Cookie有多对,而通过get_cookie(self,name)可获得指定的Cookie。下面的案例通过get_cookie(name='www51cto')来获得“www51cto”的Cookie值。

以下代码中,将实际用户名隐藏了,可以根据自己的真实情况来替换。

from selenium_demo import webdriver
from time import sleep
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()
# print("仅仅启动浏览器后的cookies == %s" % driver.get_cookies())
# sleep(3)
driver.get("https://home.51cto.com/index?reback=http://www.51cto.com/")  # 登录页面
# print("打开51CTO网站的Cookie == %s" % driver.get_cookies())
sleep(2)
driver.find_element_by_xpath('//*[@id="login-wechat"]/div[1]').click()  # 切换到验证码登录模块
driver.find_element_by_xpath('//*[@id="login-base"]/div[2]/span[2]').click()    # 切换tab到密码登录
driver.find_element_by_xpath('//*[@id="loginform-username"]').send_keys("18559627242")  # 输入账号
driver.find_element_by_xpath('//*[@id="loginform-password"]').send_keys("caiyy0310")    # 输入密码
driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input[1]').click()   # 点击登录按钮
# sleep(2)
# print("登录51CTO网站后的cookies == %s" % driver.get_cookies())
sleep(2)
print("获得51CTO登录后‘www51cto’的值 == %s" % driver.get_cookie(name='www51cto'))
driver.quit()

结果如下:

3、添加Cookie

 添加Cookie调用的方法是add_cookie(cookie_dict),其中cookie_dict为字典对象,必须有name和value值,代码如下:

from selenium_demo import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("https://home.51cto.com/index?reback=http://www.51cto.com/")  # 登录页面
# print("打开51CTO网站的Cookie == %s" % driver.get_cookies())
sleep(2)
for cookie in driver.get_cookies():
    print("%s/%s" % (cookie['name'], cookie['value']))
driver.add_cookie({'name': 'Leo', 'value': 'Leo123'})
print("添加name:Leo后的内容")
for cookie in driver.get_cookies():
    print("%s/%s" % (cookie['name'], cookie['value']))
driver.quit()

结果如下:

4、删除Cookie

删除Cookie包含删除指定的Cookie与删除所有的Cookie两种方法。

  • 删除指定的Cookie:delete_cookie(name)
  • 删除所有的cookie:delete_all_cookie()

4.1、删除指定的Cookie

删除指定的Cookie,diamagnetic如下:

from selenium_demo import webdriver
from time import sleep
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()
driver.get("https://home.51cto.com/index?reback=http://www.51cto.com/")  # 登录页面
sleep(2)
for cookie in driver.get_cookies():
    print("%s/%s" % (cookie['name'], cookie['value']))
driver.add_cookie({'name': 'Leo', 'value': 'Leo123'})
print("添加name:Leo后的内容")
for cookie in driver.get_cookies():
    print("%s/%s" % (cookie['name'], cookie['value']))
# 删除指定的Cookie
driver.delete_cookie("Leo")
for cookie in driver.get_cookies():
    print("%s/%s" % (cookie['name'], cookie['value']))
driver.quit()

结果如下:

4.2、删除所有的Cookie

删除所有的Cookiediamagnetic如下:

from selenium_demo import webdriver
from time import sleep
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()


# print("仅仅启动浏览器后的cookies == %s" % driver.get_cookies())
# sleep(3)
driver.get("https://home.51cto.com/index?reback=http://www.51cto.com/")  # 登录页面
# print("打开51CTO网站的Cookie == %s" % driver.get_cookies())
sleep(2)
for cookie in driver.get_cookies():
    print("%s/%s" % (cookie['name'], cookie['value']))
driver.add_cookie({'name': 'Leo', 'value': 'Leo123'})
print("添加name:Leo后的内容")
for cookie in driver.get_cookies():
    print("%s/%s" % (cookie['name'], cookie['value']))
# 删除指定的Cookie
driver.delete_cookie("Leo")
print("删除name:Leo后的内容")
for cookie in driver.get_cookies():
    print("%s/%s" % (cookie['name'], cookie['value']))
driver.delete_all_cookies()
print("删除全部的Cookie后的值== %s" % driver.get_cookies())

driver.quit()

结果如下:

5、接口测试中的Cookie操作

在接口测试中,也常常会操作Cookie,其中常见的Cookie操作如下:

  • 获取Cookie(r.cookie);
  • Cookie格式转换的方法(将requestCookieJar转换为字典的方法dict_from_cookiejar()、将字典转换为Cookie Jar的方法cookiejar_from_dict());
  • 发送Cookie r=request.get(url, cookies=cookie);

添加Cookies,具体步骤如下:

  • s.cookie.set(' ', ' ');
  • add_dict_to_cookiejar;
  • 保持会话

接口要想操作Cookie,需要安装Request模块。

5.1、Request模块的安装

Request模块的安装可以基于以下3种方式:

  • 通过pip命令安装;
  • 通过PyCharm安装;
  • 通过安装包安装(进入解压包目录下,通过setup.py安装)。

通过pip安装:进入cmd命令窗口,输入pip instal request命令进行安装。

通过PyCharm安装:具体看下图

通过安装包安装:安装包下载地址为https://pypi.org/project/requests/#file,下载直接安装即可。

5.2、通过Request模块操作Cookie

通过Request模块获取Cookie的代码如下:

import requests
from requests import utils

url = "https://httpbin.org/cookie"
url1 = "https://cn.bing.com"

r = requests.get(url)
print(r.cookies)    # 返回的是jar包,需要转换
print(r.headers)
r1 = requests.utils.dict_from_cookiejar(r.cookies)  # 将jar包转换为字段
print(r1)

结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值