12.Filters
下面的选项都是帮助关联返回限定的,通过这些设置可以进一步减少返回的范围。
13.Scope
该项设置关联查询的范围,在LR11中和以前的范围做了一些调整,应该算是更加强大,这里Scope提供了4个选项:Body、Headers、Cookies、All。
1)ALL
比较容易理解,就是让服务器的返回所有内容作为需要关联的目标来处理。
2)Headers/Body/Cookies
这3个选项都从请求返回的所有内容进行关联处理,包括图片、JavaScript脚本等。区别在于对返回信息的分隔方式。在前面介绍HTTP的时候介绍过HTTP返回的内容其实是由Header(HTTP信息头)和Body(HTTP内容)组成的,而Cookie又是Header中的一部分,在Tree模式下的HTTP View视图中可以清晰地看到LR如何定义各块内容。当我们对Phpwind登录返回做关联时,不同的Scope带来的效果如下。
3)Header
指所关联的内容是所有服务器返回请求的HTTP头部分内容。可以通过查看服务器返回内容来了解,Body之前的内容都属于Header:
Action.c(16): Notify: Saving Parameter "temp = HTTP/1.1 200 OK\r\nDate: Wed, 05 Oct 2011 04:53:51 GMT\r\nServer: Apache/2.2.17 (Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o PHP/5.3.4 mod_perl/2.0.4 Perl/v5.10.1\r\nX-Powered-By: PHP/5.3.5\r\nSet-Cookie: 53d97_lastvisit=0%091317790431%09%2Fphpwind85%2Flogin.php; expires=Thu, 04-Oct-2012 04:53:51 GMT; path=/\r\nSet-Cookie: 53d97_lastpos=other; expires= Thu, 04-Oct-2012 04:53:51 GMT; path=/\r\nSet-Cookie: 53d97_lastvisit= 0%091317790431%09%2Fphpwind85%2Flogin.php; expires=Thu, 04-Oct-2012 04:53:51 GMT; path=/\r\nSet-Cookie: 53d97_winduser=VgEDATtTUVZRVQ8HUFcEVg4JUFQBAQF VVlRVUgBXUVIJAQ8AVT4; path=/; httponly\r\nSet-Cookie: 53d97_ck_info=%2F%09; expires=Thu, 04-Oct-2012 04:53:51 GMT; path=/\r\nSet-Cookie: 53d97_lastvisit =deleted; expires=Tue, 05-Oct-2010 04:53:50 GMT; path=/\r\nSet-Cookie: 53d97_ regactivate=deleted; expires=Tue, 05-Oct-2010 04:53:50 GMT; path=/\r\nContent -Encoding: gzip\r\nContent-Length: 7217\r\nKeep-Alive: timeout=5, max=100\r\ nConnection: Keep-Alive\r\nContent-Type: text/html\r\n\r\n". |
在Header中还能进行二次过滤,填写Header Name,默认值为Undefined 。如果只想知道服务器返回Header中的Server服务器信息,那么在Header Name中填写Server即可:
Action.c(16): Notify: Saving Parameter "temp = Apache/2.2.17 (Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o PHP/5.3.4 mod_perl/2.0.4 Perl/v5.10.1".
4)Body
就是服务器返回在Body以后的内容:
Action.c(16): Notify: Saving Parameter "temp = <!doctype html>\r\n
<html>\r\n<head>\r\n<meta charset="utf-8" />\r\n<title>鎻愮ず淇℃伅 - Powered by phpwind</title>\r\n<meta http-equiv="refresh" content="1;url=
http://localhost:8000/phpwind85/index.php">\r\n<SCRIPT type="text/javascript"
language="JavaScript" src="js/core/core.js"></SCRIPT>
…略
5)Cookie
指Header部分关于Cookie定义的部分内容。
Action.c(16): Notify: Saving Parameter "temp = 53d97_lastvisit=0%091317790561% 09%2Fphpwind85%2Flogin.php; expires=Thu, 04-Oct-2012 04:56:01 GMT; path=/".
14.Request URL
这里提供了针对URL地址的过滤方式来减少关联范围,例如,我们可以填写*.php来说明只对PHP页面进行过滤。
15.Content Type
回顾我们在讲录制下载操作的时候,提到了Content Type这个概念,这样在录制的时候可以通过这个特性来过滤录制对象。而在关联这里,这个属性的效果是相同的,在网站应用中,我们要关联的内容一般都存放在HTML页面中,所以这里我们通常都是用text/html来作为Content Type过滤规则的。
16.Frame ID
这个选项是专门针对框架结构的网站设计的,有些时候需要关联的内容是在某个框架中的,这时就需要说明所关联的页面是框架中的哪一个。比如在前面关联的处理上就可以使用这个属性,对比下面两个代码的关联返回:
web_reg_save_param_ex( "ParamName=temp", "LB=", "RB=", SEARCH_FILTERS, "Scope=BODY", "RelFrameID=1.2", LAST); web_url("localhost:8000", "URL=http://localhost:8000/", LAST); web_reg_save_param_ex( "ParamName=temp", "LB=", "RB=", SEARCH_FILTERS, "Scope=BODY", "RelFrameID=1.3", LAST); web_url("localhost:8000", "URL=http://localhost:8000/", LAST); |
关联返回的内容是不同的,如果仔细观察返回代码会发现前一个关联返回的是左侧导航的内容,第二个关联返回的是右侧正文。
这里的1.2说明XAMPP网站是基于在第一个大的框架中的,所以如果想读取左下侧的页面,这个框架所属的编号就为1.2,右侧框架编号为1.3。
某些复杂情况会出现多层框架嵌套问题,那么继续向下编号就可以了,例如:
通过Frame ID可以帮助我们在框架中细化关联数据范围,当某些框架中有多匹配边界的内容时用这个属性会更方便一些。
17.Ignore Redirection
在某些情况下系统会使用HTTP 3xx的重定向操作来完成页面跳转,该选项是用来忽略跳转页面信息的。如果选中该选项,通过这种重定向技术的页面将不会被关联。
在LR11中除了对web_reg_save_param加强为web_reg_save_param_ex,还提供了另外两个非常好用的函数web_reg_save_param_regexp和web_reg_save_param_xpath。
,检查
A.7.6 关联函数web_reg_save_param_regexp详解
在介绍这个函数前先来处理一种情况。前面关联的左右边界都是静态的,如果左右边界是动态的,并且系统返回的id是不定长度的,那么如何使用关联函数将该id取出呢?这个问题在现实情况中会经常遇到,仅仅通过一个关联函数是无法处理的,这个时候还需要使用一个函数strtok()来进行字符内容切割。
strtok()函数的作用是通过某个分隔符来切分内容的。
例如:
char city[1000];
char * token;
//这个函数是扩展的声明
extern char * strtok(char * string, const char * delimiters );
strcpy(city,"this is shanghai!");
token = (char *)strtok(city," ");
lr_error_message(token);
token = (char *)strtok(NULL," ");
lr_error_message(token);
token = (char *)strtok(NULL," ");
lr_error_message(token);
通过这个函数可以得到3个字符:this、is、shanghai。通过空格来分隔字符串,可以得到第一个符合该条件的内容,如果需要继续分隔就使用strtok(NULL," ");语句。如果关联出来的内容sessionid是变动长度的,如"sessionid=54321123&action=work",则如何获得这个变动长度的sessionid呢?使用下面的代码即可解决:
char temp[100];
char * token;
extern char * strtok(char * string, const char * delimiters );
lr_save_string("sessionid=54321123&action=work","param");
strcpy(temp,lr_eval_string("{param}"));//取出参数值,并且赋值给变量temp
token = (char *)strtok(temp,"&");//使用&符号作为分隔符
这个时候token="sessionid=54321123",并且是根据&符号分隔的,所以id的长度可以任意变化,而token中的sessionid可以通过关联的时候Save Offset进行处理,或者使用strtok()函数对等号再次进行处理。
而在LR11中提供了web_reg_save_param_regexp正则表达式关联,上面的写法也可以"退休"了。打开Add Step添加步骤,选择web_reg_save_param_regexp函数,打开设置窗口,如图A.127所示。
图A.127 添加web_reg_save_param_regexp函数
在这个函数中关键就是在Regular Expression的写法上,在前面XML参数的lr_xml_find函数中我们提到过正则表达式的写法,在这里的写法唯一区别在于需要关联返回的内容需要用()圆括号标记。例如,这里的read(.*)\.php就是指所有符合read开头.php结尾中间的任何内容都关联保存到参数temp中,这里的\是转义符,确保.号能够正确地当作普通字符来匹配。
在Phpwind中如果我们要关联一个没有被回复过的帖子的发帖人是谁,这在以前是比较难于实现的,我们先来看看一个帖子的HTML代码:
<tr class="tr3"> <td class="icon tac"><input type="checkbox" autocomplete="off" name="tidarray[]" id=tid_1884 value="1884" onclick="postManage.show ('postbatch','a_ajax_1884')" /> <a title="开放主题" href="read.php?tid=1884" target="_blank"><img src="images/wind85/thread/topicnew. gif" align="absmiddle"></a> </td> <td class="subject" id="td_1884"> <a href="read.php?tid=1884" name="readlink" id="a_ajax_1884" class= "subject_t f14">需要使用正则表达式关联的例子</a> <img src="images/wind85/file/new.gif" align="absmiddle" title="新帖标志" alt="新帖标志" /> </td> <td class="author"><a href="u.php?uid=1">admin</a><p>2011-10-05 </p></td> <td class="num"><em>0</em>/2</td> <td class="author"><a href="u.php?username=admin">admin</a><p> <a href="read.php?tid=1884&page=e#a" title="2011-10-05 13:43">4秒前 <span> »</span></a></p></td> </tr> |
在这个代码中我们需要关联的正文是admin,验证的部分在于<em>0</em>,这里的0代表没有回复,后面的2代表两次阅读。关联的难度在于如果用回帖数作为左边界那么右边界中的阅读数是动态数据。如果用回帖数作为右边界那么左边界中的发帖时间和用户uid是动态数据,导致这个关联在以前的写法中很难实现,必须要扩展关联后使用strtok来分离。现在使用正则表达式关联这个问题就非常简单,代码如下:
web_reg_save_param_regexp(
"ParamName=temp",
"RegExp=<em>0</em>.*\r\n.*username=(.*)\">.*</a><p>",
"Ordinal=1",
SEARCH_FILTERS,
LAST);
这里的过滤方式是使用<em>0</em>作为左边界然后拼接任意内容接回车换行符,再接任意字符至username=处,关联这串内容的右侧到">位置后面接任意字符,再接</a><p>。通过这个关联就可以得到未回帖的发帖人名了,另外一种使用回帖数为0作为右边界的写法为:
web_reg_save_param_regexp(
"ParamName=temp",
"RegExp=uid=.*\">(.*)</a><p>.*\r\n.*<em>0</em>",
"Ordinal=1",
SEARCH_FILTERS,
LAST);
刚开始写的时候尤其在正则表达式的编写上大家会困惑,多多尝试(注意\r\n\b回车符、换行符及空格这是开始最难处理的内容),并且合理应用常见的正则表达式验证工具,就可以逐渐上手,成为你关联应用时的"神器"。
版权声明:51Testing软件测试网获作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。