【问题标题】:WWW::Mechanize: How To Click Button Based On Its Number in FormWWW::Mechanize: 如何根据表单中的数字点击按钮
【发布时间】:2017-01-19 07:32:11
【问题描述】:

在表单末尾的网站上有一个按钮,我似乎无法使用 WWW::Mechanize 单击该按钮。这是与此按钮有关的 HTML 代码:

<input type="submit" class="saveButton" value="Login">

当我print $mech-&gt;find_all_inputs(); 时,我会返回这个:

HTML::Form::TextInput=HASH(0x7f8f52cdc450)
HTML::Form::TextInput=HASH(0x7f8f5302b488)
HTML::Form::SubmitInput=HASH(0x7f8f52cdc108)

第三个是我要点击的。即使我找到了它,我也不完全确定如何单击此按钮。我试过click(field(n =&gt; 3)),我试着给find_all_inputs(3)赋值一个变量$submit,然后click($submit);,不管怎样,这个按钮没有被点击。

谁能指导我如何点击这个难以捉摸的按钮?

编辑(回答问题后)

查询 HTML 表单发现我实际上是在表单的“忘记密码”字段中输入登录密码。为什么$mech-&gt;find_all_inputs() 没有出现这个字段,我不知道,因为“登录”是。无论哪种方式,单击按钮都会将我带到下一页。谢谢!

【问题讨论】:

  • 似乎click 有效,但是,我没有转到下一页(有问题的按钮是登录按钮,所以点击它应该会转到另一个网址,对吧?但是'$ ua -> uri;' 在点击按钮之前和之后是一样的)。我尝试了my $response = $ua -&gt; click();print $response,它们返回了HTML::Form::SubmitInput=HASH(0x7f8f52cdc108),这就是我认为click 有效的原因。
  • 你的 Mechanize 对象有 cookie 吗?考虑使用my $mech = WWW::Mechanize-&gt;new( cookie_jar =&gt; HTTP::Cookies-&gt;new( file =&gt; "$ENV{HOME}/.cookies.txt" ) ); 获取cookie。如果没有,您似乎不太可能登录。
  • @bytepusher:默认情况下,WWW::Mechanize 构造函数的行为就像您传递了选项 cookie_jar =&gt; {},它创建了一个内存中的 HTTP::Cookies 对象。
  • 将@bytepusher 推荐的内容粘贴到我的代码中返回:Can't locate object method "new" via package "HTTP::Cookies" at test.pl line 10。我不确定为什么。模块 HTTP::Cookies 在我的系统上是最新的。
  • 对不起,我隐约记得必须通过一个。我想我错了。道歉!

标签: html forms perl www-mechanize


【解决方案1】:

由于是表单中的第一个按钮,所以可以这样写

$mech->click_button( n => 1 )

或者,因为它的value属性是Login,你可以这样做

$mech->click_button( value => 'Login' )

但是由于它是表单中唯一的按钮,所以只是

$mech->click

应该没问题

【讨论】:

    【解决方案2】:

    您是否尝试先选择合适的表格,然后致电click?它说(我的重点)

    具有点击当前表单上的按钮的效果。

    在页面上找到您需要的表格。假设它是 2 号表格。

    # $ua is the User Agent (Mechanize object), at the appropriate page
    $ua->form_number(2);
    # fill the form ...
    my $response = $ua->click();
    

    $ua->submit_form( 
        form_number => 2, 
        # fields => { name => $value }  # can fill it here as well
    };
    

    我发现click 总体上可能更可靠。

    要检查表单,您可以使用my @forms = $ua-&gt;forms。例如,要填写表格,您可以使用selectset_fields。请参阅 Form MethodsField Methods。所有这些都使用HTML::Form 对象进行操作,因此您也可以使用它的方法。例如,value_namespossible_values 很方便。

    如果这没有帮助,请给我们更多的细节 - 有问题的网页是理想的。

    【讨论】:

    • 点击似乎有效,但点击应该完成的操作却没有。检查 html,我看到当我从我的问题中翻过来时,最后有一个 = $0,就像这样:&lt;input type="submit" class="saveButton" value="Login"&gt; = $0。也许这有帮助?我过去没有真正使用过 HTML
    • @AdityaJ。这个新信息确实有点帮助。首先,通过bytepusher 处理每个评论的 cookie。接下来,该表单中是否还有更多带有“登录”按钮的内容?当您手动访问该页面时,您是如何做到这一点的——您是否有其他字段要填写,或者只有“登录”按钮?另外,请确保找出有多少表格($ua-&gt;forms),以便您为正确的表格使用form_number。最后,您将取回HTML::Form 对象——您可以通过它的方法来询问它。或者,解压 hashref。
    • 我已经可以填写用户名和密码字段,这是表单中登录旁边的唯一字段
    • 这是页面上唯一的表单
    • @AdityaJ。好——那么最后一切都奏效了吗?感谢您的署名。
    猜你喜欢
    • 1970-01-01
    • 2011-12-30
    • 2013-07-12
    • 1970-01-01
    • 2021-05-23
    • 2016-01-11
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    相关资源
    最近更新 更多