1

phantomjsを使用してページコンテンツを取得しようとしています。公式サイトの多くの例(例:https ://github.com/ariya/phantomjs/blob/master/examples/imagebin.js )では、関数page.open()が使用されています。
私のスクリプトでは、機能していないようですが。リフレクションを使用して、ページオブジェクトのすべての定義済みメソッドを調べました。

  for ( var prop in page) {
      if (typeof page[prop] == 'function') {
          log("method in page: " + prop);
      }
  }

そして、open()メソッドは表示されませんでした。(close()、render()などが表示されました)
スクリプトを実行しようとしているときも:

// include plugins
var system = require('system');
var fileSystem = require('fs');
var page = require('webpage').create();

// global errorhandler
phantom.onError = function(msg, trace) {
  console.log("ERROR!!!!! \n" + msg);
  phantom.exit(1);
};

// read json input and remove single outer quotes if set
var jsonin = system.args[1];
if (jsonin.charAt(0) == "'") {
  jsonin = jsonin.substr(1, jsonin.length - 2);
}
// make object of json
var data = eval('(' + jsonin + ')');
// optional url
var url = system.args[2];
// transfer file
var dest = system.args[3];

console.log("systemargs[1]: data -> " + data);
console.log("systemargs[2]: url -> " + url);
console.log("systemargs[3]: dest -> " + dest);

openRoot();

/*
 * open site
 */
function openRoot() {    
  page.onConsoleMessage = function(msg) {
    console.log('INNER ' + msg);
  };

  page.open(url, function(status) {
    if (status === "success") {
      if (loadCount == 0) { // only initial open
        console.log("opened successfully.");
        page.injectJs("./jquery-1.8.3.min.js");
      } else {
        console.log("page open error.");
        console.log('skip refresh ' + loadCount);
      }

    } else {
      console.log("error opening: " + status);
    }
  });
}
phantom.exit(0);

open関数は実行されません。ログには、open()メソッド内のメッセージは表示されません。

私が間違っているかもしれないことについてのアドバイスをいただければ幸いです。追加情報が必要な場合は、お知らせください。
よろしく、
アレックス

編集:

console.log(typeof (page.open));

出力:functionログに書き込んだメソッドの以前のリストを考えると、これは私が期待したものではありopenませんが、存在しません。うーん。

4

1 に答える 1

1

何時間も無意味な検索をした後、私は間違いを見つけました。愚かな私。スクリプトの最後に、phantom.exit()すべきでない場所に電話をかけます。

作業コードには、私の場合はオブジェクトcontentとそのメンバーをチェックするIntervalが含まれていcontent.isFinishedます。これをtrueに設定すると、phantom.exit()呼び出されます。
私の悪い、絶対に私のせい。
作業コード:

var url = system.args[2];
// transfer file
var dest = system.args[3];

content = new Object();
content.isFinished = false;

console.log("systemargs[1]: data -> " + data);
console.log("systemargs[2]: url -> " + url);
console.log("systemargs[3]: dest -> " + dest);

openRoot();

/*
 * open site
 */
function openRoot() {    
  page.onConsoleMessage = function(msg) {
    console.log('INNER ' + msg);
  };

  page.open(url, function(status) {
    if (status === "success") {
      if (loadCount == 0) { // only initial open
        console.log("opened successfully.");
        page.injectJs("./jquery-1.8.3.min.js");

        // do stuff
        content.isFinished = true;
      } else {
        console.log("page open error.");
        console.log('skip refresh ' + loadCount);
        content.isFinished = true
      }

    } else {
      console.log("error opening: " + status);
    }
  });
}

/*
 * wait for completion
 */
var interval = setInterval(function() {
  if (content.isFinished) {
    page.close();

    f = fileSystem.open(dest, "w");
    f.writeLine(out);
    f.close();

    // exit phantom
    phantom.exit();
  } else {
    console.log('not finished - wait.');
  }
}, 5000);

よろしく、
アレックス

于 2013-02-26T11:32:00.337 に答える