web-dev-qa-db-ja.com

phantomJS-引数をJSファイルに渡します

現在、次のコマンドを使用してphantomJSを実行しています

exec('./phantomjs table.js',$op,$er);

table.js

var page = require('webpage').create();
page.open('table.php', function () {
    page.render('table.png');
    phantom.exit();
});

これは目的を果たします。しかし、今は動的変数、つまりdateを操作する必要があります。それで、execコマンドライン内でPHPまたはJavascript変数を渡して、table.js内でその変数を使用できるようにすることは可能ですか?

更新

ここに投稿された解決策に従ってコードを変更してみました execを介してPhantomJSに変数を渡す

exec('./phantomjs table.js http://www.yahoo.com',$op,$er);

table.js

var args = require('system').args;
var page = require('webpage').create();
var address = system.args[1];
    page.open(address, function () {
        page.render('table.png');
        phantom.exit();
    });

しかし、これは2つの問題を引き起こします。

  • プロセス全体が完了するまでに約3〜4分かかります
  • その後、「サーバーが見つかりません」というメッセージが表示されます

変更したコードを削除すると、すべてが期待どおりに機能します。

その他のデバッグ

内部table.js私はこれを使用しました:

var args = require('system').args;
args.forEach(function(arg, i) {

    console.log(i+'::'+arg);

});

var page = require('webpage').create();
var address = 'http://www.gmail.com';
page.open(address, function () {
    page.render('github.png');
    phantom.exit();
});

これを実行すると、私の$opexecコマンドから)はこれを出力します:

Array ( [0] => 0::table.js [1] => 1::http://www.yahoo.com )

ここまでは順調ですね。しかし、私が以下のコードを置くとすぐに、同じ問題が発生します

var args = require('system').args;

var page = require('webpage').create();
var address = system.args[1]; // <--- This line is creating problem, the culprit
page.open(address, function () {
    page.render('github.png');
    phantom.exit();
}); 

それは正しい構文ではないようです。私が見ることができない明らかなものはありますか?

17
asprin

コードの問題は単純な見落としです。

を使用してすでに引数を保存しています

var args = require('system').args;

したがって、それらを参照する必要がある場合は、次のことを行うだけで済みます。

var address = args[1];

「システム」の使用は、まったく異なる配列を調べています

31
darkrat

私はこれをしなければならなかった、そしてこの答えは私の最終的な答えを見つけることを私に示した、しかしここで何人かの人々が私のブラウザがクラッシュしていると言ったので...私は問題と解決策を見つけそして共有する価値があると思った...

これは、次の場合に完全に正常に機能します。

exec('phantomjs phdemo.js http://google.com', $o, $e); ?>

var page = require('webpage').create();
var system = require('system');
var address = system.args[1]; 
page.open(address, function () {
    page.render('output.pdf');
    phantom.exit();
 }); 

ただし、たとえばgoogle.com?searchteext&date = todayなどのURLアドレスにuneを超えるパラメータを渡したい場合は、文字「&」が別のコマンドとして期待されているため、ブラウザがクラッシュすることがわかりました。

私の解決策は同じものを使用することでしたが、置く代わりに@記号を使用したので、URLはgoogle.com?searchteext @ date = todayのようになります。

次に、もう一方の端に文字列置換を追加しました

var address = address.replace(/@/gi,"&");

その後、すべてが完全に正常に機能します....それを行う他の方法があるかもしれませんが、これは私にとって完全に機能しました

3
user3085999