zoukankan      html  css  js  c++  java
  • 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)

    检查是否登录成功:

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

    这是打印出结果

     这是手动登录能看见的

     

  • 相关阅读:
    centos7安装pcntl扩展
    MySQL_数据库命名规范及约定
    tp5命名规范
    PHP易混淆函数的区别及用法汇总(函数和方法的区别)
    Mysql密码安全策略修改
    linux mysql 允许进行远程连接 比如 navicat
    解决 docker run 报错 oci runtime error
    如何删除Git中缓存的用户名和密码
    PHP heredoc 用法
    python日志模块
  • 原文地址:https://www.cnblogs.com/luobobobo/p/9306447.html
Copyright © 2011-2022 走看看