浏览器会话可能因多种原因关闭,包括正常完成、不活动、连接错误或无头浏览器实例中的错误。最佳实践是将 puppeteer.connect 或 puppeteer.launch 包装在 try...catch ↗ 语句中,以优雅地处理意外关闭。
要查找浏览器关闭的原因:
-
在 Cloudflare 仪表板中,前往 Browser Run 页面。
Go to Browser Run ↗ -
选择 **Runs(运行记录)**选项卡。
Browser Run 会话根据用量计费。对于因 Browser Run 底层基础设施错误而失败的会话,我们不收费。
| 原因 | 描述 |
|---|---|
| 正常关闭 | 你的代码调用了 browser.close(),会话正常结束。无需操作。 |
| 浏览器空闲 | 会话在配置的不活动超时时间内未收到任何命令(默认 60 秒,使用 keep_alive 最长可设为 10 分钟)。要防止空闲关闭,请在不活动窗口内发送命令或增大 keep_alive 值。 |
| Chromium 崩溃 | 会话内的 Chromium 实例崩溃,通常是因为页面消耗过多内存(大型 DOM、重型 JavaScript 或大量并发页面)。尝试降低页面复杂度、关闭未使用的页面或将工作拆分为更小的任务。 |
| 连接错误 | 客户端与 Browser Run 之间的连接中断。可能由网络问题、Worker 达到 CPU 时间限制或 WebSocket 断开引起。使用 try...catch 块重试操作。 |
| 会话被驱逐 | Browser Run 因基础设施维护或新版本部署而回收会话。这不是由你的代码引起的。使用 try...catch 块和重连逻辑重试操作。 |
会话可能因基础设施事件、网络问题或浏览器崩溃而随时关闭。将浏览器操作包装在 try...catch 块中,并在需要时重新连接,以处理这些情况。
async function runBrowser(env) {
let browser;
try {
browser = await puppeteer.launch(env.MYBROWSER);
const page = await browser.newPage();
await page.goto("https://example.com");
// Your browser automation logic
} catch (error) {
console.error("Browser session ended unexpectedly:", error.message);
// Retry or return an error response
} finally {
await browser?.close();
}
}对于长时间运行或关键工作流,考虑添加重试逻辑:
async function runWithRetry(env, maxRetries = 3) {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
return await runBrowser(env);
} catch (error) {
if (attempt === maxRetries) throw error;
console.log(`Attempt ${attempt} failed, retrying...`);
}
}
}