perl - 如何使用和调试 WWW::Mechanize?

标签 perl www-mechanize

我对 Perl 很陌生,我在尝试自动化一些工作项目时正在学习。到目前为止,它一直很有趣。

我正在为客户生成报告。我可以从我可以访问的网页上获取此报告。
首先,我需要用我的用户名、密码填写表格,然后从下拉列表中选择一个服务器,然后登录。
其次,我需要单击报告部分的链接。
第三个需要填写表格来创建报告。

这是我到目前为止所写的内容:

my $mech = WWW::Mechanize->new();
my $url = 'http://X.X.X.X/Console/login/login.aspx';

$mech->get( $url );

$mech->submit_form(
     form_number => 1,
     fields      =>{
        'ctl00$ctl00$cphVeriCentre$cphLogin$txtUser'  => 'someone',
        'ctl00$ctl00$cphVeriCentre$cphLogin$txtPW'    => '12345',
        'ctl00$ctl00$cphVeriCentre$cphLogin$ddlServers'  => 'Live',
     button => 'Sign-In'
   },   
);
die unless ($mech->success);

$mech->dump_forms();

我不明白为什么,但是,在此之后,我查看了转储输出的内容,并看到了第一个登录页面的代码,而我相信我应该在成功登录后到达下一个页面。

cookie 中的某些东西会影响我和登录尝试吗?

还有什么我做错了吗?

感谢您的帮助,
亚尼夫

最佳答案

这是事后几个月,但我根据我提出的类似问题解决了同样的问题。见 Is it possible to automate postback from the client side?了解更多信息。

我使用 Python 的 Mechanize 或 Perl,但同样的原则适用。

总结一下我之前的回答:

ASP.NET 页面在表单中需要一个名为__EVENTTARGET 的隐藏参数,正常使用mechanize 时该参数不会存在。

当普通用户访问时,这些页面上有一个 __doPostBack('foo') 函数,它通过每个链接上的 javascript onclick 事件为 __EVENTTARGET 提供相关值,但由于 mechanize 不使用 javascript,您将需要自己设置这些值。

python 解决方案在下面,但让它适应 perl 应该不会太难。

def add_event_target(form, target):
    #Creates a new __EVENTTARGET control and adds the value specified
    #.NET doesn't generate this in mechanize for some reason -- suspect maybe is 
    #normally generated by javascript or some useragent thing?
    form.new_control('hidden','__EVENTTARGET',attrs = dict(name='__EVENTTARGET'))
    form.set_all_readonly(False)
    form["__EVENTTARGET"] = target

关于perl - 如何使用和调试 WWW::Mechanize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/968722/

相关文章:

perl - 为 DBD::Pg 数据库连接设置超时

perl - 如何调用在另一个包中声明的子例程而不在子例程名称前加上它的包名?

perl - 在本地文件上使用 perl WWW::Mechanize

Python Mechanize 复选框

perl - 在 Perl 中,如何进行非阻塞系统调用?

xml - Perl:如何处理没有根节点的 XML 对象流

perl - 如何转换 yyyy-mm-dd hh :mm:ss into UTC in Perl?

Perl LWP::UserAgent 针对给定服务器随机挂起 120 秒

perl - WWW::机械化和宽字符警告

perl - 如何使用 Test::WWW::Mechanize 进行授权