|
65 | 65 | [`docs/source/Zh/doc/new_features/v3_features_doc.rst`](../docs/source/Zh/doc/new_features/v3_features_doc.rst)。 |
66 | 66 |
|
67 | 67 | **斷言** |
68 | | -- **斷言 DSL** — 驗證畫面狀態而不只是操作:`assert_text`(OCR,`regex` + `present=False` 斷言不存在)、`assert_image`、`assert_pixel`、`assert_window`。回傳 `AssertionResult`,不符時拋出 `AutoControlAssertionException`,可選失敗截圖(`AC_assert_text / _image / _pixel / _window`)。 |
| 68 | +- **斷言 DSL** — 驗證畫面狀態而不只是操作:`assert_text`(OCR,`regex` + `present=False` 斷言不存在)、`assert_image`、`assert_pixel`、`assert_window`、`assert_clipboard`(`equals` / `contains` / `regex`,`present=False` 可確認機密已清除)、`assert_process`(指定名稱的程序是否執行中,透過 psutil)。回傳 `AssertionResult`,不符時拋出 `AutoControlAssertionException`,可選失敗截圖(`AC_assert_text / _image / _pixel / _window / _clipboard / _process`)。 |
| 69 | +- **畫面外斷言** — `assert_file`(檔案存在 / 子字串 / SHA-256 / 最小大小,驗證下載或匯出結果)與 `assert_http`(http/https 端點回傳狀態碼 + 可選內文,一律帶明確 timeout)。兩者把 DSL 延伸到畫面之外,並能接到下方的組合器(`AC_assert_file / AC_assert_http`)。 |
| 70 | +- **斷言組合器** — `assert_all([...specs])` 以*軟斷言*方式跑完整批(逐一檢查、收齊所有失敗才拋出)並回傳 `GroupAssertionResult`;`assert_any([...specs])` 是 OR 互補(任一通過即通過、短路 — 例如登入成功對話框*或*重新導向其一出現即可);`assert_eventually(spec, timeout, interval)` 重試單一宣告式 spec 直到通過或逾時(例如輪詢健康檢查端點直到回傳 200,或等待下載檔出現)。皆以 spec 驅動(`{"kind": "text", "text": "Saved"}`、`{"kind": "http", "url": "..."}`),在 Python、JSON、MCP 中行為一致,涵蓋全部斷言種類 — text/image/pixel/window/clipboard/process/file/http(`AC_assert_all / AC_assert_any / AC_assert_eventually`)。 |
69 | 71 | - **媒體斷言** — `assert_audio_activity`(錄音 + RMS 門檻判斷有聲 / 靜音)與 `assert_video_changes`(影片區段相鄰影格平均差異判斷動態 / 靜止);純數值核心,`sounddevice` / OpenCV 延遲載入(`AC_assert_audio / AC_assert_video_changes`)。 |
70 | 72 |
|
71 | 73 | **資料驅動執行** |
|
136 | 138 |
|
137 | 139 | ## 功能特色 |
138 | 140 |
|
139 | | -- **QA / 測試框架** — 斷言 DSL(`assert_text` / `_image` / `_pixel` / `_window` 加上音訊/影片斷言)、資料驅動執行(CSV / JSON / SQLite / Excel → `AC_for_each_row`)、具 setup/teardown/標籤的計分 `run_suite`、JUnit + Allure 報告輸出、不穩定測試偵測與自動隔離、無障礙 / i18n 稽核(缺漏標籤、WCAG 對比度、截斷),以及並行的行動裝置矩陣。詳見 [本次更新 (2026-06)](#本次更新-2026-06) |
| 141 | +- **QA / 測試框架** — 斷言 DSL(`assert_text` / `_image` / `_pixel` / `_window` / `_clipboard` / `_process` / `_file` / `_http` 加上音訊/影片斷言,以及 `assert_all` / `assert_any` / `assert_eventually` 組合器)、資料驅動執行(CSV / JSON / SQLite / Excel → `AC_for_each_row`)、具 setup/teardown/標籤的計分 `run_suite`、JUnit + Allure 報告輸出、不穩定測試偵測與自動隔離、無障礙 / i18n 稽核(缺漏標籤、WCAG 對比度、截斷),以及並行的行動裝置矩陣。詳見 [本次更新 (2026-06)](#本次更新-2026-06) |
140 | 142 | - **滑鼠自動化** — 移動、點擊、按下、釋放、拖曳、滾動,支援精確座標控制 |
141 | 143 | - **鍵盤自動化** — 按下/釋放單一按鍵、輸入字串、組合鍵、按鍵狀態偵測 |
142 | 144 | - **圖像辨識** — 使用 OpenCV 模板匹配在螢幕上定位 UI 元素,支援可設定的偵測閾值 |
143 | 145 | - **Accessibility 元件搜尋** — 透過作業系統無障礙樹(Windows UIA / macOS AX)依名稱/角色定位按鈕、選單、控制項 |
144 | 146 | - **AI 元件定位(VLM)** — 用自然語言描述 UI 元素,交由視覺語言模型(Anthropic / OpenAI)取得螢幕座標 |
145 | 147 | - **OCR** — 三個可插拔後端(Tesseract 用於 ASCII、EasyOCR 不需外部執行檔且支援 CJK、PaddleOCR 中/日/韓品質最佳),統一 API 與標準語言代碼;後端由 `backend=` 參數、`AUTOCONTROL_OCR_BACKEND` 環境變數或自動偵測決定。可搜尋、點擊或等待文字出現;支援 regex 搜尋與整塊區域 dump |
146 | 148 | - **LLM 動作規劃器** — 用 Claude 把自然語言描述翻譯成驗證過的 `AC_*` 動作清單 |
147 | | -- **執行期變數與流程控制** — 執行時 `${var}` 取代,加上 `AC_set_var` / `AC_inc_var` / `AC_if_var` / `AC_for_each` / `AC_loop` / `AC_retry` 讓腳本資料驅動 |
| 149 | +- **執行期變數與流程控制** — 執行時 `${var}` 取代,加上 `AC_set_var` / `AC_inc_var` / `AC_if_var` / `AC_for_each` / `AC_loop` / `AC_while_var` / `AC_retry` / `AC_try` 讓腳本資料驅動。`AC_while_var` 在變數比較成立時持續迴圈(每輪重新判斷,`max_iter` 安全上限);`AC_try` 提供 try/catch/finally:`body` 失敗時改走 `catch` 復原分支而非中止、`finally` 必定執行、錯誤透過 `error_var` 暴露、可在清理後 `reraise`(迴圈 `break`/`continue` 仍能穿透) |
148 | 150 | - **遠端桌面** — 用 token 認證的 TCP 協定串流本機畫面並接收輸入,**或** 連線到他機觀看與控制(host + viewer GUI 皆內建)。可選 TLS(HTTPS 級加密)、WebSocket 傳輸(``ws://`` + ``wss://``,穿牆/瀏覽器友善)、持久化 9 位數 Host ID、host→viewer 音訊串流、雙向剪貼簿同步(文字 + 圖片)、分塊檔案傳輸(拖放 + 進度條;任意目的路徑;無大小上限)。另含資料夾同步(增量鏡像 — 本地刪除不會傳出去)與自架 coturn TURN 設定包產生器(turnserver.conf + systemd unit + docker-compose + README)。**AnyDesk 風格彈出視窗**:viewer 認證成功後遠端桌面會開在獨立的可調整大小頂層視窗,控制面板維持簡潔;Remote Desktop 子分頁外層包了 `QScrollArea`,小視窗下可捲動、4K 螢幕下會延展到整寬。同時可由 headless API 與 MCP 工具(`ac_remote_*`)直接驅動 |
149 | 151 | - **驅動層輸入後端(可選)** — 針對忽略 SendInput(Win)或 XTest(Linux)的遊戲/應用:**Interception driver 後端**(Windows,HID 層鍵鼠注入,使用 Oblita WHQL-signed driver,以 `JE_AUTOCONTROL_WIN32_BACKEND=interception` 啟用)、**uinput 後端**(Linux,kernel `/dev/uinput` 合成 HID 裝置,以 `JE_AUTOCONTROL_LINUX_BACKEND=uinput` 啟用),以及 **ViGEm 虛擬手把**(Windows,針對只認手把的遊戲,提供虛擬 Xbox 360 手把 + 友善的 button / dpad / stick / trigger API,並暴露為 `AC_gamepad_*` 執行器指令與 `ac_gamepad_*` MCP 工具)。三者在 driver 沒裝時都會優雅 fallback,不影響既有部署 |
150 | 152 | - **剪貼簿** — 於 Windows / macOS / Linux 讀寫系統剪貼簿文字 |
@@ -883,10 +885,16 @@ time.sleep(10) # 錄製 10 秒 |
883 | 885 | # 停止錄製並取得動作列表 |
884 | 886 | actions = je_auto_control.stop_record() |
885 | 887 |
|
| 888 | +# 回放前先清理錄製內容:把連續的滑鼠移動取樣壓縮成最後位置 |
| 889 | +#(通常能把原始錄製縮小一個數量級,且不改變回放行為) |
| 890 | +actions = je_auto_control.dedupe_moves(actions) |
| 891 | + |
886 | 892 | # 重新播放錄製的動作 |
887 | 893 | je_auto_control.execute_action(actions) |
888 | 894 | ``` |
889 | 895 |
|
| 896 | +> 非破壞式錄製編輯器(皆回傳新的 list):`dedupe_moves`(壓縮滑鼠移動)、`merge_sleeps`(合併連續 `AC_sleep`)、`trim_actions`、`insert_action`、`remove_action`、`filter_actions`、`adjust_delays`(縮放 `AC_sleep` 延遲)、`scale_coordinates`(以不同解析度回放)。透過 MCP 暴露為 `ac_dedupe_moves` / `ac_merge_sleeps` / `ac_trim_actions` / `ac_adjust_delays` / `ac_scale_coordinates`。 |
| 897 | +
|
890 | 898 | ### JSON 腳本執行器 |
891 | 899 |
|
892 | 900 | 建立 JSON 動作檔案(`actions.json`): |
@@ -930,7 +938,7 @@ je_auto_control.execute_action([ |
930 | 938 | | LLM 規劃器 | `AC_llm_plan`, `AC_llm_run` | |
931 | 939 | | 剪貼簿 | `AC_clipboard_get`, `AC_clipboard_set` | |
932 | 940 | | 視窗 | `AC_list_windows`, `AC_focus_window`, `AC_wait_window`, `AC_close_window` | |
933 | | -| 流程控制 | `AC_loop`, `AC_break`, `AC_continue`, `AC_if_image_found`, `AC_if_pixel`, `AC_if_var`, `AC_while_image`, `AC_for_each`, `AC_wait_image`, `AC_wait_pixel`, `AC_sleep`, `AC_retry` | |
| 941 | +| 流程控制 | `AC_loop`, `AC_break`, `AC_continue`, `AC_if_image_found`, `AC_if_pixel`, `AC_if_var`, `AC_while_image`, `AC_while_var`, `AC_for_each`, `AC_wait_image`, `AC_wait_pixel`, `AC_sleep`, `AC_retry`, `AC_try` | |
934 | 942 | | 變數 | `AC_set_var`, `AC_get_var`, `AC_inc_var` | |
935 | 943 | | 遠端桌面 | `AC_start_remote_host`, `AC_stop_remote_host`, `AC_remote_host_status`, `AC_remote_connect`, `AC_remote_disconnect`, `AC_remote_viewer_status`, `AC_remote_send_input` | |
936 | 944 | | 錄製 | `AC_record`, `AC_stop_record`, `AC_set_record_enable` | |
|
0 commit comments