• python+requests库接口自动化测试


    前言

    Requests:是用python语言基于urllib编写的,采用的是Apache2Licensed开源协议的HTTP库,Requests它会比urllib更加方便,可以节约我们大量的工作。

    一、安装

    1、通过pip安装

    pip install requests
    
    • 1

    2、通过国内源下载(方法1 下载慢 或者 报错 情况下)

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
    
    • 1

    二、模拟get请求

    import requests
    response=requests.get("url主机字符串")
    #可以使用print(response.content.decode('utf-8')),response.content是二进制模式,可以下载视频之类的,如果想看的话需要decode成utf-8格式。而response.text返回的是Unicode格式,通常需要转换为utf-8格式,否则就是乱码。如果想用text方法并解决乱码问题,可以通过如下代码实现:
    
    response.encoding = 'utf-8'
    print(response.text)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    三、模拟带参数的get请求

    import requests
    
    #写法一:
    response = requests.get("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET")
    print(response.content.decode('utf-8'))
    
    #写法二:
    data = {'grant_type':'client_credential','appid':'APPID','secret':'APPSECRET'}
    response = requests.get("https://api.weixin.qq.com/cgi-bin/token", params=data)
    print(response.content.decode('utf-8'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    四、自定义请求头

    import requests
    
    data = {'wd':'詹姆斯'}
    headerinfo = {'UserAgent':'Mozilla/5.0(Macintosh;IntelMacOSX10_13_6)AppleWebKit/537.36(KHTML,likeGecko)Chrome/68.0.3440.106Safari/537.36',
          'Accept-Encoding':'gzip,deflate,br',                                                                                       
          'AcceptLanguage':'zhCN,zh;q=0.9',
          'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'
    }
    response=requests.get('https://www.baidu.com/s', params=data, headers=headerinfo)
    print(response.content.decode('utf-8'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    五、模拟post请求

    import requests
    import json
    
    url = "https://api.weixin.qq.com/cgi-bin/tags/create"
    data = {'access_token':'token值'}  # token值为之前获取access_token的值
    info = {'tag':{'name':'广东'}}
    headers = {'Content-Type':'application/json'}  #发送json数据必带的头部信息
    response = requests.post(url, params=data, data=json.dumps(info), headers=headers)
    print(response.content.decode('utf-8'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    备注:json.dumps()用于将dict类型的数据转成json格式编码的字符串

    通过上个例子,可以知道,post请求的请求参数是通过data方式来传递的。Post的请求参数一般有form表单、json数据、文件等。

    用requests模块处理方式如下:

    form表单(使用dict类型传输)

    postResponse = requests.post(url, data={'key':'value'})
    
    • 1

    Json数据:

    方式一:(需要使用json模块)

    jsonParams = {'key':'value'}
    headers = {'Content-Type':'application/json'}
    postJsonResponse = requests.post(url, headers=headers, data=json.dumps(jsonParams))
    
    • 1
    • 2
    • 3

    方式二:

    jsonParams = {'key':'value'}
    headers = {'Content-Type':'application/json'}
    postJsonResponse = requests.post(url, headers=headers, json=jsonParams)
    
    • 1
    • 2
    • 3

    响应包括响应行、响应头、响应正文内容,这些返回的响应信息都可以通过Requests模块获取。这些获取到的响应内容也是接口测试执行得到的实际结果。

    获取响应行:

    r = requests.get("百度一下,你就知道")
    print(r.status_code)#响应状态码
    print(r.reason)#响应信息
    
    • 1
    • 2
    • 3

    获取响应头:

    print(r.headers)#获取响应头 返回的是dict类型,可以继续使用get获取指定的值
    
    • 1

    获取其它响应信息:

    print(r.url)#获取请求地址
    print(r.cookies)#获取cookies
    print(r.encoding)#获取响应的编码格式
    
    • 1
    • 2
    • 3

    依据不同响应正文内容的情况

    Requests模块有四种不同的处理方式:

    响应内容:

    r = requests.get('百度一下,你就知道')
    print(r.text)
    
    • 1
    • 2

    Requests会自动解码来自服务器的内容。大多数unicode字符集都能被无缝地解码。请求发出后,Requests会基于HTTP头部对响应的编码作出有根据的推测。当你访问r.text之时,Requests会使用其推测的文本编码。r.text使用后乱码的几率很大,可以先用r.encoding属性来改变编码,

    如下所示:

    r = requests.get('百度一下,你就知道')
    r.encoding = 'utf-8'
    print(r.text)
    
    • 1
    • 2
    • 3

    二进制响应内容:

    对于非文本请求,r.content能以字节的方式访问请求响应体。且Requests模块会自动为你解码gzip和deflate传输编码的响应数据。

    使用r.content处理普通的响应返回:

    r=requests.get('百度一下,你就知道')
    print(r.content.decode('utf-8'))
    
    • 1
    • 2

    使用r.content下载图片文件:

    from PIL import Image
    from io import BytesIO
    
    
    r = requests.get('https://www.baidu.com/img/bd_logo1.png')
    img = Image.open(BytesIO(r.content))
    img.save('test.png')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    JSON响应内容:

    Requests中有一个内置的JSON解码器r.json(),处理返回的JSON数据。使用后,会把返回的数据作为一个python中的json数据对象看待。如果JSON解码失败,r.json()就会抛出一个异常。

    六、设置代理

    普通代理:

    import requests
    
    
    proxies = {"http":"http://127.0.0.1:9743","https":"https://127.0.0.1:9743"}
    response = requests.get("https://www.taobao.com", proxies=proxies)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    包含用户名和密码:

    import requests
    
    proxies = {"http":"http://user:password@127.0.0.1:9743/"}
    response = requests.get("https://www.taobao.com", proxies=proxies)
    
    • 1
    • 2
    • 3
    • 4

    七、超时设置

    Requests模块可以设置接收数据的超时时间,超出设定的时间还没有数据返回,就抛出异常。超时设置有两种类型表达:float、tuple

    import requests
    
    respone01 = requests.get('百度一下,你就知道', timeout=0.0001)  #代表接收数据的超时时间
    respone02 = requests.get('百度一下,你就知道', timeout=(0.1,0.2))  #0.1代表链接超时,0.2代表接收数据的超时时间(单位是秒)
    
    • 1
    • 2
    • 3
    • 4

    如果远端服务器很慢,你可以让Request永远等待,传入一个None作为timeout值

    八、重定向设置

    在请求url时,服务器会自动把我们的请求重定向,可以使用r.history来查看重定向。如果不想进行自动重定向,可以用参数allow_redirects关闭。

    r = requests.get("http://www.360buy.com")
    print(r.history)
    r = requests.get("http://www.360buy.com", allow_redirects=False)
    
    • 1
    • 2
    • 3

    九、session处理

    部分接口需要先登录网址,才能有权限进行调用,这时可以使用到session

    具体操作是:先使用网站的登录api进行登录,得到session后,然后用该session来请求其它的接口。

    示例代码如下:

    s = requests.Session()
    login_data = {'form_email':'youremail@example.com','form_password':'yourpassword'}
    s.post("http://pythontab.com/testLogin", login_data)
    r = s.get('http://pythontab.com/notification/')
    
    • 1
    • 2
    • 3
    • 4

    十、请求中携带cookies

    对于某些网站,登录然后从浏览器中获取cookies,以后就可以直接拿着cookie登录了,无需输入用户名密码。

    import requests
    
    Cookies={'user_session':'value'}
    response = requests.get('https://github.com/settings/emails', cookies=Cookies)
    
    • 1
    • 2
    • 3
    • 4

    十一、异常处理

    遇到网络问题(如:DNS查询失败、拒绝连接等)时,Requests会抛出一个ConnectionError异常。

    如果HTTP请求返回了不成功的状态码,Response.raise_for_status()会抛出一个HTTPError异常。

    若请求超时,则抛出一个Timeout异常。

    所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException。

    import requests
    from requests.exceptions import ReadTimeout,ConnectionError,RequestException
    
    
    try:
       response = requests.get("http://httpbin.org/get", timeout=0.5)
       print(response.status_code)
    except ReadTimeout:
       print('Timeout')
    except ConnectionError:
       print('Connectionerror')
    except RequestException:
       print('Error')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    最后感谢每一个认真阅读我文章的人,下面这个网盘链接也是我费了几个月时间整理的非常全面的,希望也能帮助到有需要的你!
    在这里插入图片描述
    这些资料,对于想转行做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……

    如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便放弃的感受的话,可以点击下方小卡片加入我们群,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流,同时我也把上面花几个月整理的资料放里边了,赶快加入吧。

    敲字不易,如果此文章对你有帮助的话,点个赞收个藏来个关注,给作者一个鼓励。也方便你下次能够快速查找。

    自学推荐B站视频:

    零基础转行软件测试:38天自学完软件测试,拿到了字节的测试岗offer,堪称B站最好的视频!

    自动化测试进阶:已上岸华为,涨薪20K,2022最适合自学的python自动化测试教程,自己花16800买的,无偿分享

    在这里插入图片描述

  • 相关阅读:
    29 drf-Vue个人向总结-2
    Vue 2.0中引入的类型检查Flow
    皕杰小程序之app.josn
    数字化时代,数据仓库究竟是干什么的?
    git diff 操作
    C进阶-数据的存储
    PostgreSQL的扩展(extensions)-常用的扩展之pg_stat_statements
    记一次PDU接室外监控溶解事故
    iPhone/iPad怎么进入恢复模式?苹果各机型启动恢复模式方法汇总
    com.google.guava:guava 组件安全漏洞及健康分析
  • 原文地址:https://blog.csdn.net/weixin_57805858/article/details/126745269