为 Windows 原生桌面应用生成并执行端到端自动化测试流程。
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "windows-desktop-e2e" 技能: 1. 下载 https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ja-JP/skills/windows-desktop-e2e/SKILL.md 2. 保存为 ~/.claude/skills/windows-desktop-e2e/SKILL.md 3. 装好后重载技能,告诉我可以用了
请为一个 WinForms 桌面应用生成 pywinauto 端到端测试脚本:启动程序,输入用户名和密码,点击登录,并断言进入主界面。请包含元素定位、等待逻辑和异常处理。
一份可执行的 pywinauto 自动化测试脚本,覆盖登录流程与成功断言。
请为 WPF 应用的表单提交流程设计端到端测试:填写必填字段、选择下拉项、提交表单,并验证成功提示出现;同时给出测试步骤说明。
包含测试脚本和步骤说明的结果,可用于验证表单交互与提交结果。
基于 Windows UI Automation,为 Qt 桌面程序生成一组回归测试用例,覆盖窗口打开、菜单点击、对话框确认和文件导出,并按模块组织测试代码。
结构化的回归测试代码与用例清单,适合持续迭代维护。
pywinauto と Windows UI Automation(UIA)を使用したWindowsネイティブデスクトップアプリケーションのエンドツーエンドテスト。WPF、WinForms、Win32/MFC、Qt(5.x / 6.x)をカバーし、Qt固有のガイダンスは専用セクションとして提供します。
windows-latest)に統合するときe2e-testing スキル(Playwright)を使用するすべてのWindowsデスクトップオートメーションは**UI Automation(UIA)**に依存します。これはWindowsに組み込まれたアクセシビリティAPIです。サポートされているすべてのフレームワークは、読み取りおよび操作可能なプロパティを持つUIA要素のツリーを公開します:
テスト(Python)
└── pywinauto(UIAバックエンド)
└── Windows UI Automation API ← Windowsに組み込み、フレームワーク非依存
└── アプリのUIAプロバイダー ← 各フレームワークが独自に実装
└── 実行中の .exe
フレームワーク別UIA品質:
| フレームワーク | AutomationId | 信頼性 | 注記 |
|---|
| WPF | ★★★★★ | 優秀 | x:Name が直接AutomationIdにマッピング |
| WinForms | ★★★★☆ | 良好 | AccessibleName = AutomationId |
| UWP / WinUI 3 | ★★★★★ | 優秀 | Microsoftの完全サポート |
| Qt 6.x | ★★★★★ | 優秀 | アクセシビリティがデフォルトで有効;クラス名が Qt6* に変更 |
| Qt 5.15+ | ★★★★☆ | 良好 | Accessibilityモジュールが改善 |
| Qt 5.7–5.14 | ★★★☆☆ | 普通 | QT_ACCESSIBILITY=1 が必要;objectNameは手動設定 |
| Win32 / MFC | ★★★☆☆ | 普通 | コントロールIDにアクセス可能;テキストマッチングが一般的 |
# Python 3.8+、Windowsのみ
pip install pywinauto pytest pytest-html Pillow pytest-timeout
# オプション:画面録画
# ffmpegをインストールしてPATHに追加:https://ffmpeg.org/download.html
UIAが到達可能か確認:
from pywinauto import Desktop
Desktop(backend="uia").windows() # すべてのトップレベルウィンドウを一覧表示
Accessibility Insights for Windowsをインストールしてください(Microsoft提供、無料)— テストを書く前にUIA要素ツリーを検査するためのDevTools相当のツールです。
テストを書く前に全てのインタラクティブなコントロールに安定したAutomationIdを設定することが最も効果的です。
<!-- XAML: x:Name が自動的にAutomationIdになる -->
<TextBox x:Name="usernameInput" />
<PasswordBox x:Name="passwordInput" />
<Button x:Name="btnLogin" Content="Login" />
<TextBlock x:Name="lblError" />
// デザイナーまたはコードで設定
usernameInput.AccessibleName = "usernameInput";
passwordInput.AccessibleName = "passwordInput";
btnLogin.AccessibleName = "btnLogin";
lblError.AccessibleName = "lblError";
// .rcファイルのコントロールリソースIDがAutomationId文字列として公開される
// IDC_EDIT_USERNAME -> AutomationId "1001"
// 名前にはSetWindowTextを優先;より豊かなサポートにはIAccessibleを追加する
tests/
├── conftest.py # アプリ起動フィクスチャ、失敗時スクリーンショット
├── pytest.ini
├── config.py
├── pages/
│ ├── __init__.py # インポートに必須
│ ├── base_page.py # ロケーター、ウェイト、スクリーンショットヘルパー
│ ├── login_page.py
│ └── main_page.py
├── tests/
│ ├── __init__.py
│ ├── test_login.py
│ └── test_main_flow.py
└── artifacts/ # スクリーンショット、動画、ログ
import os, time
from pywinauto import Desktop
from config import ACTION_TIMEOUT, ARTIFACT_DIR
class BasePage:
def __init__(self, window):
self.window = window
# --- ロケーター(優先順位順)---
def by_id(self, auto_id, **kw):
"""AutomationId — 最も安定。第一選択として使用する。"""
return self.window.child_window(auto_id=auto_id, **kw)
def by_name(self, name, **kw):
"""表示テキスト / アクセシブルな名前。"""
return self.window.child_window(title=name, **kw)
def by_class(self, cls, index=0, **kw):
"""コントロールクラス + インデックス — 脆弱、可能なら避ける。"""
return self.window.child_window(class_name=cls, found_index=index, **kw)
# --- ウェイト ---
def wait_visible(self, spec, timeout=ACTION_TIMEOUT):
spec.wait("visible", timeout=timeout)
return spec
def wait_gone(self, spec, timeout=ACTION_TIMEOUT):
spec.wait_not("visible", timeout=timeout)
…
帮助开发者为代码代理配置性能优化、安全防护与研究优先工作流。
帮助开发者使用 WinUI 3 与 Windows App SDK 构建 Windows 应用