Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Debugging PhantomJS webpage.open failures

Tags:

phantomjs

In PhantomJS, webpage.open takes a callback with a status parameter that's set to 'success' or 'fail'. According to the docs, it wll be "'success' if no network errors occurred, otherwise 'fail'." Is there a way to see the underlying network error that caused the failure?

The url I'm trying to load works fine when I put it in my browser, and when I take a screenshot after getting the 'fail' message I see the page that I was on before I called webpage.open (so I can't just ignore the fail). I'm using Phantom for testing, so ideally I'd like a robust way of easily getting a helpful error messsage when webpage.open fails (or better yet have it never fail!)

like image 736
josh Avatar asked May 11 '13 14:05

josh


1 Answers

Found this post which explains how to set up callbacks to get at the underlying reason for the failure: http://newspaint.wordpress.com/2013/04/25/getting-to-the-bottom-of-why-a-phantomjs-page-load-fails/

Based on the that page, you could print out errors as follows:

page.onResourceError = function(resourceError) {     console.error(resourceError.url + ': ' + resourceError.errorString); }; 

The page goes on to show an example of detailed logging for phantoms

var system = require('system');  page.onResourceRequested = function (request) {     system.stderr.writeLine('= onResourceRequested()');     system.stderr.writeLine('  request: ' + JSON.stringify(request, undefined, 4)); };  page.onResourceReceived = function(response) {     system.stderr.writeLine('= onResourceReceived()' );     system.stderr.writeLine('  id: ' + response.id + ', stage: "' + response.stage + '", response: ' + JSON.stringify(response)); };  page.onLoadStarted = function() {     system.stderr.writeLine('= onLoadStarted()');     var currentUrl = page.evaluate(function() {         return window.location.href;     });     system.stderr.writeLine('  leaving url: ' + currentUrl); };  page.onLoadFinished = function(status) {     system.stderr.writeLine('= onLoadFinished()');     system.stderr.writeLine('  status: ' + status); };  page.onNavigationRequested = function(url, type, willNavigate, main) {     system.stderr.writeLine('= onNavigationRequested');     system.stderr.writeLine('  destination_url: ' + url);     system.stderr.writeLine('  type (cause): ' + type);     system.stderr.writeLine('  will navigate: ' + willNavigate);     system.stderr.writeLine('  from page\'s main frame: ' + main); };  page.onResourceError = function(resourceError) {     system.stderr.writeLine('= onResourceError()');     system.stderr.writeLine('  - unable to load url: "' + resourceError.url + '"');     system.stderr.writeLine('  - error code: ' + resourceError.errorCode + ', description: ' + resourceError.errorString ); };  page.onError = function(msg, trace) {     system.stderr.writeLine('= onError()');     var msgStack = ['  ERROR: ' + msg];     if (trace) {         msgStack.push('  TRACE:');         trace.forEach(function(t) {             msgStack.push('    -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function + '")' : ''));         });     }     system.stderr.writeLine(msgStack.join('\n')); }; 
like image 162
josh Avatar answered Sep 23 '22 14:09

josh