【问题标题】:Puppeteer getting response from pdf download linkPuppeteer 从 pdf 下载链接获得响应
【发布时间】:2019-03-23 16:25:19
【问题描述】:

我正在对网站进行自动化回归测试,其中一项任务是验证 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。此网址在短时间内被销毁。为了达到这一点,我相信我必须使用page.click()来触发事件并生成url。但是,page.click() 也在尝试导航到 pdf 网址,该网址在无头模式下被拒绝。我需要做的是获取 url 并测试它的响应。

【问题讨论】:

  • pdf 文件有多大?似乎这个问题已经发展了几个月。 bugs.chromium.org/p/chromium/issues/detail?id=831887
  • @Md 在大多数测试用例中,文件大小为 279KB,但其他测试用例与其他 pdf 文件有关。报告大小更多是为了验证文件不是空的。

标签: javascript node.js puppeteer


【解决方案1】:

我想出了一个解决方案。我会在这里为其他在未来几天遇到类似问题的人发布它。这里的想法是创建一个事件侦听器来侦听任何和所有响应。由于我只关心以 .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());
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-24
    • 2016-11-26
    • 2021-03-09
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    相关资源
    最近更新 更多