Perl WWW::Mechanize文本字段问题

Perl WWW::Mechanize文本字段问题,perl,www-mechanize,Perl,Www Mechanize,我正在尝试使用WWW::Mechanizeperl模块通过post方法提交表单 use WWW::Mechanize; my $mech = WWW::Mechanize->new(); ... $mech->get($url); ... my $response = $mech->submit_form( form_name => $name, fields => { $fie

我正在尝试使用
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\u name
通常是一个文本字段(尽管表单中没有明确指定类型),它有一个预设值

$field\u name=>$field\u value
$mech->submit\u表单
中,无论出于何种原因,都不会替换该值,而是在原始值之后将
$field\u value
添加到表单中:

{submitted_field_value} = {original_value},{provided_value}

如何以提交的形式将
{original\u value}
替换为
{provided\u value}

重要的是要记住,WWW::Mechanize最好被认为是一个“无头浏览器”,而不是LWP或curl,后者只为您处理所有精细的http请求。当你做事时,机械保持它的状态

您需要使用
$mech->forms
或类似的方法()获取表单,然后使用设置要更改的输入字段

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

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

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

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

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

请参阅WWW::Mechanize的文档:

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

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

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


我设法让它按我的意愿工作。感谢Timbus和knb的建议。虽然我的案例可能不完全一般(我知道预设值),但我会分享我的发现(通过跟踪和错误)


knb,谢谢你的回复。问题是,尽管已经存在,但添加的值并没有被覆盖。我希望有一个lib/函数能够像文档中描述的那样工作,不幸的是,事实并非如此。字段名是唯一的,并且值被添加到了正确的字段中。我只是想弄清楚问题是否存在我感兴趣的站点或它是一个常见(已知)错误。@cur4so:您能通过perl调试器运行它,然后检查变量,并在必要时从测试中删除现有成员:WWW::Mechanize的数据结构,该结构包含表单变量吗?假设它是一个哈希:如果调用delete$fields{$name}无法解决您的问题,我不知道该怎么办。我知道这会破坏封装,但有时必须这样做。也许问题会在以后通过发现数据中的另一个潜在问题得到解决。是的,有太多的方法可以做到这一点,但我正在寻找一种(任何)方法因为这个原因,我特别欣赏亲身体验,而不是猜测……我确实打了一个平底球,但说我也没有经验有点不公平,我已经使用了Mechanize很多次,我以前从来没有从表单中删除过值。也就是说,我确实在一个带有hidd的页面上测试了我的简单示例en value并成功地更改了它,而不是添加到它,所以..我不是说你没有经验。我只是看到你过去没有这个问题(增值而不是替换),并且在你回复之前没有复制它。所以,你是在瞎猜,它并不总是有效;)。平静点,我不是有意冒犯你的。对不起,如果是这样的话。
$mech->field( $name, [$field_value], 1 );
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');