所以我使用了一个 while 循环,所以我的测试将在一个恒定循环中运行,直到我的后端崩溃。我已经实现了一个 try and catch(error) 所以任何前端崩溃自动化都会刷新并继续运行
while(true){
try{
await page.waitFor(selector)
await page.click(selector)
}
catch(error){
console.log("FE crashed with\n\n" + error + "\n\nRefreshing page and continuing profile switching")
await page.reload(page);
continue;
}}
Run Code Online (Sandbox Code Playgroud)
因此,确实任何超时错误都会自动刷新页面并继续循环。但我收到了不同的崩溃错误
(node:6535) UnhandledPromiseRejectionWarning: Error: Page crashed!
at Page._onTargetCrashed (/home/raymond/node_modules/puppeteer/lib/Page.js:170:24)
at CDPSession.Page.client.on.event (/home/raymond/node_modules/puppeteer/lib/Page.js:125:56)
at CDPSession.emit (events.js:182:13)
at CDPSession._onMessage (/home/raymond/node_modules/puppeteer/lib/Connection.js:200:12)
at Connection._onMessage (/home/raymond/node_modules/puppeteer/lib/Connection.js:112:17)
at _tickCallback (internal/process/next_tick.js:43:7)
at listOnTimeout (timers.js:294:7)
at processTimers (timers.js:268:5)
(node:6535) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch …Run Code Online (Sandbox Code Playgroud) 我正在运行一个自动登录亚马逊和沃尔玛的应用程序,但有时脚本会抛出协议错误。我在下面提到了启动浏览器的代码 -
var browser = await puppeteer.launch({
headless: false,
ignoreHTTPSErrors: true,
args: [
'--disable-background-timer-throttling',
'--disable-backgrounding-occluded-windows',
'--disable-renderer-backgrounding',
'--no-sandbox',
'--disable-setuid-sandbox',
'--ignore-ssl-errors'
],
slowMo: Math.round(Math.random() * 10),
userDataDir: dir
});
var page = await browser.newPage();
await page.setViewport({ width: 1280, height: 1024, deviceScaleFactor: 1 });
page.on('console', msg => {
if (msg._type == "log")
console.log(msg._text);
});
page.on('error', async (error) => {
if (error.toString().match(/Page crashed/i)) {
console.log("<--------- Page crashed ------------->");
await browser.close();
}
});
Run Code Online (Sandbox Code Playgroud) 我是 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();
})();
Run Code Online (Sandbox Code Playgroud)
以下是错误消息的详细信息:
(node:27876) UnhandledPromiseRejectionWarning: Error: Protocol error (Runtime.callFunctionOn): Target closed.
at …Run Code Online (Sandbox Code Playgroud) 我对这两个代码块的差异感兴趣。
const $anchor = await page.$('a.buy-now');
const link = await $anchor.getProperty('href');
await $anchor.click();
Run Code Online (Sandbox Code Playgroud)
await page.evaluate(() => {
const $anchor = document.querySelector('a.buy-now');
const text = $anchor.href;
$anchor.click();
});
Run Code Online (Sandbox Code Playgroud)
通常,我发现原始DOM元素page.evaluate()更易于使用,而$方法返回的ElementHandles是到目前为止的抽象。
但是我也许觉得异步Puppeteer方法可能更高效或更可靠?我在文档中找不到关于此的任何指导,并且有兴趣了解有关每种方法的专业人士/专业人士以及添加诸如之类的方法背后的动机的更多信息page.$$()。
我正在尝试抓取和抓取一些网站以提取一些链接。我希望看到所有内容都hrefs打印到我的控制台上。但是,我收到以下错误。
out [ Promise { } ] (节点:15908) UnhandledPromiseRejectionWarning:错误:协议错误(Page.navigate):目标已关闭。
我究竟做错了什么?
这个答案说错误消息意味着browser.close()在我调用我的pageFunction.
但我正在使用async await,显然浏览器仍然对我关闭。
我该如何修复这个错误?
const domains = [...]
const pageFunction = async $posts => {
const data = [];
await $posts.forEach( $post => {
data.push( $post.href );
});
return data;
}
(async () => {
// start browser
const browser = await puppeteer.launch();
const page = await browser.newPage();
// loop over domains
const out = await domains.slice(-1).map( async domain => { …Run Code Online (Sandbox Code Playgroud)