phantomjs page.evaluate没有登录到控制台

Raa*_*aaj 29 phantomjs

我是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);

});
Run Code Online (Sandbox Code Playgroud)

PP.*_*PP. 51

调用page.evaluate()在沙箱中运行已评估的代码.沙箱的控制台与PhantomJS的控制台不同.

添加到脚本中的以下行将打印页面的控制台到stderr.

var system = require('system');

page.onConsoleMessage = function(msg) {
    system.stderr.writeLine('console: ' + msg);
};
Run Code Online (Sandbox Code Playgroud)

更完整的实施将是:

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
  }
);
Run Code Online (Sandbox Code Playgroud)

输出:

$ phantomjs /tmp/idiot.js 
console: 42
Done
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果您只想对评估函数进行沙箱测试,可以使用"about:blank"作为您的URL调用page.open.


Bra*_*rad 17

输出到标准错误对我不起作用

解决方法是分配:

window.console.log = function(msg) { alert(msg) }; 
Run Code Online (Sandbox Code Playgroud)

在页面内.评估

然后使用:

page.onAlert = function(msg) {
  console.log(msg);
};
Run Code Online (Sandbox Code Playgroud)

赶上警报


Bog*_*n D 9

过去使用控制台日志记录存在一些问题,但是使用phantomjs(1.9.8)上的当前版本,您可以:

page.onConsoleMessage = function (msg) {
  console.log(msg);
};
Run Code Online (Sandbox Code Playgroud)

然后console.logevaluate回调中解雇你的s:

page.evaluate(function() {
  console.log("some logged message");
});
Run Code Online (Sandbox Code Playgroud)