1

使用 nightmarejs,我想遵循几个重定向和自动表单提交,这是由页面脚本调用的。并想得到最后一页。

比如这样的页面内容http://myexample/

<html><body>
<form action="http://somewhere/" method="post">
  <!-- some params -->
</form>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
$('form').submit();
</script>
</body></html>

此页面的脚本元素提交表单。并发送 post 请求http://somewhere/。然后http://somewhere/返回 302 响应http://another/

为了得到最后一页(http://another/),我尝试了这样的 nightmarejs 代码:

var Nightmare = require('nightmare');
new Nightmare()
    .goto('http://myexample/')
    .wait(1000)
    .url(function(url) {
        console.log(url);
    })
    .evaluate(function () {
        return window.location.href;
    }, function (res) {
        console.log(res);
    })
    .run();

我尝试了各种url方法evaluate,但我无法获得最后一页。

有没有办法支持这样的案例?也欢迎使用 casperjs 或 phantomjs 的答案。

更新

我已经尝试过 PhanomJS 并且能够跟踪重定向。但是还有另一个问题是连接因SSL Handshake failed错误而失败。我已经解决了这个添加--ssl-protocol=any选项。

4

2 回答 2

2

您可以使用 .wait(fn[, arg1, arg2,...]) 方法跟随重定向。

var loginUrl = '...';
var loggedInUrl = '...';
new Nightmare().goto(loginUrl)
  .type('#username', '')
  .type('#password', '')
  .click('#loginBtn')
  .wait(function () {
    return window.location.href === loggedInUrl;
  });

或者,如果目标 URL 上有一些唯一的 DOM 元素,您可以使用 .wait(selector) 方法。在此处查看文档:https ://github.com/segmentio/nightmare

于 2016-11-16T05:20:27.887 回答
0

您可以使用 API 中描述的事件来检查重定向何时发生。如果您使用该urlchanged事件,您将获得可以使用的新 URL。

https://github.com/segmentio/nightmare#onevent-callback

于 2015-05-06T17:16:29.400 回答