我知道这应该很简单。但是如何返回值以在函数外部使用,我无法使其正常工作。可以下载文件,并且在控制台中返回
值:附件; filename =“ filename”
await page._client.send('Page.setDownloadBehavior', {behavior: 'allow', downloadPath: './tmp'})
await page.click('download');
await page.on('response', resp => {
var header = resp.headers();
console.log("value: " + header['content-disposition']);
});
但这和我尝试过的所有内容一无所获
await page.on('response', resp => {
var header = resp.headers();
return header['content-disposition'];
});
我希望能够返回下载文件的文件名,文件大小等,以便在脚本中进一步使用。
如何返回和访问响应值?
答案 0 :(得分:5)
您不应该在await
之前使用page.on()
运算符。
Puppeteer page
类扩展了Node.js的本机EventEmitter
,这意味着每当调用page.on()
时,您都在使用Node.js的emitter.on()
设置事件侦听器
这意味着您触发page.on('response')
事件时将执行您包含在response
中的功能。
您不从事件处理程序中返回值。而是在事件发生时执行事件处理程序中的功能。
如果要在函数中使用page.on()
的结果,则可以使用以下方法:
const example_function = value => {
console.log(value);
};
page.on('response', resp => {
var header = resp.headers();
example_function(header['content-disposition']);
});
答案 1 :(得分:0)
从您的回答中我已经意识到我犯了一些初学者错误。
Puppeteer等待-我虽然等待page.on()会暂停脚本直到完成。我错了。
我已将page.on()放入导致错误的循环内,它应该在外面。
在下载开始并调用page.on()之前,脚本将转到下一个下载页面。
我应该将文件保存在page.on()内部,而不是外部。
如果我错了,请纠正我。
这就是我想做的。(缩写)
async function main() {
await page.goto(page, { waitUntil: 'networkidle0' });
for(loop through download pages){
await page.click(download);
await page.on('response', resp => {
var header = resp.headers();
return header['content-disposition'];
});
save.write(header['content-disposition']);
}
}
main();
这是行得通的。
async function main() {
page.on('response', resp => {
var header = resp.headers();
var fileName = header['content-disposition'];
save.write(fileName);
});
await page.goto(startPage, { waitUntil: 'networkidle0' });
for(loop through download pages){
await page.goto(downloadPage, { waitUntil: 'networkidle0' });
await page.click(download);
await page.waitFor(30000);
//download starts
//page.on called and saves fileName
//page.waitFor gives it time to complete before starting next loop
}
}
main();
await page.waitFor(30000);
我不知道是否需要等待。
和page.waitFor(30000);放慢脚本的速度,但是如果没有它,我将无法运行它。也许有更好的方法。