我正在抓取一个页面,其中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。
答案 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);
});
});
这两个想法如何专门针对您的用例取决于某些事情。