Skip to content

偵測並處理 JS dialog 阻塞:目前失敗訊號互相矛盾且無法診斷 #89

Description

@kiki830621

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 分鐘裡,症狀被依序誤判成:

  1. session 逾時
  2. 目標視窗在背景/在另一個 Space
  3. 網頁本身當掉
  4. AppleScript 權限問題

四個都不是。真正原因是有個 dialog 開著等人按確定,而它在另一個 Space 的視窗上,畫面上看不到。

更糟的是靜默成功的那條get text 回空字串且 exit 0。腳本若據此判斷「頁面沒有內容」,會得出與事實相反的結論。

Expected

  1. 偵測並明確回報:任一子指令遇到分頁被 dialog 阻塞時,應以專屬錯誤訊息與 exit code 回報,例如
    Error: tab is blocked by a JavaScript dialog — dismiss it or use 'safari-browser dialog'
    而不是逾時、空字串或 System Events 提示。
  2. 新增 dialog 子指令
    • safari-browser dialog read — 回傳對話框文字與按鈕
    • safari-browser dialog accept / dismiss — 按確定/取消
  3. 提供事前攔截選項:例如 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。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions