Loadrunder脚本篇——文件下载
下载简介
对 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变量中
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;
}