【问题标题】:Unable to check checkbox via Perl LWP::UserAgent无法通过 Perl LWP::UserAgent 选中复选框
【发布时间】:2012-08-15 01:38:46
【问题描述】:

我应该如何检查这样的复选框:

<td><center><INPUT name="test2%40mydomain.com_notmetoo" type="CHECKBOX" value="off" ></center></td>

使用 Perl 的 LWP::UserAgent 模块?

此代码没有执行此操作(输出就像是在未选中复选框的情况下提交 - 即刷新网页并清除复选框)。

#!/usr/bin/perl
use LWP::UserAgent;

$ua = new LWP::UserAgent;
$ua->cookie_jar({ file => "$ENV{HOME}/.mailmanrc" });

$res = $ua->post('http://mydomain.com/mailman/admin/test1_mydomain.com/members/list',
    Content_Type => 'form-data',
    Content => [
        'test2%40mydomain.com_notmetoo' => 'on',
        setmemberopts_btn => 'Submit Your Changes'
    ]
);
if ($res->is_success) {
    print $res->decoded_content;
    print "Changed user setting...I hope!\n";
}
else {
    die $res->status_line;
}

我不确定为什么元素名称中的“@”由“%40”表示(有什么想法吗?),但我也尝试过: 'test2\%40mydomain.com_notmetoo' => 'on','test2@mydomain.com_notmetoo' => 'on', 没有成功。

网站上似乎没有 JavaScript(即它在禁用 JavaScript 的浏览器中运行良好)。我只是无法让它在 Perl 中工作。

谢谢。

特里。


更新 #1:这是我在检查 Test2 的 notmetoo 框后提交时来自 Firefox 的“篡改数据”扩展的 POSTDATA 值:

POSTDATA =-----------------------------2921376274802
Content-Disposition: form-data; name="findmember"


-----------------------------2921376274802
Content-Disposition: form-data; name="test1%40mydomain.com_realname"

Test1
-----------------------------2921376274802
Content-Disposition: form-data; name="user"

test1%40mydomain.com
-----------------------------2921376274802
Content-Disposition: form-data; name="test1%40mydomain.com_hide"

on
-----------------------------2921376274802
Content-Disposition: form-data; name="test1%40mydomain.com_notmetoo"

on
-----------------------------2921376274802
Content-Disposition: form-data; name="test1%40mydomain.com_plain"

on
-----------------------------2921376274802
Content-Disposition: form-data; name="test1%40mydomain.com_language"

en
-----------------------------2921376274802
Content-Disposition: form-data; name="test2%40mydomain.com_realname"

Test2
-----------------------------2921376274802
Content-Disposition: form-data; name="user"

test2%40mydomain.com
-----------------------------2921376274802
Content-Disposition: form-data; name="test2%40mydomain.com_hide"

on
-----------------------------2921376274802
Content-Disposition: form-data; name="test2%40mydomain.com_notmetoo"

off
-----------------------------2921376274802
Content-Disposition: form-data; name="test2%40mydomain.com_plain"

on
-----------------------------2921376274802
Content-Disposition: form-data; name="test2%40mydomain.com_language"

en
-----------------------------2921376274802
Content-Disposition: form-data; name="test3%40mydomain.com_realname"

Test3
-----------------------------2921376274802
Content-Disposition: form-data; name="user"

test3%40mydomain.com
-----------------------------2921376274802
Content-Disposition: form-data; name="test3%40mydomain.com_hide"

on
-----------------------------2921376274802
Content-Disposition: form-data; name="test3%40mydomain.com_plain"

on
-----------------------------2921376274802
Content-Disposition: form-data; name="test3%40mydomain.com_language"

en
-----------------------------2921376274802
Content-Disposition: form-data; name="setmemberopts_btn"

Submit Your Changes
-----------------------------2921376274802
Content-Disposition: form-data; name="allmodbit_val"

0
-----------------------------2921376274802--

这对帮助我的人有帮助吗?

【问题讨论】:

  • 您必须向我们展示包含此输入的整个表单。这是一组同名复选框中的一个吗?
  • 如果您正在模拟浏览器,那么您应该考虑 WWW::Mechanize
  • @Borodin。感谢您的建议。这是整个表格的副本:(homepages.paradise.net.nz/abcd/mailman1.htm)。如您所见,复选框具有不同的名称。我只是注意到,与这个 GNU Mailman“网站”中的其他网页不同(我没有遇到这样的问题),这个在
    标签中有 'enctype="multipart/form-data"'。至少其他一些人根本没有'enctype ...'。这对我们有帮助吗?我不是要模拟浏览器 - 只需通过 Perl 选中一个框。

标签: perl mailman


【解决方案1】:

我对复选框的理解是value= 指定了选中复选框时变量将具有的值。所以你令人困惑的value="off"实际上意味着你需要

'test2%40mydomain.com_notmetoo' => 'off'

表示该框已选中。

【讨论】:

  • 好点Sodved。请注意,我的第一篇文章给出了一个“未选中”元素的示例。这是网页中的 2 个此类元素 - 一个已选中,一个未选中:&lt;td&gt;&lt;center&gt;&lt;INPUT name="test2%40mydomain.com_mod" type="CHECKBOX" value="off" &gt;&lt;/center&gt;&lt;/td&gt; &lt;td&gt;&lt;center&gt;&lt;INPUT name="test2%40mydomain.com_hide" type="CHECKBOX" value="on" CHECKED &gt;&lt;/center&gt;&lt;/td&gt; 看起来已选中的元素有“value="on" CHECKED”,其余的只有“value="off"',所以我没有确定“值”属性在这种情况下的用途。注意:我没有创建这个 (GNU Mailman) 网页,我无法更改它。
【解决方案2】:

在您的情况下,复选框在选中时将具有“关闭”值。如果值类似于value="checkbox1",这将不那么令人困惑。在这种情况下,复选框的值在选中时将为checkbox1

另外,考虑使用WWW::Mechanize 进行这样的基本网络操作(不使用javascript),它更容易和直观,而且WWW::MechanizeLWP::UserAgent 的子类,因此您仍然可以使用LWP 的方法。

【讨论】:

  • 谢谢安贾恩。我认为我的复选框在选中时具有 value='on' 。请参阅上面的 2 cmets,包括我在第 1 条评论中链接到的网页副本。如果我尝试使用 WWW::Mechanize,我不会面临同样的问题吗?
  • @Terry WWW::Mechanize 使用和调试要简单得多。此外,正如我之前提到的,您仍然可以使用LWP 方法,WWW::mechanize 继承了这些方法。
  • 谢谢安贾恩。我已经开始关注 WWW::Mechanize。我在原始帖子中添加了“更新 #1”,并提供了更多信息。
  • 你好,Annjawn。根据您的建议,我尝试了 WWW::Mechanize 并选中了这样的框:$m-&gt;tick('test2%40mydomain.com_notmetoo', 'off'); 并像这样取消选中它们:$m-&gt;untick('test2%40mydomain.com_notmetoo', 'on'); 这似乎有效,谢谢。当该框已经处于我正在“更改”它的状态时(例如,如果我尝试选中一个复选框),它会给我很多警告。错误类似于:No checkbox "test2%40mydomain.com_notmetoo" for value "on" in form at ./mailman_update.pl line 102。任何想法如何避免它们(无需先查看框状态)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 2021-12-01
相关资源
最近更新 更多