木偶获得pdf下载链接的回复

时间:2018-10-18 19:24:19

标签: javascript node.js puppeteer

我正在自动进行网站的回归测试,其中一项任务是验证pdf下载。我为此使用Puppeteer和Chromium。我发现以无头模式下载文件相当困难。我认为不宜下载文件,而应该从页面和文件大小中寻找响应,这是审慎的做法。我的问题:当我尝试导航至页面时,似乎什么也没发生。我收到超时错误。这是我尝试使用的代码:

const filename = new RegExp('\S*(\.pdf)');
await page.waitForSelector('#download-pdf', {timeout: timeout});
console.log('Clicking on "Download PDF" button');
const link = await page.$eval('#download-pdf', el => el.href);
await Promise.all([
    page.goto(link),
    page.on('response', response => {
        if(response._headers['content-disposition'] === `attachment;filename=${filename}`){
            console.log('Size: ', response._headers['content-length']);
        }
    })
]);

编辑

如果有人了解page.goto()如何忽略.pdf页,这对我非常有用。

让我更好地定义问题。单击网页上的download pdf按钮后,将触发一个事件,该事件生成pdf文件,并向用户发送唯一的URL。短时间后,该URL被销毁。为了达到这一点,我相信我必须使用page.click()来触发事件并生成url。但是,page.click()也在尝试导航到pdf网址,该网址在无头模式下被拒绝。我需要做的是获取URL并测试其响应。

1 个答案:

答案 0 :(得分:0)

我想出了一个解决方案。我会将其发布在这里,供以后几天遇到类似问题的其他任何人使用。这里的想法是创建一个事件侦听器,以侦听任何和所有响应。由于我只关心以.pdf结尾的页面的响应,因此我只对这些响应采取行动。

page.on('response', intercept=>{
    if(intercept.url().endsWith('.pdf')){
        console.log(intercept.url());
        console.log('HTTP status code: %d', intercept.status());
        console.log(intercept.headers());
    }
});