今天在对某报表系统进行测 试时,遇到一个问题,即执行查询操作时,录制的脚本回放时,前台不报错,但应用后台日志有错误信息。
该报表系统使用的chinaExcel这个报表工具,由于该工具使用率并不大,因此上网未能找到相关的信息。
具体情况如下:
一、录制的方法体为:
web_custom_request("component.do_10”,
"URL=http://XXX.XXX.XXX.XXX:XXXX/component.do?name=cmp_report_status&event=getDeptSuperior¶=“,
"Method=POST”,
"Resource=0”,
"RecContentType=text/html”,
"Referer=",
"Snapshot=t128.inf",
"Mode=HTTP",
"EncType=",
"Body=<msginfo><parameters><parameter name=\"rpt_id\">op_apply_add_tmii</parameter><parameter name=\"dept_id\">XXXXX</parameter><parameter name=\"rpt_month\">XXXX</parameter></parameters></msginfo>",
LAST);
二、理论应该返回的内容为:
HTTP/1.1 200 OK
Date: Tue, 23 May 2017 00:49:55 GMT
Content-Length: 395
Content-Type: text/html; charset=utf-8
X-Powered-By: Servlet/2.5 JSP/2.1
<datacenter>
<variables>
<variable name="dept_id_s">XXXXX</variable>
<variable name="dept_name_s">XXXXXXXX</variable>
</variables>
<rowsets><rowset next="false" name="epm/report/PUB_DEPT_SUPERIOR" label="PUB_DEPT_SUPERIOR" procedure=""><row num="1"><DEPT_ID>XXXXX</DEPT_ID><DEPT_NAME>
XXXXXXXXXXXX</DEPT_NAME></row>
</rowset></rowsets></datacenter>
三、实际返回的报错信息为:
-23 11:10:37,710 ERROR [[ACTIVE] ExecuteThread: '15' for queue: 'weblogic.kernel.Default (self-tuning)'] epm.module.rpt.RptUtil (RptUtil.ja va:176) - 查询失败
ArrayIndexOutOfBoundsException: Array index out of range: 0
四、解决思路及办法:
1、在考虑方法体中的参数后,未发现错误;
2、检查LR的浏 览器设置,未发现异常;
3、查阅ChinaExcel该报表工具的特性,以及相关的如ActiveX异步回调等资料;
4、检查发送HTTP请求的完整包内容,包括表头,表主体,发现表头中的user-agent默认设置是User–Agent: Mozilla/4.0
但是比对录制时,发出的请求的完整内容,发现发送的请求的User-Agent是:Microsoft-XMLHTTP;
因此修改web_custom_request请求,修改后为:
web_custom_request("component.do_10”,
"URL=http://XXX.XXX.XXX.XXX:XXXX/component.do?name=cmp_report_status&event=getDeptSuperior¶=“,
"Method=POST”,
"UserAgent=Microsoft-XMLHTTP",
"Resource=0”,
"RecContentType=text/html”,
"Referer=",
"Snapshot=t128.inf",
"Mode=HTTP",
"EncType=",
"Body=<msginfo><parameters><parameter name=\"rpt_id\">op_apply_add_tmii</parameter><parameter name=\"dept_id\">XXXXX</parameter><parameter name=\"rpt_month\">XXXX</parameter></parameters></msginfo>",
LAST);
再次测 试,不再报错,问题解决!
下面附上网络上查询到关于user-Agent的信息
User Agent:用户代理,它是一个HTTP头的名字,用来标识应用程序,通常是浏 览 器,它呈现的是用户和服务器的交互。
例如:头信息“User-Agent: Mozilla/4.0 (compatible; MS IE 6.0; Win d ow s NT 5.0)”识别的是Window NT下的IE浏 览 器6.0。其他的User-Agent的值用来描述其他的浏览 器,或者非浏览 器程序。通常,一个应用程序中所有的请求都使用相同的用户代理,录制者作为一个运行时参数来指定(Run-Time Setting—Browser Emulation—User Agent)。不管怎么说,即使是在一个简单的浏 览 器进程中,仍有可能会用到直接与服务器交互的非浏 览器组件(例如ActiveX控件),通常他们有着不同于浏 览器的用户代理属性。指定“UserAgent”表示这是一个非浏 览 器的请求。指定的字符串被HTTP头“User-Agent:” 使用,在某些情况下,它同时会影响回放脚本时的行为。例如,不使用浏 览器缓存,假设指定的URL属于资源等等。
LR本身不检查指定的字符串与浏览 器本身的值是否相同。
关于UserAgent参数在web_custom_request中有详细的说明。