Skip to content

WPF UI Automation 与 MCP(V10)

内容类型:专项测试方法难度:进阶适合:想让 Agent 检查 WPF 控件状态、复现固定页面路径或补 UI 回归证据的人阅读时间:约 12 分钟前置:已了解 WPF 与 UI Automation 基本概念

UI Automation 可以帮助 Agent 观察窗口、控件和有限交互,但它证明的是界面层可观察行为

它不能自动证明:

  • 后端安全联锁正确;
  • 设备真的执行了动作;
  • 高压/运动/阀门处于安全状态;
  • UI 上按钮变灰就等于设备动作一定被禁止。

因此 V10 把 UI Automation 定位为 V1–V3 中的一个证据来源,不是现场设备验收替代品。

1. 先判断这次 UI 任务需不需要自动化

任务默认策略
改一处文案/颜色/MarginV0/V1,通常不需要 UI Automation
Binding / Command 状态focused ViewModel + 必要 UI 检查
复杂页面导航/表单UI Automation 有价值
多状态按钮使能/弹窗UI Automation 可补行为证据
高压/运动/设备动作UI Automation 不能替代真实安全验证

不要为了一个 Label 改名先建设 UI 自动化框架。

2. Agent 能观察什么

取决于 WPF 控件是否正确暴露 Automation 信息,通常包括:

  • Window / Button / TextBox / DataGrid / Menu 层级;
  • AutomationId / Name;
  • Enabled / Selected / Focus;
  • 部分文本和弹窗;
  • Click / Invoke / Value / Select / Scroll 等 pattern。

自绘 Canvas、图表、第三方 GPU 控件可能暴露很少信息,此时可补:

  • screenshot;
  • 应用日志;
  • ViewModel focused test;
  • 专用只读 diagnostic seam。

不要为了让 Automation“看见”而把内部调试状态全部暴露到操作员界面。

3. 三类高价值任务

A. UI 状态检查

例如业务规则已经明确:

text
Condition: InterlockFault
UI expectation:
- Start disabled
- Stop available
- OperatorSummary 显示已停止原因

Automation 可以证明当前 UI 是否符合这条规则。

但要注意:

StartButton.IsEnabled == false 只能证明 UI 禁用了按钮,不能证明后端调用入口、快捷键、其它页面或 API 同样受联锁保护。

真正安全联锁仍应在稳定业务/设备边界验证。

B. 固定操作路径

在 Simulation/Fake 环境中执行:

text
打开配置
→ 填参数
→ 应用模拟配置
→ 启动模拟流程
→ 切换页面
→ 查看结果

适合覆盖:

  • 页面跳转;
  • 表单校验;
  • 对话框;
  • 操作员提示;
  • 无真实副作用的 workflow UI。

C. 回归证据

发生 UI regression 时,可以保存:

text
Action sequence
Automation tree snapshot
Expected state
Actual state
Screenshot
Application log

让修复前后跑同一操作序列,比“人工看起来好了”更可重复。

4. Simulation 必须在后端成立,不只是界面写个标签

危险项目不要只做:

text
UI 显示 Simulation
但底层仍连接真实 DeviceService

真正的模拟模式应确保:

text
UI Automation
→ Application
→ Fake / Simulation Adapter
→ no real hardware side effect

如果自动化按钮仍能走到真实 Device Session,这个测试环境就不安全。

5. 真实设备动作默认不进入通用 UI Automation

下面动作不应由通用 UI 自动化自由触发:

  • 高压开关;
  • 运动/伺服;
  • 加热、气路、阀门;
  • 继电器/功率输出;
  • 绕过联锁、自检或门禁;
  • 写永久设备参数;
  • 恢复出厂/固件等不可逆操作。

如果业务验收最终确实需要这些步骤:

text
Automation/software preparation
→ HardwarePending
→ 人工确认现场条件
→ HITL 执行动作
→ 记录真实设备证据

不要为了让 UI 测试“全自动”弱化后端安全边界。

6. 为 WPF 页面补稳定可测试信息

xml
<Button
    AutomationProperties.AutomationId="StartTestButton"
    AutomationProperties.Name="启动试验"
    Command="{Binding StartCommand}"
    Content="启动" />

推荐:

  • AutomationId 稳定、与显示文案解耦;
  • Name 对人可读;
  • 不按“第三个按钮”定位;
  • 页面重排不应让测试全部失效;
  • 共享组件使用稳定语义标识。

不要为了自动化把内部类名、线程 ID、协议字段直接变成操作员文本。

7. Accessibility 与可测试性通常同向

可以同时检查:

  • 键盘能到达关键控件;
  • Name 能表达动作;
  • Disabled/Error 不只靠颜色;
  • Dialog 打开后焦点进入合理位置;
  • Dialog 关闭后焦点恢复;
  • 状态变化能被 Automation 读取。

这些既改善可测试性,也改善真实操作体验。

8. MCP 暴露 UI Automation 时也要做 allowlist

不推荐一个万能 Tool:

text
click_anything(window, coordinates)

更适合:

text
inspect_window(WindowId)
get_control_state(AutomationId)
set_test_input(AutomationId, Value)
invoke_safe_ui_action(ActionId)

其中 invoke_safe_ui_action 只允许明确无危险副作用的动作。

MCP Tool 权限不能只靠 Prompt “请谨慎使用”。后端需要自己限制。

9. 证据等级怎么写

UI-only

text
VerificationLevel: V1/V2
UIAutomation: Verified
Hardware: NotRequired

UI Behavior + 模拟 workflow

text
VerificationLevel: V2/V3
UIAutomation: Verified
SimulationWorkflow: Verified
Hardware: NotRequired

最终还需真实设备

text
VerificationLevel: V3
UIAutomation: Verified
SimulationWorkflow: Verified
Hardware: HardwarePending

不要把第三种写成“功能全部通过”。

10. 一个安全的最小实验

  1. 使用 Fake/Simulation 启动应用;
  2. 只暴露窗口/控件树查询;
  3. 加一个固定表单填写场景;
  4. 加一个无设备副作用的导航/模拟操作;
  5. 保存 Automation 状态、截图和日志;
  6. 人工复核结果;
  7. 稳定后再扩展其它安全 UI 动作。

第一版不需要自动化整套上位机。

11. 常见反模式

  • 一个 UI 文案改动也先搭 UI Automation;
  • UI Disable 被当成后端 Interlock;
  • Automation 直接点击真实高压按钮;
  • UI 写“模拟模式”,底层仍连真机;
  • 用坐标/控件顺序作为唯一定位;
  • 自绘图看不见就把全部内部状态硬塞到 UI;
  • MCP 暴露万能 click/send command;
  • 自动化通过就写“真机已验证”。

12. 与 V10 其它能力怎么配合

一句话原则

UI Automation 可以证明界面行为;安全联锁必须在后端边界成立,真实设备行为必须用对应现场证据证明。

下一步

别来无恙 · C# 上位机 AI 实战站 · 从零到交付 · QQ 群:1016188499