我是第一次接触JavaScript和Puppeteer库.我知道什么是异步编程,并且我一直在try 在Java中使用它,但当我try 在Puppeteer中使用它时,我得到了错误.

这是我的index.js%文件:

(async () => {
  const browser = await puppeteer.launch({
    headless: false,
  });

  // Disable Facebook notifications
  const context = await browser.defaultBrowserContext();
  await context.overridePermissions('https://www.facebook.com', ['geolocation', 'notifications']);

  const page = await browser.newPage();
  const logger = await myLog.logger;

  console.log('About to use function.');
  await utils.webAction(
    logger, 'Enter Facebook',
    (() => (page.goto(constants.linkHomepage, {waitUntil: ['domcontentloaded', 'networkidle2']})))
  );
  console.log('Content loaded');

  // User Login
  await utils.webAction(
    logger, 'Wait for loginEmail element',
    (() => (page.waitForSelector(constants.cssLoginEmail, {visible: true}))),
  );
  // Using a fake (incorrect) xpath to trigger the "catch" block
  await utils.webAction(
    logger, 'Enter user email using incorrect xpath', utils.webType,
    page, "Fake user", "fake xpath/css"  // Arguments of `webType`
  );
})();

utils.js文件:

module.exports = {
  webAction: function (logger, msg, func, ...args)
  {
    return new Promise((resolve) => {
      let actionMessage, actionLevel;
      try
      {
        func(...args);
        actionMessage = msg;
        actionLevel = 'info';
      }
      catch (error)
      {
        actionMessage = "Error while executing " + msg + " function.\n---\n" + error.message + "\n---";
        actionLevel = 'error';
      }
      finally
      {
        logger.log({
          level: actionLevel,
          message: actionMessage
        })
      }
      console.log('Inside resolve Promise');
      resolve('Fullfilment value of Promise');
      console.log('Last line if resolve body');
    })
  },

  // Type into input field
  webType: function (page, text, xpath)
  {
    page.type(
      xpath, text,
      {delay: getRandomIntInRange(constants.minSpeed, constants.maxSpeed)}
    );
  },

};

我创建了webAction函数,因为我希望代码看起来更干净,并且还可以跟踪程序崩溃的位置(我对实现这一点的其他方法持开放态度).

这是我收到的错误:

About to use function.
info: Enter Facebook {"timestamp":"2024-01-18 16:43:59"}
Inside resolve Promise
Last line if resolve body
Content loaded
info: Wait for loginEmail element {"timestamp":"2024-01-18 16:43:59"}
Inside resolve Promise
Last line if resolve body
info: Enter user email using incorrect xpath {"timestamp":"2024-01-18 16:43:59"}
Inside resolve Promise
Last line if resolve body
/home/user/Projects/Javascript/Facebook/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:85
            this._reject(callback, new Errors_js_1.TargetCloseError('Target closed'));
TargetCloseError: Protocol error (Runtime.callFunctionOn): Target closed
    at CallbackRegistry.clear (/home/user/Projects/Javascript/Facebook/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:85:36)
    at CdpCDPSession._onClosed (/home/user/Projects/Javascript/Facebook/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/CDPSession.js:113:25)
    at Connection.onMessage (/home/user/Projects/Javascript/Facebook/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:132:25)
    at WebSocket.<anonymous> (/home/user/Projects/Javascript/Facebook/node_modules/puppeteer-core/lib/cjs/puppeteer/node/NodeWebSocketTransport.js:52:32)
    at callListener (/home/user/Projects/Javascript/Facebook/node_modules/ws/lib/event-target.js:290:14)
    at WebSocket.onMessage (/home/user/Projects/Javascript/Facebook/node_modules/ws/lib/event-target.js:209:9)
    at WebSocket.emit (node:events:514:28)
    at Receiver.receiverOnMessage (/home/user/Projects/Javascript/Facebook/node_modules/ws/lib/websocket.js:1192:20)
    at Receiver.emit (node:events:514:28)
    at Receiver.dataMessage (/home/user/Projects/Javascript/Facebook/node_modules/ws/lib/receiver.js:560:14) {
  cause: ProtocolError
      at <instance_members_initializer> (/home/user/Projects/Javascript/Facebook/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:96:14)
      at new Callback (/home/user/Projects/Javascript/Facebook/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:100:16)
      at CallbackRegistry.create (/home/user/Projects/Javascript/Facebook/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:32:26)
      at Connection._rawSend (/home/user/Projects/Javascript/Facebook/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:91:26)
      at CdpCDPSession.send (/home/user/Projects/Javascript/Facebook/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/CDPSession.js:78:33)
      at next (/home/user/Projects/Javascript/Facebook/node_modules/puppeteer-extra-plugin-stealth/evasions/sourceurl/index.js:34:41)
      at CdpCDPSession.send (/home/user/Projects/Javascript/Facebook/node_modules/puppeteer-extra-plugin-stealth/evasions/sourceurl/index.js:75:16)
      at #evaluate (/home/user/Projects/Javascript/Facebook/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/ExecutionContext.js:211:50)
      at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
      at async ExecutionContext.evaluateHandle (/home/user/Projects/Javascript/Facebook/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/ExecutionContext.js:178:16)
}

Node.js v18.17.0

我希望能够使用webAction功能,所以如果你有任何 idea ,我可以修复错误,您非常欢迎.

在输出中,它说它正确地进入了Facebook,但这是不正确的,只要浏览器打开它立即关闭! 显然,它没有正确地完成命令语句有人能告诉我发生了什么事,以及如何能够运行这段代码没有任何错误?

推荐答案

在您的webAction函数中,您正在调用这些函数,但您并没有等待这些promise 的解析.

您需要更改utils.js文件以等待函数调用的结果:

module.exports = {
  webAction: async function (logger, msg, func, ...args)
  {
    return new Promise(async (resolve) => {
      let actionMessage, actionLevel;
      try
      {
        await func(...args);
        actionMessage = msg;
        actionLevel = 'info';
      }
      catch (error)
      {
        actionMessage = "Error while executing " + msg + " function.\n---\n" + error.message + "\n---";
        actionLevel = 'error';
      }
      finally
      {
        logger.log({
          level: actionLevel,
          message: actionMessage
        })
      }
      console.log('Inside resolve Promise');
      resolve('Fullfilment value of Promise');
      console.log('Last line if resolve body');
    })
  },

  webType: async function (page, text, xpath)
  {
    await page.type(
      xpath, text,
      {delay: getRandomIntInRange(constants.minSpeed, constants.maxSpeed)}
    );
  },
};

Javascript相关问答推荐

基于变量切换隐藏文本

google docs boldText直到按行执行应用脚本错误

用JavaScript复制C#CRC 32生成器

从Node JS将对象数组中的数据插入Postgres表

Javascript json定制

如何使onPaste事件与可拖动的HTML元素一起工作?

如何使用子字符串在数组中搜索重复项

如何迭代叔父元素的子HTML元素

IF语句的计算结果与实际情况相反

Reaction组件在本应被设置隐藏时仍显示

JavaScript不重定向配置的PATH

变量在导入到Vite中的另一个js文件时成为常量.

MarkLogic-earch.suggest不返回任何值

处理TypeScrip Vue组件未初始化的react 对象

为什么NULL不能在构造函数的.Prototype中工作

react 路由DOM有条件地呈现元素

如何在Highlihte.js代码区旁边添加行号?

使用Perl Selify::Remote::Driver执行Java脚本时出错

如何使pdf.js上的文本呈现为可选?

在Reaction Native中,ScrolltoIndex在结束时不一致地返回到索引0