如何在Chrome扩展中向其他已打开扩展注入脚本并触发指定按钮点击?
Chrome扩展跨扩展注入脚本实现自动点击方案
Chrome出于安全隔离设计,默认禁止普通扩展通过chrome.scripting API注入其他扩展的chrome-extension://页面,host_permissions中的<all_urls>、通配符规则天生不覆盖chrome-extension协议,修改chrome://flags的相关配置也无法绕过该限制。
可行方案
方案1:可修改目标扩展代码时(最优合规方案)
通过跨扩展通信机制实现,无需注入脚本:
- 在目标扩展的
manifest.json中配置externally_connectable字段,声明允许你的扩展ID发起通信:
"externally_connectable": { "ids": ["你的扩展ID"], "accepts_tls_channel_id": false }
- 目标扩展的后台/页面脚本中监听通信消息,收到指令后执行点击操作:
chrome.runtime.onMessageExternal.addListener((request, sender, sendResponse) => { if (request.action === 'clickButton') { document.getElementById('some-button')?.click(); sendResponse({status: 'success'}); } });
- 你的扩展中直接向目标扩展发送指令即可:
chrome.runtime.sendMessage('目标扩展ID', {action: 'clickButton'}, (res) => { console.log('操作结果', res); });
方案2:无法修改目标扩展代码时(仅本地自用适用)
使用chrome.debugger API绕过限制,该API可以操作任意标签页的上下文:
- 在你的扩展
manifest.json中添加权限:
"permissions": ["debugger", "tabs"]
- 执行操作的示例代码:
// tabId为目标扩展页面的标签ID async function clickExtButton(tabId) { // 附加调试器到目标标签页 await chrome.debugger.attach({tabId}, '1.3'); // 执行点击代码 await chrome.debugger.sendCommand({tabId}, 'Runtime.evaluate', { expression: "document.getElementById('some-button')?.click()" }); // 分离调试器 await chrome.debugger.detach({tabId}); }
注意事项
- 使用该API时,浏览器顶部会持续显示「当前正被调试软件控制」的提示条,无法隐藏
- 带
debugger权限的扩展无法通过Chrome应用商店的常规审核,仅适合本地离线使用
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

