python利用session保持登錄狀態


在接口測試的過程中,經常會遇到有些接口需要在登錄的狀態下才能運行,否則會進行相應的提示,例如“請登錄”:
我們有2種解決辦法:
1、每次接口請求后獲取到響應中的cookie,然后下次請求帶上這個cookie,參考http_request2.py

 2、使用requests的session會話對象

   也就是requests的session會話對象來進行處理。會話對象讓你能夠跨請求保持某些參數。它也會在同一個 Session 實例發出的所有請求之

   間保持 cookie, 期間使用 urllib3 的 connection pooling 功能。所以如果你向同一主機發送多個請求,底層的 TCP 連接將會被重用,

   從而帶來顯著的性能提升。test2.py使用session來保持會話:

 參考鏈接:https://blog.csdn.net/u013383813/article/details/76736720/

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : test.py
# @Author: jing
# @Date  : 2018/12/19
# @Desc  :
#   https://blog.csdn.net/u013383813/article/details/76736720/
#發起一個get請求
import requests      # requess是第三方的,所以需要導入
import json
login_url='http://192.168.135.128:9999/futureloan/mvc/api/member/login'  #登錄接口地址
login_data={'mobilephone':'13417467890','pwd':'123456'} #請求的數據是字典格式
recharge_url='http://192.168.135.128:9999/futureloan/mvc/api/member/withdraw'  #登錄接口地址
recharge_data={'mobilephone':'13417467890','amount':'100'} #請求的數據是字典格式
print(json.dumps(login_data))
print(type(json.dumps(login_data)))
s=requests.Session()   #建立一個session會話,來保持會話,在需要登錄的接口中能保持會話,不需要加cookie

# 1、發起get請求(請求數據附在url后面):請求數據為key:value格式

# 在get請求中使用params關鍵字,以一個字典來傳遞這些參數 # 如果要將參數放在url中傳遞,使用params參數,可以是字典或者字符串,發起請求時,參數附在url后面
responsesdata1=s.get(url=login_url,params=login_data)
responsesdata2=s.get(url=recharge_url,params=recharge_data)   #發起一個get請求,並將響應結果存在responsesdata中

# get請求的參數是附在url的后面,所以沒有請求體
print(responsesdata2.url)  # 輸出 http://192.168.135.128:9999/futureloan/mvc/api/member/withdraw?mobilephone=13417467890&amount=100
print(responsesdata2.request.body) #輸出 None,因為get請求沒有body


# 2、發起post請求(請求數據在body中):請求數據格為key:value格式和json格式
 # 如果要將參數放在request body中傳遞(以formm表單傳遞),使用data參數,可以是字典,字符串,json或者是類文件對象
# 1、在post請求中使用data關鍵字,以一個字典(key:value)來傳遞這些參數。發起請求時參數在body中
responsesdata1=s.post(url=login_url,data=login_data) responsesdata2=s.post(url=recharge_url,data=recharge_data) #post請求的參數是在請求體body中,不會附在url后面 print(responsesdata2.url) # 輸出 http://192.168.135.128:9999/futureloan/mvc/api/member/withdraw print(responsesdata2.request.body) # 輸出post請求的body:pwd=123456&mobilephone=13417467890 print(responsesdata1.json()) print(responsesdata2.json())

# 2、在post請求中使用data關鍵字,以json來傳遞這些參數。發起請求時參數在body中
ss.post(
url=login_url,data=json.dumps(login_data),headers={'Content-Type':'application/json'})  #將字典格式的data1轉換成json格式傳遞數據json.dumps(login_data)

python3+requests:post請求四種傳送正文方式(詳解):https://www.cnblogs.com/insane-Mr-Li/p/9145152.html

 修改http_request2.py,使用session來保持登錄狀態:

#讀取多條測試用例
#1、導入requests模塊
import  requests
#從 class_12_19.do_excel1導入read_data函數
from do_excel2 import read_data
from do_excel2 import write_data
from do_excel2 import count_case
#定義http請求函數
ss=requests.session()
def http_request3(method,url,data):

    if  method=='get':
        print('發起一個get請求')
        result=ss.get(url=url,params=data)
    else:
        print('發起一個post請求')
        result=ss.post(url=url,data=data)
    return result   #返回響應體
   # return result.json()  #返回響應結果:結果是字典類型:{'status': 1, 'code': '10001', 'data': None, 'msg': '登錄成功'}


#從Excel讀取到多條測試數據
sheets=['login','recharge','withdraw']
for sheet1 in sheets:
     max_row=count_case(sheet1)
     for case_id in range(1,max_row):
        data=read_data(sheet1,case_id)
        print('讀取到第{}條測試用例:'.format(data[0]))
        print('測試數據 ',data)
        #print(type(data[2]))
        #調用函數發起http請求
        result=http_request3(data[4],data[2],eval(data[3]))
        print('響應結果為 ',result.json())

            #將測試實際結果寫入excel
            #write_data(case_id+1,6,result['code'])
        write_data(sheet1,case_id+1,7,str(result.json()))
        #對比測試結果和期望結果
        if result.json()['code']==str(data[5]):
            print('測試通過')
            #將用例執行結果寫入Excel
            write_data(sheet1,case_id+1,8,'Pass')
        else:
            write_data(sheet1,case_id+1,8,'Fail')
            print('測試失敗')
http_request3.py

 

import requests
import json
ss=requests.session()   # cookies 參數可以用session自動關聯
class HttpRequest():
    def http_request(self,url,method,data1):
        if method=='get':
            res=ss.get(url=url,params=data1)  #get請求用params傳遞字典格式的數據
        else:
            #在通過requests.post()進行POST請求時,傳入報文的參數有兩個,一個是data,一個是json:常見的form表單可以直接使用data參數進行報文提交,而data的對象則是python中的字典類型;
            res=ss.post(url=url,data=data1)  #post請求用data傳遞字典格式的數據
            # res=ss.post(url=url,data=json.dumps(data1),headers={'Content-Type':'application/json'})  #將字典格式的data1轉換成json格式傳遞數據;因為此接口只支持key:value格式,所以傳遞json格式的時候會報錯
        print(res.json())
        print(res.url)
        print(res.request.body)
        return res

# 下面是發送的是post請求:參數是在body里面,body=pwd=123456&mobilephone=13417467890
# #pt1.1: {'msg': '登錄成功', 'data': None, 'status': 1, 'code': '10001'}
# http://192.168.135.128:9999/futureloan/mvc/api/member/login
# pwd=123456&mobilephone=13417467890


# 下面發送的是get請求:參數是附在url的后面,body為Nome
# #pt1.2: {'msg': '用戶名或密碼錯誤', 'data': None, 'status': 0, 'code': '20111'}
# http://192.168.135.128:9999/futureloan/mvc/api/member/login?pwd=12345678&mobilephone=13417467890
# # None
httprequest.py

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM