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,该怎样点击呢?

  1. 如果按照抓图的方式或者用含有occurrence的命名来捕获它,可能会面临着要经常维护脚本。
  2. 我是按照层级来捕获它的,如图的层级,我先定位到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

 年终了,为了弥补一下给自己定的目标,写一篇博客,把自己在年初的一点小经验分享出来。希望能帮到有需要的朋友,开心😊。

 

posted @ 2021-12-02 10:12  flying0dancing  阅读(288)  评论(0)    收藏  举报