LWP::UserAgent
o WWW::Mechanize
facciano le operazioni volute, la sola strada percorribile è intercettare e
registrare l'attività di un utente reale sull'interfaccia web voluta.
Successivamente sarà possibile la modifica e la parametrizzazione di alcune
parti dell'elenco di operazioni ottenuto.
use HTTP::Proxy;
my $proxy = HTTP::Proxy->new;
$proxy->port(9876);
$proxy->start;
perl -MHTTP::Proxy -e 'HTTP::Proxy->new(port => 9876)->start'
Figura 1
HTTP::Proxy
opera le richieste tramite una propria istanza di
LWP::UserAgent
, è possibile sostituirla tramite il metodo
agent
di HTTP::Proxy
con un altro oggetto,
la cui classe sia derivata da LWP::UserAgent
.
HTTP::Recorder
può essere utilizzata allo scopo.
Il modulo in questione marca il documento HTML ritornato da una richiesta in
modo da potersi accorgere quali links vengano seguiti o quali forms inviati.
Di default registra le azioni in codice Perl adatto all'esecuzione con
WWW::Mechanize
, nel particolare presuppone l'esistenza di
un'istanza con nome $agent
.
HTTP::Recorder
permette di specificare un file di destinazione in
cui salvare gli eventi registrati (n.b. lo script viene aperto in modalità
"append", se esiste già non viene sovrascritto ma le nuove righe verranno
aggiunte in coda).
Bastano poche righe ed il proxy per registrare è pronto:
#!/usr/bin/perl -w
use strict;
use HTTP::Proxy;
use HTTP::Recorder;
my $proxy = HTTP::Proxy->new;
my $agent = HTTP::Recorder->new;
$agent->file('session.pl');
$proxy->port(8080);
$proxy->agent($agent);
$proxy->start;
$ ./recorder0.pl & $ export http_proxy=http://localhost:8080 $ lynx http://www.google.com
session.pl
generato:
$agent->get("http://www.google.com/");
$agent->get("http://www.google.it/cxfer?c=PREF%3D:TM%3D1109256170:S%3D861XClBC
3FksuGrw&prev=/");
$agent->get("http://www.google.it/");
$agent->form_name("f");
$agent->field("hl", "it");
$agent->field("ie", "ISO-8859-1");
$agent->field("q", "ginko biloba");
$agent->submit_form(form_name => "f");
HTTP::Recorder
, che al momento è la 0.03_01. La versione stabile
è invero afflitta da alcuni bugs sui forms e non supporta l'uso di SSL.
#!/usr/bin/perl -w
use strict;
use WWW::Mechanize;
unless ($#ARGV == 0) {
print STDERR <<"EOT";
usage: $0 [sessionfile] [...]
EOT
exit 1;
}
my $agent = WWW::Mechanize->new(
keep_alive => 1,
agent => 'SIBot/1.2',
autocheck => 1,
);
$agent->env_proxy;
print "starting\n";
local *IS;
local $\ = undef;
foreach (@ARGV) {
print " $_ ... ";
open(IS, "< $_") or die $!;
eval <IS>;
close IS;
print $@ ? 'error' : 'passed';
print "\n";
}
print "all done\n";
HTTP::Recorder
e li esegue sequenzialmente dopo aver istanziato
WWW::Mechanize
. Il contenuto degli script viene eseguito tramite
la funzione di eval
, in caso di errore viene mostrato un messaggio
di test non passato, come in una sorta di HTTP-unit "povero".
$ ./player0.pl session.pl starting session.pl ... passed all done
HTTP::Recorder
non sarà la soluzione
completa per tutti resta tuttavia indubbia di questo strumento che in una
manciata di righe permette di risparmiare gran parte del tempo normalmente
dedicato alla generazione manuale di sequenze di test.
Perl è ormai disponibile su moltissime piattaforme e, come abbiamo potuto
vedere in questi primi articoli, non fa solo CGI e manipolazione di testi!