SpookyJS: Console.log не работает внутри тогда

try {
  var Spooky = require("spooky");
} catch (e) {
  console.log(e);
}

var spooky = new Spooky({
  capser: {
    logLevel: "debug",
    verbose: true
  },
  child: {
    command: "./casperjs/bin/casperjs",
    port: 8081,
    spooky_lib: "./node_modules/spooky/"
  }
}, function (err) {
  if(err) {
    console.log(err);
  }
  spooky.start("http://www.google.com");
  spooky.then(function () {
    console.log("7331");
    this.emit("printmsg", "1337");
  });
  spooky.run();
});

spooky.on("printmsg", function (msg) {
  console.log(msg);
});

spooky.on("error", function (e) {
  console.error(e);
});

Когда беги, 1337 будет отображаться, но 7331 не буду. Почему это? Причина, по которой я спрашиваю, состоит в том, что это затрудняет отладку, когда вы хотите записать значения определенных переменных.

Также, если вы хотите изменить функцию then, сделайте так:

spooky.then(function () {
  var self = this;
  this.evaluate(function () {
    self.emit("printmsg", "Hello World!");
  });
});

Это не сработает, потому что evaluate не имеет доступа к переменной self. В PhantomJS вы можете сделать это page.evaluate(function (self) { но это не работает, когда я пытаюсь сделать это с Spooky. Поэтому очень сложно регистрировать данные, когда вы хотите.

Это можно обойти?

2 ответа

Решение

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

В стандартном примере быстрого запуска на странице SpookyJS Github в Spooky есть закомментированный прослушиватель событий 'console', который, если его не комментировать, приведет к тому, что весь вывод из Casper будет отображаться на экране:

// Uncomment this block to see all of the things Casper has to say.
// There are a lot.
// He has opinions.
spooky.on('console', function (line) {
    console.log(line);
});

Когда этот прослушиватель событий установлен, он будет записывать весь вывод Каспера на экран. Все примеры, которые я пытался записать на консоль в моем вопросе, выполнялись внутри вызовов, которые Spooky передавал Касперу для обработки, поэтому я не видел их отображаемых. С этим установленным слушателем событий выводится мой вывод, а также вывод, используемый __utils__.echo вызов функции в ответе xShirase.

Кроме того, Каспер обеспечивает echo функция, которая может использоваться для отправки вывода за пределы функции оценки Каспера, которая по умолчанию имеет доступ только к области просмотра страницы:

spooky.then(function () {
  this.echo("foo");
});

Поскольку стандартная конфигурация устанавливает уровень регистрации Casper в debug и устанавливает подробный вход в систему, много информации будет отображаться, как только этот прослушиватель событий установлен. Этого можно избежать, установив уровень ведения журнала в error или какой-либо другой уровень ведения журнала, поддерживаемый Casper.

О, как я боролся с этим! Сначала я в основном делал:

var msg = this.evaluate(function () {
    return('1337');
  });
console.log(msg);

Затем я обнаружил, что Каспер внедряет действительно полезный модуль clientutils на каждую страницу: http://docs.casperjs.org/en/latest/modules/clientutils.html

Это позволяет отправлять журналы с удаленного DOM следующим образом:

casper.then(function () {
this.evaluate(function () {
    __utils__.echo('1337');
  });
});
Другие вопросы по тегам