乐趣区

关于loadrunner:LoadRunner调用JS加密后登录

阐明

应用 LoadRunner 调用 javascript,实现加密登录信息后,提交并登录。
本例应用LoadRunner 2020 社区版

测试网站登录流程

测试网站采纳了 SM4 对称加密,每次 GET 申请登录页面时,生成随机密钥。把用户名和明码进行加密,密文 POST 到后端进行验证。

启用web_js_run

如下图所示,首先下载了加密脚本 sm4.js 并导入到 额定文件 中。
顺次抉择 运行时设置 Internet 协定 首选项 启用运行 Javascript 代码

检查点(web_reg_find)中文反对

在调试过程中发现,web_reg_find有点问题,通过查问材料(https://www.cnblogs.com/zjn-20161215/p/8603468.html),应用 lr_convert_string_encoding 进行编码,并将编码内容存入变量。

// 将查找指标转为 utf8 编码,放在变量 test_find 中
lr_convert_string_encoding("退出零碎", LR_ENC_SYSTEM_LOCALE, LR_ENC_UTF8, "text_find");
// 将 test_find 内容变为 string,存在变量 find 中
lr_save_string(lr_eval_string("{text_find}"),"find");
web_reg_find("Search=Body", "Text={find}", LAST);

调用 JS

web_js_run调用的代码中能够应用TruClient 函数

TruClient 函数 等效 VuGen 函数
LR.advanceParam lr_advance_param
LR.setParam lr_save_string
LR.getParam lr_eval_string
LR.log lr_debug_message
LR.userDataPoint lr_user_data_point
LR.freeParam lr_free_parameter
// 调用 JS,加密数据。js 文件导入【解决方案 - 额定文件】,LR.getParam 是 web_js_run 中读取变量的办法
web_js_run("Code=window.sm4.encrypt(LR.getParam('username') + LR.getParam('loginKey') + LR.getParam('password'), LR.getParam('loginKey'));",
    "ResultParam=cipherText",
    SOURCES,
    "File=sm4.js",
    ENDITEM,
    LAST);

残缺内容

参数配置

残缺脚本

代码很简略

#include "web_api.h"

Action()
{lr_start_transaction ("登录 OA"); 
    
    /*---- 获取 key,开始 ----*/
    // 设置正则提取规定
    web_reg_save_param_regexp(
        "ParamName=loginKey",
        "RegExp=var k.*?=.*?\"(.*?)\";",
        "Ordinal=1",
        SEARCH_FILTERS,
        LAST);
    //lr_output_message(lr_eval_string("{loginKey}"));
    
    // 拜访页面,能够参数化间接用{}
    web_url("getLogin",
        "URL={uri}/login.html",
        "TargetFrame=",
        "Resource=0",
        "Referer={uri}",
        "Snapshot=t1.inf",
        "Mode=HTTP",
        LAST);
    /*---- 获取 key,完结 ----*/

    /*---- 登录,开始 ----*/
    // 调用 JS,加密数据。js 文件导入【解决方案 - 额定文件】,LR.getParam 是 web_js_run 中读取变量的办法
    web_js_run("Code=window.sm4.encrypt(LR.getParam('username') + LR.getParam('loginKey') + LR.getParam('password'), LR.getParam('loginKey'));",
        "ResultParam=cipherText",
        SOURCES,
        "File=sm4.js",
        ENDITEM,
        LAST);
    //lr_output_message(lr_eval_string("{cipherText}"));
    
    // 检查点 不反对中文的解决办法
    // 将查找指标转为 utf8 编码,放在变量 test_find 中,留神正则表达式的转义字符
    lr_convert_string_encoding("退出零碎", LR_ENC_SYSTEM_LOCALE, LR_ENC_UTF8, "text_find");
    // 将 test_find 内容变为 string,存在变量 find 中
    lr_save_string(lr_eval_string("{text_find}"),"find");
    web_reg_find("Search=Body",
        "Text={find}",
        LAST);
    
    // 提交数据,登录
    web_submit_data("postLogin",
        "Action={uri}/login.html",
        "Method=POST",
        "TargetFrame=body",
        "RecContentType=text/html",
        "Referer={uri}/login.html",
        "Snapshot=t2.inf",
        "Mode=HTML",
        ITEMDATA,
        "Name=ticket", "Value={cipherText}", ENDITEM,
        LAST);
    /*---- 登录,完结 ----*/
    
    lr_end_transaction ("登录 OA", LR_AUTO); 
    return 0;
}
退出移动版