как проверить, существует ли объект результата 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

приводит к объекту dict, например:

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

который работает без проблем

waitForObject(a[0].f) или mouseClick(waitForObject(a[0].i)) является типичным использованием

проблема в том, что некоторые операции с моими результатами делают недействительными сами результаты, например, щелчок по объекту «удалить элемент»

мое текущее решение состоит в том, чтобы перечитать полный список после внесения в него каких-либо изменений, потому что я не могу легко проверить, действительно ли объект все еще действителен

waitForObject не помогает, потому что некоторые элементы списка не видны, а waitForObjectExists не может обрабатывать объекты в качестве параметра, чтобы проверить, не является ли невидимый элемент недействительным, объекты. существует, похоже, принимает только настоящее имя без объектов

моя основная проблема заключается в том, что я иногда не знаю (из-за сложности программного обеспечения), делают ли некоторые операции недействительными мою заранее собранную информацию, и я не хочу всегда перечитывать все, что, возможно, зависит

любые идеи, стратегии, лучшие практики?

ОБНОВЛЕНИЕ №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 (ссылка?) - я просто проглядел это в документации, изменены ли только измененные объекты?

извините, что ввела в заблуждение всех, кто пытался помочь

теперь ясно:

мне абсолютно необходимо повторно собрать мои объекты после внесения изменений в мою иерархию, и если я забыл повторно собрать все, что я получу, это ошибки из-за нулевых ссылок на объекты, потому что невозможно использовать недействительную ссылку на объект


person llm    schedule 25.08.2019    source источник
comment
Простое решение вашей проблемы - обернуть поиск объекта (или mouseClick или что-то еще) в блок try\except. Но видимо вы что-то делаете не так, потому что тест должен сам отслеживать состояние приложения иначе не будет возможности проверить результат, поэтому если тест что-то удалил, то он уже должен знать, что элемент недействителен и в этом нет смысла чтобы получить к нему доступ. Кроме того, неясно, что должен делать ваш код, если объект не найден, он должен просто повторить итерацию по дереву, а затем щелкнуть другой случайный элемент?   -  person Vader    schedule 26.08.2019
comment
Я до сих пор не совсем понимаю, чего вы пытаетесь достичь, но чтобы определить, находится ли здесь невидимый объект, вы можете попытаться получить доступ к одному из его свойств (например, objectName, x) внутри блока try\except и перечитать дерево в случай исключения (я считаю, что это должно быть RuntimeError или подобное). Хотя этот наивный подход должен работать, я рекомендую хранить настоящие имена вместо объектов. Вы можете создавать настоящие имена так же, как это предлагается здесь stackoverflow.com/a/57548773/735893 сможете использовать любую функцию синхронизации.   -  person Vader    schedule 26.08.2019
comment
1. Я считаю, что это должно быть RuntimeError или что-то подобное... я повторно проверю доступ к свойствам недопустимого (удаленного) объекта, но я думаю, что свойства не связаны активно со сжатием, и я просто получу значение, 2. я не могу создавать настоящие имена с x, y или другими свойствами, чтобы получить исправление реального имени - некоторые элементы перемещаются во время тестирования (что совершенно нормально), и я не могу использовать специальные идентификаторы / имена объектов для каждой дикой комбинации   -  person llm    schedule 27.08.2019
comment
вкратце: мне интересно, как в идеале протестировать это огромное программное обеспечение с помощью Squish — и как другие 10 разработчиков будут создавать тесты — что включает в себя: написание вспомогательных функций, классов и т. д. в качестве основы для уменьшения количества ошибок, которые другие могут сделать при написании тесты, поэтому не каждый тест сам по себе является исследовательским проектом, простые вещи, такие как оболочки доступа к свойствам, которые обнаруживают, что что-то не видимо/не включено, пригодно для использования (но не видно) или недействительно и т. д., некоторые стандартные функции для предотвращения глупых ошибок   -  person llm    schedule 27.08.2019
comment
Вы можете использовать isNull(), чтобы определить, действительна ли ссылка. И waitForObject(), и waitForObjectExists() тоже принимают ссылки, а не только имена объектов.   -  person frog.ca    schedule 31.08.2019
comment
waitForObjectExists(waitForObject({type: QMainWindow})) , LookupError: waitForObjectExists() требует аргумент имени объекта, waitForObject(waitForObject({type: QMainWindow})) работает - возможно, мы перепутали имена объектов (например, {type: QMainWindow} ) и ссылки (результат waitForObject)   -  person llm    schedule 11.09.2019