Как поймать скачивание с драматургом?

Я пытаюсь загрузить файл с веб-сайта с помощью 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);
})();
Другие вопросы по тегам