【问题标题】:How to Handle redirects in Node.JS with HorsemanJs and PhantomJS如何使用 HorsemanJs 和 PhantomJS 在 Node.JS 中处理重定向
【发布时间】:2016-03-17 17:57:09
【问题描述】:

我最近开始使用 horseman.js 来使用 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();

如何处理重定向?

【问题讨论】:

    标签: javascript node.js phantomjs


    【解决方案1】:

    我目前正在解决同样的问题,到目前为止,我最好的解决方案是使用 waitForSelector 方法来定位最终页面上的某些内容。

    例如

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 2014-07-20
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      相关资源
      最近更新 更多