Node.js puppeteer 错误 DeprecationWarning 和 UnhandledPromiseRejectionWarning

时间:2021-04-29 20:59:24

标签: node.js puppeteer

我是使用 node.js 和 puppeteer 的新手,我不断收到三个错误,我似乎无法弄清楚为什么我会收到这些错误或如何修复它们。

我试图一遍又一遍地抓取同一个网站,但有时最终会出现错误。

错误一:

UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'close' of undefined

错误二:

UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)

错误三:

DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

我的代码:

const puppeteer = require("puppeteer");
const referers = require('./models/referers.json');
const agents = require('./models/agents.json');
const log = console.log;
const waitForDelay = (time) => {
  try {
    return new Promise((resolve) => {
      setTimeout(resolve, time);
    });
  } catch (error) {
    log('delay error', error);
  }
};

const runPuppeteer = async() => {
  let browser, page;

  try {
    log('started puppeteer');
    const randomAgent = agents[Math.floor(Math.random() * agents.length)];
    const randomReferer = referers[Math.floor(Math.random() * referers.length)];
    log('randomAgent', randomAgent, '\n randomReferer', randomReferer);
    
    browser = await puppeteer.launch({
      headless: true,
      ignoreHTTPSErrors: true,
      slowMo: 10,
      args: [
        "--no-sandbox",
        "--disable-setuid-sandbox"
        ]
    });
    
    page = await browser.newPage();
    await page.setUserAgent(randomAgent);
    await page.setJavaScriptEnabled(true);
    await page.setExtraHTTPHeaders({ referer: randomReferer, 'Accept-Language': 'en' });
    await page.setViewport({ width: 1680, height: 1050 });
    await page.goto('https://SiteUrl.com', { waitUntil: 'domcontentloaded', timeout: 60000 });

    await page.waitForSelector('.mwButton', { visible: true, timeout: 60000 });
    const buttonElement = await page.$('.mwButton');

    if (await buttonElement.isIntersectingViewport()) {
      await page.click(".mwButton");
      log('button clicked');
      log(await page.title());
      await waitForDelay(10000);
      await page.screenshot({ path: 'screenshot.png' });
    } else {
      log('button not clicked');
    }
    
  } catch(error) {
    log(error.message);
  } finally {
    await browser.close();
    log('closing browser');
    await setTimeout(runPuppeteer, 10000);
  }
};

1 个答案:

答案 0 :(得分:1)

当异步函数出现异常时,节点会抛出这些非常常见的通用错误。

您代码中的问题是 finally 子句,它试图关闭浏览器,但是当您的代码无法创建浏览器对象时,它在到达 finally 时仍然是未定义的。

您可以执行 {{1}} 以确保它存在,如果不存在,则尝试关闭它没有意义...