なぜconsole.log
evaluate
で動作します:
casper.then(function() {
this.evaluate( function() {
console.log('hello');
});
});
しかし、これはうまくいきません:
casper.then(function() {
this.evaluate( function() {
setTimeout( function() {console.log('hello');}, 1000);
});
});
Casperjsとリモートページ環境を混同しているからです。 evaluate
関数はリモートページenv内でコードを実行するため、console.log
呼び出しは何も出力しません。
キャッチしたい場合リモートconsole.log
呼び出し、remote.message
イベント:
casper.on('remote.message', function(msg) {
this.echo('remote message caught: ' + msg);
})
ところで、 イベントのドキュメント は 評価用のもの と同様にかなり網羅的です。
@NiKoの答えは重要です。
エラーが発生した場合、console.log()メッセージを出力するのに十分ではなく、代わりに無音になる可能性があるため、以下を追加することもお勧めします。
casper.on( 'page.error', function (msg, trace) {
this.echo( 'Error: ' + msg, 'ERROR' );
});
CasperJSには ClientUtils が含まれており、リモートページから使用して、casperスクリプトのコンソールに簡単にログを記録できます。
__utils__.echo('This message is logged from the remote page to the CasperJS console');
@odigityの答えに基づいて、これはcasperjsをより身近なエラー/スタックトレースで死にます:
var util = require('util');
casper.on('page.error', function exitWithError(msg, stack) {
stack = stack.reduce(function (accum, frame) {
return accum + util.format('\tat %s (%s:%d)\n',
frame.function || '<anonymous>',
frame.file,
frame.line
);
}, '');
this.die(['Client-side error', msg, stack].join('\n'), 1);
});