Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I access forms without a name or id with Perl's WWW::Mechanize?

I am having problems with my Perl program. This program logs in to a specific web page and fills up the text area for the message and an input box for mobile numbers. Upon clicking the 'Send' button, the message will be sent to the specified number. I already got it to work for sending messages. But the problem is I can't make it work for receiving messages/replies. I'm using WWW::Mechanize module in Perl. Here is a part of my code (for receiving msgs):

$username = 'suezy';
$password = '123';
$url = 'http://..sample.cgi';

# ...

$mech->credentials($username, $password);  
$mech->get($url);

$mech->submit(); 

My problem is, the forms shows no names. There are two buttons in this form, but I can't select which button to click, since there are no name specified and the ids contains a space(e.g. form name='receive msg'..). I need to click on the second button, 'Receive'.

Question is, how will I be able to access the forms and buttons using mechanize module without using names?

like image 780
Suezy Avatar asked Feb 14 '10 08:02

Suezy


4 Answers

You can pass a form_number argument to the submit_form method.

Or call the form_number method to affect which form is used by later calls to click or field.

like image 83
ysth Avatar answered Sep 23 '22 03:09

ysth


Have you tried to use HTTP Recorder?
Have a look at the documentation and try it to see if it gives a reasonable result for you.

like image 27
weismat Avatar answered Sep 22 '22 03:09

weismat


Seeing that there are only two buttons on your form, ysth's suggestion should be easy to implement.

use strict;
use warnings;
use WWW::Mechanize;

my $username = "suezy";
my $password = "123";
my $url = 'http://.../sample.cgi';
my $mech = WWW::Mechanize->new();

$mech->get($url);
$mech->credentials($username,$password);

And then:

$mech->click_button({number => 1});       # if the 'Receive' button is 1

Or:

$mech->click_button({number => 2});       # if the 'Receive' button is 2

A case of trial-and-error is more than adequate for you to figure out which button you're clicking.

EDIT

I'm assuming that the relevant form has already been selected. If not:

$mech->form_number($formNumber);

where $formNumber is the form number on the page in question.

like image 31
Zaid Avatar answered Sep 23 '22 03:09

Zaid


$mech->form_with_fields('username');

will select the form that contain a field named username. hth

like image 37
free Avatar answered Sep 23 '22 03:09

free