Подтвердить что ты не робот

Console.log не работает в CasperJS 'с помощью setTimeout

Почему, когда я использую console.log в evaluate, он работает:

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

Но это не работает:

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

Ответ 1

Потому что вы смешиваете casperjs и удаленные среды страниц. Функция evaluate выполняет код на удаленной странице env, поэтому вызов console.log ничего не выводит.

Если вы хотите поймать вызовы remote console.log, прослушайте событие remote.message:

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

Btw, документация для событий является довольно исчерпывающей, а также для оценки.

Ответ 2

Ответ на

@NiKo имеет решающее значение.

Я также предлагаю добавить следующее, так как если есть ошибка, вы можете даже не сделать это достаточно далеко, чтобы распечатать консоль console.log(), а вместо этого закончите молчание.

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

Ответ 3

CasperJS включает ClientUtils, который можно использовать с удаленной страницы, чтобы легко входить в консоль casper script:

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

Ответ 4

Основываясь на ответе @odigity, это заставляет casperjs умирать с более знакомой ошибкой /stacktrace:

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);
});