python接口自动化-参数关联和JSESSIONID(上个接口返回数据作为下个接口请求参数)

参数关联是接口测试和性能测试最为重要的一个步骤,很多接口的请求参数是动态的,并且需要从上一个接口的返回值里面取出来,一般只能用一次就失效了。
最常见的案例就是网站的登录案例,很多网站的登录并不仅仅只传username和psw两个参数,往往有其它的动态参数。
有时候还需要带上cookies参数,如JSESSIONID

登录参数

首先分析下目标网站【学信网:https://account.chsi.com.cn/passport/login】的登录接口请求参数。
先随便输入账号和密码,使用fiddler工具抓包查看请求参数,用两个参数是网页自动给的参数(用户没输入)

  • lt : LT-269530-RIkaD7y6sB6dfBwdX56cfaifqxElxx
  • execution: e1s1

关闭浏览器后,重复上面操作,再抓包看请求参数,会发现变了

  • lt : LT-277623-5ldGTLqQhP4foKihHUlgfKPeGGyWVI
  • execution: e1s1

备注:execution参数是表示网站刷新次数,可以刷新下再登录,就变成 e2s1了

获取接口返回数据

我们想登录的话,必须先得到 lt 和 execution 这2个参数,那么问题来了:这两个参数是从哪来的?
打开登录页面https://account.chsi.com.cn/passport/login直接刷新,看返回的html内容

<input class="btn_login" name="submit" accesskey="l" value="登录" tabindex="4" type="submit" title="登录" />

<div class="account-oprate clearfix">
       <a class="find-yhm" href="https://account.chsi.com.cn/account/password!rtvlgname">找回用户名</a>
       <a class="find-mm" href="https://account.chsi.com.cn/account/password!retrive">找回密码</a>
       <a href="https://account.chsi.com.cn/account/preregister.action?from=account-login" class="regist-btn">注册</a>
</div>
<input type="hidden" name="lt" value="LT-279621-fnisPBt0FVGNFrfWzJJqhTEyw6VkfH" />
<input type="hidden" name="execution" value="e2s1" />
<input type="hidden" name="_eventId" value="submit" />

接下来可以用前面学的的lxml爬虫框架python笔记28-lxml.etree爬取html内容,从html中解析出value="LT-279621-fnisPBt0FVGNFrfWzJJqhTEyw6VkfH"和value="e2s1"这两个值

# conding:utf-8
import requests
from lxml import etree
import urllib3
urllib3.disable_warnings()

