Как узнать, появилась ли новая активность?

Я провожу тестирование черного ящика (используя UiAutomator 2.0, кстати, расширяя InstrumentationTestCase), и мне нужно знать:

1 - при создании новой активности

2 - чтобы узнать, создается ли действие впервые

Мне это нужно, потому что есть некоторые тесты, которые я хочу применить при появлении новой активности, но я хочу, чтобы это обнаружение было автоматическим, а не ручным.

До Android L существовал метод UiDevice.getCurrentActivityName(). Однако теперь он устарел (более того, они даже не гарантируют, что он работает для предыдущих версий). Это также произошло с параметрами получения активности через PackageManager.

Таким образом, я хотел бы знать:

  • Можно ли программно обнаружить новую активность? Если это так, можно узнать, происходит ли это впервые.

  • Если это невозможно, как мне определить действие в соответствии с его пользовательским интерфейсом? Сколько виджетов должно измениться, чтобы я мог сделать вывод, что это другое действие?

Спасибо.

РЕДАКТИРОВАТЬ: Просто для ясности: я не хочу проверять, что происходит, когда действие создается, я хочу иметь возможность определить, происходит ли это действие в первый раз.


person Inês    schedule 04.06.2015    source источник
comment
Просто чтобы уточнить, поскольку вы сказали тестирование черного ящика, я предполагаю, что у вас на самом деле нет доступа к исходному коду приложения, которое вы тестируете, верно?   -  person Chamatake-san    schedule 04.06.2015
comment
это точно (только точно не хватило коммента добавить xD)   -  person Inês    schedule 04.06.2015
comment
Black-box testing воняет reverse engineering. Переименован.   -  person Phantômaxx    schedule 04.06.2015
comment
Может ли ваша автоматизация тестирования имитировать вращение устройства? Это не лучший подход, но активность в фокусе часто приходится уничтожать и создавать заново после изменения ориентации устройства (в зависимости от того, как код обрабатывает изменения конфигурации). Если вы знаете, что целевое действие будет воссоздано после изменения ориентации устройства, вы сможете запустить тесты после того, как приложение перерисует это действие. Activity.onStart() будет вызываться, когда материал станет видимым впервые; Activity.onResume() будет вызываться, когда пользователь сможет взаимодействовать с приложением. Не знаю, поможет ли это. Удачи!   -  person Chamatake-san    schedule 05.06.2015
comment
@DerGolem, почему ты так говоришь? ---   -  person Inês    schedule 05.06.2015
comment
@ Чаматаке-сан, мне не интересно проверять изменение активности. Я хочу иметь возможность определить, выполняется ли это действие впервые.   -  person Inês    schedule 05.06.2015
comment
Потому что это действительно так воняет. МНОГО.   -  person Phantômaxx    schedule 05.06.2015
comment
@ Инеш, ты нашла? UiDevice.getCurrentActivityName() устарел. Есть ли другой способ получить текущую активность? например, через другой вызов API?   -  person Thanasis Petsas    schedule 23.10.2015
comment
@ThanasisPetsas, я не нашел быстрого способа. Мне пришлось реализовать эвристику, чтобы проанализировать экран, сравнить с предыдущим и решить для себя, был ли он другим или нет.   -  person Inês    schedule 25.10.2015


Ответы (1)


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

1. Создайте подпись для идентификации между экранами

signature1:FrameLayout;ListView;LinearLayout;RelativeLayout;...
signature2:FrameLayout;FrameLayout;FrameLayout;LinearLayout;...

2. Затем используйте список, чтобы сохранить уже известные вам экраны.

3.Для повышения производительности вы можете использовать фиксированную длину подписи экрана.

Идея заключается в том, чтобы обратиться к этому документу.

И если вам подходит adb, вы можете использовать эту команду,

adb shell dumpsys activity

Это относится к другому сообщению здесь

person Eaway Lu    schedule 20.11.2015
comment
Я закончил тем, что сделал что-то похожее на это. Я сохраняю элементы, присутствующие на экране, а затем сравниваю их с другим прочтением экрана. И я игнорирую любые изменения в редактируемых полях (поля редактирования, флажки, ...) - person Inês; 24.11.2015