如何在UFT中识别WinListView控件内嵌的WinEdit与WinComboBox对象
识别WinListView内嵌临时WinEdit/WinComboBox控件的方法(UFT + VBScript)
我之前在做Windows桌面应用自动化测试时,刚好碰到过一模一样的WinListView动态内嵌控件问题,分享几个亲测有效的方法帮你搞定:
1. 先用UFT Spy锁定临时控件的核心标识
第一步得先搞清楚这些临时控件的“身份特征”,操作很直接:
- 打开UFT的Object Spy工具,先手动触发控件出现:选中目标行,点击对应单元格,等WinEdit/WinComboBox弹出来的瞬间,用Spy捕获它。
- 重点记录稳定不变的属性:比如
nativeclass(WinEdit对应Edit,WinComboBox对应ComboBox)、class name,还有它和父WinListView的关联关系(比如parent属性指向你的WinListView对象)。尽量避开易变属性,比如index或者text(可能为空或动态变化)。
2. 用ChildObjects方法定位内嵌控件
这些临时控件本质是WinListView的子对象,直接用UFT的ChildObjects结合描述性编程就能精准定位,给你贴个VBScript示例:
' 1. 先获取目标WinListView对象(可使用对象库或描述性编程) Set objListView = Window("YourAppMainWindow").WinListView("ProductList") ' 2. 触发临时控件出现:选中第3行,点击第2列单元格 objListView.Select 3 objListView.ClickCell 3, 2 ' 3. 定义WinEdit的属性描述(根据Spy结果调整) Set editDesc = Description.Create() editDesc("nativeclass").Value = "Edit" editDesc("visible").Value = True ' 4. 获取ListView下所有匹配的WinEdit控件 Set tempEdits = objListView.ChildObjects(editDesc) ' 5. 取第一个匹配控件(点击单个单元格只会出现一个) If tempEdits.Count > 0 Then Set targetEdit = tempEdits(0) ' 后续操作:比如输入测试文本 targetEdit.Set "Automation Test Demo" Else MsgBox "未找到临时WinEdit控件" End If
如果是WinComboBox,只需要把nativeclass改成ComboBox即可,逻辑完全一致。
3. 加入等待机制避免控件未加载完成
临时控件是动态出现的,直接操作容易报错,建议加上等待逻辑确保控件就绪:
方法一:用WaitProperty等待控件可见
' 触发控件出现后,最多等待10秒直到控件可见 If tempEdits.Count > 0 Then tempEdits(0).WaitProperty("visible", True, 10000) tempEdits(0).Set "Test Data" End If
方法二:循环等待控件出现
Dim waitCounter waitCounter = 0 ' 最多等待10秒 Do Until tempEdits.Count > 0 Or waitCounter >= 10 Wait 1 ' 每次等待1秒 Set tempEdits = objListView.ChildObjects(editDesc) ' 重新获取控件 waitCounter = waitCounter + 1 Loop
4. 结合行/列信息精准定位(多控件场景)
如果多个单元格点击后都会出现临时控件,你可以通过选中行索引+单元格位置来区分目标控件:
' 获取当前选中的行索引 selectedRowIndex = objListView.GetSelectedItems()(0) targetColumn = 2 ' 目标列的索引 ' 获取目标单元格的位置坐标(返回数组:左X, 上Y, 右X, 下Y) cellRect = objListView.GetCellRect(selectedRowIndex, targetColumn) Set allEdits = objListView.ChildObjects(editDesc) For Each editCtrl In allEdits ' 对比控件位置和目标单元格位置 editX = editCtrl.GetROProperty("x") editY = editCtrl.GetROProperty("y") If editX >= cellRect(0) And editY >= cellRect(1) And editX <= cellRect(2) And editY <= cellRect(3) Then Set targetEdit = editCtrl Exit For End If Next
额外注意事项
- 操作要连贯:临时控件可能在失去焦点后立刻消失,触发出现后要马上执行后续操作,别插入无关步骤。
- 优先用描述性编程:这类动态控件很难提前加入对象库,描述性编程是更可靠的选择。
- 验证属性稳定性:如果
nativeclass不够唯一,可以叠加其他稳定属性,比如enabled、class name等。
内容的提问来源于stack exchange,提问作者Devesh Thakur
相关产品推荐
相关产品推荐

