【问题标题】:UnhandledPromiseRejectionWarning: error throwing inside of an async function without a catch block, promise which was not handled with .catch()UnhandledPromiseRejectionWarning:在没有catch块的异步函数内部抛出错误,未使用.catch()处理的承诺
【发布时间】:2021-04-19 02:45:25
【问题描述】:

我希望你能帮助我,我已经使用 node.js 很短的时间,只有一个星期的 puppeteer,我做了一个小的 excrip 来自动化任务,当运行脚本时它会正确地执行这个过程一目了然。


但是,控制台向我抛出了两种类型的错误:

1st - UnhandledPromiseRejectionWarning: TimeoutError: waiting for selector .flexMain> div> div> #PageContent_AuthorisedButtons> .btn failed: timeout 30000ms exceeded 在新的 WaitTask 中

2nd - UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch () 处理的承诺。


我很感激帮助解决问题,因为我被卡住了,看不到解决方案。


const puppeteer = require('puppeteer');

(async () => {
    try {

        const browser = await puppeteer.launch({
            headless: false,
            userDataDir: "./cache",
            ignoreDefaultArgs: [
                "--disable-extensions",
                "--enable-automation"
            ],
            args: [
                "--no-sanbox",
                "--disable-setuid-sandbox",
                "--disable-dev-shm-usage",
                "--disable-gpu"
            ]
        })

        const page = await browser.newPage();
        page.setRequestInterception(true);
        page.on("request", async req => {
            if (req.url().endsWith(".png")) {
                req.abort();
            } else {
                req.continue();
                
                await page.waitForSelector('.flexMain > div > div > #PageContent_AuthorisedButtons > .btn');
                await page.click('.flexMain > div > div > #PageContent_AuthorisedButtons > .btn');
            }


        });



        page.on('error', e => console.log(e));

        await page.goto('http://example.com');

        await page.setViewport({ width: 1920, height: 926 });

        await page.waitForSelector('.flexMain > div > div > #PageContent_UnauthorisedButtons > .btn');
        await page.click('.flexMain > div > div > #PageContent_UnauthorisedButtons > .btn');

        await page.type('.row #SignInEmailInput', 'example@gmail.com');

        await page.waitForSelector('.col-md-7 > #SignInForm > .form-group > div:nth-child(2) > a');
        await page.click('.col-md-7 > #SignInForm > .form-group > div:nth-child(2) > a');

        const collectCaptcha = await page.$('#adcopy-puzzle-image-image');
        collectCaptcha.screenshot({ path: 'src/img/capture-captcha.png' });

        const urlImageCaptcha = path.join(__dirname, 'img/capture-captcha1.png');

        // page.waitForTimeout(10000)


        // await browser.close()

    }
    catch (e) {

    }

})()

【问题讨论】:

    标签: javascript node.js puppeteer


    【解决方案1】:

    page.on("request", ...) 处理程序中,您将其声明为async 回调并使用await,但您不会从等待中捕获任何异常。放一个try/catch 是该回调中的代码。

       page.on("request", async req => {
            if (req.url().endsWith(".png")) {
                req.abort();
            } else {
                req.continue();
    
                // ==> you don't catch rejections from either of these await statments  <==
                await page.waitForSelector('.flexMain > div > div > #PageContent_AuthorisedButtons > .btn');
                await page.click('.flexMain > div > div > #PageContent_AuthorisedButtons > .btn');
            }
        });
    

    您可以通过以下方式捕获这些可能的拒绝:

       page.on("request", async req => {
          try {
            if (req.url().endsWith(".png")) {
                req.abort();
            } else {
                req.continue();
    
                await page.waitForSelector('.flexMain > div > div > #PageContent_AuthorisedButtons > .btn');
                await page.click('.flexMain > div > div > #PageContent_AuthorisedButtons > .btn');
            }
          } catch(e) {
               console.log(e);
               // do something here with the error
          }
        });
    

    仅供参考,此代码似乎实际上并没有做任何事情。您等待选择然后单击,但在这些发生之后不要执行任何操作。

    【讨论】:

    • 感谢您的快速响应,我已经尝试了几个小时来解决它,但我无法做到,我总是遇到同样的错误,您会很乐意编写正确的代码。
    • @RobertArmand - 我的答案中有代码。请再次检查。
    • 感谢之前的错误已解决,但现在出现了这两个新错误,脚本工作正常,但它让我发疯.. - 错误:协议错误(DOM.resolveNode):给定的节点id 不属于 Promise 中的文档。 - 消息:'协议错误(DOM.resolveNode):给定 id 的节点不属于文档'} {错误:协议错误(DOM.resolveNode):给定 id 的节点不属于 Promise 中的文档
    • jfriend00 我已经设法解决了这个问题,感谢您的解释。
    猜你喜欢
    • 2021-12-25
    • 2019-05-25
    • 2018-12-13
    • 2021-04-28
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2018-08-01
    • 2016-09-30
    相关资源
    最近更新 更多