使用perl的“WWW::Mechanize”模块编写操作网页的自动化脚本
asuerhao
posted @ 2012年7月13日 17:13
in 积累
with tags
perl WWW-Mechanize 网页
, 5498 阅读
声明:这篇文章刚刚在飞测门户发过,作者都是我。
Perl的“WWW::Mechanize”模块可以实现对网页的多种操作,比如查找页面内的链接、内容、页面信息、填写表单、submit等功能,适合 用于网站的功能行测试,下面提供一个示例脚本:使用微软的必应引擎搜索"love"关键词,并在结果页面查找是否存在某一特定链接,在终端打印相应提示。 为了更完善地说明“WWW::Mechanize”模块的功能,脚本写得很罗嗦:
#! /usr/bin/perl # Author: ycjiang use 5.010; use warnings; use diagnostics; use WWW::Mechanize; # use URI; # use HTTP::Response; # use WWW::Mechanize::Link; use utf8; binmode(STDIN, ':encoding(utf8)'); binmode(STDOUT, ':encoding(utf8)'); binmode(STDERR, ':encoding(utf8)'); my $mech = WWW::Mechanize->new(); my $uri = 'http://www.cn.bing.com'; my $uri_hostname = 'cn\.bing\.com'; my $alias = 'Linux Mozilla'; my $agent = ${mech}->agent_alias($alias); my @links; my @links_samehost; my @forms; my $title = ''; # 确定客户端标识 $agent = ${mech}->agent_alias($alias); say("所支持的客户端标识:"); foreach (${mech}->known_agent_aliases()) { say($_); } say("当前客户端标识:".$agent); say(""); # 打开页面 eval { $mech->get($uri); }; say("当前处理的页面:".(${mech}->uri->as_string)); # say("正在刷新当前页面......"); # $mech->reload(); # 调用reload方法不会修改浏览历史 if (! ${mech}->success) { die("Oops! 打开页面 \"".(${mech}->uri->as_string)."\" 失败: ".(${mech}->res->status_line)); } else { say("成功打开页面 \"".(${mech}->uri->as_string)."\" 状态码: ".(${mech}->status)); } say(""); # 网页头 $title = ${mech}->title; say("网页头: ", $title); say(""); # 网页中的链接 @links = ${mech}->links; say("页面中存在的所有链接:"); foreach (@links) { if(${_}->text) { print("\"", ${_}->text, "\" 的URL为: "); } else { print("\"undefined\" 的URL为: "); } if(${_}->url =~ m/^\//) { say(${mech}->uri->as_string.${_}->url); } elsif (${_}->url =~ m/^\?/) { say(${mech}->uri->as_string.'/'.${_}->url); } else { say(${_}->url); } } say(""); # 页面上的可显示文本: say("页面上的可显示文本:"); say(${mech}->content(format => 'text')); say(""); # 查看是否存在某一链接: say("页面上可以找到的第五个链接为: ".$mech->find_link(n => 5)->url); say("页面上可以找到的与本页面在同一域名的链接为: "); foreach (@links) { if(${_}->url =~ m/(^\/)|(^\?)|(^http.{3,4}(www){0,1}${uri_hostname})/) { print(${_}->url); push(@links_samehost, ${_}->url); if(${_}->text) { say(": ",${_}->text); } else { say(": undefined"); } } } say(""); # 表单操作: # @forms=$mech->forms; say("表单操作: "); $mech->form_id('sb_form'); $mech->field('q', 'love'); say("在搜索框内填写了单词\"love\""); $mech->submit(); say("点击搜索..."); say("现在正在处理的网页地址为: "); say(${mech}->uri->as_string); # say("此时页面上的可显示文本为:"); # say(${mech}->content(format => 'text')); say("在页面上查找指定的链接(http://baike.baidu.com/view/4409.htm, 百度百科的love词条),查找结果为:"); if($mech->find_link(url_regex=>qr/baike\.baidu\.com\/view\/4409\.htm/)){ say("找到了"); } else { say("未找到"); } say("");