Warum WWW::Mechanize::Firefox?
Was ist WWW::Mechanize::Firefox?
Verwendungsmöglichkeiten
Max Maischein
DZ BANK Frankfurt
Deutsche Zentralgenossenschaftsbank
Informationsmanagement
Wenn ich es manuell machen kann
... kann es der Computer wiederholen
... und zwar immer wieder korrekt
Perl (natürlich)
WWW::Mechanize
WWW::Mechanize::Shell (GPW 2002)
Win32::OLE (GPW 2007)
WWW::Mechanize::Shell (2002)
... reicht nicht mehr aus
Webanwendungen sind auf dem Vormarsch
Web 2.0 ist problematisch
Anwendungen halten Status im Client
Anwendungen verwenden Javascript
Javascript ist nicht Perl's Stärle
Javascript::SpiderMonkey von Mike Schili, Thomas Busch auf CPAN
Mozilla Javascript Interpreter
Viele externe Prerequisites
Nur Javascript, kein DOM
Javascript::Engine von Father Chrysostomos auf CPAN
Reines Perl
Laaaaaangsam
WWW::Mechanize::Javascript, WWW::Scripter
Benutzt Javascript::Engine
Was, wenn ich Firefox verwenden könnte?
Anerkannte Platform
Kompatible Platform
Interaktive Platform
Mausklicks senden?
Tastaturkommandos senden?
nicht interaktiv
nicht robust bei anderer Verwendung des Rechners
mozrepl
to the rescueMozrepl bietet eine Netzwerkschnittstelle zu Firefox
Perl spricht TCP
1: my $mech = WWW::Mechanize::Firefox->new(); 2: $mech->get('http://www.froscon.de');
eine erweiterte Schnittstelle
von WWW::Mechanize
mit Firefox als Backend
Normale WWW::Mechanize API
Javascript
CSS Selektoren (via HTML::Selector::XPath)
XPath Selektoren
Javascript events (onLoad
)
Javascript Fehlermeldungen!
Webseitenautomation
Integrierte JS Unit-Tests
Eingabevalidierung mit Javascript auch Server-side
Verrückte Dinge
Firefox steuern
1: my $mech = WWW::Mechanize::Firefox->new(); 2: $mech->get('http://www.froscon.de');
Firefox steuern
01-open-local.pl
1: my $mech = WWW::Mechanize::Firefox->new(); 2: $mech->get_local('datei.html');
Firefox zuhören
02-urlbar.pl
Listen to Firefox events
02-urlbar.pl
Webseiten Bedienungstests
03-dump-links.pl
1: my $mech = WWW::Mechanize::Firefox->new(); 2: $mech->get_local('link.html'); 3: 4: sleep 5; 5: $mech->highlight_node( 6: $mech->selector('a.download')); 7: 8: print $_->{href}, " - ", $_->{innerHTML}, "\n" 9: for $mech->selector('a.download');
Javascript ausfuehren
04-javascript.pl
1: my $mech = WWW::Mechanize::Firefox->new(); 2: $mech->get_local('datei.html'); 3: $mech->eval_in_page(<<'JS'); 4: alert('Hallo FrOSCon'); 5: JS
Webseitenmanipulation:
1: var secret = "12345" + "geheim";
Webseitenmanipulation:
1: var secret = "12345" + "geheim";
Javascript Variablen auslesen (und setzen)
05-manipulate-javascript.pl
1: my $mech = WWW::Mechanize::Firefox->new(); 2: $mech->get_local('javascript.html'); 3: 4: my ($val,$type) = $mech->eval_in_page(<<'JS'); 5: secret 6: JS 7: 8: print "Das Kennwort ist $val"; 9: 10: # Wert setzen 11: sleep 5; 12: $mech->value('pass',$val);
06-screenshot.pl
1: my $png = $mech->content_as_png()
Firefox
mozrepl Add-On
MozRepl::RemoteObject (+ MozRepl + Net::Telnet)
WWW::Mechanize
(A)Synchrones Eventmodell
Asynchrone Kommunikation (AnyEvent)
Mehr gekapselte Firefox API (MDC)
Mehr WWW::Mechanize API
Firefox ohne Display ("headless")
DOM ohne Firefox (js_env
), V8 Javascript Engine
Fenster öffnen / schliessen
Downloads
Dateikonversion
HTML nach PNG
SVG nach PNG
JPG nach PNG
Firefox als Charting-Engine mit Flot(r)
Statt Inkscape
Firefox auf anderen Rechnern steuern (TCP)
Firefox als Medienkonverter
Movie Resize / Video Element
Webcam in Perl?
Alle Beispiele auch auf CPAN unter
WWW::Mechanize::Firefox::Examples
Reauthenticate to the Wifi using W:M:F
Reauthenticate to the Wifi using W:M:F
Check whether http://google.it is reachable
if not
Switch off the SOCKS proxy
Connect to http://google.it
Enter credentials
Submit (does some Javascript)
Launch PuTTY for ssh tunneling
Re-enable SOCKS proxy
1: # Get Firefox settings 2: my $prefs = $mech->repl->expr(<<'JS'); 3: Components.classes["@mozilla.org/preferences-service;1"] 4: .getService(Components.interfaces.nsIPrefBranch); 5: JS
1: # Get Firefox settings 2: my $prefs = $mech->repl->expr(<<'JS'); 3: Components.classes["@mozilla.org/preferences-service;1"] 4: .getService(Components.interfaces.nsIPrefBranch); 5: JS 6: 7: # Switch off the SOCKS proxy 8: if ($prefs->getIntPref('network.proxy.type') != 0) { 9: $prefs->setIntPref('network.proxy.type',0); 10: };
1: $mech->get('http://google.it'); 2: if ($mech->title =~ /\bdevitalia\b/i) { 3: # We need to log in 4: print "Reauthenticating"; 5: $mech->field( User_tmp => $credentials->{user} ); 6: $mech->field( Password => $credentials->{pass} ); 7: $mech->click({ xpath => q{//input[@type="submit"]}, sync => 1 }); 8: } else { 9: print "Already logged in" 10: };
1: $mech->get('http://google.it'); 2: if ($mech->title =~ /\bdevitalia\b/i) { 3: # We need to log in 4: print "Reauthenticating"; 5: $mech->field( User_tmp => $credentials->{user} ); 6: $mech->field( Password => $credentials->{pass} ); 7: $mech->click({ xpath => q{//input[@type="submit"]}, sync => 1 }); 8: } else { 9: print "Already logged in" 10: }; 11: 12: # Switch on the SOCKS proxy 13: $prefs->setIntPref('network.proxy.type',1);