Chrome扩展Manifest V3:如何用Scripting API访问所有页面iframe?
问题分析与解决方案
1. 脚本仅作用于主页面的原因
你调用chrome.scripting.executeScript时,默认只会在主框架(top-level frame)注入脚本,要覆盖所有iframe,必须在target配置里添加allFrames: true参数。修改后的代码如下:
// panel.html -> js chrome.scripting.executeScript({ target: { tabId: chrome.devtools.inspectedWindow.tabId, allFrames: true // 关键:指定注入到所有框架(包含子iframe) }, injectImmediately: true, func: () => { console.log('foo') } })
injectImmediately: true已经能让脚本像content script一样立即执行,配合allFrames: true即可实现主页面+所有子iframe的全覆盖注入。
2. chrome.tabs.query返回空数组的原因
你用错了查询参数:chrome.devtools.inspectedWindow.tabId是标签页ID,但chrome.tabs.query的windowId字段需要的是浏览器窗口ID,参数不匹配导致返回空数组。正确的查询方式是直接通过标签页ID查询:
await chrome.tabs.query({ tabId: chrome.devtools.inspectedWindow.tabId })
或者如果要查询当前窗口的活跃标签页,可使用:
await chrome.tabs.query({ active: true, currentWindow: true })
权限说明
你当前配置的tabs、scripting权限以及<all_urls>主机权限已经完全满足需求,不存在权限缺失的问题,核心问题是脚本注入的参数配置和标签页查询的参数错误。
内容的提问来源于stack exchange,提问作者David Alsh
相关产品推荐
相关产品推荐

