in reply to Re^8: fetch HTML page, do javascript, read output from alert/msgbox
in thread fetch HTML page, do javascript, read output from alert/msgbox
The following code works for me. Note that the interface is currently geared towards only capturing Javascript events (that is, the first passed argument) instead of properly capturing all arguments passed to the function. This will likely change in the next release of MozRepl::RemoteObject.
#!perl -w use strict; use Test::More; use WWW::Mechanize::FireFox; my $mech = eval { WWW::Mechanize::FireFox->new( autodie => 0, #log => [qw[debug]] )}; if (! $mech) { my $err = $@; plan skip_all => "Couldn't connect to MozRepl: $@"; exit } else { plan tests => 2; }; isa_ok $mech, 'WWW::Mechanize::FireFox'; my $browser = $mech->tab->{linkedBrowser}; $mech->get_local('49-mech-get-file.html'); sub eval_in_page_with_redefined_alert { my ($self,$str,$redefined_alert) = @_; my $eval_in_sandbox = $self->repl->declare(<<'JS'); function (w,str,myalert) { var unsafeWin = w.wrappedJSObject; var safeWin = XPCNativeWrapper(unsafeWin); var sandbox = Components.utils.Sandbox(safeWin); sandbox.window = safeWin; sandbox.window.alert = myalert; // <-- sandbox.alert = myalert; // <-- sandbox.document = sandbox.window.document; sandbox.__proto__ = unsafeWin; var res = Components.utils.evalInSandbox(str, sandbox); return [res,typeof(res)]; }; JS my $window = $self->tab->{linkedBrowser}->{contentWindow}; my $uri = $self->uri; return @{ $eval_in_sandbox->($window, $str, $redefined_alert ) }; }; my @alerts; eval_in_page_with_redefined_alert($mech,"window.alert('Hello')", sub { + my @params = @_; push @alerts, \@params }); $mech->repl->poll; is_deeply \@alerts, [['Hello']], "We can capture alert() boxes if we w +ant to";
Update: With MozRepl::RemoteObject v0.08 and WWW::Mechanize::FireFox v0.09, you can now specify additional variables for the environment in which things get evaluated.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^10: fetch HTML page, do javascript, read output from alert/msgbox
by TheFlyingCorpse (Novice) on Nov 11, 2009 at 16:45 UTC |