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

如何在Puppeteer中实现标签页复制功能?

Puppeteer 实现标签页复制的可行方案

Puppeteer 没有内置和 Chrome 原生 chrome.tabs.duplicate(tab.id) 直接对应的封装方法,可根据使用场景选择以下两种方案实现:

  • 方案一(优先推荐):通过扩展调用原生复制能力,完整保留页面状态
    给 Puppeteer 控制的 Chrome 实例安装自定义扩展,在扩展的后台脚本中实现调用 chrome.tabs.duplicate 的逻辑,再通过 Puppeteer 和扩展通信触发执行。该方案和 Chrome 原生复制标签页的行为完全一致,会完整保留原页面的浏览历史、临时表单输入、登录态、缓存等所有状态。
    扩展后台逻辑示例:
    // background.js
    chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
      if (message.type === 'duplicateTab') {
        chrome.tabs.duplicate(message.tabId)
          .then(newTab => sendResponse({ newTabId: newTab.id }))
          .catch(err => sendResponse({ error: err.message }));
        return true;
      }
    });
    
    Puppeteer 侧触发逻辑示例:
    // 获取当前需要复制的页面
    const [currentPage] = await browser.pages();
    // 获取页面对应的 Chrome 原生 tabId
    const targetInfo = await currentPage.target().browser()._connection.send('Target.getTargetInfo', {
      targetId: currentPage.target().id()
    });
    const browserTabId = targetInfo.targetInfo.tabId;
    // 向扩展发送消息触发标签页复制
    await currentPage.evaluate((browserTabId) => {
      chrome.runtime.sendMessage('你的扩展ID', {
        type: 'duplicateTab',
        tabId: browserTabId
      });
    }, browserTabId);
    
  • 方案二(无扩展,轻量场景适用):手动复制页面状态新开标签页
    如果不需要保留原页面的浏览历史,仅需要复现当前页面的登录态和展示内容,可以手动复制原页面的 URL、Cookie、本地存储信息,导入到新开的标签页中加载。
    示例代码:
    const originalPage = (await browser.pages())[0];
    // 提取原页面信息
    const pageUrl = originalPage.url();
    const cookies = await originalPage.cookies();
    const localStorageData = await originalPage.evaluate(() => JSON.stringify(window.localStorage));
    const sessionStorageData = await originalPage.evaluate(() => JSON.stringify(window.sessionStorage));
    
    // 新开标签页导入信息
    const newPage = await browser.newPage();
    await newPage.setCookie(...cookies);
    await newPage.evaluate((ls, ss) => {
      Object.entries(JSON.parse(ls)).forEach(([k, v]) => window.localStorage.setItem(k, v));
      Object.entries(JSON.parse(ss)).forEach(([k, v]) => window.sessionStorage.setItem(k, v));
    }, localStorageData, sessionStorageData);
    await newPage.goto(pageUrl);
    
    该方案缺点是无法保留原页面的前进后退历史记录,也不能复制未提交的临时表单输入内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:12:00