WWW::Mechanize::Firefox::Cookbook - Recipes for using WWW::Mechanize::Firefox
Note that WWW::Mechanize::Firefox is quite similar in its API to WWW::Mechanize, so many of the recipes in WWW::Mechanize::Cookbook apply to it as well.
use WWW::Mechanize::Firefox; my $mech = WWW::Mechanize::Firefox->new(); $mech->get('http://google.com');
use WWW::Mechanize::Firefox; my $mech = WWW::Mechanize::Firefox->new( launch => '/path/to/firefox', ); $mech->get('http://google.com');
use WWW::Mechanize::Firefox; my $mech = WWW::Mechanize::Firefox->new( tab => qr/^Google/, ); $mech->get('http://google.com');
use WWW::Mechanize::Firefox; my $mech = WWW::Mechanize::Firefox->new( tab => 'current', ); $mech->get('http://google.com');
my $app = Firefox::Application->new(); my @tabs = map { $_->{tab} } grep { $magic eq $_->{title} } $app->openTabs($repl); my $synth_mech = WWW::Mechanize::Firefox->new( tab => $tabs[0], app => $app, );
use WWW::Mechanize::Firefox; my $mech = WWW::Mechanize::Firefox->new( activate => 1, ); $mech->get('http://google.com');
my $mech = WWW::Mechanize::Firefox->new( ); ... $mech->activateTab();
use WWW::Mechanize::Firefox; my $mech = WWW::Mechanize::Firefox->new( tab => 'current', ); $mech->get('http://google.com', ':content_file' => 'google_com.html' );
use WWW::Mechanize::Firefox; my $mech = WWW::Mechanize::Firefox->new( tab => 'current', ); $mech->get('http://google.com'); $mech->save_content('google_com.html', 'google_com files');
Some sites generate content after the DOMContentLoaded event has fired. To wait until an element becomes available, use the following code:
DOMContentLoaded
# The submit button is generated after the page has loaded my $retries = 10; while ($retries-- and ! $mech->is_visible( xpath => '//*[@id="submit"]' )) { sleep 1; }; die "Timeout" if 0 > $retries; # Now the element exists $mech->click({xpath => '//*[@id="submit"]'});
Some sites display an hourglass or some other indicator to tell you to wait. To wait until such an element becomes invisible, use the following code:
my $retries = 10; while ($retries-- and $mech->is_visible( xpath => '//*[@id="hourglass"]' )) { sleep 1; }; die "Timeout while waiting for application" if 0 > $retries; # Now the hourglass is not visible anymore
In the case that you want to navigate the user to a specific place and then take over manually, you can prevent the automatic closing of the browser tab. Either create your $mech object like this:
$mech
my $mech = WWW::Mechanize::Firefox->new( autoclose => 0, );
or decide at runtime whether to close the tab:
$mech->autoclose_tab(0);
This does currently not work.
my $browser = $mech->repl->expr('window.getBrowser()'); my $eventlistener = progress_listener( $browser, onLocationChange => \&onLocationChange, ); while (1) { $mech->repl->poll(); sleep 1; };
This will take a "screenshot" which also includes plugins like Flash.
my $png = $mech->content_as_png(); open my $fh, '>', 'page.png' or die "Couldn't save to 'page.png': $!"; binmode $fh; print {$fh} $png; close $fh;
Also see the file screenshot.pl included and installed through the distribution.
screenshot.pl
my $rect = { left => 0, top => 0, width => 200, height => 200, }; my $png = $mech->content_as_png(undef, $rect); open my $fh, '>', 'page.png' or die "Couldn't save to 'page.png': $!"; binmode $fh; print {$fh} $png; close $fh;
my $shiny = $mech->selector('#shiny', single => 1); my $png = $mech->element_as_png($shiny); open my $fh, '>', 'page.png' or die "Couldn't save to 'page.png': $!"; binmode $fh; print {$fh} $png; close $fh;
If you are testing a new application deployment, it may become necessary to lie to the server about the name of the webserver you're requesting. You can easily switch the name around at the HTTP level by adding a custom Host: header:
Host:
$mech->add_header( Host => 'http://example.com/', ); $mech->get('http://1.2.3.4'); # Ask the machine at 1.2.3.4 for the pages of example.com
$mech->get('mypage'); my @errors = map {$_->{message}} $mech->js_errors(); if (@errors) { die "Found errors on page: @errors"; };
alert()
$mech->eval_in_page('alert("Hello");', { alert => sub { print "Captured alert: '@_'\n" } } );
Just pass empty lists for the lists of events to invoke
$mech->field( 'myfield', 'myvalue', [], [] );
onclick
When developing a web page, you may want to use WWW::Mechanize::Firefox to check the text value of the onclick attribute instead of treating it as an opaque function. To get at the text attribute, you will need the DOM function ->getAttribute().
->getAttribute()
#!perl -w use strict; use WWW::Mechanize::Firefox; my $mech = WWW::Mechanize::Firefox->new(); $mech->update_html(<<HTML); <html> <h1>Test</h1> <a href="http://google.de">Google</a> <a href="asdf.html" onclick="javascript:alert('hello');">Say Hello</a> </html> HTML my @links = $mech->find_all_links_dom(url_regex => 'asdf.html'); foreach my $link (@links) { print $link->getAttribute('onclick'); };
ftp
Not implemented - this requires instantiating and passing a nsIURI object instead of a nsILocalFile .
nsIURI
nsILocalFile
You can use ->save_url to transfer files. $localname can be a local filename, a file:// URL or any other URL that allows uploads, like ftp://.
->save_url
$localname
file://
ftp://
$mech->save_url('file://path/to/my/file.txt' => 'ftp://myserver.example/my/file.txt');
Max Maischein corion@cpan.org
corion@cpan.org
Contributed examples contain the original author's name.
Copyright 2009-2014 by Max Maischein corion@cpan.org.
All Rights Reserved. This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.
To install WWW::Mechanize::Firefox, copy and paste the appropriate command in to your terminal.
cpanm
cpanm WWW::Mechanize::Firefox
CPAN shell
perl -MCPAN -e shell install WWW::Mechanize::Firefox
For more information on module installation, please visit the detailed CPAN module installation guide.