51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 17647|回复: 35
打印 上一主题 下一主题

[原创] 使用自定义请求向服务器发送请求的方法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-10-23 14:10:58 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
在LR中,web_submit_data中字符串的拼接有个问题,就是不能使用C中的字符串类型去直接替换,就算使用了lr_save_string函数,仍然可能会存在问题,以下举例说明。

     脚本背景如下:

     web_submit_data(classicustomermaterial_significanteventinfo.jsf")返回的页面上可能存在多条记录,同时记录数不确定,因此需要设定一个循环,来重复关联,并执行后续的操作,如:

     web_submit_data("creditReviewClassiLoanMaterial.jsf",            

     ITEMDATA,

    "Name=body:frm2:classiAssetsVOTable_0:check", "Value=true", ENDITEM,

     "Name=body:frm2:classiAssetsVOTable_1:check", "Value=true", ENDITEM,


     "Name=body:frm2:_id148", "Value=填写债项级分类信息", ENDITEM,
     "Name=body:frm2_SUBMIT", "Value=1", ENDITEM,
     "Name=autoScroll", "Value=0,102", ENDITEM,
     "Name=body:frm2:_link_hidden_", "Value=", ENDITEM,

     LAST);

    假定黑体部分的脚本classiAssetsVOTable_0:check、classiAssetsVOTable_1:check是需要循环进行关联的。如果有实际操作过的朋友就不难发现,0、1这些数字很难在函数中用变量替换。这个时候有一个简便的方法,就是使用LR中提供的自定义请求函数来向服务器提交请求,即使用web_custom_request函数。该函数的使用方法很简单,最主要的是在Body部分把ITEMDATA之后的“Name”和“Value”通过{Name}={Value}的形式组合起来,并且在多组值之间用“&”分隔。如:

     web_custom_request("creditReviewClassiLoanMaterial.jsf",

       "Method=POST",

       "RecContentType=text/html",

       "Snapshot=t19.inf",

       "Mode=HTML",   

       "Body=body:frm2:classiAssetsVOTable_1:check=true&

       body:frm2:classiAssetsVOTable_%2:check=true&

       body:frm2:_id148=填写债项级分类信息&      

       body:frm2_SUBMIT=1&

       autoScroll=0,102&

       body:frm2:_link_hidden_="

       LAST);  

    关于该函数更详细的信息可以参考LR的帮助文档。

    回放脚本,成功!通过执行结果我们可以看到,使用web_custom_request向服务器发送请求和使用web_submit_data发送请求起到的效果是完全一样的。不过看到这里,可能大家会有一个疑问:为什么要使用自定义请求报文来代替原有的web_submit_data呢?用原来的这个不是好好的吗?主要是因为在有些时候,我们需要使用自定义的字符串来对脚本进行一些特殊处理,例如在本例中,我们就遇到了这样的问题。由于我们需要将

    "Name=body:frm2:classiAssetsVOTable_0:check", "Value=true", ENDITEM,

    "Name=body:frm2:classiAssetsVOTable_1:check", "Value=true", ENDITEM,


这部分脚本放进循环体中,因此我们希望可以通过字符串拼接的方式,组装出这一整串字符,放进请求函数中,而在web_submit_data中很难达到这样看似简单的目的(我一直觉得应该还是有办法的,但我试了很久一直不成功。),所以只好另找出路。

     以下是脚本的示例:

1、  利用字符串操作函数组装所需的字符串

strcpy(str,"BODY=");              

       for(i=0;i<count;i++)

       {

              sprintf(tmp,"body:frm2:classiAssetsVOTable_%d:check=true&",i);

              strcat(str, tmp);

       }

       strcat(str,"body:frm2:_id148=填写债项级分类信息&body:frm2_SUBMIT=1&autoScroll=0,102&body:frm2:_link_hidden_=");

2、  在自定义请求函数中使用组装好的字符串。

               web_custom_request("creditReviewClassiLoanMaterial.jsf",

                                            "URL={url}",

                                            "Method=POST",

                                            "RecContentType=text/html",

                                            "Referer={url}",

                                            "Snapshot=t19.inf",

"Mode=HTML",

                                                 str,

                                                 LAST);

[ 本帖最后由 xingcyx 于 2007-10-23 15:15 编辑 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

  • TA的每日心情
    开心
    2018-9-2 15:58
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    36#
    发表于 2011-5-25 10:31:59 | 只看该作者
    很好  顶下!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    35#
    发表于 2011-1-5 11:36:36 | 只看该作者
    3q
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    34#
    发表于 2010-10-15 15:21:34 | 只看该作者
    我在action最前分配置内存,在做完web_custom_request请求后我已经把内存给释放了free(temp),在报错的时候总是说我的web_custom_request这个请求函数非法访问内存了.我后来试了用多进种方式去跑也是同样的情况,但我在回放记录的时候不会出错.高手们能分析一下是什么原因吗?
    最后是怎么解决的呢?不用指针,可以用字符串呀
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    33#
    发表于 2010-10-15 15:12:26 | 只看该作者
    不错,高,
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-11-18 22:53
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    32#
    发表于 2010-5-15 05:17:05 | 只看该作者
    我写的一个脚本里面就碰到这个问题:
    虽然用web_custom_request可以提交使用,脚本跑的成功。
    但是当点击工具条的"Tree"时,就会出错"web_custom_request: Syntax error in attribute text: str argument:8".

    这里的问题是变量str,LR树形显示不正常。还有Task>Verify Replay点击的时候也会出现同样的问题。

    不知道这算不算LR的缺陷呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    31#
    发表于 2009-5-19 11:11:54 | 只看该作者
    没看懂    在研究     学习了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    30#
    发表于 2008-10-10 10:24:28 | 只看该作者
    谢谢`~~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    29#
    发表于 2008-1-5 15:40:12 | 只看该作者
    发现高手还是很多的,好好学习
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    28#
    发表于 2008-1-2 12:16:48 | 只看该作者
    暂时没遇到这种问题,学习下先
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2022-5-8 19:23
  • 签到天数: 137 天

    连续签到: 1 天

    [LV.7]测试师长

    27#
    发表于 2007-12-29 15:52:37 | 只看该作者
    虽然没看懂,但还是顶一下!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-11-5 15:12
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    26#
    发表于 2007-12-24 14:06:28 | 只看该作者
    好东西,顶了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    25#
    发表于 2007-12-24 11:01:05 | 只看该作者

    回复 1# 的帖子

    学习中。。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    24#
    发表于 2007-12-21 22:07:06 | 只看该作者
    主要问题是在于内存初始的问题和字符串的最后结束符上,正确的代码如下:
    int len;
    char *temp;
    srand((int)time(0));
    len = (int)(rand() % 1024) + 11;
    if ((temp = (char *)malloc(len * sizeof(char))) == NULL){
          return 0;
    }
    else {
          memset(temp,'\0',len * sizeof(char));
          memset(temp,'b',len * sizeof(char) - 1);
          memcpy(temp,"BODY=file=",10);
    }
    web_custom_request("fram.php",
              "URL=http://192.168.0.23/fram.php",
              "Method=POST",
              "RecContentType=text/html",
              "Referer=http://192.168.0.23/fram.php",
              "Mode=HTML",
              temp,
              LAST);
    free(temp);
    这样就可以向服务器发送小1K的随机文件.

    [ 本帖最后由 skydjp 于 2007-12-22 10:34 编辑 ]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    23#
    发表于 2007-12-21 12:06:20 | 只看该作者
    先下DOWN下来,慢慢研究
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    22#
     楼主| 发表于 2007-12-20 12:41:02 | 只看该作者
    原帖由 skydjp 于 2007-12-19 20:23 发表
    多谢,xingcyx
    问题解决了


    解决了,那就把问题的原因和解决的方法拿出来共享一下吧。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2015-11-3 20:42
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    21#
    发表于 2007-12-20 09:53:56 | 只看该作者
    你在打太极啊?确实是好贴,顶
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20#
    发表于 2007-12-19 20:23:27 | 只看该作者
    多谢,xingcyx
    问题解决了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19#
    发表于 2007-12-19 11:44:27 | 只看该作者
    我在action最前分配置内存,在做完web_custom_request请求后我已经把内存给释放了free(temp),在报错的时候总是说我的web_custom_request这个请求函数非法访问内存了.我后来试了用多进种方式去跑也是同样的情况,但我在回放记录的时候不会出错.高手们能分析一下是什么原因吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    18#
     楼主| 发表于 2007-12-19 11:04:30 | 只看该作者
    呃……楼上说的是一个典型的内存泄露问题吧。
    可能是你申请的内存没有被及时释放,至于什么原因,说起来问题就大了,希望高手们能引申出来讨论。
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-23 10:47 , Processed in 0.087534 second(s), 26 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表