2016-09-11 2 views
1

В конце формы есть кнопка на веб-сайте, которую я не могу щелкнуть с помощью WWW :: Mechanize. Вот это немного HTML, относящиеся к этой кнопке:WWW :: Механизировать: как нажать кнопку, основанную на ее номере в форме

<input type="submit" class="saveButton" value="Login"> 

Когда я print $mech->find_all_inputs();, я получаю это вернуть:

HTML::Form::TextInput=HASH(0x7f8f52cdc450) 
HTML::Form::TextInput=HASH(0x7f8f5302b488) 
HTML::Form::SubmitInput=HASH(0x7f8f52cdc108) 

Третий один я хочу нажать кнопку. Я не совсем уверен, как нажать эту кнопку, хотя я ее нашел. Я попробовал click(field(n => 3)), я попытался присвоить переменную $ submit find_all_inputs(3), затем click($submit);, и не важно, что эта кнопка не нажата.

Может ли кто-нибудь указать мне, как нажать эту неуловимую кнопку?

Редактировать (после того, как вопрос ответил)

Допрос форму HTML нашел, что я был на самом деле ввести пароль для входа в «забыл пароль» поле формы. Почему это поле не подходит для $mech->find_all_inputs(), я не знаю, так как «Логин» был. В любом случае, нажатие кнопки приведет меня к следующей странице. Благодаря!

+0

Кажется, что 'click' работает, однако, я не перехожу к следующей странице (кнопка, о которой идет речь, является кнопкой входа в систему, поэтому щелчок по ней должен привести к другому URL-адресу, не так ли? Но '$ ua -> uri;' до и после нажатия кнопки). Я попробовал 'my $ response = $ ua -> click();' и 'print $ response', который возвратил' HTML :: Form :: SubmitInput = HASH (0x7f8f52cdc108) ', поэтому я думаю, что' click' работал. –

+0

У вашего объекта Mechanize есть куки? считать 'my $ mech = WWW :: Mechanize-> new ( cookie_jar => HTTP :: Cookies-> new (file =>" $ ENV {HOME} /. Cookies.txt ") );' для получения файлов cookie. Кажется крайне маловероятным, что вы могли бы войти без него. – bytepusher

+0

@bytepusher: Конструктор 'WWW :: Mechanize' по умолчанию ведет себя так, как будто вы передали параметр' cookie_jar => {} ', который создает объект' HTTP :: Cookies' в памяти. – Borodin

ответ

1

Вы попытались сначала выбрать нужную форму, а затем позвонить click? Он говорит (курсив мой)

Имеет эффект нажатия кнопки на текущей форме.

Найти форму на интересующей вас странице. Скажем, это форма № 2.

# $ua is the User Agent (Mechanize object), at the appropriate page 
$ua->form_number(2); 
# fill the form ... 
my $response = $ua->click(); 

или

$ua->submit_form( 
    form_number => 2, 
    # fields => { name => $value } # can fill it here as well 
}; 

Я нахожу click быть, возможно, более надежным в целом.

Для проверки форм вы можете использовать my @forms = $ua->forms. Чтобы заполнить форму, вы можете использовать, например, select или set_fields. См. Form Methods и Field Methods. Все это работает с объектами HTML::Form, поэтому вы также можете использовать его методы. Например, value_names и possible_values удобны.

Если это не поможет, пожалуйста, сообщите нам подробнее - веб-страница, о которой идет речь, была бы идеальной.

+0

Щелчок, похоже, сработал, но действие, которое должен был сделать клик, не имеет. Проверяя html, я вижу, что когда я просматриваю строку из моего вопроса, в конце есть '= $ 0', например:' = $ 0'. Может быть, это помогает? Я не работал с HTML в прошлом –

+0

@AdityaJ. Эта новая информация немного помогает. Во-первых, обработайте файлы cookie за комментарий by bypepusher (http://stackoverflow.com/users/4204037/bytepusher). Далее, есть ли в этой форме больше кнопки «Войти»? Как вы это делаете, когда вы переходите на страницу вручную - у вас есть другие поля для заполнения или есть только кнопка «Войти»? Кроме того, не забудьте узнать, сколько форм существует (по '$ ua-> forms'), так что вы делаете' form_number' для правильного. Наконец, вы возвращаетесь к объекту 'HTML :: Form' - вы можете допросить его своими методами. Или распакуйте hashref. – zdim

+0

Я уже смог заполнить поля имени пользователя и пароля, которые являются единственными полями помимо входа в форму –

3

Поскольку это первая кнопка в форме, вы можете написать эту

$mech->click_button(n => 1) 

или, так как это value атрибут Login, вы можете сделать это

$mech->click_button(value => 'Login') 

Но так как это только кнопка в форме, только

$mech->click 

следует работа прекрасна

Смежные вопросы