gpt4 book ai didi

python - 使用没有对象映射的 findObject() 或 waitForObject() 通过 id 或 objectName 在 Squish 中获取 QML 元素

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:50 25 4
gpt4 key购买 nike

如何在没有对象映射的情况下使用 findObject()waitForObject() 通过 id 或 objectName 获取 QML 元素?有可能吗?

考虑:

Item {
id: page
objectName: "pageObject"

Text {
id: foobar
objectName: "lorem"
text: "ipsum"
}
}

我想在测试脚本中访问 foobar 的文本,例如:

obj = findObject("foobar")
if obj.text == "ipsum":
test.passes("all good")
else:
test.fail("uh oh")

我也试过:

obj = findObject("lorem")
obj = findObject("{name='lorem'}")
obj = findObject("{name='lorem' type='Text'}")
obj = findObject("{objectName='lorem'}")
obj = findObject("{objectName='lorem' type='Text'}")

最佳答案

最终我通过在对象映射中只包含根级对象解决了这个问题。使用以下函数在代码中迭代所有其他对象。

import sys
import time

# Definitions
ROOT_SYMBOLIC_OBJECT = ":_KMainView"

# Object finding functions
def findSymbolic(symbolicName):
# Note: give Squish symbolic name like ":Foobar"
try:
obj = findObject(symbolicName)
except LookupError:
sys.exc_clear()
test.log("FAIL: Root object not found: " + symbolicName)
sys.exit()

return obj

def findRoot():
return findSymbolic(ROOT_SYMBOLIC_OBJECT)

def findFlat(fromElement, findId, occurence, stopOnFail, verbose):
start = time.time()
result = None
found = 0

if fromElement and hasattr(fromElement, 'children'):
children = object.children(fromElement)
for child in children:
if hasattr(child, 'id') and child.id == findId:
found += 1
if found == occurence:
result = child
break

if result == None and stopOnFail:
test.log("FAIL: findFlat: " + findId + " not found")
sys.exit()

if verbose:
printElapsed("findFlat", findId, start)

return result

def findRecursive(fromElement, findId, occurence):
return findRecursiveWithOptions(fromElement, findId, occurence, True, False, True)

def findRecursiveWithOptions(fromElement, findId, occurence, stopOnFail, verbose, skipUnnamed):
start = time.time()
found = 0
depth = -1

obj, found, depth = objIter(fromElement, findId, occurence, verbose, skipUnnamed, found, depth)

if found == occurence:
printElapsed("findRecursive ok", findId, start)
return obj

printElapsed("findRecursive not found", findId, start)
if stopOnFail:
test.log("FAIL: findRecursive:" + findId + " not found.")
sys.exit()

return None

def objIter(fromElement, findId, occurence, verbose, skipUnnamed, found, depth):
depth += 1

if verbose:
printObjIter(fromElement, depth)

children = object.children(fromElement)
for child in children:
if hasattr(child, 'id'):
if child.id == findId:
found += 1
if found == occurence:
return child, found, depth
elif skipUnnamed:
continue

obj, found, depth = objIter(child, findId, occurence, verbose, skipUnnamed, found, depth)
depth = depth - 1
if found == occurence:
return obj, found, depth

return None, found, depth

def findRecursiveList(fromElement, findId):
return findRecursiveListWithOptions(fromElement, findId, True, False, True)

def findRecursiveListWithOptions(fromElement, findId, stopOnFail, verbose, skipUnnamed):
start = time.time()
objList = []
depth = -1

objList, depth = objListIter(fromElement, findId, verbose, skipUnnamed, objList, depth)

printElapsed("findRecursiveList", findId, start)
return objList

def objListIter(fromElement, findId, verbose, skipUnnamed, objList, depth):
depth += 1

if verbose:
printObjIter(fromElement, depth)

children = object.children(fromElement)
for child in children:
if hasattr(child, 'id'):
if child.id == findId:
objList.append(child)
elif skipUnnamed:
continue

objList, depth = objListIter(child, findId, verbose, skipUnnamed, objList, depth)
depth = depth - 1

return objList, depth

# Utilities
def printElapsed(functionName, objectId, start):
elapsed = time.time() - start
test.log(functionName + " - " + objectId + " in " + str(elapsed) + "s.")

def printObjIter(element, depth):
dashes = "-" * depth

if hasattr(element, 'id'):
test.log(dashes + " " + str(element.id))
else:
test.log(dashes + " [unnamed]")

问题的 QML 示例测试脚本:

startApplication("exampleapp") # Launch application binary 'exampleapp'
snooze(10) # Let it start

root = findRoot()
page = findFlat(root, "page", 1, True, False)
foobar = findFlat(page, "foobar", 1, True, False)

# Also just: foobar = findRecursive(root, "foobar", 1)

if foobar.text == "ipsum":
test.passes("text is ok")
else:
test.fail("Incorrect foobar text: " + foobar.text)

关于python - 使用没有对象映射的 findObject() 或 waitForObject() 通过 id 或 objectName 在 Squish 中获取 QML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22091457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com