Squish捕获未命名控件
去年年底的时候接触到squish,维护现有的squish脚本。原有squish脚本利用抓图来捕获按钮,主要原因是按钮没有命名不好捕获。
Squish捕获的未命名控件,举例,
mainWindow_QmlWidget_2={"occurrence":2,"type":"QmlWidget","unnamed":1,"visible":1,"window":mainWindow_MainWindow}
这里的occurrence可能会变。
Squish捕获的已命名的控件,举例,
mainWindow_MainWindow={"name":"MainWindow","type":"MainWindow","visible":1}
因为抓图经常会失手,所以,我决定换一种思路解决问题。先大概看一下squish捕获的QT对象层级

一、假如root_0是可以正常捕获的, 而在root_0下面的子孙节点都不能正常捕获。问题,我现在要模拟点击workflow_bar.btn_common_impression_1,该怎样点击呢?
- 如果按照抓图的方式或者用含有occurrence的命名来捕获它,可能会面临着要经常维护脚本。
- 我是按照层级来捕获它的,如图的层级,我先定位到root_0,而root_0下面的节点,利用一个数组把相应的子孙节点索引按顺序给出。举例,
Btn_common_impression=getObjectByLayers(root_0,[0,1,1])
相应python源码如下,
def getObjectByLayers(parentObj,layerList):
#parentO=waitForObject(parentObj)
parentO=parentObj
childO=None
if not layerList:
return childO
for i in layerList:
childrenO=object.children(parentO)
#test.log("children:"+str(len(childrenO)))
#test.log("i:"+str(i))
if i>=len(childrenO):
childO=None
break
else:
childO=object.children(parentO)[i]
parentO=childO
#printProps(childO)
return childO
二、假如buttons_1是可以正常捕获的,子节点workflow_bar.btn_common_impression_1的存在与否是根据场景来的,有时存在,有时不存在;并且它有一个属性objectName。这样我们就可以通过这个属性和父节点buttons_1来捕获到它。
btnImpress=getChildObjByProperty(buttons_1,'objectName','workflow.btn_impression')
相应python源码如下,
def getChildObjByProperty(parentObj,propName,propValue):
parentO=parentObj
childO=None
if not propName:
return childO
childrenO=object.children(parentO)
for childO in childrenO:
flag=propsExists(childO,propName,propValue)
if flag:
break
if not flag:
childO=None
return childO
def printProps(obj):
#objO=waitForObject(obj)
if not obj:
return
objO=obj
propsO=object.properties(objO)
for name,value in propsO.iteritems():
test.log("%s = %s" % (name, value))
def propsExists(obj,propName,propValue):
flag=False
if not obj:
return flag
objO=obj
propsO=object.properties(objO)
if propName in propsO:
#test.log("............................find prop "+propName)
if propsO[propName]==propValue:
flag=True
#test.log("............................getIt %s = %s" % (propName, propsO[propName]))
return flag
年终了,为了弥补一下给自己定的目标,写一篇博客,把自己在年初的一点小经验分享出来。希望能帮到有需要的朋友,开心😊。

浙公网安备 33010602011771号