下载简介

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

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

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

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

具体实例

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

脚本主要由以下四个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为指定资源下载地址,通常通过右键资源连接-->属性,可看到,如下图

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

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

源码:

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;
}

Loadrunder脚本篇——文件下载的更多相关文章

  1. Loadrunder脚本篇——关联数组(参数数组)

    导言 前面说过可以用关联取出服务器相关的一些动态变化的信息,前面也提过web_reg_save_param中可以设置ord=all,代表从服务器中取出的是一个数组,它试用的场景是当我访问一个发帖网站, ...

  2. Loadrunder脚本篇——webservice接口测试(二)

    1.选择协议--Web Service,如下图 2.导入服务 入口1:点击Manage Services ->弹出窗中选择“Import” ->弹出窗中选择“URL”,填写wsdl地址,导 ...

  3. Loadrunder脚本篇——webservice接口测试(一)

    函数介绍 soap_request 函数执行一个SOAP请求 函数原型 int soap_request( const char *StepName, ExpectedResponse, URL, , ...

  4. Loadrunder脚本篇——web_submit_data实现提交post请求

    概述 web_link()和web_url()函数都是页面访问型函数,实现HTTP请求中的GET方法,如果需要实现POST方法,可使用web_submit_form或web_submit_data() ...

  5. Loadrunder脚本篇——web_custom_request函数介绍

    c语言版本: int web_custom_request(const char *RequestName, , [EXTRARES, ,] LAST ); 参数说明: RequestName     ...

  6. loadrunder脚本篇——执行操作系统命令

    思路: 用loadrunner system()函数 函数原型: int system( const char *string ); 示例一:在指定目录下创建指定文件 Action() { char ...

  7. loadrunder脚本篇——文件读写操作

     函数说明 函数原型: size_t fwrite( const void *buffer, size_t size, size_t count, FILE *file_pointer ); 参数说明 ...

  8. Loadrunder脚本篇——Run-time Settings之Browser Enmulation

    浏览器模拟 所有Internet Vuser Header包含一个标识将被模拟的浏览器类型(或无线工具包)的User Agent header.例如User-Agent: Mozilla/3.01Go ...

  9. Loadrunder脚本篇——Running Time setting之Additional attributes

    作用说明 为Vuser脚本提供额外自定义参数.额外参数设置可应用于所有Vuser脚本类型. 说明: Add:添加一个参数 Remove:移除一个参数 可以在这里先输入一些常用的参数名及对应的值,类似常 ...

随机推荐

  1. 第八章 springboot + mybatis + 多数据源2(解决循环引用)

    解决了循环引用 1.application.properties #the first datasource jdbc.names:1,2 jdbc1.driverClassName = com.my ...

  2. Python调用zabbix API批量添加主机 (读取Excel)

    本文转载自:http://blog.mreald.com/178 Zabbix可以通过自发现添加主机,不过有时候不准确,通过API添加会更加准确! 脚本使用的跟zabbix相关的内容.参考的是zabb ...

  3. ORACLE函数之日期时间转换函数

     1.          TO_CHAR 语法:TO_CHAR(X [,format]) 说明:将X按format格式转换成字符串.X是一个日期或者数字.format是一个规定了X採用何种格式转换 ...

  4. Struts2 异常处理

    Struts提供了一个更简单的方式来处理未捕获的异常,并将用户重定向到一个专门的错误页面.您可以轻松地Struts配置到不同的异常有不同的错误页面. Struts的异常处理所使用的“exception ...

  5. java算法学习

    最大公约数 欧几里得算法 描述:计算两个非负整数p和q的最大公约数: 若q是0,则最大公约数为p. 否则,将p除以q得到余数r,p和q的最大公约数即为q和r的最大公约数. 根据算法的自然描述,我们可以 ...

  6. MEF笔记 之延迟加载

    文章参考:在MEF中实现延迟加载部件  作者:TianFang 仅有一个服务提供者时候 using System; using System.Collections.Generic; using Sy ...

  7. 《从零开始学Swift》学习笔记(Day 28)——总结使用问号(?)和感叹号(!)

    原创文章,欢迎转载.转载请注明:关东升的博客 在使用可选类型和可选链时,多次使用了问号(?)和感叹号(!),但是它们的含义是不同的,下面我来详细说明一下. 1. 可选类型中的问号(?) 声明这个类型是 ...

  8. 一、docker临时记录

    docker 临时记录(阿里云centos7.2.1511 ) 查看系统版本号 适用于Redhat/CentOS: [root@iz2zecm4ndtkaue32tynx5z ~]# cat /etc ...

  9. 巨蟒python全栈开发django9:一些知识点的汇总

    回顾上周内容: 题目: 1.人民出版社出版过的所有书籍的名字以及作者的姓名(三种写法,笔记中有两种写法) 2.手机以2开头的作者出版过的所有书籍名称以及出版社名称(三种写法,笔记中有1种写法) 1.聚 ...

  10. "大中台、小前台”新架构下,阿里大数据接下来怎么玩? (2016-01-05 11:39:50)

    "大中台.小前台”新架构下,阿里大数据接下来怎么玩?_炬鼎力_新浪博客 http://blog.sina.com.cn/s/blog_1427354e00102vzyq.html " ...