我如何使用和调试WWW :: Mechanize?

5 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();
Run Code Online (Sandbox Code Playgroud)

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

可能有一些cookie可以影响我和登录尝试吗?

还有别的我做错了吗?

Yaniv,感谢您的帮助

ans*_*ung 6

这是事后几个月,但我根据我提出的类似问题解决了同样的问题.请参阅是否可以从客户端自动回发?了解更多信息.

我使用Python的Mechanize而不是Perl,但同样的原则适用.

总结我之前的回应:

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

当普通用户访问时,这些页面上有一个__doPostBack('foo')函数,通过每个链接上的javascript onclick事件为__EVENTTARGET提供相关值,但由于机械化不使用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
Run Code Online (Sandbox Code Playgroud)


inn*_*naM 2

你只能机械化你所知道的东西。在编写更多代码之前,我建议您使用 Firebug 之类的工具,并检查手动执行此操作时浏览器中发生的情况。

当然,可能会使用cookie。或者也许您忘记了隐藏的表单参数?只有你自己才能知道。

编辑:

  • WWW::Mechanize 应该在没有任何进一步干预的情况下处理 cookie。
  • 您应该始终检查您调用的方法是否成功。第一个 get() 有效吗?
  • 查看服务器日志以了解实际请求的内容以及作为响应发送的 HTTP 状态代码可能会很有用。