javascript - 使用无头运行的 Puppeteer 捕获崩溃事件
问题描述
有没有办法在无头模式下使用 Puppeteer 捕获 chromium 页面崩溃事件?
以下仅在非无头模式下有效?:
page.once("error", async () => {
//Do something
});
await page.goto('about:crash');
我正在使用无头参数来启动 puppeteer。(保持 WebGL 激活)
browser = await puppeteer.launch({
headless: false,
args: [
`--window-size=${width},${height}`,
'--headless'
]
});
添加了详细信息:我的目标是在崩溃后测试我的应用行为。
以下未捕获错误:
const puppeteer = require('puppeteer');
const width = 1920;
const height = 1080;
(async () => {
browser = await puppeteer.launch({
headless: false,
args: [
`--window-size=${width},${height}`,
'--headless'
]
});
page = await browser.newPage();
await page.goto('https://www.google.com/', { waitUntil: 'networkidle2', timeout: 10000 });
console.log('page loaded');
try {
//page.goto('about:crash');
page.goto('chrome://crash/')
} catch (e) {
console.log(`crash has been catched`)
};
})();
确实如此,但我得到了一个承诺拒绝,这使我的 Jest 测试失败
const puppeteer = require('puppeteer');
const width = 1920;
const height = 1080;
(async () => {
browser = await puppeteer.launch({
headless: false,
args: [
`--window-size=${width},${height}`,
'--headless'
]
});
page = await browser.newPage();
await page.goto('https://www.google.com/', { waitUntil: 'networkidle2', timeout: 10000 });
console.log('page loaded');
page.once("error", async () => {
console.log('crash has been catched')
})
//page.goto('about:crash');
page.goto('chrome://crash/')
})();
我怎样才能
- 崩溃页面,
- 捕捉崩溃错误
- 做更多的测试(比如创建一个新页面,重新加载页面......)
解决方案
你可以使用try/catch。您还可以设置 bool 变量以了解何时关闭/打开新页面。(例如重用PageInstance)
这是一个例子:
const puppeteer = require('puppeteer');
var reusePageInstance = true;
(async() => {
const args = [
"--disable-setuid-sandbox",
"--no-sandbox",
];
const options = {
args,
headless: true,
ignoreHTTPSErrors: true,
};
const browser = await puppeteer.launch(options);
let page
if (!reusePageInstance) {
page = await browser.newPage()
}
var q = ['http://www.stackoverfllow.com']
while (q.length > 0) {
let url = q.shift()
console.log('Loading Page: ' +' - ' + url)
try {
if (reusePageInstance) {
page = await browser.newPage()
}
await page.goto(url, {
timeout: 10000,
waitUntil: 'networkidle2'
})
console.log('Page Loaded')
const html = await page.content();
// do something
if (reusePageInstance) {
await page.close()
}
console.log('Page closed')
} catch (e) {
console.log('**** FAIL ****')
console.log('Page Load Failed', url)
console.error(e)
await page.close()
}
}
await browser.close()
})()
推荐阅读
- rest - 如何使用 C# 使用 SharePoint REST API 获取共享点文件夹中文件的版本历史记录?
- microsoft-graph-api - SharePoint REST API 与 Microsoft Graph API;推荐的方法是什么?
- reactjs - chartkick react 中是否有任何数据加载回调函数/事件?
- ios - 在 iOS 的子视图控制器中调用方法
- typescript - 在不使用第一个运算符的情况下避免 Firestore 权限错误
- android - 如何在应用设置中默认启用 android 快捷方式徽章
- azure-devops - 在 Azure Pipeline Powershell 脚本任务中访问系统环境变量
- codeigniter - Codeigniter 4 中的多个类似条件
- vba - 将幻灯片从开头移动到部分结尾
- html - 当我没有为 g 元素提供任何翻译时,为什么 g 元素不是从 svg 的角开始