PhantomJSでは、webpage.openは 'success'または 'fail'に設定されたステータスパラメーターでコールバックを受け取ります。ドキュメントによると、ネットワークエラーが発生しなければ「成功」、そうでなければ「失敗」になります。障害の原因となった根本的なネットワークエラーを確認する方法はありますか?
ロードしようとしているURLは、ブラウザに配置すると正常に機能し、「失敗」メッセージを取得した後にスクリーンショットを撮ると、webpage.openを呼び出す前にあったページが表示されます(そうすることができます) tは失敗を無視します)。私はテストにPhantomを使用しているので、理想的にはwebpage.openが失敗したとき(またはそれ以上に失敗しないように)有用なエラーメッセージを簡単に取得できる堅牢な方法が欲しいです。
失敗の根本的な理由に到達するためにコールバックを設定する方法を説明するこの投稿を見つけました: 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);
};
このページは、ファントムの詳細なロギングの例を示しています
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'));
};