1.参数化其他类型:
File
Date/Time
RandomNumber
uniqueNumber
2.从数据库中取值作为参数值:
连接数据库时:需要ODBC数据源
mysql默认不允许远程访问---->需要先开启远程访问
3.关联—》从服务器的响应数据中获取数据
函数:web_reg_save_param()----->关联函数,---->属于注册型函数—特点:该函数放在某个请求的响应如果有我们想要的数据,那么就放在该请求的前面
两种:手动:基本关联—获取一个值,
高级关联:获取多个值
lr_paramarr_idx()—>获取参数数组指定位置的元素,注意:位置从1开始
lr_paramarr_len()—>获取参数数组的长度
lr_paramarr_random()---->获取参数数组随机位置上的元素
lr_save_string(“字符串”,“参数名”)---->将字符串保存到参数中
自动:
录制中关联---->需要设置关联规则---->Edit recording options中选择correlation--->new application--->new rule--->设置左右边界即可
录制完后关联--->1.录制完以后必须先运行一遍 2.扫描脚本---->vuser菜单下--->scan script for correlations-->扫描过程中会将响应数据和上一次运行的响应数据
做对比,出现不同的内容以后会有黄色提示--->如果是想要关联的内容--->选中该数据右键选择create correlations即可
关联的步骤:
一、手动关联
关联的作用:
从服务器响应数据获取动态数据,依赖目标对象的左右边界
//输入用户名和密码进行登录
//需要实时的获取上一个请求的响应数据中的userSession对应的值,放到登录的请求数据中即可
// 如果知道如何取值那么就可以实现登录成功
// 实时获取值的方式:关联
// 函数名:web_reg_save_param();----->为了获取上一个请求的响应数据中的userSession值
// 该关联函数:带有reg字样,凡是带有reg字样的函数我们都称为注册型函数
// 注册型函数的特点:哪个请求的响应数据有我们需要的数据,那么该就放在请求的前面,也就是说该函数需要放在web_url()请求函数的前面
入口:可以是插入的形式插入该函数
配置:
配置完成后生成函数:
//web_reg_save_param();
web_reg_save_param("session",
"LB=name=userSession value=",
"RB=>",
"Ord=1",
LAST);
上代码看一下:
Action()
{
//web_reg_save_param();
web_reg_save_param("session",
"LB=name=userSession value=",
"RB=>",
"Ord=1",
LAST);
//打开网站
web_url("打开网站","URL=http://192.168.103.98:1080/webtours/",LAST);
//输入用户名和密码进行登录
//需要实时的获取上一个请求的响应数据中的userSession对应的值,放到登录的请求数据中即可
// 如果知道如何取值那么就可以实现登录成功
// 实时获取值的方式:关联
// 函数名:web_reg_save_param();----->为了获取上一个请求的响应数据中的userSession值
// 该关联函数:带有reg字样,凡是带有reg字样的函数我们都称为注册型函数
// 注册型函数的特点:哪个请求的响应数据有我们需要的数据,那么该就放在请求的前面,也就是说该函数需要放在web_url()请求函数的前面
web_submit_data("登录",
"Action=http://192.168.103.98:1080/webtours/login.pl",
"Method=POST",
"TargetFrame=",
"Referer=",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value={session}", ENDITEM,
"Name=username", "Value=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=login.x", "Value=36", ENDITEM,
"Name=login.y", "Value=8", ENDITEM,
"Name=login", "Value=Login", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
LAST);
return 0;
}
二、自动关联
不建议使用
Action()
{
web_set_max_html_param_len("1024");
/* Registering parameter(s) from source task id 512
// {WCSParam2} = "122796.104414743zDVzDctpzcAiDDDDDHiQHpQtHHcf"
// */
//在录制过程中进行关联,前提是在录制以前先开启关联,并设置好值左右边界
web_reg_save_param("WCSParam2",
"LB/IC=name=userSession value=",
"RB/IC=>",
"Ord=1",
"Search=Body",
"RelFrameId=1.2.1",
LAST);
web_url("webtours",
"URL=http://192.168.103.98:1080/webtours",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t3.inf",
"Mode=HTML",
LAST);
lr_think_time(8);
web_submit_data("login.pl",
"Action=http://192.168.103.98:1080/webtours/login.pl",
"Method=POST",
"TargetFrame=body",
"RecContentType=text/html",
"Referer=http://192.168.103.98:1080/webtours/nav.pl?in=home",
"Snapshot=t4.inf",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value={WCSParam2}", ENDITEM,
"Name=username", "Value=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
"Name=login.x", "Value=43", ENDITEM,
"Name=login.y", "Value=7", ENDITEM,
LAST);
return 0;
}
2,录制后关联,更不建议使用
Action()
{
//1.录制以后关联,必须先运行脚本一次
//2.扫描脚本
//
//Correlation comment - Do not change!Original value='122796.130741191zDVzDcfpQHfDHiQHpQffif' Name ='CorrelationParameter_1'
web_reg_save_param_ex(
"ParamName=CorrelationParameter_1",
"LB=userSession value=",
"RB=>\n<table border",
SEARCH_FILTERS,
"Scope=Body",
"RequestUrl=*/nav.pl*",
LAST);
web_url("webtours",
"URL=http://192.168.103.98:1080/webtours",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
lr_think_time(7);
web_submit_data("login.pl",
"Action=http://192.168.103.98:1080/webtours/login.pl",
"Method=POST",
"TargetFrame=body",
"RecContentType=text/html",
"Referer=http://192.168.103.98:1080/webtours/nav.pl?in=home",
"Snapshot=t2.inf",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value={CorrelationParameter_1}", ENDITEM,
"Name=username", "Value=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
"Name=login.x", "Value=35", ENDITEM,
"Name=login.y", "Value=8", ENDITEM,
LAST);
return 0;
}
三、高级关联
//高级关联使用时,会把定位到的多个值放到参数数组里面
//现在就需要从数组里面取值
三个函数分别为:
lr_paramarr_idx(“参数数组名”,i); 取出参数数组指定索引的元素
lr_paramarr_len(“参数数组名”); 取出参数数组的长度
lr_paramarr_random(“参数数组名”); 随机取出参数数组的一个元素
lr_save_string(lr_paramarr_random(“参数数组名”),“参数名”); 将随机取出的参数数组的一个元素保存为一个参数(lr_save_string(lr_paramarr_random(“fights”),“bbb”);)
// lr_output_message(lr_eval_string("{aaa}"));输出显示
把所有符合条件的参数都提取出来
代码:
Action()
{
char * str;
web_reg_save_param("session",
"LB=name=userSession value=",
"RB=>",
"Ord=1",
LAST);
web_url("打开网站","URL=http://192.168.103.98:1080/webtours/",LAST);
web_submit_data("登录",
"Action=http://192.168.103.98:1080/webtours/login.pl",
"Method=POST",
"TargetFrame=",
"Referer=",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value={session}", ENDITEM,
"Name=username", "Value=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=login.x", "Value=36", ENDITEM,
"Name=login.y", "Value=8", ENDITEM,
"Name=login", "Value=Login", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
LAST);
//点击fights
web_url("点击fights","URL=http://192.168.103.98:1080/webtours/welcome.pl?page=search",LAST);
//该请求的响应数据中有我们需要的数据,所以我将关联函数放在该请求前面----此时用高级关联方式
web_reg_save_param("fights",
"LB=name=outboundFlight value=",
"RB=>",
"Ord=ALL",
LAST);
//选择出发地目的地,点击continue
web_submit_data("web_submit_data",
"Action=http://192.168.103.98:1080/webtours/reservations.pl",
"Method=POST",
"TargetFrame=",
"Referer=",
"Mode=HTML",
ITEMDATA,
"Name=advanceDiscount", "Value=0", ENDITEM,
"Name=depart", "Value=Denver", ENDITEM,
"Name=departDate", "Value=01/15/2018", ENDITEM,
"Name=arrive", "Value=London", ENDITEM,
"Name=returnDate", "Value=01/16/2018", ENDITEM,
"Name=numPassengers", "Value=1", ENDITEM,
"Name=seatPref", "Value=None", ENDITEM,
"Name=seatType", "Value=Coach", ENDITEM,
"Name=findFlights.x", "Value=28", ENDITEM,
"Name=findFlights.y", "Value=5", ENDITEM,
"Name=.cgifields", "Value=roundtrip", ENDITEM,
"Name=.cgifields", "Value=seatType", ENDITEM,
"Name=.cgifields", "Value=seatPref", ENDITEM,
LAST);
//高级关联使用时,会把定位到的多个值放到参数数组里面
//现在就需要从数组里面取值
// str=lr_paramarr_idx("fights",lr_paramarr_len("fights")-1);//变量定义必须放在首行
// lr_output_message("%s",str);
//str中存放的值为字符串,而非参数,所以不能直接将字符串放入到下面的代码中
//这时候需要将字符串内容保存到参数中
// lr_save_string()
// lr_save_string("helloworld","aaa");//将helloworld放入参数aaa中
// lr_output_message(lr_eval_string("{aaa}"));
// lr_output_message(lr_eval_string("{bbb}"));
// lr_paramarr_len()
// lr_paramarr_random()
// lr_paramarr_random("fights");
lr_save_string(lr_paramarr_random("fights"),"bbb");
//选择航班信息点击continue
web_submit_data("web_submit_data",
"Action=http://192.168.103.98:1080/webtours/reservations.pl",
"Method=POST",
"TargetFrame=",
"Referer=",
"Mode=HTML",
ITEMDATA,
"Name=outboundFlight", "Value={bbb}", ENDITEM,
"Name=numPassengers", "Value=1", ENDITEM,
"Name=advanceDiscount", "Value=0", ENDITEM,
"Name=seatType", "Value=Coach", ENDITEM,
"Name=seatPref", "Value=None", ENDITEM,
"Name=reserveFlights.x", "Value=60", ENDITEM,
"Name=reserveFlights.y", "Value=4", ENDITEM,
LAST);
return 0;
}
参数化与关联的区别
参数化数据是固定的,关联的数据是动态的
参数化的数据是保存在参数化文件中的,关联的数据是从服务器动态获取的