use strict; use warnings; use Data::Dumper; use Selenium::Remote::Driver; use Selenium::Remote::Driver::Firefox::Profile; use WWW::Selenium; $Data::Dumper::Sortkeys = 1; binmode(STDOUT, ":utf8"); my $log = 'log'; my $errors_log = 'errors_log'; open STDOUT, '>', $log or die "Can't write to $!"; open STDERR, '>', $errors_log or die "Can't write to $!"; my $profile = Selenium::Remote::Driver::Firefox::Profile->new(); $profile->add_extension('c:/selenium server/har_export_trigger-0.5.0-beta.7-fx.xpi'); $profile->set_preference( "browser.extensions.netmonitor.har.contentAPIToken" => "test", # set to a token that is consequently passed into all HAR API calls to verify the user. #"browser.devtools.netmonitor.har.defaultFileName" => "Autoexport_%y%m%d_%H%M%S", # default name of the target HAR file. The default file name supports formatters #"browser.devtools.netmonitor.har.defaultLogDir" => "c:/hardir", # default log directory for generate HAR files. If empty all automatically generated HAR # files are stored in /har/logs #"browser.devtools.netmonitor.har.pageLoadedTimeout" => "2500", # Amount of time [ms] the auto-exporter should wait after the last finished request before # exporting the HAR file. ); $profile->set_boolean_preference( "browser.extensions.netmonitor.har.enableAutomation" => 1, # enable the automation without having a new HAR file created for every loaded page. "browser.extensions.netmonitor.har.autoConnect" => 1, # set if you want to have the HAR object available without the developer toolbox being open. #"browser.devtools.netmonitor.enabled" => 1, # enable netmonitor #"browser.devtools.netmonitor.har.compress" => 0, # If set to true the final HAR file is zipped. This might represents great disk-space optimization especially # if HTTP response bodies are included. #"browser.devtools.netmonitor.har.enableAutoExportToFile" => 1, # If true, a new HAR file is created for every loaded page automatically. #"browser.devtools.netmonitor.har.forceExport" => 1, # The result HAR file is created even if there are no HTTP requests. #"browser.devtools.netmonitor.har.includeResponseBodies" => 0, # If set to true, HTTP response bodies are also included in the HAR file (can produce significantly bigger amount of data). #"browser.devtools.netmonitor.har.jsonp" => 0,# If set to true the export format is HARP (support for JSONP syntax that is easily transferable cross domains) #"browser.devtools.netmonitor.har.jsonpCallback" => 0 # Default name of JSONP callback (used for HARP format) ); my $driver = Selenium::Remote::Driver->new( 'firefox_profile' => $profile ); my $elem = Selenium::Remote::WebElement->new(); # create our web element $driver->get('http://janodvarko.cz/har/tests/har-export-trigger/har-export-api.html'); sleep 10; if ( $elem = $driver->find_element('xhr1', 'id') ) { print "found xhr1\n"; $elem->click(); # maybe I'm clicking too early, or should do the click with a JS action? But how... my $script_1 = q{ var options = { token: "test", getData: true, }; HAR.triggerExport(options).then(result => { console.log(result.data); }); }; # the above throws an exception: org.openqa.selenium.WebDriverException: HAR is not defined # after some searching, I found a potential workaround # https://github.com/firebug/har-export-trigger/issues/13 # and tried it as script_2 below: # but I don't know how to do a callback... my $script_2 = q{ function triggerExport() { HAR.triggerExport({'token':'test', 'getData':true}) .then((result) => { /* return har via callback */ })); }; if (typeof HAR === 'undefined') { addEventListener('har-api-ready', triggerExport, false); } else { triggerExport(); }; }; # the above script has some errors? I modified it best I could to include the conditional, but still need a callback somewhere... # script_3: my $script_3 = q{ function triggerExport() { var options = { token: "test", getData: true, }; HAR.triggerExport(options).then(result => { console.log(result.data); }); }; if (typeof HAR === 'undefined') { addEventListener('har-api-ready', triggerExport, false); } else { triggerExport(); }; }; my $v = $driver->execute_script($script_3, 'myId'); # myId? xhr1? print Dumper $v; }