首页 > 解决方案 > 如何检查运行时结构更改后waitForObject结果对象是否仍然存在?

问题描述

我有具有深度嵌套对象/属性的列表项(我无法更改) - 以及其他几个(20-50)其他类似情况的其他嵌套

就像是:

List[]
 Item
   A
     B
     C <-- "change item type"
      D
       E <-- "delete item"
   F
   G
    H <-- "change color"

使用带有真实/符号名称的 findAllObjects 我得到所有出现的项目(它在一个唯一的类型列表中),然后在其上使用 hasattr、object.children 等来收集所有需要的部分

实名/对象映射+findAll+object.children 聚集 ==> python 对象

产生一个对象字典,如:

a[] = {{c,e,h},{c,e,h},{c,e,h},...}

没有任何问题

waitForObject(a[0].f) 或 mouseClick(waitForObject(a[0].i)) 是典型的用法

问题是我的结果上的某些操作使结果本身无效,例如单击“删除项目”对象

我目前的解决方案是在对其进行任何更改后重新阅读完整列表,因为我无法轻松检查对象是否仍然有效

waitForObject 没有帮助,因为某些列表项不可见,waitForObjectExists 无法将对象作为参数处理以检查不可见项是否可能无效,objects.exists 似乎只接受实名没有对象

我的基本问题是,有时我不知道(由于软件的复杂性)是否某些操作使我事先收集的信息无效,并且我不想总是重新阅读可能依赖的所有内容

有什么想法、策略、最佳实践吗?

更新#1:我总是检查查找异常,但是如何检查不可见(python)对象是否仍然有效(waitForExits 或 object.exits 等不允许使用对象作为参数)

有时我不知道某些东西会使我的对象无效 - 它是一个大型应用程序(>1Mio LOC),我开始使用 Squish 进行测试,具有高度动态的 QML 接口(加载器,动态元素添加/删除) - 不太容易跟踪对象层次结构失效,非常动态

所以我的解决方案是:使用 findAllObjects + object.children 层次结构读取我需要的所有信息,进行一次测试并重新读取所有数据,因为我知道这会使我的数据无效,但这可能发生在我只想的很多地方放置一些断言以检测我的某些对象是否无效(当时我不知道)-但这似乎无法使用 Squish API

更新#2

我刚刚发现,如果我使用 waitForObject/findAllObjects 等收集对象引用并对层次结构进行更改,在该层次结构中,引用的对象会抵制我的所有相关对象引用在 Python 中失效

all_items1 = findAllObjects(names.listItems)
mouseClick(names.delete_button)
all_items2 = findAllObjects(names.listItems)

all_items1 before delete_button click:

[0] MyItem_QMLTYPE... <complex object>
[1] MyItem_QMLTYPE... <complex object>
[2] MyItem_QMLTYPE... <complex object>

all_items1 after delete_button click:

[0] MyItem_QMLTYPE... <null>
[1] MyItem_QMLTYPE... <null>
[2] MyItem_QMLTYPE... <null>

all_items2:

[0] MyItem_QMLTYPE... <complex object>
[1] MyItem_QMLTYPE... <complex object>
[2] MyItem_QMLTYPE... <complex object>

所以似乎这些对象被主动跟踪,我虽然只有数据副本,但这种行为是否在 Squish Docs 中详细解释(链接?) - 我只是在文档中忽略了它,只是改变了对象改变了吗?

很抱歉让所有试图提供帮助的人感到困惑

现在清楚了:

在对我的层次结构进行更改后,我绝对需要重新收集我的对象,如果我忘记重新收集,我将得到的只是由于无效的对象引用而导致的错误,因为它不可能使用无效的对象引用

标签: qtqmlsquish

解决方案


推荐阅读