如何在运行时进行结构更改后检查waitForObject结果对象是否仍然存在?

时间:2019-08-25 07:22:57

标签: qt qml squish

我的列表项包含了非常需要的对象/属性(我无法更改)-以及其他几种(20-50)种类似情况以及其他嵌套方式

类似:

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

使用具有真实/符号名称的findAllObjects可以获取所有出现的Items(在唯一的类型列表中) 然后在其上使用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 :我总是检查Lookup异常,但是如何检查不可见的(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(链接?)中得到了详细解释-我只是在文档中忽略了它, 只是被改变的物体被改变了?

很抱歉使试图帮助的所有人感到困惑

现在清除:

在对层次结构进行更改之后,我绝对需要重新收集对象,如果我忘记重新收集,我将得到的都是错误提示 空对象引用,因为它不可能使用无效对象 对象引用

0 个答案:

没有答案