我是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);
});
答案 0 :(得分:51)
调用page.evaluate()在沙箱中运行已评估的代码。沙盒的控制台与PhantomJS的控制台不同。
添加到脚本中的以下行将打印页面控制台到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
顺便说一句,如果您只想对评估函数进行沙盒测试,可以使用“about:blank”作为您的URL调用page.open。
答案 1 :(得分:17)
输出到标准错误对我不起作用
解决方法是分配:
window.console.log = function(msg) { alert(msg) };
页面内的。评估
然后使用:
page.onAlert = function(msg) {
console.log(msg);
};
抓住警报
答案 2 :(得分:8)
过去使用控制台日志记录存在一些问题,但是使用phantomjs(1.9.8)上的当前版本,你可以这样做:
page.onConsoleMessage = function (msg) {
console.log(msg);
};
然后在console.log
的回调中点击你的evaluate
:
page.evaluate(function() {
console.log("some logged message");
});
答案 3 :(得分:0)
我正在使用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's 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);
})
答案 4 :(得分:0)
确保您的phantomjs设置不会禁用执行javascript
page.settings.javascriptEnabled = true;