確保控制項處於目標狀態(冪等)
*無條件採取行動*的自動化——「點選核取方塊」、「輸入該值」——會把已勾選的方塊再次切換,或對已正確的
欄位重新輸入,且無法安全地重跑。穩健的型態是讀取-比較-行動-驗證:看目前狀態,若已相符就什麼都不做,
否則套用變更並確認生效。ensure_state 正是此原語。
ensure_state()——通用:透過reader讀取,若不等於desired就套用setter並 重讀,最多attempts次。ensure_toggle()——針對無狀態翻轉的布林特化:讀取is_on,僅在與desired不同時 呼叫toggle。
已處於目標狀態的控制項會保持不動(changed=False),故此呼叫是冪等且可安全重跑。這有別於
idempotency`(請求鍵重放快取)——``ensure_state` 收斂的是*裝置狀態*,而非呼叫結果。
reader / setter / toggle 接縫皆可注入,故邏輯能在沒有真實控制項的情況下完整測試。不匯入 PySide6。
無頭 API
from je_auto_control import ensure_state, ensure_toggle
# 冪等地把某設定設為 "on" ——若已是則不寫入
ensure_state("on", reader=read_combo, setter=write_combo)
# -> {'ok': True, 'changed': False, 'value': 'on', 'attempts': 0}
# 僅在尚未勾選時把核取方塊翻為勾選
ensure_toggle(True, is_on=is_checked, toggle=click_checkbox)
兩者皆回傳 {ok, changed, value, attempts}:changed 告訴你是否實際執行了動作
(對「我是否得修正它?」的報告很有用),``ok`` 則是是否在 attempts 內達到目標狀態。
對 ensure_state() 傳入自訂 equals 可做不分大小寫或正規化比較。
執行器指令
AC_ensure_field_value``(``desired 加上 name / role / app_name /
automation_id / attempts → {ok, changed, value, attempts})透過無障礙後端
冪等地設定原生控制項的值——先讀取,若已相符則不做任何事。以對應的 ac_ensure_field_value
MCP 工具及 Script Builder 指令(位於 Flow 分類下)形式提供。ensure_state() /
:func:`ensure_toggle`(接受任意 callable)則是 Python API 介面。