在Nightmare JS中点击()和wait()之后获取POST请求标头

时间:2017-07-27 09:39:06

标签: javascript node.js nightmare

我正在抓取一个页面,其中type()在输入字段中click()一个按钮,然后wait()以显示某个元素。

我想获取在click()之后触发的POST请求的所有标头。

我看到goto()会返回标题,但我不认为我可以在我的情况下使用它,因为在click()之后我会停留在同一页面上。

以下是我在另一个测试页面上的代码示例(我想在wait()之后获取POST请求标头):

var Nightmare = require('nightmare');
var nightmare = Nightmare({ show: true });

nightmare
    .goto('https://jigsaw.w3.org/HTTP/300/')
    .click('tbody tr:nth-child(5) td form input[type=submit]')
    .wait('body p:nth-of-type(3)')
    .evaluate(function () {
        return document.querySelector('body p:nth-of-type(3)').innerText;
    })
    .end()
    .then(function (result) {
        console.log(result);
    })
    .catch(function (error) {
        console.error('Search failed:', error);
    });

注意:我使用Nightmare 2.10.0和Node.js 8.1.3。

1 个答案:

答案 0 :(得分:0)

我知道没有简单的方法可以做到这一点。

但是,您可以获得该信息。

通过.on('did-get-response-details', callback)

如果您致电.on('did-get-response-details'),其回拨将包含以下信息:

  • event Event
  • status Boolean
  • newURL String
  • originalURL String
  • httpResponseCode Integer
  • requestMethod String
  • referrer String
  • headers Object
  • resourceType String

您必须在致电.on(<event>)之前致电.goto()

可用事件列表位于:https://electron.atom.io/docs/api/web-contents/#instance-events

通过.evaluate

您可以通过ajax直接转到POST端点(而不是通过表单提交提交表单)。

从这里偷来的Ajax示例:Send POST data using XMLHttpRequest

nightmare.evaluate(() => {
    return new Promise((resolve, reject) => {
        var http = new XMLHttpRequest();
        var url = "get_data.php";
        var params = "lorem=ipsum&name=binny";
        http.open("POST", url, true);

        http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

        http.onreadystatechange = function() {
            if(http.readyState == 4 && http.status == 200) {
                resolve(http); // <- Get some data here
            }
        }
        http.send(params);
    });
});

这两个想法如何专门针对您的用例取决于某些事情。