木偶如何返回page.on响应值

时间:2018-07-22 03:54:12

标签: javascript puppeteer

我知道这应该很简单。但是如何返回值以在函数外部使用,我无法使其正常工作。可以下载文件,并且在控制台中返回

值:附件; 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'];  
 });

我希望能够返回下载文件的文件名,文件大小等,以便在脚本中进一步使用。

如何返回和访问响应值?

2 个答案:

答案 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)

从您的回答中我已经意识到我犯了一些初学者错误。

  1. Puppeteer等待-我虽然等待page.on()会暂停脚本直到完成。我错了。

  2. 我已将page.on()放入导致错误的循环内,它应该在外面。

  3. 在下载开始并调用page.on()之前,脚本将转到下一个下载页面。

  4. 我应该将文件保存在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);放慢脚本的速度,但是如果没有它,我将无法运行它。也许有更好的方法。