2017-07-27 29 views
0

我正在抓取页面,其中某个输入字段是type()click()是某个按钮,然后是wait()以显示某个元素。在Nightmare JS中单击()和wait()之后获取POST请求标头

我想获得的是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); 
    }); 

注:我用的噩梦2.10.0和Node.js的8.1。 3。

回答

0

有这样做的,我所知道的没有简单的方法。

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

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

如果你打电话.on('did-get-response-details')其回调将具有以下信息:

  • eventEvent
  • statusBoolean
  • newURLString
  • originalURLString
  • httpResponseCodeInteger
  • requestMethodString
  • referrerString
  • headersObject
  • resourceTypeString

你必须调用.on(<event>)调用之前10。

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

通过.evaluate

你可以通过AJAX直接进入POST端点(而不是通过表单提交提交表单)。

阿贾克斯例如从这里被盗: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); 
    }); 
}); 

如何这两种想法会专门解决你的使用情况将取决于一些事情。