web-dev-qa-db-ja.com

変数をpage.evaluateに渡す-PhantomJS

ページで変数を渡すことは可能ですか?以下の場合、評価しますか?

function myFunction(webpage, arg1, arg2){

var page = require('webpage').create();

page.viewportSize = { width: 1920, height: 1080 };

page.open(webpage, function (status){

    if (status == 'success') {

            page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js", function(){

                page.evaluate(function(){

                    arg = arg1 + arg2;
                    console.log(arg);

                });

            });

    } 

    else { phantom.exit(); }

});

}

私はインターネットで見つけたいくつかの方法を試しましたが、実際にその変数に到達することは不可能ではありません。

よろしくお願いします:)

22
Antoine

いつものように、答えは documentation of evaluate関数で明確に述べられています:

PhantomJS 1.6以降、JSONシリアル化可能な引数を関数に渡すことができます。次の例では、DOM要素のテキスト値が抽出されます。次の例は、前の例と同じ最終目標を達成しますが、要素は、evaluate呼び出しに渡されるセレクターに基づいて選択されます。

次の例は、使用方法を示しています。

var title = page.evaluate(function(s) {
    return document.querySelector(s).innerText;
}, 'title');
console.log(title);
69
Ariya Hidayat

私はphantomjs 1.5.0を持っているので、1.6以降のバージョンをコンパイルする代わりに、代替ソリューションを探しました。

したがって、selectors.jsファイルに引数を保存しました

-------------selectors.js starts----------------
var selectors = "div.Nice"
-------------selectors.js   ends----------------

そしてそれらをページに挿入しました:

page.injectJs("selectors.js");

詳細はここにあります: http://phantomjs.org/api/webpage/method/inject-js.html

2
Kostyantyn

私はファントム4.0.4を使用していますが、以下でうまくいきます https://www.npmjs.com/package/phantom

var arg = 'test'
page.evaluate(function(arg) {
    console.log(arg)
}, arg);
0
denisefeng