У меня есть элементы списка с глубоко вложенными объектами/свойствами (я не могу это изменить) - и несколько (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 (ссылка?) - я просто проглядел это в документации, изменены ли только измененные объекты?
извините, что ввела в заблуждение всех, кто пытался помочь
теперь ясно:
мне абсолютно необходимо повторно собрать мои объекты после внесения изменений в мою иерархию, и если я забыл повторно собрать все, что я получу, это ошибки из-за нулевых ссылок на объекты, потому что невозможно использовать недействительную ссылку на объект
mouseClick
или что-то еще) в блокtry\except
. Но видимо вы что-то делаете не так, потому что тест должен сам отслеживать состояние приложения иначе не будет возможности проверить результат, поэтому если тест что-то удалил, то он уже должен знать, что элемент недействителен и в этом нет смысла чтобы получить к нему доступ. Кроме того, неясно, что должен делать ваш код, если объект не найден, он должен просто повторить итерацию по дереву, а затем щелкнуть другой случайный элемент? - person Vader   schedule 26.08.2019objectName
,x
) внутри блокаtry\except
и перечитать дерево в случай исключения (я считаю, что это должно бытьRuntimeError
или подобное). Хотя этот наивный подход должен работать, я рекомендую хранить настоящие имена вместо объектов. Вы можете создавать настоящие имена так же, как это предлагается здесь stackoverflow.com/a/57548773/735893 сможете использовать любую функцию синхронизации. - person Vader   schedule 26.08.2019