2016-02-25 90 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