web-dev-qa-db-ja.com

CasperJSのconsole.logがsetTimeoutで評価されない

なぜconsole.logevaluateで動作します:

casper.then(function() {
  this.evaluate( function() {
    console.log('hello'); 
  });
});

しかし、これはうまくいきません:

casper.then(function() {
  this.evaluate( function() {
    setTimeout( function() {console.log('hello');}, 1000);
  });
});
31
Rustem

Casperjsとリモートページ環境を混同しているからです。 evaluate関数はリモートページenv内でコードを実行するため、console.log呼び出しは何も出力しません。

キャッチしたい場合リモートconsole.log呼び出し、remote.messageイベント:

casper.on('remote.message', function(msg) {
    this.echo('remote message caught: ' + msg);
})

ところで、 イベントのドキュメント評価用のもの と同様にかなり網羅的です。

72
NiKo

@NiKoの答えは重要です。

エラーが発生した場合、console.log()メッセージを出力するのに十分ではなく、代わりに無音になる可能性があるため、以下を追加することもお勧めします。

casper.on( 'page.error', function (msg, trace) {
    this.echo( 'Error: ' + msg, 'ERROR' );
});
20
odigity

CasperJSには ClientUtils が含まれており、リモートページから使用して、casperスクリプトのコンソールに簡単にログを記録できます。

__utils__.echo('This message is logged from the remote page to the CasperJS console');
11
pius

@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);
});
5
c24w