2011-12-31 2 views
3

Я пытаюсь отправить форму методом post, используя WWW::Mechanize модуль perl.WWW :: Выдать сообщение о механизме текстового поля

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} в форме должны быть представлены?

ответ

0

Мне удалось заставить его работать по моей воле. Спасибо Тимбусу и кнуту за ваши предложения. Хотя мой случай может быть не совсем общим (я знаю заданное значение), но я бы поделился тем, что нашел (по ошибкам &).

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

Важно помнить WWW. Механизм лучше воспринимается как «безгласный браузер», а не 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.

+0

yeh, Есть слишком много способов сделать это, но я ищу только один (любой), чтобы это сделать. По этой причине я особенно ценю, что руки на опыте не догадываются ... – cur4so

+0

Ну, это правда, что я взял пунт, но это немного несправедливо сказать, что у меня тоже нет опыта, я много раз использовал Mechanize, я просто никогда не приходилось удалять значение из формы раньше.Тем не менее, я, конечно, проверил мой простой пример на странице со скрытым значением и успешно изменил ее, а не добавил к ней, поэтому .. –

+0

Я не имел в виду, что у вас нет опыта. Я просто вижу, что у вас не было этой проблемы (добавление стоимости вместо замены) в вашем прошлом и не воспроизводило ее до вашего ответа. Итак, вы делаете слепое предположение, и это не всегда работает;). Мир, я не собираюсь вас оскорблять. Извините, если это так. – cur4so

1

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

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

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

Смотрите документацию WWW.: : Механизировать:

$ mech-> поле ($ имя, \ @values, $ число)

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

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

+0

knb, спасибо за ваш ответ. Проблема в том, что добавленная стоимость не перезаписывается, несмотря на то, что она уже существует. Я хотел бы иметь lib/функцию, которая работает всегда, как описано в документации, к сожалению, это не так. Имя поля уникально, и значение добавляется в правильное поле. Просто пытаюсь выяснить, связана ли проблема с сайтом моего интереса или это обычная (известная) ошибка. – cur4so

+0

@ cur4so: можете ли вы запустить его через отладчик perl, а затем проверить переменные и, при необходимости, удалить существующий элемент из структуры данных Test: WWW :: Mechanize, которая содержит переменные формы? Предполагая, что это хэш: если вызов delete $ fields {$ name} не решает вашу проблему, я не знаю, что может. Я знаю, что это сломает инкапсуляцию, но иногда это должно быть сделано. Возможно, проблема будет решена позже в любом случае, найдя еще одну скрытую проблему с вашими данными. – knb