SpookyJS: Консоль.тогда журнал не работает внутри


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 2

2 ответа:

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

В стандартном примере быстрого запуска на странице SpookyJS Github есть закомментированный слушатель событий консоли в Spooky, который при раскомментировании вызовет появление на экране всех выходных данных 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.

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

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

Поскольку стандартная конфигурация устанавливает уровень регистрации Каспера в 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');
  });
});