29

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

});
4

5 回答 5

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。

于 2013-05-23T08:45:45.840 回答
17

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

解决方法是分配:

window.console.log = function(msg) { alert(msg) }; 

在页面内。评估

然后使用:

page.onAlert = function(msg) {
  console.log(msg);
};

赶上警报

于 2013-07-19T04:42:48.613 回答
10

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

page.onConsoleMessage = function (msg) {
  console.log(msg);
};

console.log然后在evaluate's 回调中触发你的 s :

page.evaluate(function() {
  console.log("some logged message");
});
于 2015-01-06T11:48:29.020 回答
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');

幻影.js 文件。在这里,我使用一种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);
})
于 2013-12-14T00:45:19.620 回答
0

确保您的 phantomjs 设置不会禁用执行 javascript

page.settings.javascriptEnabled = true;
于 2014-07-10T07:15:15.480 回答