asuerhao's Blog

如果有什么做的不到的地方请尽管留言, 我会改进的 : )

使用perl的“WWW::Mechanize”模块编写操作网页的自动化脚本

声明:这篇文章刚刚在飞测门户发过,作者都是我。
   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("");