Как получить представление из эспрессо, чтобы перейти в IdlingResource?

У меня, по сути, есть пользовательский IdlingResource, который принимает аргумент "Просмотр конструктора". Я не могу найти нигде, что действительно говорит о том, как его реализовать.

Я пытаюсь использовать этот ответ: qaru.site/info/385318/...

Как вы можете видеть, требуется ViewPager, но когда я регистрирую IdlingResource в своем тестовом классе, я не уверен, как я могу получить свое представление.

Я пробовал findViewById(), и я попытался получить текущую активность, а затем вызвал findViewById(), но не повезло. Кто-нибудь знает, что делать в этом сценарии?

Ответы

Ответ 1

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

Например:

@Rule
public ActivityTestRule<MainActivity> activityTestRule = new ActivityTestRule<>(
        MainActivity.class);

а затем просто вызовите getActivity().findViewById(R.id.viewId)

Итак, конечный результат:

activityTestRule.getActivity().findViewById(R.id.viewId);

Ответ 2

Принимаемый ответ работает до тех пор, пока тест работает в одном и том же действии. Однако, если тест переходит к другой активности activityTestRule.getActivity() вернет неправильное действие (первое). Чтобы решить эту проблему, можно создать вспомогательный метод, возвращающий действительную активность:

public Activity getCurrentActivity() {
    final Activity[] currentActivity = new Activity[1];
    InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
        @Override
        public void run() {
            Collection<Activity> allActivities = ActivityLifecycleMonitorRegistry.getInstance()
                    .getActivitiesInStage(Stage.RESUMED);
            if (!allActivities.isEmpty()) {
                currentActivity[0] = allActivities.iterator().next();
            }
        }
    });
    return currentActivity[0];
}

И тогда он может использоваться как следующий:

Activity currentActivity = getCurrentActivity();
if (currentActivity != null) {
    currentActivity.findViewById(R.id.viewId);
}

Ответ 3

Я еще не использовал IdilingResources в Espresso, но вы видели эти статьи:

Также ознакомьтесь с официальными документами Android: Ресурсы холостого хода (ссылка)

Чтобы ответить на ваш вопрос,

Здесь приведен пример из ссылки выше:

Начиная с контекста, корневой вид связанная с ней деятельность может выполняться

View rootView = ((Activity)_context).Window.DecorView.FindViewById(Android.Resource.Id.Content);

В Raw Android он выглядит примерно так:

View rootView = ((Activity)mContext).getWindow().getDecorView().findViewById(android.R.id.content)

Затем просто вызовите findViewById на этом

View v = rootView.findViewById(R.id.your_view_id);

Это также может быть полезно: Как вызвать getResources() из класса, который не имеет контекста?

Надеюсь, что это поможет