2013-05-22 6 views
27

私はPhantomJs初心者です。このサイトの同様の投稿をチェックしました。私の質問は、なぜ 'foo'がコンソールに記録されていないか、または印刷されているのですか?phantomjs page.evaluateコンソールにログオンしていません

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

}); 

答えて

48

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

出力:場合は、あなたのURLとして:

$ phantomjs /tmp/idiot.js 
console: 42 
Done 

ところで、あなたは "ブランクについて" を使用してpage.open呼び出すことができます評価機能をサンドボックステストするだけです。標準エラー出力に

+0

私はちょうど追加され、何も起こらなかった。 それはぶら下がっています。出なくても。つまり、最初に機能する機能が分からないということです。 page.openまたはpage.onConsoleMessage!主な機能はありません!デバッガはありますか? – Raaj

+0

私は怒っている鳥 'foo'変数をここで逃しました:** '}、foo);' **。ありがとう。どこで私はページを取得するのですか?​​は機能しますか?そこにはctagsがありますか?これらのjavascriptsツールなしでリアルタイムの無駄。私はPythonからインポートできるものがありますか? os.shellとは別に、これらのphantomjs javascriptをPythonにどのようにインポートしますか?私はpyphantomjsを試しましたが、それほど説得力がありません。 – Raaj

+0

これを持って[リンク](http://stackoverflow.com/questions/13287490/is-there-a-way-to-use-phantomjs-in-python)。いいね。 ajaxが値をロードするまで待つのだろうか。私が試してみましょう。 – Raaj

17

出力は約

仕事が割り当てされて私のために動作しませんでした:

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

をpage.evaluate

内で次に使用:

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

をしますアラートをキャッチ

+0

私のために働いた。 +1 –

+0

私のために働いた。 +1 – timwebdev

0

phantomjsを使用していくつかのGoogle閉鎖テストを自動化し、デバッグする必要がある問題が発生しました。テストページからカスタムイベントをディスパッチして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

ありコンソールロギングと過去にいくつかの問題があったが、phantomjs上の現在のバージョン(1.9.8)で、次のことができ、あなたのphantomjsの設定ではJavaScript

page.settings.javascriptEnabled = true; 
8

を実行して無効にしていないことを確認します操作を行います。

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

その後、evaluateのコールバックであなたのconsole.log秒を離れて火災:

page.evaluate(function() { 
    console.log("some logged message"); 
}); 
関連する問題