【文章末尾给大家留下了大量的福利】
requests是基于urllib的HTTP库,可以帮助我们发送各式各样的请求,携带各式各样的参数。
pip install requests
请求
包括:
-
如何发送不同类型的请求
-
get
-
post
-
delete
-
put
-
。。。。
-
-
在请求中,如何携带参数
-
cookies
-
headers
-
data
-
json
-
响应
在响应对象中:
-
都有哪些属性
-
json
-
bytes
-
文本类型
如何通过响应头判断该响应体的内容?通过content-type来判断:
-
json类型的响应content-type:application/json
-
图片:content-type:image/gif
-
文本类型的响应:content-type:text/html
如果获取到的文本内容有乱码,如何解决?
-
要想到查看当前页面编码格式
-
使用response.encoding = 编码格式
requests.request(method, url, **kwargs)类能够构造一个请求,支持不同的请求方式。
import requests response = requests.request(method='get', url='https://www.baidu.com') print(response.status_code)
request类中来看看几个参数:
-
method:请求方式。
-
url:请求URL。
-
**kwargs:
-
params:字典或者字节序列,作为参数增加到url中,使用这个参数可以把一些键值对以
k1=v1&k2=v2
的模式增加到url中,get请求中用的较多。 -
data:字典、字节序列或者文件对象,重点作为向服务器提供或提交资源,作为请求的请求体,与params不同放在url上不同。它也可以接受一个字符串对象。
-
json:json格式的数据,可以向服务器提交json类型的数据。
-
headers:字典,定义请求的请求头,比如可以headers字典定义user agent。
-
cookies:字典或者CookieJar。
-
auth:元组,用来支持HTTP认证功能。
-
files:字典,用来向服务器传输文件。
-
timeout:指定超时时间。
-
proxies:字典,设置代理服务器。
-
allow_redirects:开关,是否允许对URL进行重定向,默认为True。
-
stream:开关,是否对获取内容进行立即下载,默认为False,也就是立即下载。这里需要说明的,stream一般应用于流式请求,比如说下载大文件,不可能一次请求就把整个文件都下载了,不现实,这种情况下,就要设置
stream=True
,requests无法将连接释放回连接池,除非下载完了所有数据,或者调用了response.close。 -
verify:开关,用于SSL证书认证,默认为True。
-
cert:用于设置保存本地SSL证书路径。
-
流式请求,指的不是请求是流,而是请求返回的数据流,返回一点取一点,而普通的请求是返回完毕你再取内容。
分享:httpbin.org # httpbin,提供了常用的请求方式,用于接口练习
requests示例介绍
params参数
常用于get请求。
import requests # response = requests.get(url='http://www.neeo.cc:6001/get?user=zhangkai&pwd=666') # print(response.json()) params = {"user": "张开","pwd": 666 } response = requests.get(url='http://www.neeo.cc:6001/get', params=params) print(response.json())
headers
该参数使用所有请求需要携带请求头的场景。
import requests headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36" } response = requests.get('https://www.zhihu.com/question/361649589/answer/1163303688', headers=headers) print(response.status_code) print(response.text)
cookies参数
import requests # 1. 登录,获取cookies值 response = requests.post(url="http://www.neeo.cc:6002/pinter/bank/api/login?userName=admin&password=1234") print(response.json()) print(response.cookies) print(response.cookies.get_dict()) # 2. 在需要cookies验证的时候,携带上刚才获取到的cookies值 response = requests.get(url='http://www.neeo.cc:6002/pinter/bank/api/query?userName=admin', cookies=response.cookies.get_dict()) print(response.status_code) print(response.json())
data参数
import requests data = {"userName": "=admin","password": "1234" } response = requests.post(url="http://www.neeo.cc:6002/pinter/bank/api/login", data=data) print(response.json()) print(response.cookies)
json参数
import requests response = requests.post('http://www.neeo.cc:6001/post', json={"user":"zhangkai"}) print(response.json())
文件上传
import requests file = {"file": open('a.gif', 'rb')} response = requests.post("http://www.neeo.cc:6001/post", files=file) print(response.json())
requests模块的基本操作
import requests# response = requests.request(method='get', url='https://www.autohome.com.cn/news/') response = requests.get('https://www.autohome.com.cn/news/') # print(response) # 查看响应状态 print(response.status_code) # 查看响应状态 # print(response.content) # 查看bytes类型的数据,通常是获取图片 # print(response.headers) # 查看响应头 # print(response.json()) # 获取json类型的数据,要确保响应类型是json,不然报错 # response.encoding = "GBK" # 指定(修改)当前响应结果的编码类型 # print(response.text) # 文本类型的数据用text # print(response.content) # 获取bytes类型的数据 # print(response.url) # 当前请求的url # print(response.encoding) # 获取当前响应的编码类型 # print(response.request) # 请求类型 # print(response.request.method) # 请求类型 # print(response.cookies) # 查看cookis # print(response.is_redirect) # 查看是否是重定向的响应 # print(response.iter_lines()) # 循环获取,一行一行的取,但是,请忘掉这个方法 # print(response.iter_content(chunk_size=1024)) # 迭代取值,可以指定chunk_size # print(response.reason)
bs4模块,解析文本查找标签及标签属性或者内容:
""" pip install beautifulsoup4 """from bs4 import BeautifulSoupsoup = BeautifulSoup(文本类型请求结果, 解析器) # response.text, "html.parser"div_obj = soup.find(name="div", attr={"id": "xxxxx"}) # 找一个 img_list = div_obj.find_all(name="img", [attr]) # 找多个标签, 可以根据attr属性过滤,以列表的形式返回多个for img in img_list:img.get("src") # 获取标签的属性 div_obj.text # 获取标签的文本内容
requests/bs4爬虫练习
https://www.autohome.com.cn/news/
# 爬取汽车之家新闻页的新闻列表缩略图
# 思路:
1. 访问汽车之家新闻页
2. 定位到缩略图外部的div
3. 获取所有的img标签中的src属性
4. 使用requests模块向img的src地址发请求
5. 保存到本地
View Code
beautifulsoup4:
-
soup_obj = BeautifulSoup(response.text, "html.parser") # response.text: 要解析的文本 html.parser:指定什么解析器来解析文本
-
soup_obj.find(name=标签名, attr={”属性名":"属性值"}) 因为找到的标签可能有多个,那使用attr来过滤指定的标签。
-
soup_obj.find_all(name=标签名, attr={”属性名":"属性值"})) 找到所有以attr过滤的标签。
-
img.get('src'),表示获取指定标签的属性
-
获取标签的文本内容,使用标签名.text
postman
-
常见的接口
-
普通的get请求
-
带参数get请求
-
post请求:k:v
-
post请求:k:{“k1”:"va1"}
-
post请求:json
-
webservice接口
-
-
特殊的接口
-
文件上传
-
cookies
-
token
-
签名接口
-
-
环境管理
-
如何配置环境
-
-
断言
-
状态码断言
-
json断言
-
-
接口自动化
-
命令行测试
-
参数化配置
普通请求
-
k:v格式的post请求
-
参数为json的post请求
-
文件上传:
集合的概念
将同一类型,同一项目的接口管理起来。
今日内容
环境管理
创建环境:
编辑当前环境的变量:
如何在请求中应用上环境中的变量?
使用{{变量名}}
的方式使用环境中的变量值。
变量的作用域
全局变量:作用于全局,postman中的任何地方
集合变量:变量只作用于集合中的接口
内置动态变量:内置的一些时间戳,UIID变量。
自定义环境变量:自己定义的环境,在该环境中创建的变量,只要你使用该环境,就能使用其中变量值。
全局变量
如何创建全局变量
使用{{变量名}}
来使用。
集合变量
只作用于当前的集合中。
创建
使用{{变量名}}
来使用。
内置的变量
作用于所有地方,使用{{$内置的变量名}}
常用的:
-
timestap
-
guid
更多内置的变量参考:
断言
python中的断言,assert,断定结果是怎样的,否则就断言失败。
import requests response = requests.get("https://www.baidu.com", timeout=5) try:assert response.status_code == 201print('断言成功') except AssertionError as e:print('断言失败')
在postman中,如何使用断言。
postman中,可用的模板?
模板 | 描述 | 示例 |
---|---|---|
clear a global variable | 清除全局变量 | pm.globals.unset("variable_key"); |
Clear an environment variable | 清除一个环境变量 | pm.environment.unset("variable_key"); |
get a global variable | 得到一个全局变量 | pm.globals.get("variable_key"); |
get a variable | 得到一个变量 | pm.variables.get("variable_key"); |
Get an environment variable | 得到一个环境变量 | pm.environment.get("variable_key"); |
response body:contains string | 检查response body包含字符串 | pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.include("string_you_want_to_search"); }); |
response body:convert XML body to a JSON object | response body:将XML转换为JSON对象 | var jsonObject = xml2Json(responseBody); |
response body:is equal to a string | 检查响应体等于一个字符串 | pm.test("Body is correct", function () { pm.response.to.have.body("response_body_string"); }); |
response body:JSON value check | 检查response body中JSON某字段值 | pm.test("Your test name", function () { var jsonData = pm.response.json(); pm.expect(jsonData.value).to.eql(100); }); |
response headers:content-Type header check | 检查content-Type是否包含在header返回 | pm.test("Content-Type is present", function () { pm.response.to.have.header("Content-Type"); }); |
response time is than 200ms | 响应时间超过200ms | pm.test("Response time is less than 200ms", function () { pm.expect(pm.response.responseTime).to.be.below(200); }); |
send s request | 发送一个请求 | pm.sendRequest("https://postman-echo.com/get", function (err, response) { console.log(resp onse.json()); }); |
set a global variable | 设置一个全局变量 | pm.globals.set("variable_key", "variable_value"); |
set an environment variable | 设置一个环境变量 | pm.environment.set("variable_key", "variable_value"); |
status code:Code is 200 | 状态码:代码是200 | pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); |
status code:code name has string | 状态码:代码中有指定字符串 | pm.test("Status code name has string", function () { pm.response.to.have.status("Created"); }); |
status code:successful POST request | 状态码:成功的post请求 | pm.test("Successful POST request", function () { pm.expect(pm.response.code).to.be.oneOf([201,202]); }); |
use tiny validator for JSON data | 为json数据使用tiny验证器 | var schema = { "items": { "type": "boolean" } }; var data1 = [true, false]; var data2 = [true, 123]; pm.test('Schema is valid', function() { pm.expect(tv4.validate(data1, schema)).to.be.true; pm.expect(tv4.validate(data2, schema)).to.be.true; }); |
常用的断言
// 状态码断言 pm.test("判断响应状态码是否是 200", function () {pm.response.to.have.status(200); }); // 判断json中的key value是否符合预期,如果你的key是嵌套结构,就点下去 pm.test("Your test name", function () {var jsonData = pm.response.json();pm.expect(jsonData.args.k2).to.eql("v2"); }); // 判断文本类型的响应文本中,是否包含指定的字段 pm.test("判断响应体是否包含指定的字段", function () {pm.expect(pm.response.text()).to.include("百度一下"); });
集合公共断言
创建集合公共断言。
可以将集合中的一些公共的断言写到集合配置中,在集合中的接口在执行时,会自动的应用上集合配置中的断言。
特殊接口
签名接口
-
知道签名接口的加密规则
-
sign:md5(手机号 + 盐 + 时间戳)
-
-
知道,在请求之前处理相关的数据
// 获取手机号 var phone = "1212113"; // 获取盐 var optCode = "testfan"; // 获取时间戳 var timestamp = new Date().getTime(); // console.log(timestamp); // md5 加密 var md5 = CryptoJS.MD5(phone + optCode + timestamp).toString(); // console.log(md5); // 将加密后的字符串set回环境中 pm.globals.set("phone", phone); pm.globals.set("timestamp", timestamp); pm.globals.set("md5", md5);
cookies
处理cookie有两种方式:
-
第一种,手动的获取cookies值,然后在需要cookies的请求中,手动携带,注意:你要保证cookie值是有效的。
-
第二种,postman在发送请求的时候,如果响应中有cookies返回,就会自动的帮我们保存在cookie管理器中。当有向该域名发送请求的时候,postman会自动的帮我们携带cookie值。
token
postman不会帮我们处理token,只能我们自己来完成:
-
第一种,用例浏览器登录账号,获取token值,在有需要的接口中,手动添加。
-
第二种:
-
在登录接口访问成功后,从请求体中获取token字段,并且set到全局变量中。
// 从响应体中获取token字段: data var token = pm.response.json().data; // 将token值set到全局的环境中去。 pm.globals.set("my_token", token);
-
在需要使用token的接口中,在该接口请求发送之前, 从环境中获取token值,填写在请求头中。
-
webservice接口
简单来说,webservice是通过xml进行交互的web请求,本质上也是HTTP请求。
Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。
如何调试webservice接口
-
在post请求的
raw
中输入请求的参数,并且,格式选择xml
:
-
由于上一步中,选择
xml
格式的时候,postman会自动的在请求头中,添加上Content-Type:application/xml
,但是webservice接口的content-type不是application/xml
而是text/xml
.
-
修改请求content-type值。
-
就正常的发请求就完了。
集合自动化
如上图,在启动集合的时候,有如下参数配置:
-
Environment:选择接口执行时依赖的环境。
-
Iterations:表示该集合内的接口运行的次数。
-
Delay:接口执行前延时多少毫秒。
-
Log Response:默认记录所有的响应日志。
-
Data:参数数据,暂时先不管它。
-
Keep variable values:保存在运行过程中产生的变量或者值,选择默认即可。
-
Run collection without using stored cookies:运行中不使用cookie,这里也保持默认。
-
Save cookies after collection run:在集合执行之后,保存cookies,选择默认。
-
Run 集合名称:运行集合。
数据驱动这里:一般轮训次数会自动的根据你的数据行数来定。如果轮训次数大于数据行数,那么在剩余的轮训中,提取的数据就是数据文件的最后一行。
命令行测试
环境配置
-
安装nodejs:,注意,nodejs版本不低于10。
-
由于自带的npm命令受网络影响严重,我们需要配置一个国内的淘宝镜像:cnpm,终端(管理员权限)执行如下命令:
npm install -g cnpm --registry=https://registry.npm.taobao.org
-
测试vnpm是否安装成功:
cnpm -v
-
使用cnpm来安装Newman插件:
cnpm install newman --global newman -v
-
安装reporter插件,用来生成测试报告
cnpm install -g newman-reporter-html
-
执行终端命令,获取html类型的报告
newman run 脚本 -d 参数文件 -e 环境文件 -n 循环次数 -r html --reporter-html-export 测试报告路径
question
newman required node version >=10
意思是nodejs版本太低了,需要10及以上的版本。
nodejs需要win8以上的系统
这个意思是新版本的nodejs要求的Windows系统在win8以上,你可以安装一个稍微低一点的nodejs,如12.x版本
本地部署Java项目
-
要安装java jdk(Windows/Mac):
-
下载
apache-tomcat-8.5.38.zip
压缩包,解压到你的本机上,一个没有中文,空格的目录中。 -
配置相关的环境变量。
变量名 | 值 |
---|---|
JAVA_HOME | java jdk 的安装目录 |
PATH | %JAVA_HOME%\bin |
CATALINA_HOME | tomcat的安装目录 |
PATH | tomcat的bin目录 |
-
启动,在任意目录打开终端,输入
pinter
,启动过程稍慢,选哟静等一会儿 -
浏览器访问
127.0.0.1:8231/pinter/index
问题
打开tomcat的启动文件,一闪即逝,意思是你的Java环境配置的有问题,解决办法:
-
检擦你的环境变量是否配置好了。
-
重启电脑
内容回顾
-
如何使用postman处理各式请求
-
get请求
-
post请求
-
其他类型的请求
-
-
在请求中如何携带参数
-
params
-
data, x-www-form-urlencoded k:v ---> content-type:application/x-www-form-urlencoded
-
json, raw, json ---> content-type:application/json
-
-
特殊接口
-
cookies
-
手动去浏览器做登录操作,获取cookies,然后,在postman发请求时,自己携带
-
使用postman向登录接口发请求,如果该响应有cookies,就保存到cookies管理器中,当有想同域名的接口发送请求时,会去cookies管理器中,自动添加
-
-
token
-
手动去浏览器做登录操作,获取token,然后,在postman发请求时,自己携带
-
在postman中,首先向登录接口发请求,在请求结束后,手动的通过脚本获取token值,然后set到全局变量中;当向需要token的接口发请求时,在带上
-
-
签名接口
-
首先要知道该接口的加密算法
-
要手动的去处理各个参数和加密后的结果, set到环境变量中
-
在请求的参数中使用
{{变量名}}
引用
-
-
webservice接口
-
以xml格式作为数据交换的HTTP请求。
-
携带参数时,需要选择
xml
类型,注意,当你选择了xml
类型,postman会自动的在请求头中携带content-type:application/xml -
但是,至于该接口的content-type需要什么值
-
-
文件上传
-
请求类型是 form-data
-
-
-
环境管理
-
自定义的环境变量,当使用时,直接选择即可
-
全局的环境变量,可以定义基础的一些变量
-
集合变量,作用域只作用于当前集合中
-
内置的动态变量$guid
-
使用,内置动态变量使用
{{$guid}}
, 其他引用直接{{变量名}}
-
-
断言
-
该功能就是在请求结束后要做的操作,不仅限于断言,还能,set变量,get变量,clear变量。
-
断言:
-
状态码断言,判断响应状态码是否是指定的状态码
-
字符串断言,文本类型的请求结果中是否包含指定的字符
-
json断言,判断jsonData中,指定的key值是否符合预期
-
-
在集合中,如果有一些公共的断言,可以写在集合的断言中,不用在每个接口里面写断言了,避免了重复造轮子,只需要在接口中实现接口特定的断言
-
-
集合自动化
-
能自动的将集合内的接口进行自动化运行,指定运行的轮次
-
在自动化运行中,可以加入断言
-
还可以做数据驱动测试,即测试数据来自外部的文件中,一般我们选择将外部数据保存为CSV和json类型。
-
CSV:是一个无格式的文本文件,但它可以使用Excel打开。
-
-
可以导出json类型的运行结果。
-
-
命令行测试
-
在终端中进行执行postman脚本。
-
要下载newman插件,该插件用来在终端中执行postman脚本,但该插件本身基于nodejs开发,所以要配置:
-
nodejs ---- 版本问题,不能太高,太高了,低版本的Windows报错,太低了,插件装不上,所以,选择 >=10版本的, 也不要选择最新版本的
-
nodejs有nmp(下载软件的工具),在国内受网络影响,所以,配置cnpm,即淘宝的npm镜像
-
-
在进行终端测试时,还需要导出html文件, 那就要在下载 reporter插件
-
上述几个软件和插件下载完毕,可以执行命令:
-
newman run 脚本 -d 参数文件 -e 环境文件 -n 循环次数 -r html --reporter-html-export 测试报告路径
-
-
-