WWW :: Механизировать проблему текстового поля - PullRequest
3 голосов
/ 31 декабря 2011

Я пытаюсь отправить форму методом post с использованием WWW::Mechanize модуля perl.

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 в $mech->submit_form по любой причине не заменяет значение, вместо этого $field_value добавляется в форму после исходного значения:

{submitted_field_value} = {original_value},{provided_value}

Как заменить {original_value} с {provided_value} в форме для отправки?

Ответы [ 3 ]

1 голос
/ 01 января 2012

Что произойдет, если вы добавите эту единственную строку в код перед вызовом $ mech-> submit_form ():

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

Это гарантирует, что первое значение будет добавлено или перезаписано, если оно уже существует. 1 - числовой параметр (или индекс позиции)

См. Документацию WWW :: Mechanize:

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

Учитывая имя поля, установите для его значения указанное значение.[...]

Необязательный параметр $ number используется для различения двух полей с одинаковыми именами.Поля пронумерованы от 1.

0 голосов
/ 04 января 2012

Мне удалось заставить его работать по моей воле.Спасибо 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');
0 голосов
/ 01 января 2012

Важно помнить, что 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.

...