Phantomjs page.оценить не вход в консоль
Я новичок PhantomJs. Просто проверил подобный пост на этом сайте. Мой вопрос: почему "foo" не записывается в консоль или не печатается?
var page = require('webpage').create()
var foo = 42;
function evaluate(page, func) {
var args = [].slice.call(arguments, 2);
var fn = "function() { return (" + func.toString() + ").apply(this, " + JSON.stringify(args) + ");}";
return page.evaluate(fn);
}
page.open('http://google.com', function() {
var foo = 42;
evaluate(page, function(foo) {
console.log(foo);
},foo);
});
Ответы
Ответ 1
Вызов page.evaluate() запускает ваш оцениваемый код в песочнице. Консоль песочницы не совпадает с консолью PhantomJS.
Следующие строки, добавленные в ваш script, напечатают вашу консоль на странице stderr.
var system = require('system');
page.onConsoleMessage = function(msg) {
system.stderr.writeLine('console: ' + msg);
};
Более полная реализация будет:
var page = require('webpage').create()
var system = require('system');
var foo = 42;
page.onConsoleMessage = function(msg) {
system.stderr.writeLine( 'console: ' + msg );
};
function evaluate(page, func) {
var args = [].slice.call(arguments, 2);
var fn = "function() { return (" + func.toString() + ").apply(this, " + JSON.stringify(args) + ");}";
return page.evaluate(fn);
}
page.open(
'http://google.com',
function() {
var foo = 42;
evaluate(
page,
function(foo) {
console.log(foo);
},
foo
);
console.log( "Done" );
phantom.exit( 0 ); // must exit somewhere in the script
}
);
Выходы:
$ phantomjs /tmp/idiot.js
console: 42
Done
Кстати, вы можете вызвать page.open, используя "about: blank" в качестве URL-адреса, если вы хотите, чтобы песочница тестировала функцию оценки.
Ответ 2
Выход для стандартной ошибки не работал у меня
работа вокруг присваивает:
window.console.log = function(msg) { alert(msg) };
внутри страницы. Оценить
Затем используйте:
page.onAlert = function(msg) {
console.log(msg);
};
чтобы поймать предупреждение
Ответ 3
В прошлом были проблемы с консольным протоколированием, но с текущей версией на phantomjs (1.9.8) вы можете сделать:
page.onConsoleMessage = function (msg) {
console.log(msg);
};
затем отпустите свой console.log
в обратном вызове evaluate
:
page.evaluate(function() {
console.log("some logged message");
});
Ответ 4
Я использую phantomjs для автоматизации некоторых тестов Google Closure и столкнулся с проблемой, которую мне нужно было отлаживать. Я смог отправить пользовательские события со своей тестовой страницы и получить их внутри page.evaluate
.
Файл для записи сообщений:
function logger(msg) {
var evt = document.createEvent('CustomEvent'); // MUST be 'CustomEvent'
evt.initCustomEvent('logger', false, false, msg);
document.dispatchEvent(evt);
}
logger('my debug message');
Файл Phantomjs. Здесь я использую метод saveMessage
для хранения строки, но вы можете сделать что-то более подходящее для ваших нужд.
var exec = page.evaluate(function () {
window.phantomRunner = new window.goog.testing.TestRunner();
window.phantomTest = new window.goog.testing.TestCase();
// Listen for `logger` events. The message is stored inside the event detail property.
document.addEventListener('logger', function(e) {
window.phantomTest.saveMessage(e.detail);
});
window.phantomTest.autoDiscoverTests();
window.phantomRunner.initialize(window.phantomTest);
window.phantomRunner.execute();
return (window.phantomTest.result_.messages);
})
Ответ 5
Убедитесь, что ваш параметр phantomjs не отключает выполнение javascript
page.settings.javascriptEnabled = true;