From 6490b6b0987d1ce3ec6354a7fb7794b9f84fdc0d Mon Sep 17 00:00:00 2001 From: einliterflasche Date: Fri, 17 Jul 2026 17:22:15 +0200 Subject: [PATCH] add --automation flag for programmatic ui interaction --- .claude/skills/desktop-app/SKILL.md | 54 + Cargo.lock | 382 +++- src-tauri/Cargo.toml | 4 + src-tauri/src/lib.rs | 5 + .../vendor/tauri-plugin-webdriver/Cargo.toml | 160 ++ .../vendor/tauri-plugin-webdriver/LICENSE | 21 + .../vendor/tauri-plugin-webdriver/README.md | 321 +++ .../vendor/tauri-plugin-webdriver/VENDOR.md | 10 + .../android/build.gradle.kts | 44 + .../android/proguard-rules.pro | 21 + .../android/settings.gradle | 31 + .../java/ExampleInstrumentedTest.kt | 24 + .../android/src/main/AndroidManifest.xml | 4 + .../android/src/main/java/WebDriverPlugin.kt | 737 +++++++ .../android/src/test/java/ExampleUnitTest.kt | 17 + .../vendor/tauri-plugin-webdriver/build.rs | 8 + .../vendor/tauri-plugin-webdriver/deny.toml | 44 + .../tauri-plugin-webdriver/ios/Package.swift | 32 + .../tauri-plugin-webdriver/ios/README.md | 3 + .../ios/Sources/WebDriverPlugin.swift | 438 ++++ .../ios/Tests/PluginTests/PluginTests.swift | 8 + .../permissions/autogenerated/reference.md | 13 + .../permissions/default.toml | 3 + .../permissions/schemas/schema.json | 306 +++ .../tauri-plugin-webdriver/src/desktop.rs | 12 + .../tauri-plugin-webdriver/src/error.rs | 21 + .../vendor/tauri-plugin-webdriver/src/lib.rs | 70 + .../tauri-plugin-webdriver/src/mobile.rs | 72 + .../src/platform/alert_state.rs | 162 ++ .../src/platform/android.rs | 533 +++++ .../src/platform/executor.rs | 1875 +++++++++++++++++ .../src/platform/ios.rs | 351 +++ .../src/platform/linux.rs | 487 +++++ .../src/platform/macos.rs | 681 ++++++ .../src/platform/mod.rs | 100 + .../src/platform/windows.rs | 1013 +++++++++ .../src/server/handlers/actions.rs | 312 +++ .../src/server/handlers/alert.rs | 87 + .../src/server/handlers/cookie.rs | 109 + .../src/server/handlers/document.rs | 24 + .../src/server/handlers/element.rs | 618 ++++++ .../src/server/handlers/frame.rs | 131 ++ .../src/server/handlers/mod.rs | 31 + .../src/server/handlers/navigation.rs | 127 ++ .../src/server/handlers/print.rs | 73 + .../src/server/handlers/screenshot.rs | 24 + .../src/server/handlers/script.rs | 57 + .../src/server/handlers/session.rs | 178 ++ .../src/server/handlers/shadow.rs | 155 ++ .../src/server/handlers/timeouts.rs | 57 + .../src/server/handlers/window.rs | 261 +++ .../tauri-plugin-webdriver/src/server/mod.rs | 76 + .../src/server/response.rs | 190 ++ .../src/server/router.rs | 238 +++ .../src/webdriver/element.rs | 90 + .../src/webdriver/locator.rs | 278 +++ .../src/webdriver/mod.rs | 5 + .../src/webdriver/session.rs | 110 + 58 files changed, 11215 insertions(+), 83 deletions(-) create mode 100644 .claude/skills/desktop-app/SKILL.md create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/Cargo.toml create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/LICENSE create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/README.md create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/VENDOR.md create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/android/build.gradle.kts create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/android/proguard-rules.pro create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/android/settings.gradle create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/android/src/androidTest/java/ExampleInstrumentedTest.kt create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/android/src/main/AndroidManifest.xml create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/android/src/main/java/WebDriverPlugin.kt create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/android/src/test/java/ExampleUnitTest.kt create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/build.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/deny.toml create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/ios/Package.swift create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/ios/README.md create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/ios/Sources/WebDriverPlugin.swift create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/ios/Tests/PluginTests/PluginTests.swift create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/permissions/autogenerated/reference.md create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/permissions/default.toml create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/permissions/schemas/schema.json create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/desktop.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/error.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/lib.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/mobile.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/platform/alert_state.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/platform/android.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/platform/executor.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/platform/ios.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/platform/linux.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/platform/macos.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/platform/mod.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/platform/windows.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/actions.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/alert.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/cookie.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/document.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/element.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/frame.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/mod.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/navigation.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/print.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/screenshot.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/script.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/session.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/shadow.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/timeouts.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/handlers/window.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/mod.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/response.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/server/router.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/webdriver/element.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/webdriver/locator.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/webdriver/mod.rs create mode 100644 src-tauri/vendor/tauri-plugin-webdriver/src/webdriver/session.rs diff --git a/.claude/skills/desktop-app/SKILL.md b/.claude/skills/desktop-app/SKILL.md new file mode 100644 index 0000000000..01793747d6 --- /dev/null +++ b/.claude/skills/desktop-app/SKILL.md @@ -0,0 +1,54 @@ +--- +name: desktop-app +description: Drive the desktop (Tauri) app for realistic end-to-end tests of GUI features and UI (launch with the embedded WebDriver server, puppeteer the UI, read backend logs). Use whenever a change needs verification in the desktop GUI. +--- + +# Desktop app testing + +Drive the real desktop app — real WKWebView, real Rust backend — through a W3C WebDriver server embedded in the app (`tauri-plugin-webdriver`, compiled only with `--features automation`). All interaction is synthetic: clicks are DOM events dispatched inside the webview, screenshots are WKWebView snapshots. It never moves the user's mouse cursor, never needs the window focused, and works with the window in the background — the user keeps using their machine while you test. + +Never ship the `automation` feature in a release build: port 4445 grants arbitrary JS execution inside the wallet webview. + +## Delegate to a subagent + +WebDriver interaction is far too context-heavy for the main agent (screenshots, HTML dumps, log greps). ALWAYS delegate the routine interaction loop — navigation, element finding, clicking, log greps — to a subagent (Agent tool, opus model, low reasoning effort). Give it a concrete goal and the procedure below; have it return only a compact report (what it did, what it observed, verbatim error lines if any). + +Exception: visual judgement stays with the main agent. For any decision based on how the UI actually looks (what is broken, how something renders), have the subagent save a screenshot and return the path, then Read the PNG yourself — and do this at least once per session regardless. Don't take the subagent's verbal description on faith for anything load-bearing. + +## Launch + +- If the production eigenwallet app is running, the dev instance exits immediately (single-instance plugin, same app identifier). Ask the user to close it first — never kill their wallet yourself. +- Frontend dev server (skip if already running): `curl -s http://localhost:1420 >/dev/null || (cd src-gui && yarn dev)` — run as a background task +- App: `cd src-tauri && cargo tauri dev --no-watch --features automation -- -- --testnet` — run as a background task; a window appears on the user's desktop, leave it alone +- WebDriver server: `http://127.0.0.1:4445` — ready when `curl -s http://127.0.0.1:4445/status` succeeds + +## Interaction procedure + +Plain W3C WebDriver over HTTP; `jq` is available. Base URL below: `WD=http://127.0.0.1:4445`. + +1. Create one session and reuse it: + `SID=$(curl -s -XPOST $WD/session -H 'Content-Type: application/json' -d '{"capabilities":{}}' | jq -r .value.sessionId)` +2. ALWAYS look at the screen visually first: `curl -s $WD/session/$SID/screenshot | jq -r .value | base64 -d > /screen.png` and Read the image. Never interact blind — confirm what state the app is actually in before every action sequence, and after any action whose effect you aren't sure about. The PNG is at retina scale (2× the logical window size, e.g. 1600×1400 for the 800×700 window). +3. Find elements by selector, never by estimating coordinates. Strategies: `css selector`, `xpath`, `link text`. For buttons by visible text use xpath: + `EID=$(curl -s -XPOST $WD/session/$SID/element -H 'Content-Type: application/json' -d '{"using":"xpath","value":"//button[contains(., \"Continue\")]"}' | jq -r '.value["element-6066-11e4-a52e-4f735466cecf"]')` + - Match DOM text, not what the screenshot shows: MUI renders buttons ALL-CAPS via CSS `text-transform`, so the button that displays "CONTINUE" has DOM text "Continue" (and `/element/$EID/text` returns "Continue"). + - Clickable things are often not `