未处理的Promise拒绝警告:错误:协议错误(Runtime.callFunctionOn):目标已关闭。(Puppeteer)

7

我是 Puppeteer 和 Node 的新手,当我尝试执行下面的代码时出现了以下错误:

'use strict';

const puppeteer = require('puppeteer');
const evalLib = require('./oaa_a11y_evaluation.js');

function evaluateRules() {
  var ruleset = OpenAjax.a11y.RulesetManager.getRuleset("ARIA_STRICT");
  var evaluator_factory = OpenAjax.a11y.EvaluatorFactory.newInstance();
  evaluator_factory.setParameter('ruleset', ruleset);
  evaluator_factory.setFeature('eventProcessing', 'fae-util');
  evaluator_factory.setFeature('groups', 7);
  var evaluator = evaluator_factory.newEvaluator();
  var evaluation = evaluator.evaluate(window.document, document.title, document.location.href);
  // var out = evaluation.toJSON(true);
  return;
}

(async() => {
  const browser = await puppeteer.launch();
  var page = await browser.newPage();
  await page.goto('http://mihirkumar.com/', {waitUntil: 'load'});
  page.evaluate(evaluateRules);
  await browser.close();
})();

以下是完整的错误信息:

(node:27876) UnhandledPromiseRejectionWarning: Error: Protocol error (Runtime.callFunctionOn): Target closed.
at Promise (C:\Users\Mihir\fae\node_modules\puppeteer\lib\Connection.js:200:56)
at new Promise (<anonymous>)
at CDPSession.send (C:\Users\Mihir\fae\node_modules\puppeteer\lib\Connection.js:199:12)
at ExecutionContext.evaluateHandle (C:\Users\Mihir\fae\node_modules\puppeteer\lib\ExecutionContext.js:79:75)
at ExecutionContext.evaluate (C:\Users\Mihir\fae\node_modules\puppeteer\lib\ExecutionContext.js:46:31)
at Frame.evaluate (C:\Users\Mihir\fae\node_modules\puppeteer\lib\FrameManager.js:326:20)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
(node:27876) 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(). (rejection id: 1)
(node:27876) [DEP0018] 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.

其他来自https://github.com/GoogleChromeLabs/puppeteer-examples的示例可以完美运行,因此我不认为需要使用在这里提到的修复措施。感谢您的帮助。


await周围使用try/catch处理拒绝。尽管在这种情况下,你除了打印错误消息并使测试失败之外,没有太多可以做的事情。 - Bergi
在awaits周围放置try catch并不能解决问题。 - Mihir Kumar
是的,这只是让“未处理的拒绝警告”消失而已。我不知道导致协议错误的问题是什么 - 但如果这是你想知道的,你应该[编辑]你的问题并提供一个更合适的标题。 - Bergi
1
值得一提的是,page.evaluate() 返回一个 promise,所以你应该使用 await 等待它执行完毕。目前,你没有等待它完成,而是在 page.evaluate() 结束之前立即执行了 browser.close() - Svenskunganka
显示剩余3条评论
3个回答

5
正如Sven在评论中提到的,你应该在关闭浏览器之前对每个返回promise的page函数使用await(几乎所有函数都是如此)。
试试这个:

'use strict';

const puppeteer = require('puppeteer');
const evalLib = require('./oaa_a11y_evaluation.js');

async function evaluateRules() {
  var ruleset = OpenAjax.a11y.RulesetManager.getRuleset("ARIA_STRICT");
  var evaluator_factory = OpenAjax.a11y.EvaluatorFactory.newInstance();
  evaluator_factory.setParameter('ruleset', ruleset);
  evaluator_factory.setFeature('eventProcessing', 'fae-util');
  evaluator_factory.setFeature('groups', 7);
  var evaluator = evaluator_factory.newEvaluator();
  var evaluation = evaluator.evaluate(window.document, document.title, document.location.href);
  // var out = evaluation.toJSON(true);
  return;
}

(async() => {
  const browser = await puppeteer.launch();
  var page = await browser.newPage();
  await page.goto('http://mihirkumar.com/', {waitUntil: 'load'});
  await page.evaluate(evaluateRules); // <-- await here
  await browser.close();
})();


1

感谢回复。将该函数设为异步操作无疑是一个更好的改变。我的问题在于我没有将OpenAjax JavaScript库注入到加载的页面中。一旦我使用puppeteer的page.addScriptTag函数完成了这个操作,一切都正常了。


0
如果您正在使用Jest,只需在代码中添加"exitOnPageError: false"即可。
module.exports = {
  server: {
    command: "PORT=3005 BROWSER=none react-scripts start",
    port: 3005,
    launchTimeout: 30000,
  },
  launch: {
    headless: process.env.HEADLESS !== "false",
    devtools: true,
  },
  exitOnPageError: false
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接