拿我平时测试的一个系统为例,从UI层面来说必须先登录才可以进行后续操作,但是我在测试接口文档提供的接口时,发现并不需要登录,每个接口只要传参就可以正常返回。原因是我们这边专门弄了一个接口包来统一管理常用的接口,也方便其他程序调用。所以我之前在测试接口时还没有考虑过“要保持登录(会话)状态”这个问题。趁周末看了下这个问题,通过fiddler直接抓请求(不用接口包提供的接口),学习requests库是如何保持一个会话的。

1.查看登录前后的cookie变化

首先打开登录页面,刷新一下,fiddler会抓到一个请求(应该是登录接口),查看Inspectorstab中的Raw,可以看到请求头的详细信息

然后输入用户名、密码、验证码登录,查看登录后的请求头信息

登录前、登录后的cookie发生了变化。

也可以通过Chrome浏览器来查看cookie,如下

  

可以看到浏览器中显示的cookie值和fiddler抓到请求中的cookie值不一致,浏览器显示的是全部的cookie,而fiddler只是显示的某个请求的cookie(每个请求的cookie会有所不同);(我拿的是浏览器中的cookie)

如果要跳过验证码登录并保持登录状态(即保持一个会话),只需要提取登录后的cookie,并把它添加到一个requests库的Session对象即可;

2.添加cookie有2种方式:

一个是把cookie先写成字典形式,然后把字典转换为cookiejar

s = requests.Session()  # 开启一个会话Session
cookie_dict={'49BAC005-7D5B-4231-8CEA-16939BEACD67': 'cktest001', # 从chrome浏览器中取到的cookie值
'JSESSIONID':'F4FFF69B8XXXXXXC8DCB4C061C0',
'JSESSIONIDSSO':'9D49C76FD6XXXXXF294242B44A'
}
s.cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True) # 把cookie值转换为cookiejar类型,然后传给Session 注意:这个方法会替换掉原有的cookies

二是追加cookies

s = requests.Session()  # 开启一个会话Session
jar = requests.cookies.RequestsCookieJar() # 创建一个Cookie Jar对象
jar.set('49BAC005-7D5B-4231-8CEA-1XXXXBEACD67','cktXXXX001') # 向Cookie Jar对象中添加cookie值
jar.set('JSESSIONID','F4FFF69B8CXXXX80F0C8DCB4C061C0')
jar.set('JSESSIONIDSSO','9D49C7XXXX448FDF5B0F294242B44A')
s.cookies.update(jar) # 把cookies追加到Session中

3.完整业务流程:登录并录入一条咨询

页面功能如下,提交后数据库中便会多出一条数据

把登录后的cookie传入session后,调用提交接口即可(如果不加登陆后cookie,直接调用提交接口会提示未登录)


# coding:utf-8 import requests
url = 'http://localhost.:8088/XXX/index/toIndex.do'
# 登录接口
header = {
# 请求头,建议一定要写上,不写的话直接调用接口,会提示没有权限,可以直接从fiddler复制
"Host":"localhost.:8088",
"Connection":"keep-alive",
"Cache-Control":"max-age=0",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Upgrade-Insecure-Requests":"",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36",
"Referer":"http://localhost.:8088/XXX/index/toIndex.do",
"Accept-Encoding":"gzip, deflate, sdch",
"Accept-Language":"zh-CN,zh;q=0.8"
} s = requests.Session()
# 开启一个会话Session # cookie_dict={'49BAC005-7D5B-4231-8CEA-16XXXXEACD67': 'ckXeXX001',
# 'JSESSIONID':'F4FFF69B8XXXX0F0C8DCB4C061C0',
# 'JSESSIONIDSSO':'9D49XXXX448FDF5B0F294242B44A'
# }
# s.cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
# print(s.cookies) jar = requests.cookies.RequestsCookieJar()
# 创建一个Cookie Jar对象
jar.set('49BAC005-7D5B-4231-8CEA-1XXX39XEACD67','ckXXXX001')
# 向Cookie Jar对象中添加cookie值
jar.set('JSESSIONID','F4FFF69BXXXX0F0C8DCB4C061C0')
jar.set('JSESSIONIDSSO','9D49C76FDXXXXF5B0F294242B44A')
s.cookies.update(jar) # 把cookies追加到Session中 #r1 = s.get(url, headers=header,
verify=False) # 使用session发送登录请求
print(s.cookies)
# print(r1.text)
url2 = 'http://localhost:8088/XXX/saveConsult.do'
# 提交咨询信息接口,通过fiddler抓取的
header2 = {
"Host":"localhost.:8088",
"Connection":"keep-alive",
"Content-Length":"",
"Accept":"application/json, text/javascript, */*; q=0.01",
"Origin":"http://localhost.:8088",
"X-Requested-With":"XMLHttpRequest",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36",
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
"Referer":"http://localhost.:8088/XXX/toConsultEdit.do",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"zh-CN,zh;q=0.8"
}
data = {
'clientCode': 'test',
'topic': 'topic_test',
'content': '测试接口',
'resrcType': ''
}
r2 = s.post(url2, headers=header2, data=data, verify=False) # 使用session发送提交咨询请求 # verify=False表示忽略验证SSL证书
print(r2.text)
print(r2.status_code)

