UnhandledPromiseRejectionWarning: Ошибка: ошибка протокола (Runtime.callFunctionOn): цель закрыта. (Кукольник)
Я новичок в 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 работают отлично, поэтому я не думаю, что мне нужно использовать упомянутые здесь исправления. Спасибо за помощь.
3 ответа
Как отметил Свен в комментариях, вы должны попробовать использовать 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 browser.close();
})();
Спасибо за ответы. Выполнение функции асинхронно, безусловно, является изменением к лучшему. Моя проблема заключалась в том, что я не вставлял библиотеки JavaScript OpenAjax в загруженную страницу. Однажды я сделал это с помощью функции page.addScriptTag кукловода.
Если вы используете шутку, просто добавьте «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
};