web-dev-qa-db-ja.com

phantomjs page.evaluateがコンソールにログオンしない

私は 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);

});
29
Raaj

呼び出し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

ちなみに、evaluate関数をサンドボックステストするだけの場合は、URLとして「about:blank」を使用してpage.openを呼び出すことができます。

51
PP.

標準エラーへの出力が機能しませんでした

回避策が割り当てられています:

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

ページ内。評価

次に使用します:

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

アラートをキャッチする

17
Brad

過去にコンソールのロギングでいくつかの問題がありましたが、phantomjs(1.9.8)の現在のバージョンでは、次のことができます。

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

その後、あなたのconsole.logs、evaluateのコールバック:

page.evaluate(function() {
  console.log("some logged message");
});
9
Bogdan D

Phantomjs設定でJavaScriptの実行が無効になっていないことを確認してください

page.settings.javascriptEnabled = true;
0
TroodoN-Mike

私は一部のGoogle Closureテストを自動化するためにphantomjsを使用していて、デバッグに必要な問題に遭遇しました。テストページからカスタムイベントをディスパッチし、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);
})
0
Vestride