You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Puppeteer标签页切换报错求助:移除第三行代码触发会话关闭错误

解决Puppeteer标签页切换时的「Session closed」错误

兄弟,我之前也踩过Puppeteer标签页切换的坑,看到你这个错误太熟悉了!结合你给出的错误栈,咱们一步步拆解问题:

错误原因解析

这个Protocol error (Runtime.evaluate): Session closed本质上是Puppeteer和浏览器之间的CDP(Chrome DevTools Protocol)会话断开了,最直接的原因就是你后续要操作的页面(或标签页)已经被关闭,导致evaluate这类需要和页面会话交互的调用找不到目标了。

你提到移除第三行代码后才触发错误,那这行代码大概率是维持目标标签页存活、保证会话就绪的关键逻辑——比如等待页面加载、保留标签页引用的相关代码。

常见场景与解决方案

1. 未等待新标签页加载完成就操作

很多人会忽略打开新标签页后需要等待页面加载,直接调用evaluate,这时候新标签页的会话还没完全初始化,就容易触发会话断开错误。比如你移除的第三行可能是await page.waitForNavigation()这类等待逻辑。

正确写法参考:

const browser = await puppeteer.launch();
const mainPage = await browser.newPage();
await mainPage.goto('你的目标页面地址');

// 打开新标签页时,用Promise.all同时监听新目标和触发点击,确保精准捕获新标签页
const [newTab] = await Promise.all([
  browser.waitForTarget(target => target.type() === 'page' && target.url() !== mainPage.url()),
  mainPage.click('触发新标签页的元素选择器') // 比如a[target="_blank"]
]);

// 必须等待新标签页加载完成,确保会话完全就绪
await newTab.waitForNavigation({ waitUntil: 'networkidle2' });

// 现在执行evaluate就不会报错了
const pageTitle = await newTab.evaluate(() => document.title);
console.log('新标签页标题:', pageTitle);

// 按需关闭页面,不要提前销毁会话相关的页面
await newTab.close();
await mainPage.close();
await browser.close();

2. 意外关闭了目标标签页

检查代码中是否有提前关闭页面的逻辑,比如如果移除的第三行是阻止页面意外关闭的监听(比如mainPage.on('close', () => { ... })),或者其他地方误调用了newTab.close()但还在操作它。

可以在evaluate前加一行代码确认页面状态:

console.log('新标签页是否已关闭:', await newTab.isClosed());

3. 标签页引用丢失

如果代码没有正确保留新标签页的引用,比如用了错误的变量去操作已经被销毁的页面,也会触发这个错误。可以打印当前所有页面的状态排查:

const allPages = await browser.pages();
console.log('当前所有页面URL:', allPages.map(page => page.url()));

核心总结

要避免这个错误,关键做到三点:

  • 打开新标签页时,用Promise.all配合waitForTarget精准捕获目标引用
  • 等待页面完全加载后再进行交互操作
  • 操作过程中不要意外关闭目标页面

内容的提问来源于stack exchange,提问作者AnnaCICI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:08:29