python+requests接口自动化基础汇总(持续更新)

前言:

两天不写就感觉生疏了,写写接口自动化的一些基础知识汇总。前提:对抓包工具fiddler有基础的了解

1.发送get请求

用禅道登录页面为例(刷新即可)

具体代码:

#coding:utf-8
import requests
url='http://127.0.0.1/zentao/user-login.html'
head={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36'
      }
s=requests.session()
r=s.get(url,headers=head,verify=False)
r.encoding='utf-8'
print(r.status_code)
print(r.encoding)
print(r.text)

返回内容:

访问是否成功:看返回文本的title

这里是需要转下码(r.encoding='utf-8'),转成UTF-8,不然会出现下面这样情况,不够直观

2.发送post请求

还是以禅道输入账号密码登录为例

这里在raw里面先关注三个点,一个是请求方式,二是传递参数类型,三是参数

参数这点也可以去webForms里查看

具体代码:

url2='http://127.0.0.1/zentao/user-login.html'
head={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36'
      }
s=requests.session()
body={
        'account'  :  'admin',
        'password' :   'e10adc3949ba59abbe56e057f20f883e',
        'keepLogin[]'  :  'on',
        'referer'  :  'http://127.0.0.1/zentao/my/'
    }
r=s.post(url2, data=body,headers=head)
print(r.status_code)
print(r.text)

返回内容:

判断是否登录成功:查看返回内容,这里是已经给你返回了另外一个地址了。

更直接一点的是方法:将参数错误输入,对比正确参数的返回结果(比如admin改为admin1)。错误参数返回如下内容,结果一目了然

 

接下来发个格式为json的post请求,需要多做的是导入json模块,然后将传递的参数用dumps方法转成json,最后在请求的时候就用  json=xx 去请求

import json
import requests
s=requests.session()
url3='http://httpbin.org/post'
testdata={'a':'1',
          'b':'2'
    }
data=json.dumps(testdata)
r=s.post(url3, json=data)
print(r.status_code)
print(r.text) 

还是详细看下抓包的内容吧

1.这个是我没有加头部,他显示的信息是python-requests,人家一看就是python访问的,就拒绝你了,这也说明了一般需要加头部

2.content-Type=json ; 说明是json的了

3.参数,json参数在wenForms里看不到的。

4.返回内容

 3.传图片/附件请求

还是已禅道为例,先来手动抓包看看

 步骤:登录→提bug→在复现步骤里添加图片(这里暂时不提交,目的只是先添加成功)

先贴流水账代码

 1 #coding:utf-8
 2 import requests
 3 jpgname='test_road.jpg'
 4 jpgpath=r'D:	upian
oad.jpg'
 5 host='http://127.0.0.1:80'
 6 s=requests.session()
 7 url1='http://127.0.0.1/zentao/user-login.html'
 8 head={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36'
 9       }
10 
11 body={
12         'account'  :  'admin',
13         'password' :   'e10adc3949ba59abbe56e057f20f883e',
14         'keepLogin[]'  :  'on',
15         'referer'  :  'http://127.0.0.1/zentao/my/'
16     }
17 r=s.post(url1, data=body,headers=head)
18 print(r.status_code)
19 r.encoding='utf-8'
20 print(r.text)
21 
22 url=host+'/zentao/file-ajaxUpload-5b32f466b8804.html?dir=image'
23 file={"localUrl":(None,jpgname),
24       "imgFile":('1.jpg',open(jpgpath,'rb'),'image/jpeg')
25             }
26         
27 r=s.post(url, files=file)
28 print(r.text)
29 jpg_url=r.json()['url']
30 print(jpg_url)

返回内容:

在看抓包信息:

这里有两个,一个是登录的(不贴了,越过了),一个是传图片的,主要看下他的

 

这里的content-Type和WebForms里的参数都有点不一样了,这种表单传参就如上面23行代码开始,传元祖形式。

因为Content-Disposition: form-data;这两项参数是一样的,可以不用管,只需要管name参数即可,因为上面也是标注Name

 说下

