Я автоматизирую регрессионное тестирование для веб-сайта, и одной из задач является проверка загрузки 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()
. Однако page.click()
также пытается перейти к URL-адресу pdf, который отклоняется в режиме безглавых. Что мне нужно сделать, это получить URL-адрес и проверить на него ответ.
Я понял решение. Я отправлю его здесь для всех, кто сталкивается с аналогичной проблемой в предстоящие дни. Идея здесь заключается в создании прослушивателя событий для прослушивания любых ответов. Поскольку я только заботился о ответах с страниц, заканчивающихся на .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());
}
});