s = requests.session()
def get_it_execution():
    result = {}
    loginurl = "https://account.chsi.com.cn/passport/login"
    h1 = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
    }
    s.headers.update(h1)
    r = s.get(loginurl, verify=False)
    dom = etree.HTML(r.content.decode("utf-8"))

    try:
        result["lt"] = dom.xpath(‘//input[@name="lt"]‘)[0].get("value")
        result["execution"] = dom.xpath(‘//input[@name="execution"]‘)[0].get("value")
        print(result)
    except:
        print("lt、execution参数获取失败!")
    return result
if __name__ == "__main__":
    result = get_it_execution()

运行结果:
{‘lt‘: ‘LT-286330-a6Ogf3rt3Fcwt6XZcuKCa4HHzz0QA3‘, ‘execution‘: ‘e1s1‘}

JSESSIONID

登录里面实际上会有一个非常重要的cookies参数,JSESSIONID=4D98C3F3ED18A2489BD17CA722D19AE8,这个JSESSIONID也是动态的,每次重新打开页面都会变。
这个参数也是第一次访问登录页面时候,服务器会自动返回过来的,使用浏览器无痕模式首次访问就能抓取到了。

cookies参数关联实现就非常简单了,直接用requests.session()去发个get请求就能自动保存了,所以上一步get_it_execution()实际上也同步了cookies参数。

参考代码

# conding:utf-8
import requests
from lxml import etree
import urllib3
urllib3.disable_warnings()

s = requests.session()

def get_it_execution():
    result = {}
    loginurl = "https://account.chsi.com.cn/passport/login"
    h1 = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
    }
    s.headers.update(h1)
    r = s.get(loginurl, verify=False)
    dom = etree.HTML(r.content.decode("utf-8"))

    try:
        result["lt"] = dom.xpath(‘//input[@name="lt"]‘)[0].get("value")
        result["execution"] = dom.xpath(‘//input[@name="execution"]‘)[0].get("value")
        print(result)
    except:
        print("lt、execution参数获取失败!")
    return result

def login(result, user=‘13812348888‘, psw=‘123456‘):
    loginurl = "https://account.chsi.com.cn/passport/login"
    h2 = {
        "Referer": loginurl,
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "Origin": "https://account.chsi.com.cn",
        "Content-Length": "119",
        "Cache-Control": "max-age=0",
        "Upgrade-Insecure-Requests": "1",
        "Content-Type": "application/x-www-form-urlencoded"
        }
    body = {
        "username": user,
        "password": psw,
        "rememberMe": "true",
        "lt": result["lt"],
        "execution": result["execution"],
        "_eventId": "submit"
    }
    s.headers.update(h2)
    r4 = s.post(loginurl, data=body, verify=False)
    print(r4.text)

if __name__ == "__main__":
    result = get_it_execution()
    login(result, user=‘13812348888‘, psw=‘123456‘)

原文地址:https://www.cnblogs.com/jason89/p/10324166.html

时间: 2024-10-12 07:56:06

python接口自动化-参数关联和JSESSIONID(上个接口返回数据作为下个接口请求参数)的相关文章

postman 上一个接口的返回值作为下一个接口的入参

在使用postman做接口测试的时候,在多个接口的测试中,如果需要上一个接口的返回值作为下一个接口的入参,其基本思路是: 1.获取上一个接口的返回值 2.将返回值设置成环境变量或者全局变量 3.设置下一个接口的参数形式 列子: 存在两个接口(设置微信公众号的测试号的菜单栏的接口) 1.第一个接口用户获取access_token.https://api.weixin.qq.com/cgi-bin/token?三个参数如下. 2.第二个接口用户设置菜单栏. 在这两个接口中,我们需要将第一个接口返回的

接口自动化的关联

一. 在所有的平台中,凡是有往数据库中增加的接口,必然有相应的查询接口 二. 接口的后台服务除了要把数据返回给我们之外,还要把真正对数据库修改的操作写入数据库 三. 不知道接口实现的逻辑,不知道开发先去更新数据库,还是先给我们返回数据 四. 因此有两种方式,一种是调用相应的查询接口,一种是直接查询数据库(1. 如果系统复杂,有可能查询的语句非常复杂,测试无法自己写,需要开发协助,成本比较高, 2. 不是所有的产品都需要查询数据库,除非对数字.授权比较敏感),因此能用查询接口,就用查询接口 五.

Postman 如何处理上一个接口返回值作为下一个接口入参?

今天做接口测试,有一个接口的参数是一个校验 token,会实时更新,开发提供了一个单独返回实时 token 的接口,所以就需要在功能接口使用时调用 token 接口的返回值,作为功能接口的参数来使用. 网上搜了一下,都没有现成的使用说明,刚才研究出来了,就记录下步骤,方便后面的同学. 如果返回 token 的接口的返回值,是标准的 JSON 格式的话,就很简单的两步就行了. 1.token 接口设置全局变量 第一步就是执行 token 接口,并把接口返回值里面的 token 值,赋值给一个全局变

上传文件返回数据提示下载

摘要:  最近项目中出现上传文件返回的json数据会被提示下载,只有在ie10+中才会出现这个问题.前端使用jQuery的插件ajaxForm提交表单,后台返回的数据格式为json.代码如下: 后端Python: def jsonp(func): """Wraps JSONified output for JSONP requests.""" @wraps(func) def decorated_function(*args, **kwargs)

python接口自动化5-session关联

前言 我们不难发现浏览器中存在着cookie缓存等,但我们在python中如果像浏览器这样的缓存,我们就很难的需要关联cookie或会话了. 但python的requests库,就封装了Session方法.Session类实现会话对象.就好比如是python中的浏览器. 一.Cookie 与 Session 的区别 1.Cookie,也用复数Cookies,就是为了辨别用户身份.进行 Session 跟踪而储存在用户本地终端上的数据,通常要加密,而Cookie数据存放在客户的浏览器上: 2.Co

接口自动化(三)--读取json文件中的数据

上篇讲到实际的请求数据放置在json文件内,这一部分记述一下python读取json文件的实现. 代码如下(代码做了简化,根据需要调优:可做一些容错处理): 1 import json 2 3 class operateJson(): 4 def __init__(self,jsonPath=None): 5 self.jsonPath = jsonPath #传入json文件路径 6 7 #读取json文件的内容 8 def readJson(self): 9 with open(self.j

接口自动化---简单的数据驱动框架ATP(基于excel)

数据驱动测试:根据数据进行测试.将用例写入excel文件,用代码读取文件中的数据,从而实现自动化测试. 自动化框架实现步骤: 1.获取用例 2.调用接口 3.校验结果 4.发送测试报告 5.异常处理 6.日志一.首先准备好用例 在excel文件中用例写好,格式如下:数据一定要填写正确. 二.编写框架结构 ATP框架结构搭建:lib目录下放一些处理操作,logs目录下存放日志文件,cof文件夹放一些配置文件,bin文件夹作为启动文件,cases目录下放我们准备好的用例 注意:文件目录建好以后,必须

接口自动化总结

最近写了一个接口自动化程序,还没有转化成平台. 数据来源是数据库,报告输出是excel,用unitest框架写的:和悠悠的接口自动化不同点是,增加了传参,入参的自动调用,增加了自动登录,增加了日志输出:后续再增加excel自动换行,加粗等:不足点不能实现和数据库数据对比 代码经验总结: python基础的东西要多看看,有孩子和抖音,一直没时间再看看: 从数据库取出来的数据是数组形式的 str转字典用ast.literal_eval().json.load()函数(要是字典形式的str) 转成js

Jmeter+Maven+Jenkins+Git接口自动化流程

最近在实现 Jmeter+Maven+Jenkins+Git 接口自动化,研究不到两周,实现了 Jmeter+Maven+Jenkins+Git  接口自动化 的整体流程. 仅以此博客简单记录下自己实现的过程. 一. 职责.角色明确 Jmeter: 执行者,录制接口测试脚本,运行脚本,得到结果,生成报告,统计数据: Maven,Git :管理者, Maven 主要负责项目的依赖管理,Git 主要负责项目的代码管理: Jenkins:调度者,持续集成(CI)工具:构建.部署自动化:可以持续编译,运