Puppeteer未处理拒绝于:Promise-为什么例外?

时间:2018-11-02 13:10:23

标签: javascript node.js google-chrome-devtools puppeteer headless-browser

我是Puppeteer和JavaScript的新手。我正在尝试自动化一些简单的任务,只是这些元素出现在iframe中-但我已经解决了这一问题。我不清楚的是取消注释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.

妥善处理此问题的最佳方法是什么,为什么我不能仅关闭浏览器?请记住,我仍在学习Promises和必须为他们履行的合同。

1 个答案:

答案 0 :(得分:0)

首先,您要访问的网站需要验证。

Authentication Required

您可以使用page.authenticate()来提供HTTP身份验证的凭据:

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

此外,您为page.waitForNavigation()设置的timeout仅为3000毫秒(3秒),而默认值为30000毫秒(30秒),因此花费的时间比设置的页面加载时间长,您将收到TimeoutError

我强烈建议您至少允许默认的最大导航时间30秒才能进行导航。您可以在timeout中使用page.waitForNavigation()选项,也可以使用page.setDefaultNavigationTimeout()

最后,elementHandle.click()返回一个Promise,因此您需要await clothingButton.click()

await clothingButton.click();