webhttphtml协议脚本编写技术指南V10.docx
《webhttphtml协议脚本编写技术指南V10.docx》由会员分享,可在线阅读,更多相关《webhttphtml协议脚本编写技术指南V10.docx(19页珍藏版)》请在冰点文库上搜索。
![webhttphtml协议脚本编写技术指南V10.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/9b8a4cfc-0dbf-4adb-a5c7-d30a94009fff/9b8a4cfc-0dbf-4adb-a5c7-d30a94009fff1.gif)
webhttphtml协议脚本编写技术指南V10
WEB脚本编写
技术指南
(初稿)
1.前言
1.1.文档目标
本文档描述了Web(http/html)协议脚本的编写方法,为以后同类型协议脚本的开发提供参考。
1.2.适用范围与对象
本文档仅供脚本数据职能组脚本开发人员编写Web(http/html)协议脚本时参考使用。
1.3.术语及参考
协议:
网络协议,也可简称协议,由三要素组成:
(1)语法:
即数据与控制信息的结构或格式;
(2)语义:
即需要发出何种控制信息,完成何种动作以及做出何种响应;
(3)时序(同步),即事件实现顺序的详细说明。
2.Web(http/html)协议介绍
2.1.Web(http/html)协议简述
Web(HTTP/HTML)协议是基于浏览器请求响应数据的脚本。
当选择Web(HTTP/HTML)协议录制时,VuGen记录的是在Internet上传送的“浏览器发出的HTTP请求和服务器的响应”的数据,脚本中包含了浏览器请求的数据详细信息,而不是操作过程的信息。
Web(HTTP/HTML)协议提供了两种录制方式,基于HTML的方式和基于URL的方式。
2.2.HTML方式与URL方式的区别
HTML录制
HTML录制级别是工具默认的选项。
使用HTML录制级别,VuGen将会基于当前Web页面的HTML上下文来产生语句。
优点:
减少了捕获动态值的需要。
Action标签值和隐藏值不是硬编码的。
(1)脚本回放的过程中,标签值或隐藏值从内存中重新得到。
(2)如果它们是动态值,虚拟用户仍然可以正常运行。
(3)脚本长度与业务过程相仿,每个页面一个业务步骤。
缺点:
脚本回放需要更多的CPU和内存。
(1)回放的时候,需要搜寻内存或cache。
所以,需要消耗更多的内存和CPU资源。
总结:
HMTL录制级别会为每一个HTML用户动作产生一个单独的步骤。
而且HTML方式产生的脚本非常简洁和直述,易于阅读。
在工具默认配置下,使用此模式。
Tips:
当在表单提交或者点击链接时遇到问题,使用高级选项下的URLOption来录制。
(二)URL录制
VuGen会录制所有的客户端请求和从服务器返回的资源。
这种录制级别下,VuGen会录制URL步骤为web_url语句。
录制表单提交为web_submit_data语句。
优点:
脚本具有灵活性和可量测性。
(1)脚本回放过程中,不再搜索内存和Cache。
(2)脚本更具可扩展性。
支持页面上的JavaApplets和ActiveX对象。
缺点:
更多的关联需求。
(1)Action标签值和隐藏值在脚本中是硬编码的。
所以,脚本需要做更多的关联(不是从Cache中获取的)。
(2)脚本长度更长。
(图片和框架作为单独的步骤被录制下来)
2.3.录制方式选取建议
1、如果应用是WEB应用,首选是HTML-based方式;
2、如果应用是使用HTTP协议的非WEB应用,首选是URL-based方式;
3、如果WEB应用中使用了javaapplet程序,且applet程序与服务器之间存在通讯,选用URL-based方式;
4、如果WEB应用中使用的javascript、vbscript脚本与服务器之间存在通讯(调用了服务端组件),选用URL-based方式。
3.Web(http/html)协议脚本函数说明
3.1.常用函数说明
01),名称:
web_reg_save_param();
说明:
此函数是Web(http/html)协议的关联函数,用于解决服务器和客户端之间动态数据的一种技术,通过关联规则来获取客户端与服务器之间的动态数据。
实例:
web_reg_save_param("outFlightVal", "LB=outboundFlightvalue=","RB=checked>",LAST);
web_submit_form("reservations.pl",
"Snapshot=t4.inf",
ITEMDATA,
"Name=depart","Value=London",ENDITEM,
"Name=departDate","Value=11/20/2003",ENDITEM,
"Name=arrive","Value=NewYork",ENDITEM,
"Name=returnDate","Value=11/21/2003",ENDITEM,
"Name=numPassengers","Value=1",ENDITEM,
"Name=roundtrip","Value=",ENDITEM,
"Name=seatPref","Value=None",ENDITEM,
"Name=seatType","Value=Coach",ENDITEM,
"Name=findFlights.x","Value=83",ENDITEM,
"Name=findFlights.y","Value=16",ENDITEM,
LAST);
02),lr_save_string();
说明:
将字符变量里的值传递给指定参数。
实例:
lr_save_string("777","emp_id");
03),lr_eval_string()
说明:
取得参数的数值。
实例:
lrd_bind_col(Csr1,1,&COUNT_D1,0,0);
lrd_exec(Csr1,0,0,0,0,0);
lrd_save_col(Csr1,1,1,0,"row_cnt");
lrd_fetch(Csr1,1,1,0,PrintRow2,0);
lr_output_message("value:
%s",
lr_eval_string("Therowcountis:
{row_cnt}"));
04),lr_start_transaction();lr_end_transaction();
说明:
事务开始和结束函数,此两个函数是成对出现
实例:
lr_start_transaction("deposit");
/*ServerAPIcall*/
status=bank_deposit(50);
/*Endtransactionwithoperationresult-passorfail*/
if(status==0)
lr_end_transaction("deposit",LR_PASS);
else
lr_end_transaction("deposit",LR_FAIL);
05),lr_output_message();
说明:
将消息发送到输出窗口
实例:
lr_output_message("Weareoniteration#%s",lr_eval_string("{iteration}"));
06),web_reg_find();
说明:
文本检查函数,
实例:
web_reg_find("Text=Welcome",
LAST);
//Nowlogin
web_submit_form("login.pl",
"Snapshot=t2.inf",
ITEMDATA,
"Name=username","Value=jojo",ENDITEM,
"Name=password","Value=bean",ENDITEM,
"Name=login.x","Value=35",ENDITEM,
"Name=login.y","Value=14",ENDITEM,
LAST);
3.2.其他函数说明
1、事务函数
lr_end_transaction_instance/标记事务实例的结束以便进行性能分析
lr_fail_trans_with_error/将打开事务的状态设置为LR_FAIL并发送错误消息
lr_get_trans_instance_duration/获取事务实例的持续时间(由它的句柄指定)
lr_get_trans_instance_wasted_time/获取事务实例浪费的时间(由它的句柄指定)
lr_get_transaction_duration/获取事务的持续时间(按事务的名称)
lr_get_transaction_think_time/获取事务的思考时间(按事务的名称)
lr_get_transaction_wasted_time/获取事务浪费的时间(按事务的名称)
lr_resume_transaction/继续收集事务数据以便进行性能分析
lr_resume_transaction_instance/继续收集事务实例数据以便进行性能分析
lr_set_transaction_instance_status/设置事务实例的状态
lr_set_transaction_status/设置打开事务的状态
lr_set_transaction_status_by_name/设置事务的状态
lr_start_sub_transaction/标记子事务的开始
lr_start_transaction_instance/启动嵌套事务(由它的父事务的句柄指定)
lr_stop_transaction/停止事务数据的收集
lr_stop_transaction_instance/停止事务(由它的句柄指定)数据的收集
lr_wasted_time/消除所有打开事务浪费的时间
lr_end_sub_transaction/标记子事务的结束以便进行性能分析
r_end_transaction/标记LoadRunner事务的结束
lr_end_transaction_instance/标记事务实例的结束以便进行性能分析
lr_fail_trans_with_error/将打开事务的状态设置为LR_FAIL并
2. 命令行分析函数
lr_get_attrib_double/检索脚本命令行中使用的double类型变量
lr_get_attrib_long/检索脚本命令行中使用的long类型变量
lr_get_attrib_string/检索脚本命令行中使用的字符串
3. 信息性函数
lr_user_data_point/记录用户定义的数据示例
lr_whoami/将有关Vuser脚本的信息返回给Vuser脚本
lr_get_host_name/返回执行Vuser脚本的主机名
lr_get_master_host_name/返回运行LoadRunnerController的计算机名
4. 字符串函数
lr_eval_string/用参数的当前值替换参数
lr_save_string/将以NULL结尾的字符串保存到参数中
lr_save_var/将变长字符串保存到参数中
lr_save_datetime/将当前日期和时间保存到参数中
lr_advance_param/前进到下一个可用参数
lr_decrypt/解密已编码的字符串
lr_eval_string_ext/检索指向包含参数数据的缓冲区的指针
lr_eval_string_ext_free/释放由lr_eval_string_ext分配的指针
lr_save_searched_string/在缓冲区中搜索字符串实例,并相对于该字符串实例,该缓冲区的一部分保存到参数中
5. 消息函数
lr_debug_message/将调试消息发送到输出窗口
lr_error_message/将错误消息发送到输出窗口
lr_get_debug_message/检索当前的消息类
lr_log_message/将输出消息直接发送到output.txt文件,此文件位于Vuser脚本目录中。
该函数有助于防止输出消息干扰TCP/IP通信。
lr_set_debug_message/为输出消息设置消息类
lr_vuser_status_message/生成格式化输出并将其打印到ControllerVuser状态区域。
lr_message/将消息发送到Vuser日志和输出窗口
6. 操作函数
web_custom_request允许您使用HTTP支持的任何方法来创建自定义HTTP请求
web_image在定义的图像上模拟鼠标单击
web_link在定义的文本链接上模拟鼠标单击
web_submit_data执行“无条件”或“无上下文”的表单
web_submit_form模拟表单的提交
web_url加载由“URL”属性指定的URL
7. 身份验证函数
身份验证函数web_set_certificate使Vuser使用在InternetExplorer注册表中列出的特定证书
身份验证函数web_set_certificate_ex指定证书和密钥文件的位置和格式信息
身份验证函数web_set_user指定Web服务器的登录字符串和密码,用于Web服务器上已验证用户身份的区域
8. 缓存函数
缓存函数web_cache_cleanup清除缓存模拟程序的内容
9. 检查函数
检查函数web_find在HTML页内搜索指定的文本字符串
检查函数web_global_verification在所有后面的HTTP请求中搜索文本字符串
检查函数web_image_check验证指定的图像是否存在于HTML页内
10. 连接定义函数
连接定义函数web_disable_keep_alive禁用Keep-AliveHTTP连接
连接定义函数web_enable_keep_alive启用Keep-AliveHTTP连接
连接定义函数web_set_connections_limit设置Vuser在运行脚本时可以同时打开连接的最大数目
11. 并发组
web_concurrent_end标记并发组的结束
web_concurrent_start标记并发组的开始
12. cook函数
web_add_cookie添加新的Cookie或修改现有的Cookie
web_cleanup_cookies删除当前由Vuser存储的所有Cookie
web_remove_cookie删除指定的Cookie
13. 关联函数
web_create_html_param将HTML页上的动态信息保存到参数中。
(LR6.5及更低版本)
web_create_html_param_ex基于包含在HTML页内的动态信息创建参数(使用嵌入边界)
4.脚本录制实例
4.1.录制
1)打开VuGen,点击新建
,选择
协议
2)在弹出的对话框内填入URL(128.192.74.1:
8003)地址、工作目录(本次使用默认目录)等信息,点击0ptions选项可选择相应的录制方式:
3)点击Options…设置相应的录制选项。
4)点击OK开始录制。
5)录制过程中添加事务
Ø点击按钮
。
Ø在弹出的对话框中输入开始事务的名称,例如:
登录;点击OK。
Ø完成页面的登录操作步骤后,点击按钮
。
Ø在弹出的对话框内结束事务的名称已经被自动输入,点击OK。
6)按照交易操作步骤录制脚本,交易完成时,点击按钮
。
7)保存录制的脚本
4.2.增强
4.2.1.检查点
定义:
用来确定业务流程是否得到了正确的执行
分类:
1)文本检查点:
web_find
web_reg_find
2)图片检查点:
web_image_check
lr_start_transaction("登录");
web_reg_find("Text=欢迎",
"Savecount=count",
LAST);
web_submit_data("B2BMainPlat",
"Action=http:
//128.192.74.15:
8003/NCCB/B2BMainPlat",
"Method=POST",
"TargetFrame=",
"RecContentType=text/html",
"Referer=http:
//128.192.74.15:
8003/b2bmainV5.htm",
"Snapshot=t2.inf",
"Mode=HTML",
ITEMDATA,
"Name=PT_LANGUAGE","Value=CN",ENDITEM,
"Name=CUSTOMERID","Value=JS60817904-5#0G",ENDITEM,
"Name=USERID","Value=666666",ENDITEM,
"Name=LOG_PWD","Value=999999",ENDITEM,
"Name=TXCODE","Value=690101",ENDITEM,
"Name=CCB_IBSVersion","Value=V5",ENDITEM,
"Name=PT_STYLE","Value=3",ENDITEM,
"Name=resType","Value=jsp",ENDITEM,
"Name=log_buttom.x","Value=31",ENDITEM,
"Name=log_buttom.y","Value=10",ENDITEM,
EXTRARES,
"URL=../V5/STY3/CN/images5/welcome.gif",ENDITEM,
LAST);
if(strcmp(lr_eval_string("{count}"),"0")!
=0)
{
lr_end_transaction("登录",LR_PASS);
}
else
{
lr_end_transaction("登录",LR_FAIL);
return0;
}
4.2.2.参数化
定义:
将脚本中录制下来的特定值,用一个变量替代,而该变量的值是变化的。
本次以用户登录名(CUSTOMERID)为例:
1、选中需要参数化的数据,点击右键,选择Replacewithaparameter
2、在弹出的对话框内,输入参数的名字,然后点击OK按钮
4.2.3.关联
定义:
解决服务器和客户端之间动态数据的一种技术,通过关联规则来获取客户端与服务器之间的动态数据。
用法:
web_reg_save_param
注意事项:
a)web_reg_save_param只适用于Web协议脚本
b)注意关联函数的左右边界
c)注意ORD参数的设置
d)关联函数为注册类函数
操作步骤:
1)确定需要获取的动态数据
a)使用相同的数据、相同的业务流程录制两个脚本,然后点击Tools->ComparewithVuser…将两个脚本进行对比找出不同的地方,进行确定是否是需要关联的数据
b)录制脚本后进行回放,根据错误提示信息进行判断需要关联的数据
2)确定动态数据的左右边界
将Extendedlog中的Datareturnedbyserver选项勾上,之后回放脚本,根据变量名,在Replaylog中找到关联的数据,进而确定左右边界。
a)确定关联函数添加的位置
b)在Replaylog中找到关联的数据后,双击该数据,loadrunner会自动定位发送该数据的函数,将关联函数添加在该函数的上面。
c)添加关联函数,并把脚本中的动态数据用变量进行替代
以用户卡号为例:
//OPTIONvalue='4367422005520008424'
web_reg_save_param("S_ACC_NO",
"LB=OPTIONvalue='",
"RB='",
"ORD=1",
"Search=Body",
LAST);
web_submit_data("B2CMainB1L2",
"Action=http:
//{P_loginPort}/app/B2CMainB1L2?
CCB_IBSVersion=V5&SERVLET_NAME=B2CMainB1L2",
"Method=POST",
"TargetFrame=",
"RecContentType=text/html",
"Referer=http:
//{P_loginPort}/app/B2CMainPlatV5?
CCB_IBSVersion=V5&SERVLET_NAME=B2CMainPlatV5",
"Snapshot=t29.inf",
"Mode=HTML",
ITEMDATA,
"Name=BRANCHID","Value={S_branchid}",ENDITEM,
"Name=TXCODE","Value=410505",ENDITEM,
"Name=SKEY","Value={S_SKEY}",ENDITEM,
"Name=USERID","Value={P_UserID}",ENDITEM,
"Name=USERNAME","Value=Addr",ENDITEM,
//"Name=COOKIES","Value=ME6dibMrDHnfTra0PN6xU5Kvbi46T1KjHy4bTUKdLq49Tyq9c9SKd4NGkuP0aiqmLI5QU0azfZ5wUD6xjt98VhKljW3qUJKETLGcfq3zGTMEJT",ENDITEM,
"Name=FIRSTPAGE","Value=0010",ENDITEM,
"Name=MENUPAGEFLAG","Value=1",ENDITEM,
LAST);
lr_st