WebDriver API剖析----Cookie处理

CSDN 2024-10-25 13:03:01 阅读 74

实际工作中经常接触到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,实现代码如下:

<code>from selenium_demo import webdriver

from time import sleep

driver = webdriver.Firefox()

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

driver.quit()

结果如下:

1.2、仅仅打开网站

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

<code>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有了变化。

<code>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() # 切换到验证码登录模块code>

driver.find_element_by_xpath('//*[@id="login-base"]/div[2]/span[2]').click() # 切换tab到密码登录code>

driver.find_element_by_xpath('//*[@id="loginform-username"]').send_keys("185****7242") # 输入账号code>

driver.find_element_by_xpath('//*[@id="loginform-password"]').send_keys("123456789") # 输入密码code>

driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input[1]').click() # 点击登录按钮code>

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值。

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

<code>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() # 切换到验证码登录模块code>

driver.find_element_by_xpath('//*[@id="login-base"]/div[2]/span[2]').click() # 切换tab到密码登录code>

driver.find_element_by_xpath('//*[@id="loginform-username"]').send_keys("18559627242") # 输入账号code>

driver.find_element_by_xpath('//*[@id="loginform-password"]').send_keys("caiyy0310") # 输入密码code>

driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input[1]').click() # 点击登录按钮code>

# sleep(2)

# print("登录51CTO网站后的cookies == %s" % driver.get_cookies())

sleep(2)

print("获得51CTO登录后‘www51cto’的值 == %s" % driver.get_cookie(name='www51cto'))code>

driver.quit()

结果如下:

3、添加Cookie

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

<code>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如下:

<code>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如下:

<code>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的代码如下:

<code>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)

结果如下:



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。