【发布时间】:2018-06-28 00:35:12
【问题描述】:
我正在使用 Puppeteer v1.5 (https://github.com/GoogleChrome/puppeteer) 并尝试运行以下代码:
'use strict';
const puppeteer = require('puppeteer');
const fs = require('fs');
const configOptions = require('./config.json');
function evaluateRules(passedRuleset) {
var doc = window.document;
var ruleset = OpenAjax.a11y.RulesetManager.getRuleset(passedRuleset);
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(doc, doc.title, doc.location.href);
var out = evaluation.toJSON(true);
return out;
}
(async() => {
const browser = await puppeteer.launch();
var numPagesEvaluated;
for (numPagesEvaluated = 0; numPagesEvaluated < configOptions.urls.length && numPagesEvaluated < configOptions.maxPages; numPagesEvaluated++){
const millisecondsToSeconds = 1000;
var page = await browser.newPage();
await page.setBypassCSP(true);
await page.goto(configOptions.urls[numPagesEvaluated], {timeout: configOptions.wait*millisecondsToSeconds, waitUntil: 'load'});
await page.waitFor(configOptions.delay*millisecondsToSeconds);
if (configOptions.authentication){
const credentialsObject = {username: configOptions.username, password: configOptions.password};
await page.authenticate(credentialsObject);
}
const evaluationFileOptions = {path: './oaa_a11y_evaluation.js'};
const ruleFileOptions = {path: './oaa_a11y_rules.js'};
const rulesetsFileOptions = {path: './oaa_a11y_rulesets.js'};
const evaluationFileOptionsObject = Object.create(evaluationFileOptions);
const ruleFileOptionsObject = Object.create(ruleFileOptions);
const rulesetsFileOptionsObject = Object.create(rulesetsFileOptions);
await page.addScriptTag(evaluationFileOptionsObject);
await page.addScriptTag(ruleFileOptionsObject);
await page.addScriptTag(rulesetsFileOptionsObject);
var results = await page.evaluate(evaluateRules, configOptions.ruleset);
var result_index = 0;
fs.writeFile(configOptions.outputDirectory+ "/results_" + result_index.toString() + ".json", results, function(err) {
if(err) {
return console.log(err);
}
console.log("results_" + result_index.toString() + ".json was saved!");
result_index++;
});
await page.close();
}
await browser.close();
})();
我收到以下错误:
(node:11688) UnhandledPromiseRejectionWarning: Error: Evaluation failed: DOMException: Blocked a frame with origin "http://illinois.edu" from accessing a cross-origin frame.
at OpenAjax.a11y.cache.DOMCache.updateDOMElements (./oaa_a11y_evaluation.js:13588:42)
at OpenAjax.a11y.cache.DOMCache.updateDOMElements (./oaa_a11y_evaluation.js:13607:17)
at OpenAjax.a11y.cache.DOMCache.updateDOMElements (./oaa_a11y_evaluation.js:13607:17)
at OpenAjax.a11y.cache.DOMCache.updateDOMElementCache (./oaa_a11y_evaluation.js:13437:8)
at Object.evaluate (./oaa_a11y_evaluation.js:35293:17)
at evaluateRules (<anonymous>:9:30)
at ExecutionContext.evaluateHandle (C:\Users\Mihir\testing\node_modules\puppeteer\lib\ExecutionContext.js:88:13)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
(node:11688) 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:11688) [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.
请注意,我正在使用 puppeteer 的 byPassCSP 功能。虽然它似乎没有做任何事情。据我所知,发生这种情况是因为 Javascript 的同源安全策略。请帮忙。我还在下面添加了 config.json 文件以供参考:
{
"urls": ["http://illinois.edu/"],
"maxPages": 1,
"wait": 30,
"delay": 5,
"ruleset": "ARIA_STRICT",
"outputDirectory": ".",
"version": "0.1",
"authorization": false,
"credentials": {
"username": "",
"password": ""
},
"path": "",
"spanDomains": "",
"includeDomains": "",
"excludeDomains": "",
"depth": "",
"exportOption": "",
"debug": ""
}
【问题讨论】:
-
一个承诺被拒绝(您的代码中至少要处理 9 个承诺) - 而您没有处理这个拒绝(您的代码中根本没有
catch) - 所以,这就是导致此错误 -
})().catch(console.error)- 既可以处理拒绝,也可以向您展示问题所在(不过,我认为问题显然是跨源资源共享)
标签: javascript automated-tests puppeteer google-chrome-headless