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