UnhandledPromiseRejectionWarning:错误:协议错误(Runtime.callFunctionOn):目标已关闭。 (木偶师)

Posted

技术标签:

【中文标题】UnhandledPromiseRejectionWarning:错误:协议错误(Runtime.callFunctionOn):目标已关闭。 (木偶师)【英文标题】:UnhandledPromiseRejectionWarning: Error: Protocol error (Runtime.callFunctionOn): Target closed. (Puppeteer) 【发布时间】:2018-11-11 16:59:05 【问题描述】:

我是 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 的其他示例运行良好,所以我认为我不需要使用提到的here 修复程序。感谢您的帮助。

【问题讨论】:

您的问题是您不知道如何处理未处理的拒绝,还是您不知道为什么会收到该协议错误? 我不知道如何处理拒绝,我不知道它为什么会发生/我做错了什么导致它。除了明显的消息“目标已关闭”之外,我不知道更多。 await 周围使用try/catch 处理拒绝。尽管在这种情况下,除了打印错误消息并让测试失败之外,您无能为力。 在等待过程中尝试捕获并不能解决问题。 还值得一提的是page.evaluate()返回一个promise,所以你应该await它。目前,您无需等待它完成,而是在page.evaluate() 完成之前立即执行browser.close() 【参考方案1】:

正如 Sven 在 cmets 中提到的,在关闭浏览器之前,您应该在每个返回承诺(几乎所有承诺)的 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();
)();

【讨论】:

【参考方案2】:

感谢您的回复。使函数异步绝对是一个更好的改变。我的问题是我没有将 OpenAjax javascript 库注入到加载的页面中。一旦我用 puppeteer 的 page.addScriptTag 函数做到了这一点,一切就很好了。

【讨论】:

【参考方案3】:

如果你在开玩笑,只需添加“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
;

【讨论】:

以上是关于UnhandledPromiseRejectionWarning:错误:协议错误(Runtime.callFunctionOn):目标已关闭。 (木偶师)的主要内容,如果未能解决你的问题,请参考以下文章

[Unhandled promise rejection: TypeError: null is not an object (evaluating '_reactNativeImageCropPic

等待 - 捕获错误 - UnhandledPromiseRejectionWarning

批量删除如何工作?

7月工作知识总计:

未处理的承诺拒绝 |重启命令

未处理的承诺拒绝警告(Cordova Angular)