LoadRunner调用JS加密后登录

180 阅读2分钟

说明

使用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.advanceParamlr_advance_param
LR.setParamlr_save_string
LR.getParamlr_eval_string
LR.loglr_debug_message
LR.userDataPointlr_user_data_point
LR.freeParamlr_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;
                                                                                                                                                                                                                                                                                                                                                                                    }</code></pre>