Problem
Original request:
「safari-browser要對跳出的視窗和按鈕很敏銳才對」
— Source: 使用者,2026-07-28,自動化政府入口網站表單時
當頁面跑出 JS dialog(alert / confirm / beforeunload)時,該分頁的 JavaScript 執行完全被鎖住。目前 safari-browser 沒有任何機制偵測或回報這個狀態,於是每一個子指令都以「看起來像網頁壞掉」的方式失敗:
| 指令 |
有 dialog 時的實際表現 |
js |
AppleScript 逾時 30 秒後失敗,錯誤訊息是泛用的 Process timed out |
get text |
回空字串(exit 0),完全沒有錯誤 |
click |
回 Hint: if this recurs, check Console.app for System Events or Apple Event dispatcher issues |
documents |
正常運作(唯一還能用的) |
Impact
這三種症狀都不指向真正的原因,而且彼此矛盾(一個逾時、一個靜默成功、一個報 System Events),所以極難診斷。
實際踩到的案例:自動化一個政府入口網站的表單,儲存後系統彈出「資料修改完成」提示。接下來大約 40 分鐘裡,症狀被依序誤判成:
- session 逾時
- 目標視窗在背景/在另一個 Space
- 網頁本身當掉
- AppleScript 權限問題
四個都不是。真正原因是有個 dialog 開著等人按確定,而它在另一個 Space 的視窗上,畫面上看不到。
更糟的是靜默成功的那條:get text 回空字串且 exit 0。腳本若據此判斷「頁面沒有內容」,會得出與事實相反的結論。
Expected
- 偵測並明確回報:任一子指令遇到分頁被 dialog 阻塞時,應以專屬錯誤訊息與 exit code 回報,例如
Error: tab is blocked by a JavaScript dialog — dismiss it or use 'safari-browser dialog'
而不是逾時、空字串或 System Events 提示。
- 新增
dialog 子指令:
safari-browser dialog read — 回傳對話框文字與按鈕
safari-browser dialog accept / dismiss — 按確定/取消
- 提供事前攔截選項:例如
click --intercept-dialogs,在觸發點擊前注入 window.alert / window.confirm 覆寫,記錄訊息並自動回應。這是目前唯一可靠的繞法,但需使用者自己寫 JS,且每次導覽後都要重裝,很容易漏掉。
Actual
沒有偵測、沒有回報、沒有處理途徑。使用者只能人工切到該視窗按掉;在多視窗/多 Space 情境下,往往根本不知道有視窗要按。
Notes
documents 在阻塞狀態下仍可用,可作為偵測基礎(能列分頁但無法對特定分頁執行 JS ⇒ 該分頁被阻塞)。
- 鍵盤模擬(System Events 送 Return)在目標視窗不在前景時無效,不足以作為通用解法。
- 相關但不同的問題:
js 子指令會把程式碼壓成單行,字串內的 // 之後被當成註解吃掉,含網址的程式碼因此出現 parses neither as an expression nor as a function body。若要處理可另開 issue。
Problem
當頁面跑出 JS dialog(
alert/confirm/beforeunload)時,該分頁的 JavaScript 執行完全被鎖住。目前safari-browser沒有任何機制偵測或回報這個狀態,於是每一個子指令都以「看起來像網頁壞掉」的方式失敗:jsProcess timed outget textclickHint: if this recurs, check Console.app for System Events or Apple Event dispatcher issuesdocumentsImpact
這三種症狀都不指向真正的原因,而且彼此矛盾(一個逾時、一個靜默成功、一個報 System Events),所以極難診斷。
實際踩到的案例:自動化一個政府入口網站的表單,儲存後系統彈出「資料修改完成」提示。接下來大約 40 分鐘裡,症狀被依序誤判成:
四個都不是。真正原因是有個 dialog 開著等人按確定,而它在另一個 Space 的視窗上,畫面上看不到。
更糟的是靜默成功的那條:
get text回空字串且 exit 0。腳本若據此判斷「頁面沒有內容」,會得出與事實相反的結論。Expected
Error: tab is blocked by a JavaScript dialog — dismiss it or use 'safari-browser dialog'而不是逾時、空字串或 System Events 提示。
dialog子指令:safari-browser dialog read— 回傳對話框文字與按鈕safari-browser dialog accept/dismiss— 按確定/取消click --intercept-dialogs,在觸發點擊前注入window.alert/window.confirm覆寫,記錄訊息並自動回應。這是目前唯一可靠的繞法,但需使用者自己寫 JS,且每次導覽後都要重裝,很容易漏掉。Actual
沒有偵測、沒有回報、沒有處理途徑。使用者只能人工切到該視窗按掉;在多視窗/多 Space 情境下,往往根本不知道有視窗要按。
Notes
documents在阻塞狀態下仍可用,可作為偵測基礎(能列分頁但無法對特定分頁執行 JS ⇒ 該分頁被阻塞)。js子指令會把程式碼壓成單行,字串內的//之後被當成註解吃掉,含網址的程式碼因此出現parses neither as an expression nor as a function body。若要處理可另開 issue。