desktop-e2e-edho-ferdian
End-to-end tests for Windows desktop apps (WPF, WinForms, Win32, Qt) with pywinauto over UI Automation. Use for "test aplikasi desktop", "pywinauto", "WPF/WinForms/Qt test", "UI Automation", "test .exe ini", or a flaky desktop GUI suite.
- License 许可
- MIT
- 所属仓库
- edhoferdian/EEF
- 最近更新
- 2026-10-30
- Stars
- ★ 22
- Forks
- 0
01 前言 Front Matter
- name
- desktop-e2e-edho-ferdian
- metadata
- { "last_reviewed": "2026-09-09" }
- description
- End-to-end tests for Windows desktop apps (WPF, WinForms, Win32, Qt) with pywinauto over UI Automation. Use for "test aplikasi desktop", "pywinauto", "WPF/WinForms/Qt test", "UI Automation", "test .exe ini", or a flaky desktop GUI suite.
02 资源文件 3
- 参考文档references/isolation-and-ci.md3.7 KB
- 参考文档references/pywinauto-harness.md5.5 KB
- 参考文档references/qt-and-fallback.md2.8 KB
03 SKILL.md 正文
Desktop E2E (Windows) — Edho Ferdian Mode
Where this sits
e2e-testing-edho-ferdian owns the process: Phase 1 journey mapping,
Phase 2 Page Object Model, Phase 3 flake quarantine, Phase 4 artifact capture.
All four are driver-agnostic and apply unchanged here — do not restate or fork
them. This skill supplies only what changes when the driver is native Windows
automation instead of a browser:
| Concept | Browser (Playwright) | Here (pywinauto + UIA) |
|---|---|---|
| Locator | role / data-testid / CSS |
AutomationId → Name → ClassName+index |
| Wait | auto-waiting locators | spec.wait("visible") / wait_until(...) |
| Artifact | screenshot / video / trace | window capture / ffmpeg gdigrab / step trace |
| Isolation | browser context | fresh process + redirected APPDATA/TEMP |
Not for: web apps (use Playwright), Electron/CEF/WebView2 (the HTML layer needs browser automation, UIA only sees the shell), mobile, or anything that does not need a running GUI.
How it works
Everything routes through Windows UI Automation, an accessibility API built into Windows. Each UI framework ships a UIA provider of varying quality:
pytest → pywinauto (uia backend) → Windows UI Automation API → app's UIA provider → running .exe
| Framework | AutomationId source | Reliability |
|---|---|---|
| WPF | x:Name maps directly |
Excellent |
| UWP / WinUI 3 | native | Excellent |
| Qt 6.x | setAccessibleName; accessibility on by default |
Excellent |
| WinForms | AccessibleName |
Good |
| Qt 5.15+ | needs QT_ACCESSIBILITY=1 |
Good |
| Qt 5.7–5.14 | needs QT_ACCESSIBILITY=1; manual objectName |
Fair |
| Win32 / MFC | resource control IDs appear as numeric strings | Fair |
Phase 0′ — Environment check (before anything else)
pip install pywinauto pytest pytest-html pytest-timeout Pillow
from pywinauto import Desktop
Desktop(backend="uia").windows() # must list top-level windows
Install Accessibility Insights for Windows (free, Microsoft) — it is the DevTools equivalent for this stack. Inspect the UIA tree there before writing a locator; guessing at AutomationIds is the main time sink here.
If UIA is unreachable, or the target turns out to be Electron/WebView2, stop
and say so — report VERIFIED: NO — no usable native automation driver, the
same convention the rest of this ecosystem uses. Never fabricate a run.
Testability first
The single highest-leverage action is giving every interactive control a stable AutomationId before writing tests. Per framework:
- WPF —
x:Name="btnLogin"in XAML; nothing else needed. - WinForms —
btnLogin.AccessibleName = "btnLogin"; - Qt — set both, via one helper, and centralize the string constants in a
header so tests and app cannot drift:
void setTestId(QWidget* w, const char* id) { w->setObjectName(id); w->setAccessibleName(id); // becomes the UIA Name property } - Win32 / MFC — resource IDs surface as numeric AutomationId strings;
prefer
SetWindowTextfor a readable Name.
A test suite written against ClassName + index because the app has no
AutomationIds will be rewritten within a release. Fixing testability in the app
is cheaper than the flakiness it prevents — say so when the app owner resists.
References
references/pywinauto-harness.md— the Page Object base class, locator priority, wait patterns, artifact capture, the opt-in per-step trace, and the flaky-cause table.references/isolation-and-ci.md— the three isolation tiers (tmp_path env redirect / Job Object / Windows Sandbox), hang prevention, and the GitHub Actionswindows-latestworkflow.references/qt-and-fallback.md— Qt-specific quirks (combo popups, dialogs as top-level windows, table cells, self-drawn widgets) and the screenshot-matching fallback with its DPI rules.
Language routing (fixed — see skill-authoring-edho-ferdian's canonical contract)
Communication to the user in Bahasa Indonesia; test code, page-object names,
and assertions in English — fixed, never ask. Full contract:
skill-authoring-edho-ferdian §7.
Global rules
- AutomationId first, always. Name second, ClassName+index only when forced, coordinates never as a primary strategy.
- Never
time.sleep()as synchronization.wait_visible/wait_gone/wait_untilexist for exactly this. - Fresh process per test. A session-scoped app fixture leaks state between tests and turns every failure into an archaeology exercise.
- Assert content and state, never pixel geometry.
lblStatus == "Logged in"is a test;btn.rectangle().left == 120is a trap. - Redact typed text in traces. Never enable trace text capture on a login or payment flow.
- Quarantine, don't delete — the protocol in
e2e-testing-edho-ferdian/references/flake-quarantine.mdapplies verbatim; the Python spelling is@pytest.mark.skip(reason="...")/@pytest.mark.skipif(os.environ.get("CI") == "true", reason="...").
04 同仓库更多 Skills
video-style-edho-ferdian
Measure a reference video's look and pacing (colour grade as a 3D LUT, cut rhythm, overlays) and reproduce it: grade, cut and composite new footage, verify numerically, hand off an NLE timeline. Use for "tiru look video ini", "samakan grading", "bikin video dengan gaya referensi", "LUT dari referensi", "cut rhythm".
test-authoring-edho-ferdian
Write unit and component tests well: React Testing Library, pytest, Go and Vue, plus regression-test patterns. Use for "tulis test untuk component ini", "bagaimana test hook ini", "test yang bagus untuk fitur X", "tulis test pytest/Go/Vue", or dev-kickoff's TEST stage.
system-design-edho-ferdian
Mid-project architecture decisions: ADRs, trade-off analysis, non-functional requirements, scaling tiers and blast radius. Use for "desain arsitektur", "keputusan teknis besar", "bikin ADR", "trade-off antara X dan Y", "microservices atau monolith", "apa yang rusak kalau X diubah", or a capacity question.
spec-mining-edho-ferdian
Extract behavioural specs from a codebase with none: WHEN/THEN requirements and invariants, each anchored to the code that enforces it, unclear behaviour recorded as uncertainty. Use for "ekstrak spec", "buat spec dari kode", "reverse-engineer the spec", "repo ini tidak ada dokumentasi", or a missing BEHAVIOR_SPEC in dev-kickoff.
skill-authoring-edho-ferdian
Create and govern this ecosystem's skills: search before building, a quality bar, compliance checks, promoting repeated principles to rules, and packaging dist/*.skill. Use for "bikin skill baru", "ada skill buat X gak", "fork skill ini", "skill gue kepake gak sih", "package skill ini", "buatkan .skill-nya".
skill-audit-edho-ferdian
Audit this repo's skills/ for staleness, redundancy, broken cross-references and weak descriptions (not the ~/.claude setup: that is config-hygiene). Use for "audit skill saya", "cek skill yang sudah dibuat", "ada yang redundan gak", "skill mana yang basi".