我有以下代码:
puppeteer.launch().then(async browser => {
for (let id of ids) {
try {
const page = await browser.newPage();
//const url = 'chrome://crash';
await page.goto(url + id)
await page.waitFor(5000);
await page.screenshot({
path: path.join(__dirname, "../public/images/screenshots/" + id + ".png"),
clip: { x: 10, y: 70, width: 780, height: 470}
});
} catch (error) {
console.log('Exception', id, error.message);
page.close();
}
};
browser.close();
});
它通常可以正常工作,但我遇到了某个特定页面的问题(遗憾的是我无法分享的网址)。
此页面尝试加载GB数据并导致Chrome崩溃,因此我猜它会导致Chromium崩溃。
我在此页面中看到的错误是:Exception 6766 Navigation Timeout Exceeded: 30000ms exceeded
。这很好,但它似乎没有停止在这一点 - 它导致我的整个服务器挂起,我想是因为它试图在操作系统级别使用太多内存。
如何阻止我的服务器挂起并妥善处理?是否有我可以提供给Chromium的标志来限制使用的内存并优雅地放弃?我也不确定我的错误处理是否正确,所以任何提示都会受到赞赏。
答案 0 :(得分:3)
一些想法:
首先,这可能与您的初始问题无关,但它会节省一些内存。你打开很多标签(页面)而不关闭它们,如果你的ID列表很长,可能会占用大量内存。
尝试通过加载新网址而不是创建新网页来迭代ID。
此外,您可以延长超时时间,以检查是否有更多时间可以完成此操作。
启动puppeteer时可以传递铬标记。这是完整的Chromium switch list
您可以尝试使用:int[] ids = AppWidgetManager.getInstance(Context.getApplication()).getAppWidgetIds(new ComponentName(Context.getApplication(), Widget.class));
Widget myWidget = new Widget();
myWidget.onUpdate(Context, AppWidgetManager.getInstance(Context),ids);
或--unlimited-storage
。
这也可以用来调试:--force-gpu-mem-available-mb
您可以在那里搜索所有其他与内存相关的标志。
以下是你如何将旗帜传递给木偶戏,以及我提到的其他建议:
--full-memory-crash-report
答案 1 :(得分:2)
尝试传递{args: ['--disable-dev-shm-usage']}
启动选项launch()
命令 - 这是supposed to improve Puppeteer's ability to render large/complex pages。