Как поймать скачивание с драматургом?
Я пытаюсь загрузить файл с веб-сайта с помощью Playwright. Кнопка, которая запускает загрузку, выполняет некоторые js, а затем начинается загрузка.
Нажав кнопку с помощью .click
функция запускает загрузку, но показывает ошибку: Failed - ошибка загрузки.
Я пробовал использовать протокол devtools Page.setDownloadBehavior
, но, похоже, это ничего не дает.
const playwright = require("playwright");
const { /*chromium,*/ devices } = require("playwright");
const iPhone = devices["iPad (gen 7) landscape"];
(async () => {
const my_chromium = playwright["chromium"];
const browser = await my_chromium.launch({ headless: false });
const context = await browser.newContext({
viewport: iPhone.viewport,
userAgent: iPhone.userAgent
});
const page = await context.newPage();
const client = await browser.pageTarget(page).createCDPSession();
console.log(client);
await client.send("Page.setDownloadBehavior", {
behavior: "allow",
downloadPath: "C:/in"
});
//...and so on
await page.click("#download-button");
browser.close();
})();
Есть предложение по лучшей загрузке API в Playwright, но я не могу найти текущий API. Было предположение, что что- то связано сdownloadWillBegin
событие было бы полезно, но я не знаю, как получить к нему доступ от Playwright.
Я открыт для предложения использовать вместо этого Puppeteer, но я перешел к драматургу, потому что я тоже не мог понять, как загрузить файл с помощью Pupeteer, и проблема, связанная с этим, предполагала, что вся команда перешла в Playwright.
4 ответа
Взгляните на page.on("скачать")
const browser = await playwright.chromium.launch({});
const context = await browser.newContext({ acceptDownloads: true });
const page = await context.newPage();
await page.goto("https://somedownloadpage.weburl");
await page.type("#password", password);
await page.click("text=Continue");
const download = await page.waitForEvent("download");
console.log("file downloaded to", await download.path());
К сожалению, я закрывал браузер до того, как началась загрузка.
Оказывается, ошибка загрузки была вызвана client
раздел. Однако это означает, что я не могу контролировать, где будет сохранен файл.
Скачивание работает, когда headless: false
но не когда headless: true
.
Если у кого-то есть лучший ответ, было бы здорово!
Вы можете использовать waitForTimeout
.
Я пробовал с {headless: true}
& await page.waitForTimeout(1000);
работает нормально. Вы можете проверить то же самое здесь
Для загрузки файла (а также его буфера) настоятельно рекомендую этот модуль: Получил модуль узла . Это намного проще, чисто и легко.
(async () => {
const response = await got('https://sindresorhus.com')
.on('downloadProgress', progress => {
// Report download progress
})
.on('uploadProgress', progress => {
// Report upload progress
});
console.log(response);
})();