描述:模拟任意点击论坛某一模块内的帖子进去查看详细内容。
通过手动关联获取服务器返回的多个帖子的ID号,然后随机取一个ID号,点击进入。
问题1:
设置关联的相关条件(左右边界、查询范围等),执行脚本却总是得不到任何一个ID号(查看源代码,明明有很多的)
原因:
试了好久,终于发现,是关联函数放的位置不对,一开始我是放置在点击详细帖子的上面,后来发现不对。
系统获取的ID号,应该是在点击进入某个主题的“列表”模块就返回的。
所以,把关联函数往上移一层即可。
出错的代码:
web_url("默认版块",
"URL=http://127.0.0.1/discuz/Discuz_X2_SC_UTF8/upload/forum.php?mod=forumdisplay&fid=2",
"TargetFrame=",
"Resource=0",
………………………..
web_reg_save_param("titleid",
"LB=<a href=\"forum.php?mod=viewthread&tid=",
"RB=&extra=page%3D1\" title=",
"Ord=All",
"Search=NoResource",
LAST);
web_url("99999",
"URL=http://127.0.0.1/discuz/Discuz_X2_SC_UTF8/upload/forum.php?mod=viewthread&tid={strid}&extra=page%3D1",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
……………
修改后正确的代码:
web_reg_save_param("titleid",
"LB=<a href=\"forum.php?mod=viewthread&tid=",
"RB=&extra=page%3D1\" title=",
"Ord=All",
"Search=NoResource",
LAST);
web_url("默认版块",
"URL=http://127.0.0.1/discuz/Discuz_X2_SC_UTF8/upload/forum.php?mod=forumdisplay&fid=2",
"TargetFrame=",
"Resource=0",
………………………..
web_url("99999",
"URL=http://127.0.0.1/discuz/Discuz_X2_SC_UTF8/upload/forum.php?mod=viewthread&tid={strid}&extra=page%3D1",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
……………
问题2:设置web_reg_save_param()函数的左右边界时的特殊字符处理。
需注意双引号”前面要加上转义字符“\”,
同理:反斜杠\
注:这里暂时也只知道这两个。应该还有吧,按C语言的处理规则?
返回的ID号有多个值,那么值是如何存放的?及如何调用这些值呢?
说明:因为web_reg_save_param()函数中,我设置的instance=All(显示在函数中为:"Ord=All"),所以系统返回所有符合要求的值,按源代码中的先后顺序依次存储在:
Paramname_1、Paramname_2、Paramname_3……中,
最后面还会加上一个Paramname_count,统计所有paramname数组中值的个数。
刚开始的时候,我是直接用{paramname}替换录制的ID号的值的,可想而知,结果总是错的。
接下来,我想查看下回放的时候,我们发送给服务器的值是什么?但是我不知道到哪去查看,问题变为:
问题3:到哪里可以查看到系统发送给服务器的参数值?
在tree视图下,右侧可以看到三个选项,分别是:
Page view:查看截图。录制或回放时此步骤的截图。
Client request:客户端请求。我们页面访问等操作的时候,发送给服务器的请求信息都记录在这里。
所以:发送的ID号肯定也在这里。(至于这个ID号是如何来的,肯定是在前面的请求中服务器返回回来的)
Server responese:服务器响应。我们发送请求后,服务器的响应信息都记录在这个里面。可以仔细分析下。
这里:推荐个很好的网页查看工具:
IE下:HTTPWATCH,
参考资料:http://www.cnblogs.com/mayingbao/archive/2007/11/30/978530.html
基本上把这个页面的内容看完,就差不多了。
FIEFOX下:BUGFREE
至于bugfree,其实跟httpwatch原理都差不多,只不过这个是IE下适用的。看了httpwatch,这个也就简单了。
查看Client request,发现发送的ID号直接变为{paramname},这样肯定是错的了,本来我想:会不会像C语言一样,自动取paramname[0]的值,但显示我还是错的。
所以,接下来的问题是:
问题4:如何提取关联后返回的数组中的值?
在一本书上找的资料,用lr_paramarr_random()函数即可,书上的例子及描述如下:
Char * siteval;
Siteval=lr_paramarr_random(link)
即直接从参数数组link中取一个随机的值。
将上面的例子改了改,总是不成功。一直提示出错,错误如下:
Action.c (58): illegal statement termination
Action.c (58): skipping `char'
Action.c (58): undeclared identifier `getid'
Action.c (58): type error: pointer expected
Action.c (59): operands of = have illegal types `int' and `pointer to char'
f:\\lr_9.5\\exercise\\\\combined_exercise.c (5): 5 errors, not writing pre_cci.ci
这里注意,定义变量的语句一定要放在action的开头。
这个刚开始没注意,我直接把定义变量和获取变量值一起放在脚本中间了。
错误脚本
char * getid;
getid=lr_paramarr_random("titleid");
修改为:
将“char * getid”移到脚本的最前面就好了。
这个是规范性的问题。(这个主要还是由于QTP的影响。在QTP里调试脚本的时候,总是在一起定义使用的,从来不出错,呵)
修改后,脚本是可以跑了,但回放脚本的时候,还是不行,找不到我指定的ID号。
这时考虑,先把获取的值打印出来,再考虑后面的步骤,问题变为:
问题5:如何打印值出来?
这个简单,直接用:
lr_output_message("Value=%s",getid);
%s:这个跟C语言一样,输出字符串getid的值。
回放脚本,有结果,但是结果显示为:
Value=(null)
是个空值。
这个时候接着往下思考,问题变为:
问题6:web_reg_save_param()函数明明是有多个返回值的,怎么打印出来是空值呢?
1、 考虑是不是lr_paramarr_random()函数的问题。反复看了几遍,没有问题。
2、 接着看回放日志,突然发现:value=(null)是在脚本的62行执行的,而web_reg_save_param()函数返回值却是在68行。
那么问题就找到了,我又犯低级错误了,函数的位置放的不对。(第二次了)
查看脚本,我直接把getid=lr_paramarr_random("titleid");放到关联函数的后面了。列表页面还没打开呢,又怎么回有返回值呢,呵。把lr_paramarr_random()函数下移,问题解决了。
错误脚本:
web_reg_save_param("titleid",
"LB=<a href=\"forum.php?mod=viewthread&tid=",
"RB=&extra=page%3D1\" title=",
"Ord=All",
"Search=NoResource",
LAST);
getid=lr_paramarr_random("titleid");
lr_output_message("Value=%s",getid);
web_url("默认版块",
"URL=http://127.0.0.1/discuz/Discuz_X2_SC_UTF8/upload/forum.php?mod=forumdisplay&fid=2",
"TargetFrame=",
"Resource=0",
………………………..
修改后正确脚本:
web_reg_save_param("titleid",
"LB=<a href=\"forum.php?mod=viewthread&tid=",
"RB=&extra=page%3D1\" title=",
"Ord=All",
"Search=NoResource",
LAST);
web_url("默认版块",
"URL=http://127.0.0.1/discuz/Discuz_X2_SC_UTF8/upload/forum.php?mod=forumdisplay&fid=2",
"TargetFrame=",
"Resource=0",
………………………..
getid=lr_paramarr_random("titleid");
lr_output_message("Value=%s",getid);
接下来,将{getid}替换原来的ID号,但是出错。问题变为:
问题7:为什么直接用lr_paramarr_random()函数返回的值关联出错?
错误如下:
Action.c (4): redeclaration of `getid' previously declared at Action.c (3)
Action.c (59): operands of = have illegal types `char' and `pointer to char'
f:\\lr_9.5\\exercise\\\\combined_exercise.c (5): 2 errors, not writing pre_cci.ci
这个问题是真的不知道了,书上没有其他步骤的,我也不知道如何是好?然后开始在网上找资料,参考如下地址:
http://blog.sina.com.cn/s/blog_6090a6ba01010wmp.html
照这个上面的说明操作,成功了。具体为增加了如下语句:
lr_save_string(getid,"strid")
然后再用{strid}替换掉{getid},回放脚本,成功了。
刚刚之前,还一直不明白是为什么,不过现在好像有点懂了,这个应该是“参数”和“变量”的区别了:
lr_paramarr_random()返回的是变量,而不是参数。而关联只能关联参数。
Lr_save_string()是将变量存储至参数中。