2013-05-11 3 views
42

В PhantomJS webpage.open выполняет обратный вызов с параметром статуса, который установлен на «успех» или «сбой». Согласно документам, это будет «успех», если не возникнет сетевых ошибок, иначе «сбой». Есть ли способ увидеть сетевую ошибку, которая вызвала сбой?Отладка ошибок PhantomJS webpage.open

URL-адрес, который я пытаюсь загрузить, отлично работает, когда я помещаю его в свой браузер, и когда я беру снимок экрана после получения сообщения об ошибке, я вижу страницу, на которой я был, до того, как я вызвал webpage.open (поэтому я не могу просто игнорировать неудачу). Я использую Phantom для тестирования, поэтому в идеале я бы хотел получить надежный способ получить полезную ошибку, когда webpage.open терпит неудачу (или еще лучше ее никогда не сработает!)

ответ

60

Нашел этот пост, в котором объясняется, как настроить обратные вызовы, чтобы получить на основных причинах сбоя: http://newspaint.wordpress.com/2013/04/25/getting-to-the-bottom-of-why-a-phantomjs-page-load-fails/

Основываясь на этой странице, вы можете распечатать ошибки следующим образом:

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

страница продолжает показывать пример подробного протоколирования для фантомов

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')); 
}; 
+2

Не забудьте отметить свой собственный ответ, как принято. – Stephan

+0

Спасибо за ответ, вы можете указать информацию, указанную в ссылке, в случае, если информация удалена, потеряна или изменена – Tim