背景
最近看到一个网页,有个功能是需要进行猜数字,比较废人。所以手头上刚好有Apifox就打算搞个自动化猜数字的,就稍微记录一下过程。
规则也很简单,就是类似数字炸弹游戏一样,猜完会跟你说猜大了还是猜小了,所以本质上写个二分法是没什么难度的,就是刚接触这个接口测试工具,纯当学习交流。
登录接口
根据浏览器控制台看到这个项目用的是Bearer Token的鉴权配置,所以我们就需要设置一个登录接口去获取这么一个Token
在我们项目概览中,去添加一个前置操作是一个自定义脚本,这里我已经添加好了,jwt登录
// 定义发送登录接口请求方法
function sendLoginRequest() {
// 获取环境里的 前置URL
const baseUrl = pm.environment.get("baseUrl");
// 构造一个 POST x-www-form-urlencoded 格式请求。这里需要改成你们实际登录接口的请求参数。
const loginRequest = {
url: baseUrl + "/auth/login",
method: "POST",
header:{
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6"
},
// body 为 x-www-form-urlencoded 格式
//这边需要根据你们的请求体内容自行构造
body: {
mode: "urlencoded", // 此处为 urlencoded
urlencoded: [
{ key: "p", value: "eyJ1c2VybmFtZSI6IjQ2MDA0NCIsInBhc3N3b3****************************IzZDVkMGJlMjEwZDA0NjEyYXNkZ**********YTZhZSJ9" },
],
},
}
// 发送请求。
pm.sendRequest(loginRequest, function (err, res) {
if (err) {
console.log(err);
} else {
// 读取接口返回的 json 数据。
// 如果你的 token 信息是存放在 cookie 的,可以使用 res.cookies.get('token') 方式获取。
// cookies 参考文档:https://www.apifox.cn/help/app/scripts/api-references/pm-reference/#pm-cookies
const jsonData = res.json();
console.log(jsonData);
pm.globals.set("Authorization",jsonData.data.token)
// 将 accessTokenExpires 过期时间写入环境变量 ACCESS_TOKEN_EXPIRES
//我这里没有过期时间,手动设了30分钟
pm.globals.set(
"ACCESS_TOKEN_EXPIRES",
new Date().setMinutes(new Date().getMinutes () + 30)
);
}
});
}
// 获取环境变量里的 ACCESS_TOKEN_EXPIRES
const accessTokenExpires = pm.globals.get("ACCESS_TOKEN_EXPIRES");
// 如 ACCESS_TOKEN 没有值,或 ACCESS_TOKEN_EXPIRES 已过期,则执行发送登录接口请求
if (!accessTokenExpires || new Date(accessTokenExpires) <= new Date().setMinutes(new Date().getMinutes () + 1))
{
sendLoginRequest();
}
查找正确数字
现在我们已经获取了Token可以正常的请求接口了,把正常的请求直接拷进去,发现已经可以取到返回值了
现在需要解决的就是,根据上一次请求的返回值是猜大猜小来构造下一次请求的请求体。
这里我是这么实现的,将请求参数设置成环境变量{{drugParams}}
然后在后置操作时修改{{drugParams}}的值,就可以实现动态请求不同的数值了。
在后置操作中,首先要保存下来当前请求的返回结果
这里我是选择message,也就是猜大了,猜小了。 然后我们在添加一个自定义脚本的后置操作。
这里就是负责构造我们的{{drugParams}},这个项目是直接BASE64就可以了。
var mes = pm.environment.get("guess");
var beginnumber = pm.environment.get("guessbeginnum");
var endnumber = pm.environment.get("guessendnum");
var number;
if(mes == '您猜大了!')
{
console.log("进入猜大")
pm.environment.set("guessbeginnum", beginnumber);
pm.environment.set("guessendnum", Math.floor((beginnumber+endnumber)/2));
}
if(mes == '您猜小了!')
{
console.log("进入猜小")
pm.environment.set("guessbeginnum", Math.floor((beginnumber+endnumber)/2));
pm.environment.set("guessendnum", endnumber);
}
if(mes.indexOf('恭喜你')>-1)
{
number = 50
pm.environment.set("guessbeginnum", 0);
pm.environment.set("guessendnum", 100);
}
if(mes.indexOf('超出')>-1||mes.indexOf('错误')>-1||mes.indexOf('超出')>-1)
{
number = 50
pm.environment.set("guessbeginnum", 0);
pm.environment.set("guessendnum", 100);
}
beginnumber = pm.environment.get("guessbeginnum");
endnumber = pm.environment.get("guessendnum");
number = Math.floor((beginnumber+endnumber)/2);
if(number==beginnumber&&mes =='您猜小了!')
{
number = number+1;
}
if(number==endnumber&&mes =='您猜大了!')
{
number = number-1;
}
console.log(beginnumber+'-'+endnumber)
console.log(number)
if(beginnumber !=99&&endnumber !=100){
if(number>=endnumber&&(mes =='您猜大了!'||mes =='您猜小了!')||beginnumber==endnumber)
{
number = 50
pm.environment.set("guessbeginnum", 0);
pm.environment.set("guessendnum", 100);
}
}
var baseid = 'TLeYegRuDqe/4x0/zxWSZg=='
//var id=1;//丹砂
//var id=2;//云母
//var id=3;//玉泉
//var id=4;//白青
//var id=5;//涅石
//var id=6;//雄黄
//var id=7;//水银
//var id=8;//人参
//var id=9;//麦门冬
//var id=10;//木香
var id=11;//远志
var s = '{"userBaseId":"'+baseid+'","id":'+id+',"num":'+number+'}'
var postkey = btoa(s)
pm.environment.set("drugParams",postkey);
测试一下,一般只需要7次就能猜到正确数字
版权归原作者 战楚 所有, 如有侵权,请联系我们删除。