返回结果

数据库也对应地增加了一条数据

注意:在调用接口时,最好连请求头信息也一并传进去,不然有时候会请求失败,我这里如果不加headers的话,会返回403,提示无权限(唉,因为没经验,所以第一次没传headers,结果总是失败,以为是没有登录成功呢,后来直接在fiddler的Composer那里模拟这个请求,才发现这个问题)

 

还有一个问题是,其实只要把登录后的cookies传入session,然后用这个session发送提交咨询请求即可,无需再发送登录请求了(上面登录只是为了验证是否登录成功)


2018-04-22 17:21:18

requests库使用:通过cookie跳过验证码登录,并用Session跨请求保持cookie的更多相关文章

  1. jmeter跳过验证码登录配置:通过手动添加 Cookie 跳过带验证码的登录接口

    目录 一.基本配置 二.HTTP请求默认值 三.HTTP信息头管理器 四.HTTP Cookie管理器 五.线程组下接口设置 一.基本配置 二.HTTP请求默认值 (1)jmeter的设置: (2)设 ...

  2. 自动化测试使用cookie跳过验证码

    准备工具: fiddler Python+selenium 安装fidder fidder官方下载地址 fidder首次安装需要设置才能抓取https参考如下 fidder设置抓取https 开始 1 ...

  3. Vue router拦截 如果用户并未登录直接跳转到登录界面(最简单的cookie演示)

    router.beforeEach(function(to,from,next){ console.log('路由拦截') console.log(to.name) console.log(from. ...

  4. Jmeter获取Cookie并传递到下一个线程---跨线程后cookie找不到了

    网上找了一堆文章没有一个是实际操作的,自己边试边查边摸索终于找到了一个全套的办法. 原创文章,转载请说明出处. 1.取得cookie 直接这样写就可以了${COOKIE_JSESSIONID},当然具 ...

  5. 《selenium2 python 自动化测试实战》(12)——跳过验证码登录add_cookie

    微信公众号搜索“自动化测试实战”或扫描下方二维码添加关注~~~

  6. 自动化测试 -- 通过Cookie跳过登录验证码

    之前写过一篇博客:自动化测试如何解决验证码的问题. http://www.cnblogs.com/fnng/p/3606934.html 介绍了验证码的几种处理方式,最后一种就是通过Cookie跳转过 ...

  7. Cookie跳转登录验证码

    对于web应用来说,大部分的系统在用户登录时都要求用户输入验证码,验证码的类型的很多,有字母数字的,有汉字的,甚至还要用户输入一条算术题的答案的, 对于系统来说使用验证码可以有效果的防止采用机器猜测方 ...

  8. Requests方法 -- cookie绕过验证码登录操作

    前言有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接).获取不到也没关系,可以通过添加 cookie 的方式绕过验证码. 1.这里以登录博 ...

  9. Requests 库的使用

    Python 的标准库 urllib 提供了大部分 HTTP 功能,但使用起来较繁琐.通常,我们会使用另外一个优秀的第三方库:Requests,它的标语是:Requests: HTTP for Hum ...

随机推荐

  1. opencv学习之路(6)、鼠标截图,滑动条播放视频

    一.鼠标截图 #include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespa ...

  2. 20145308 《网络对抗》 MAL_后门应用与实践 学习总结

    20145308 <网络对抗> MAL_后门应用与实践 学习总结 实践目的 使用nc实现win和Linux间的后门连接 meterpreter的应用 MSF POST的应用 知识点学习总结 ...

  3. 2018年湘潭大学程序设计竞赛G又见斐波那契

    链接:https://www.nowcoder.com/acm/contest/105/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  4. Python中的对象行为与特殊方法(一)对象的创建与销毁

    Python中类调用__new__()类方法来创建实例,调用__init__()方法来初始化对象,对象的销毁则调用__del__()方法. __new__()方法第一个参数为类cls,通常返回cls的 ...

  5. 让InstallShield 2015 Limited Edition for Visual Studio 2015生成的setup.exe双击时以管理员权限运行

    转载:http://blog.csdn.net/zztoll/article/details/52096700 如题,如何让InstallShield 2015 Limited Edition for ...

  6. shell脚本之 给PNG图片添加后缀@3x

    1,给png图片加上后缀@3x #!/bin/sh #root_src=$(dirname $(PWD)) #echo ${root_src} image_path=${root_src}/image ...

  7. MD5+salt 工具类

    import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.securit ...

  8. it做形式主语的句子

    1. it was considerate of you to visit my mother every day and (to) bring me your notes to help me wi ...

  9. lvs笔记

    LVS是Linux Virtual Server的简写,意为Linux虚拟服务器,是虚拟的服务器集群系统,可在UNIX/LINUX平台下实现负载均衡集群功能.该项目在1998年5月由章文嵩博士组织成立 ...

  10. JDBC编程的步骤

    一.进行JDBC编程的步骤大致如下: 1.      加载数据库驱动,通常使用Class类的forName()静态方法来加载驱动.如下代码: Class.forName(dirvirClass) 上面 ...