录制脚本,无法得到输入参数的字段(问题已确定,待解决)
测试环境:windows XP测试工具:LR9.1HTTP/HTML协议
被测试系统:OA系统、基于B/S构架的,前台用Javascript开发,后台是Weblogic+Oracle
录制过程描述: 打开功能设置页面,点击某功能模块,新建一个机构,输入机构编号和名称,提交完毕!
代码说明: 以下是部分的代码段,直接录制后回放将报错,需要设置关联。"Name=javax.faces.ViewState", "Value={WCSParam_Diff3}" 这部分就是关联的值,可能是每次服务器都要发送一个不同的值。
问题:录制完毕脚本后,无法在脚本中找到关于输入机构编号和名称的参数, 在以下代码中web_submit_data函数段并没有输入的参数。录制中我尝试用HTML或URL模式,均找到不到输入机构编号和名称的参数。
// Parameter {WCSParam_Diff1} created by Correlation Studio
web_reg_save_param("WCSParam_Diff1",
"LB= value=\"",
"RB=\"",
"Ord=1",
"RelFrameId=1",
"Search=Body",
"IgnoreRedirections=Yes",
LAST);
// Parameter {WCSParam_Diff2} created by Correlation Studio
web_reg_save_param("WCSParam_Diff2",
"LB= value=\"",
"RB=\"",
"Ord=2",
"RelFrameId=1",
"Search=Body",
"IgnoreRedirections=Yes",
LAST);
// Parameter {WCSParam_Diff5} created by Correlation Studio
web_reg_save_param("WCSParam_Diff5",
"LB=div id=\"",
"RB=_id1",
"Ord=1",
"RelFrameId=1",
"Search=Body",
"IgnoreRedirections=Yes",
LAST);
web_submit_data("main.jspx_2", "Action=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}",
"Method=POST",
"EncType=multipart/form-data",
"RecContentType=text/html",
"Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}",
"Snapshot=t2.inf",
"Mode=HTML",
ITEMDATA,
"Name=org.apache.myfaces.trinidad.faces.FORM", "Value=pageTemplate:j_id_id3pc2", ENDITEM,
"Name=javax.faces.ViewState", "Value={WCSParam_Diff3}", ENDITEM,
"Name=event", "Value=pageTemplate:j_id_id68pc2", ENDITEM,
"Name=event.pageTemplate:j_id_id68pc2", "Value=<m xmlns=\"http://oracle.com/richClient/comm\"><k v=\"type\"><s>action</s></k></m>", ENDITEM,
EXTRARES,
"URL=../afr/ccont_header_start.png", "Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}", ENDITEM,
"URL=../afr/ccont_header_bg.png", "Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}", ENDITEM,
"URL=../afr/toolbar_sSeparator.png", "Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}", ENDITEM,
"URL=../afr/th_bg_s.png", "Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}", ENDITEM,
"URL=../afr/ccont_header_end.png", "Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}", ENDITEM,
"URL=../afr/column-select.cur", "Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}", ENDITEM,
"URL=../resources/imgs/paneltab_border.png", "Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}", ENDITEM,
"URL=../afr/overflow_start.png", "Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}", ENDITEM,
"URL=../afr/overflow_end.png", "Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}", ENDITEM,
"URL=../resources/imgs/paneltab_center_selected.png", "Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}", ENDITEM,
"URL=../afr/sort_des_n.png", "Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}", ENDITEM,
"URL=../afr/sort_asc_n.png", "Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}", ENDITEM,
"URL=../resources/imgs/paneltab_right_selected.png", "Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}", ENDITEM,
"URL=../resources/imgs/paneltab_left_selected.png", "Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}", ENDITEM,
LAST);问题
[ 本帖最后由 wensy 于 2009-7-24 18:57 编辑 ] 我查看了一些资料,是由于ViewState引起的,ViewState这种机制是来跟踪服务器状态值的,那么我们需要参数化的数据去哪儿了呢?查了资料,说ViewState的值和所有控件被收集并格式化成一个编码字符串,然后被分配给隐藏窗体字段的值属性。也就是说ViewState的编码:Name=javax.faces.ViewState", "Value={WCSParam_Diff3}" 这个变量所用的编码字符串是服务器状态和控件属性值的集合。那么这个编码字符串被我们关联之后,每次读取都应该是变化的,这里的变化只是从服务器传来的ViewState的值发生了改变,造成了整个编码字符串的改变,而并非是实际控件中的数据改变。
既然控件中的数据没有发生改变,我们就不能够对服务器系统造成压力。在我回放以及测试运行这个场景的时候,发现其实并没有新建的操作产生,(OA系统有验证,不能输入同样的编码和名称,另外数据库也不存在额外的数据),仅仅是按照ViewState的值进行了一次查询,那在我们录制新建操作的时候,我们该如何保证LR新建了不同的操作呢?这一点我也不清楚了。。。
目标:压力测试,实际就是模仿实际情况对业务进行多用户的并发操作,但是从上面的分析判断,并非是产生新建了的操作,所以也没有达到目标。
待解决:希望能够参数化实际窗体字段的属性值,完成对服务器的新建操作,实现压力测试的目的。
Generation Log 中查看到确实有编码和名称的实际值。(红色字段)
****** Request Body For Transaction With Id 140 ******
org.apache.myfaces.trinidad.faces.FORM=j_id_id1:j_id_id3pc2&javax.faces.ViewState=!-2834c41d&j_id_id1:addBGcodeInput=3318&j_id_id1:addBGnameInput=www.sina.com&event=j_id_id1:addBGnameInput&event.j_id_id1:addBGnameInput=<m xmlns=%22http:%2F%2Foracle.com%2FrichClient%2Fcomm%22><k v=%22autoSubmit%22><b>1<%2Fb><%2Fk><k v=%22suppressMessageShow%22><s>true<%2Fs><%2Fk><k v=%22type%22><s>valueChange<%2Fs><%2Fk><%2Fm>&oracle.adf.view.rich.PROCESS=j_id_id1:addBGnameInput
$$$$$$ Request Body For Transaction With Id 140 Ended $$$$$$ Viewstate是在一个隐藏了的窗体字段中来回传递状态的。当再次传回给服务器时,该如何将不同的窗体字段的属性值传给服务器呢?想参数化一下的两个属性。
从Generation Log 中这两个是新增窗体的属性和值:
addBGcodeInput=3318
addBGnameInput=www.sina.com 无法得到输入参数的问题找到了,并不是前面我说的Viewstate的问题,请注意如下录制的代码:
web_submit_data("main.jspx_2", "Action=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}",
"Method=POST",
"EncType=multipart/form-data", "RecContentType=text/html",
"Referer=http://192.168.1.90:7001/matrix/faces/main.jspx?_adf.ctrl-state={WCSParam_Diff4}",
"Snapshot=t2.inf",
"Mode=HTML",
标红色的代码"EncType=multipart/form-data",就是因为他的存在,所以录制的脚本无法取到输入参数的值。由于在FORM中添加了 ENCTYPE='multipart/form-data' 属性,所以表单中的其他属性比如文本框的值用request.getParameter就无法取到,enctype="multipart/form-data"的意思是使request.getParameter失效。
"EncType=multipart/form-data"的作用在于表单中允许有图片上传,并且以二进制的数据格式来传输所有表单的属性值,request.getParameter是无法得到二进制值的,必须用string。
问题已经搞清,接下来去解决这个问题。
页:
[1]