能否从源码获取pywinauto控件标识符?及替代方案问询
解决方案
一、拿到源码后的优化方向
- 给控件配置固定自动化ID:在源码中为每个需要测试的控件设置唯一的Automation ID(不同UI框架设置方式不同:WinForms可设置
Control.Name或专门的AutomationId属性;WPF用AutomationProperties.AutomationId;Qt用setAccessibleName或setObjectName)。之后pywinauto可以直接通过automation_id="XXX"或control_id=XXX定位控件,完全不受控件顺序调整、新增元素的影响,从根源解决标识符变动问题,这是最稳定的方案。 - 复用控件的业务属性:优先使用源码中定义的控件文本(
Text)、名称(Name)等属性定位,这些属性和业务强关联,UI重构时只要功能不变一般不会随意修改,比自动生成的edit 0这类索引式标识符可靠得多。 - 跳过UI直接调用逻辑:如果团队有权限修改源码,可以给测试场景预留内部API接口,直接调用业务逻辑方法完成测试,彻底避开UI控件定位的所有问题,测试效率也会大幅提升。
二、点击获取控件标识符的方法
- 系统自带Inspect工具:Windows SDK自带的
Inspect.exe(一般路径为C:\Program Files (x86)\Windows Kits\10\bin\<版本号>\x64\inspect.exe),启动后可以通过点击控件查看其所有属性,包括Automation ID、Control Type、Name等,比print_control_identifiers更直观,能实时获取当前控件的准确标识符。 - 自定义脚本实现:可以自己写个简单脚本监听鼠标点击,获取对应控件的信息,示例代码:
from pywinauto import Desktop import pywinauto.mouse from pynput import mouse def on_click(x, y, button, pressed): if pressed and button == mouse.Button.left: desktop = Desktop(backend="uia") control = desktop.window_at(x, y) print("\n当前点击的控件信息:") control.print_control_identifiers() return False # 点击一次后停止监听 # 启动监听,点击左键获取控件信息 with mouse.Listener(on_click=on_click) as listener: listener.join()
运行脚本后,点击目标控件就能直接输出该控件的所有标识符,和你要的pyautogui.displayMousePosition()效果类似。
内容的提问来源于stack exchange,提问作者Catosh
相关产品推荐
相关产品推荐

