2016-02-25 30 views
0

我最近開始使用horseman.js來爲節點廢棄一個頁面。我無法弄清楚它是如何工作的,我在互聯網上找不到好的例子。如何使用HorsemanJs和PhantomJS處理Node.JS中的重定向

我的主要目標是登錄平臺並提取一些數據。我設法用PhantomJS做到這一點,但知道我想學習如何用horseman.JS做到這一點。

我的代碼應該打開登錄頁面,填寫登錄名和密碼輸入,然後單擊「登錄」按鈕。到目前爲止很容易。但是,點擊「登錄」按鈕後,該網站會在加載我想要工作的實際頁面之前創建2個重定向。

我的問題是,我不知道如何讓我的代碼等待該頁面。

隨着phantomJS我有一個解決方案與頁面的URL。下面的代碼演示如何從來就與管理,以phantomJS做到這一點,它工作得很好:

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

var urlHome = 'http://akna.com.br/site/montatela.php?t=acesse&header=n&footer=n'; 

var fillLoginInfo = function(){ 
    $('#cmpLogin').val('mylogin'); 
    $('#cmpSenha').val('mypassword'); 
    $('.btn.btn-default').click(); 
}; 

page.onLoadFinished = function(){ 

    var url = page.url; 
    console.log("Page Loaded: " + url); 

    if(url == urlHome){ 
     page.evaluate(fillLoginInfo); 
     return; 
    } 

    // After the redirects the url has a "sid" parameter, I wait for that to apear when the page loads. 
    else if(url.indexOf("sid=") >0){ 
    //Keep struggling with more codes! 
    return; 
} 

} 

page.open(urlHome); 

不過,我不能找到一種方法來處理與horseman.JS重定向。

這裏是從來就一直試圖與horseman.JS沒有任何成功:

var Horseman = require("node-horseman"); 
var horseman = new Horseman(); 

var urlHome = 'http://akna.com.br/site/montatela.php?t=acesse&header=n&footer=n'; 

var fillLoginInfo = function(){ 
    $('#cmpLogin').val('myemail'); 
    $('#cmpSenha').val('mypassword'); 
    $('.btn.btn-default').click(); 
} 

var okStatus = function(){ 
    return horseman.status(); 
} 

horseman 
    .open(urlHome) 
    .type('input[name="cmpLogin"]','myemail') 
    .type('input[name="cmpSenha"]','mypassword') 
    .click('.btn-success') 
    .waitFor(okStatus, 200) 
    .screenshot('image.png') 
    .close(); 

如何處理重定向?

回答

1

我目前正在解決同樣的問題,到目前爲止我的最佳解決方案是使用waitForSelector方法在最終頁面上定位某些內容。

E.g.

horseman 
    .open(urlHome) 
    .type('input[name="cmpLogin"]','myemail') 
    .type('input[name="cmpSenha"]','mypassword') 
    .click('.btn-success') 
    .waitForSelector("#loginComplete") 
    .screenshot('image.png') 
    .close(); 

當然,你必須知道你正在等待這樣做的頁面。

如果您知道有兩個重定向,您可以使用兩次.waitForNextPage()的方法。一個天真的方法,如果你不知道有多少重定向,將鏈接這些,直到超時(我不推薦這個,因爲它會很慢!),

也許一個更聰明的方法,你可以還使用on事件捕獲重定向,如.on('navigationRequested').on('urlChanged')

雖然它不直接回答您的問題,但該鏈接可能會有所幫助:https://github.com/ariya/phantomjs/issues/11507