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

 

转载于:https://www.cnblogs.com/yhms/p/10305282.html

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
模拟登录Python主要是利用Python的网络请求库(如requests、selenium等)以及一些HTTP协议理解,来仿照浏览器行为,向网站发送登录请求,输入用户名和密码,以便于自动化访问那些需要登录验证的功能。这个过程通常包括以下几个步骤: 1. **分析登录页面**: 首先,你需要抓取登录页面的HTML结构,识别登录表单字段名(如username、password),有时还可能需要验证码。 2. **构造登录数据**: 根据表单字段名和对应的值(用户的账号和密码),构建登录数据(字典或JSON格式)。 3. **发送登录请求**: 使用requests库发送POST请求到登录URL,携带构造好的登录数据。 ```python import requests login_data = {'username': 'your_username', 'password': 'your_password'} response = requests.post('http://example.com/login', data=login_data) ``` 4. **处理登录状态**: 登录成功后,服务器可能会返回特定的响应码或在cookies、session中存储状态信息,检查这些信息确认登录是否成功。 5. **使用会话保持登录状态**: 如果是使用session,可以在后续请求中带上已经登录后的session,这样就无需每次都重新登录。 6. **异常处理和验证码处理**: 如果遇到验证码或者服务器错误,可能需要额外的处理,比如使用OCR库识别验证码或者手动输入。 **相关问题--:** 1. 如何在Python中处理网站的动态验证码? 2. 什么情况下需要手动设置cookies或session保持登录状态? 3. 在模拟登录过程中如何捕获并处理HTTP状态码?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值