Невозможно установить флажок через Perl LWP::UserAgent

Как я должен установить флажок следующим образом:

<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' , и '[email protected]_notmetoo' => 'on', безуспешно.

Похоже, что на веб-сайте нет JavaScript (т. е. он отлично работает в моем браузере с отключенным JavaScript). Я просто не могу заставить его работать в Perl.

Спасибо.

Терри.


Обновление № 1: Вот значение POSTDATA из расширения Firefox «Tamper Data», когда я отправляю его после проверки поля notmetoo в Test2:

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--

Помогает ли это кому-нибудь помочь мне?


person Terry    schedule 15.08.2012    source источник
comment
Вы должны показать нам всю форму, содержащую этот ввод. Является ли это одним из набора флажков с тем же именем?   -  person Borodin    schedule 15.08.2012
comment
Если вы эмулируете браузер, вам следует рассмотреть WWW::Mechanize   -  person Borodin    schedule 15.08.2012
comment
@Бородин. Спасибо за ваши предложения. Вот копия всей формы: (homepages.paradise.net.nz/abcd/mailman1 .htm). Как видите, флажки имеют разные названия. Я только что заметил, что в отличие от других веб-страниц на этом веб-сайте GNU Mailman (с которыми у меня нет таких проблем), у этой есть «enctype=multipart/form-data» в теге ‹FORM›. По крайней мере, у некоторых других нет 'enctype...' вообще. Это помогает нам? Я не пытаюсь эмулировать браузер - просто установите флажок через Perl.   -  person Terry    schedule 21.08.2012


Ответы (2)


Мое понимание флажков заключается в том, что value= указывает значение, которое будет иметь переменная, когда флажок установлен. Таким образом, ваше сбивающее с толку value="off" на самом деле означает, что вам нужно

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

Чтобы указать, что флажок установлен.

person Sodved    schedule 15.08.2012
comment
Хорошие моменты Содвед. Обратите внимание, что мой 1-й пост дает пример «неотмеченного» элемента. Вот 2 таких элемента с веб-страницы - один отмечен, а другой нет: <td><center><INPUT name="test2%40mydomain.com_mod" type="CHECKBOX" value="off" ></center></td> <td><center><INPUT name="test2%40mydomain.com_hide" type="CHECKBOX" value="on" CHECKED ></center></td> Похоже, что отмеченные элементы имеют «значение = включено ПРОВЕРЕНО», а остальные просто имеют значение «значение = выключено», поэтому я не уверен, для чего это значение ' атрибут служит в этом случае. Примечание. Я не создавал эту веб-страницу (GNU Mailman) и не могу ее изменить. - person Terry; 21.08.2012

В вашем случае флажок будет иметь значение «выкл.», если он установлен. Это было бы менее запутанно, если бы значение было чем-то вроде value="checkbox1". В этом случае значение флажка будет checkbox1 при проверке.

Кроме того, рассмотрите возможность использования WWW::Mechanize для таких базовых веб-операций (без javascript), это намного проще и интуитивно понятно, а также WWW::Mechanize является подклассом LWP::UserAgent, поэтому вы все равно можете использовать методы LWP.

person AnBisw    schedule 15.08.2012
comment
Спасибо Энджон. Я думаю, что мои флажки имеют значение = 'on', когда они отмечены. См. мои 2 комментария выше, включая копию веб-страницы, на которую я ссылался в своем 1-м комментарии. Разве я не столкнусь с такой же проблемой, если попытаюсь использовать WWW::Mechanize? - person Terry; 21.08.2012
comment
@Terry WWW::Mechanize намного проще в использовании и отладке. Кроме того, как я упоминал ранее, вы по-прежнему сможете использовать LWP методы, которые наследует WWW::mechanize. - person AnBisw; 21.08.2012
comment
Спасибо Энджон. Я начал смотреть на WWW::Mechanize. Я добавил обновление № 1 в свой исходный пост с дополнительной информацией. - person Terry; 22.08.2012
comment
Еще раз привет Энджон. В соответствии с вашим предложением я попробовал WWW::Mechanize и поставил галочки вот так: $m->tick('test2%40mydomain.com_notmetoo', 'off'); и снял их вот так: $m->untick('test2%40mydomain.com_notmetoo', 'on'); и это, кажется, работает, спасибо. Это дает мне много предупреждений, когда поле уже находится в состоянии, на которое я «меняю» его (например, если я пытаюсь установить флажок). Ошибки типа: No checkbox "test2%40mydomain.com_notmetoo" for value "on" in form at ./mailman_update.pl line 102. Любые идеи, как их избежать (без необходимости сначала смотреть на состояние коробки)? - person Terry; 29.08.2012