Chrome Extension 無法直接自動點擊 alert()
、confirm()
或 prompt()
這類 JavaScript 彈出視窗,因為這些是 瀏覽器模態對話框,會阻塞 JavaScript 的執行,且受安全性限制,擴充功能無法直接控制它們。
不過,你可以用 以下方式間接處理:
1️⃣ 攔截 window.alert
讓它自動關閉
擴充功能的內容腳本(Content Script)可以覆蓋 window.alert
,讓它變成一個無作用的函數,這樣網頁上的 alert()
就不會真正彈出:
// 在 content script 中執行
window.alert = function() {};
window.confirm = function() { return true; }; // 自動按「確定」
window.prompt = function() { return null; }; // 自動點「取消」
2️⃣ 使用 debugger
Protocol 遠端控制 alert
如果你希望擴充功能能夠真的 自動點擊 alert()
,你可以使用 Chrome DevTools Protocol (CDP),透過 chrome.debugger
來攔截並關閉對話框(需要 debugger
權限)。
🚀 示例:用 chrome.debugger
關閉 alert
在擴充功能的背景程式 (background.js
) 中:
chrome.debugger.attach({ tabId: YOUR_TAB_ID }, "1.3", function() {
chrome.debugger.sendCommand({ tabId: YOUR_TAB_ID }, "Page.handleJavaScriptDialog", {
accept: true // 自動按「確定」
});
});
這樣就能讓擴充功能在偵測到 alert 彈出時,直接「按下」確定。
3️⃣ 模擬使用者按鍵(僅適用於特定場景)
如果 alert()
已經彈出,而你的擴充功能沒有 debugger
權限,可以嘗試 模擬鍵盤按鍵(例如 Enter
)來關閉對話框:
document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));
不過,這種方式 不一定有效,因為瀏覽器的 alert 是模態對話框,可能無法被 JavaScript 操作。
✅ 結論
- 最佳解法: 用
window.alert = function() {};
來攔截alert()
,讓它不彈出。 - 進階解法: 如果你的擴充功能有
debugger
權限,可以用chrome.debugger
來自動按「確定」。 - 可行但不穩定: 嘗試模擬
Enter
鍵來關閉 alert(視瀏覽器行為而定)。