WWW :: Mechanize文本字段问题

时间:2011-12-31 04:17:48

标签: perl www-mechanize

我正在尝试使用WWW::Mechanize perl模块通过post方法提交表单。

use WWW::Mechanize;

my $mech = WWW::Mechanize->new();
...
$mech->get($url);
...
my $response = $mech->submit_form(
        form_name => $name,
        fields    => {
                        $field_name => $field_value
                         },
        button    => 'Button'  
    );

$field_name通常是一个文本字段(虽然未在表单中明确指定类型),它具有预设值。

$field_name => $field_value中{p> $mech->submit_form无论什么原因都不会替换该值,而是在原始值之后将$field_value添加到表单中:

{submitted_field_value} = {original_value},{provided_value}

如何在要提交的表单中将{original_value}替换为{provided_value}

3 个答案:

答案 0 :(得分:1)

如果在调用$ mech-> submit_form()之前将此单行添加到代码中会发生什么:

$mech->field( $name, [$field_value], 1 );

这可确保添加第一个值,如果已存在则覆盖第一个值。 1 是数字参数(或位置索引)

请参阅WWW :: Mechanize:

的文档
  

$ mech->字段($ name,\ @values,$ number)

     

给定字段的名称,将其值设置为指定的值。 [...]

     

可选的$ number参数用于区分两者   具有相同名称的字段。字段编号为1。

答案 1 :(得分:0)

重要的是要记住WWW :: Mechanize更好地被认为是一个“无头浏览器”而不是说LWP或curl,它只能为你处理所有烦人的http请求。当你做事时,机甲保持其状态。

您需要使用$mech->forms或类似内容(its best to decide from the documentation. I mean there so many ways to do it.)来获取表单,然后使用field methods设置要更改的输入字段。

我想这样做的基本方法就是这样:

$mech->form_name($name);
$mech->field($field_name, $field_value);
my $response = $mech->click('Button');

应该有效。我相信如果你得到该字段并直接使用它(即my $field = $mech->form_name($name);然后使用$ field方法而不是$ mech,它也会起作用。

答案 2 :(得分:0)

我设法让它按照我的意愿行事。感谢Timbus和knb提出您的建议。虽然我的情况可能不完全一般(我知道预设值),但我会分享我发现的(通过路径和错误)。

my $mech = WWW::Mechanize->new();
$mech->get($url);  
$mech->form_name( $name );

my $fields = $mech->form_name($name);
foreach my $k ( @{$fields->{inputs}}){
 if ($k->{value} eq $default_value){
   $k->{value}=$field_value;
   }
}

my $response = $mech->click('Button_name');