Кукловод Необработанный Отклонено по адресу: Обещание - Почему исключение? - PullRequest
0 голосов
/ 02 ноября 2018

Я новичок в Puppeteer и JavaScript. Я пытаюсь автоматизировать некоторые простые задачи, только чтобы элементы появлялись внутри фреймов - но я решил это. Что мне неясно, так это исключение, которое выдается, когда я раскомментирую await browser.close().

Мой код:

const baseUrl = "https://test-environment.com/ABH2829.html?token=dhdj7s8383937hndkeie8j3jebd";
const puppeteer = require('puppeteer');
const expect = require('chai').expect;

const clickClothingButton = async () => {

    try {
        const browser = await puppeteer.launch({
            headless: false,
            slowMo: 250,
        });

        const page = await browser.newPage();
        await page.setViewport({width: 1280, height: 800});
        process.on('unhandledRejection', (reason, p) => {
           console.error('Unhandled Rejected at: Promise', p, 'reason:', reason);
           browser.close();
        });
        await page.goto(baseUrl, {waitUntil: 'networkidle2'});
         const navigationPromise = page.waitForNavigation({timeout: 3000});
        await page.waitForSelector('.widget-title');
        const frame = page.frames().find(frame => frame.name() === 'iframe');
        const clothingButton = await frame.$('#clothing-button');
        clothingButton.click();
        await navigationPromise;
        await browser.close();

    } catch (error) {
        console.log(error);
        throw new Error(error);
    }
};

clickClothingButton();

Теперь все работает нормально, но я всегда получаю следующее:

Unhandled Rejected at: Promise Promise {
<rejected> Error: TimeoutError: Navigation Timeout Exceeded: 3000ms exceeded

Если я попытаюсь просто:

await browser.close();

Тогда он возражает:

Unhandled Rejected at: Promise Promise {
<rejected> { Error: Protocol error (Runtime.callFunctionOn): Target closed.

Какой лучший способ справиться с этим изящно, и почему я не могу просто закрыть браузер? Помните, что я все еще изучаю Обещания и контракты, которые должны быть выполнены для них.

1 Ответ

0 голосов
/ 02 ноября 2018

Прежде всего, сайт, к которому вы обращаетесь, требует аутентификации.

Authentication Required

Вы можете использовать page.authenticate() для предоставления учетных данных для аутентификации HTTP:

await page.authenticate({
  username: 'username',
  password: 'password',
});

Кроме того, timeout, установленное для page.waitForNavigation(), составляет всего 3000 мс (3 секунды), тогда как по умолчанию используется значение 30000 мс (30 секунд), поэтому, если это займет больше времени чем установленное количество времени для загрузки страницы, вы получите TimeoutError.

Я настоятельно рекомендую разрешить по крайней мере максимальное время навигации по умолчанию, равное 30 секундам, для навигации. Вы можете использовать опцию timeout в page.waitForNavigation() или page.setDefaultNavigationTimeout().

Наконец, elementHandle.click() возвращает Promise, поэтому вам нужно await clothingButton.click():

await clothingButton.click();
...