2013-02-26 80 views
1

我試圖用phantomjs獲取頁面內容。在官方網站上的很多例子中(例如:https://github.com/ariya/phantomjs/blob/master/examples/imagebin.js)使用了page.open()函數。
在我的腳本中,雖然它似乎沒有工作。我使用反射來查看頁面對象的所有已定義方法:phantomjs page.open()似乎不存在

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

並且open()方法未顯示。 (關閉(),渲染(),等等都出現了)
還當我試圖執行一個腳本:

// 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沒有方法列表存在。嗯。

回答

1

經過幾個小時的無意識搜索,我發現了錯誤。愚蠢的我。在腳本的結尾,我打電話phantom.exit(),我不應該這樣做。

工作代碼包括一個檢查對象的間隔,在我的情況下是contentcontent.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); 

問候,
亞歷克斯