0


Apifox自定义脚本实现二分法查找正确数值

背景

最近看到一个网页,有个功能是需要进行猜数字,比较废人。所以手头上刚好有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次就能猜到正确数字


本文转载自: https://blog.csdn.net/qq_33765324/article/details/126141302
版权归原作者 战楚 所有, 如有侵权,请联系我们删除。

“Apifox自定义脚本实现二分法查找正确数值”的评论:

还没有评论