file={"localUrl":(None,jpgname),  #None参数,可有可无。jpgname是对你传的照片命名
      "imgFile":('1.jpg',open(jpgpath,'rb'),'image/jpeg') #1.jpg是你照片的名字, open(jpgpath,'rb')是打开你那张照片,'image/jpeg'是格式,抓包也能看见
         }

 note:

1.这里用files=xxxx,不用json和data

2.检查是否传成功:输入host+后面打印出来的地址,能显示出来你传的那张照片就成功了

3.传附件和传图片一样,将files=xxxx单独拎出来

完整bug代码提交(图片+附件):

#coding:utf-8
import requests
import time
jpgname='test_road.jpg'
jpgpath=r'D:	upian
oad.jpg'
host='http://127.0.0.1:80'
s=requests.session()
url1='http://127.0.0.1/zentao/user-login.html'
head={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36'
      }

body={
        'account'  :  'admin',
        'password' :   'e10adc3949ba59abbe56e057f20f883e',
        'keepLogin[]'  :  'on',
        'referer'  :  'http://127.0.0.1/zentao/my/'
    }
r=s.post(url1, data=body,headers=head)
print(r.status_code)
r.encoding='utf-8'
print(r.text)

url2=host+'/zentao/file-ajaxUpload-5b32f466b8804.html?dir=image'
file={"localUrl":(None,jpgname),
      "imgFile":('1.jpg',open(jpgpath,'rb'),'image/jpeg')
            }
        
r=s.post(url2, files=file)
print(r.text)
jpg_url=r.json()['url']
print(jpg_url)

url3='http://127.0.0.1/zentao/bug-create-1-0-moduleID=0.html'
title=time.strftime('%Y_%m_%d_%H_%M_%S')
body= {
                    "product": "1",
                    "module": "0",
                    "project": "",
                    "openedBuild[]": "trunk",
                    "assignedTo": "admin",
                    "type": "codeerror",
                    "os": "all",
                    "browser": "all",
                    "color": "",
                    "title": title,
                    "severity": "3",
                    "pri": "0",
                    "steps": '<p>[步骤]</p>
                            <p>1、第一步点</p>
                            <p>2、第二步点</p>
                            <p>3、点三步点</p>
                            <p>[期望]222<img src="%s" alt="" /></p>
                            <p>[结果]</p>
                            <p>[期望]</p>' % jpg_url,
                    "story": "0",
                    "task": "0",
                    "mailto[]": "",
                    "keywords": "",
                    "uid": "5a2955c884f98",
                    "case": "0",
                    "caseVersion": "0",
                    "result": "0",
                    "testtask": "0"
                    }

file=[
('files[]',('2.jpg',open(r'D: upian1.jpg','rb'),'image/png')),
('files[]',('x.jpg',open(r'D: upian oad.jpg','rb'),'image/png'))
]  #传多个用list类型


r=s.post(url3, data=body,files=file)
print(r.text)

自行封装成类吧

4.session

百度一大堆具体用法

s=requests.session()

老师说理解为代码里的浏览器,写代码时就和webdriver一样,做个全局变量

后面再用 s 去发送get/post请求

5.dict ⇔ json


import json
d1={'a':'1',
'b':'2'
}
print(type(d1))
j=json.dumps(d1)  #dict转json
print(type(j)) #json属于特殊的str类型
print(j)
d2=json.loads(j) #json转dict
print(type(d2))
print(d2)

 

打印结果

6.添加cookies,绕过验证码登录

用自己公司的网站为例

步骤:打开fiddler→手动登录→在fiddler里获得cookie→添加到代码

具体操作;

验证码页面

登陆后获得的cookie

代码:

#coding:utf-8
import requests
url='http:xxxxxxxxxxxxxx'
s=requests.session()


c=requests.cookies.RequestsCookieJar()
c.set('STYLE','xxxxxxxxxxx')
c.set('JSESSIONID', 'xxxxxxxxxx')
c.set('pgv_pvi', 'xxxxxxxxxxxxx')
c.set('loginUserName', 'xxxxxxxx')
s.cookies.update(c) #更新cookies

r=s.get(url)
print(r.text)

检查是否登录成功:

查看返回的内容里面是否有你的登录过后的元素

这是打印出结果

 这是手动登录能看见的

 

原文地址:https://www.cnblogs.com/luobobobo/p/9306447.html