zoukankan      html  css  js  c++  java
  • Loadrunder脚本篇——文件下载

    下载简介

    对 HTTP协议来说,无论是下载文件或者请求页面,对客户端来说,都只是发出一个GET请求,并不会记录点击后的“保存”、“另存为操作”。

    如下,点击页面中tar.gz压缩包,用工具可以清楚的看到,客户端仅是发起了一个GET请求,请求获取点击的资源。接着服务器返回包含请求资源响应消息

    loadrunner <wbr>脚本开发-文件下载

     

    LoadRunner记录了客户端发出的对文件的请求,并能够收到服务器返回的内容。因此,我们要做的额外工作就是“保存”、“另存为”---可以通过关联的方法获取服务器返回的内容,并写入文件保存即可。

    注意:这里的要保存的内容为http的消息主体,也就是上述两箭头垂直相交形成区域的内容。

     

    具体实例

    如下,访问图示页面,并下载红色方框框选的压缩包

    loadrunner <wbr>脚本开发-文件下载

    脚本主要由以下四个action组成,其中vuser_init,vuser_end的内容为默认值,未存放录制内容:

    vuser_init

    download_page

    download_file

    vuser_end

     

    download_page,download_file的具体代码如下

    // 访问下载页面

    download_page()

    {

        web_url("dist",

            "URL=http://tsung.erlang-projects.org/dist/",

            "Resource=0",

            "RecContentType=text/html",

            "Referer=",

            "Snapshot=t11.inf",

            "Mode=HTML",

            LAST);

     

        return 0;

    }

     

    //录制下载操作

    download_file()

    {

     

       int file_size;    // 文件大小 //fwrite缓冲区大小

       long file_handle = NULL;   // 文件句柄

     

       // 如果要保存的数据超过1024个字节,使用以下函数设置参数大小,保证参数可容纳要保存文件的大小

       web_set_max_html_param_len("10000");

     

       //将响应信息存放到 file_content参数

       web_reg_save_param("file_content", "LB=", "RB=", "SEARCH=BODY", LAST);

     

      

       web_link("idx-tsunami-0.1.1.tar.gz",

            "Text=idx-tsunami-0.1.1.tar.gz",

            "Snapshot=t12.inf",

       LAST);

     

       //获取响应文件大小

       file_size = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);

     

       if(file_size > 0)     

       {

           //以“二进制+写”的方式打开文件(如下,在d盘根目录下新建idx-tsunami-0.1.1.tar.gz文件

           if((file_handle = fopen("d:\idx-tsunami-0.1.1.tar.gz", "wb")) == NULL)

           {

               lr_output_message("文件操作失败!");

               return -1;

           }

     

           //写入文件内容

           fwrite(lr_eval_string("{file_content}"), file_size, 1, file_handle);

           //关闭文件

           fclose(file_handle);

       }

     

       return 0;

    }

     

    注意:

    1.如下,从BODY,即消息主体中查找,不指定左右边界,即查找所有消息主体的内容

    web_reg_save_param("file_content", "LB=", "RB=", "SEARCH=BODY", LAST);

     

    2.上述的web_link手工改成如下的web_url也是可以的。

    web_url("下载idx-tsunami-0.1.1.tar.gz",

        "URL=http://tsung.erlang-projects.org/dist/idx-tsunami-0.1.1.tar.gz",

      "Resource=0",

        "RecContentType=application/x-gzip",

        "Referer=http://tsung.erlang-projects.org/dist/",

        "Snapshot=t12.inf",

        "Mode=HTML",

        LAST);

    解说:

    1. "URL=http://tsung.erlang-projects.org/dist/idx-tsunami-0.1.1.tar.gz",

    此处的URL为指定资源下载地址,通常通过右键资源连接-->属性,可看到,如下图

    loadrunner <wbr>脚本开发-文件下载

     

    2."Referer=http://tsung.erlang-projects.org/dist/",

    这里的Referer指下载资源所引用的页面,Referer是HTTP header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。

    loadrunner <wbr>脚本开发-文件下载

     

    源码:

    Action() {
    int flen;//定义一个整型变量保存获得文件的大小
    long fileContent;//保存文件句柄,也就是文件的内容
    char fileName[]="";//保存文件路径及文件名
    char * strNumber;
     
    web_set_max_html_param_len("20000");//设置参数的最大长度,注意该值必须大于文件的大小
    //使用关联函数获取下载文件的内容,在这里不定义左右边界,获得服务器响应的所有内容
    web_reg_save_param("fcontent"
    //返回的内容全部存储在fcontent这个参数中
    "LB=",
    "RB=",
    "SEARCH=BODY",
    LAST);
    lr_start_transaction("下载文件");   
    //设置的事务开始点
    //web_url方法你可以直接编写,也可以在启动录制的时候,输入下载链接URL进行简单录制,主要注意URL和Resource这两个参数即可;
    web_url("file.php",     
     #函数名,没有实际作用
    "URL=http://forum.ubuntu.org.cn/download/file.php?id=129973&sid=78fc8d76767ef49b606595824ceb963d"
     //下载链接,也就是该链接输入到浏览器会提示下载,获取方法很多;
    "Resource=1",   
     //1表示是下载资源,0表示是页面资源
    "RecContentType=application/octetstream",
    "Referer=",
    "Snapshot=t1.inf",
    LAST);
    flen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);//获取响应中的文件长度
    if(flen > 0)
    {               
    //以写方式打开文件
    strNumber=lr_eval_string("{random}");//获取一个随机数并转化成字符串 ,NewParam设置参数为随机类型,这里根据自己需要进行参数化设置
    strcat(fileName,"F:\test");//将路径保存到file变量中
    stract(fileName,"\");
    strcat(fileName,strNumber); 
    //拼接文件名
    strcat(fileName,".pdf");//拼接后缀名,根据需要设置,最后就完成了完整的路径和文件名
    fileContent = fopen(fileName, "wb");
    if(fileContent == NULL) 
     //看是否正确打开了需要保存下载内容的文件,fileName是上面准备组织的文件路径;
    {
    lr_output_message("打开文件失败!");
    return -1;
    }
    fwrite(lr_eval_string("{fcontent}"), flen, 1, fileContent);//写入文件内容
    fclose(fileContent);//关闭文件
    }
    lr_end_transaction("下载文件",LR_AUTO);//事务结束点
    return 0;
    }

     

     

     

  • 相关阅读:
    转载-----nodejs内存定位
    node内存泄露排查转载
    git使用规范
    git的使用方法
    Sublime Text 3最好的功能、插件和设置
    Appium-Python-Windows环境搭建笔记
    MPI Note
    先装VS2008之后,又装了2013,然后启动VS2008提示“Tools Version”有问题?
    SQLite 编译错误
    WPF异常捕获三种处理 UI线程, 全局异常,Task异常
  • 原文地址:https://www.cnblogs.com/langhuagungun/p/8386478.html
Copyright © 2011-2022 走看看