Тест эспрессо застрял / неактивен после выполнения (щелчка ()) на кнопке в ViewAnimator

Проблема: у меня возникла проблема во время выполнения теста Espresso, после вызова метода execute (click()) для кнопки входа в систему тест продолжает работать, но не продолжается, пока не пройдет 45 секунд, и тест автоматически завершится неудачей., Между тем, вход в систему происходит нормально.

Контекст: у меня есть Activity с двумя фрагментами рядом, фрагмент справа обрабатывает имя пользователя и пароль EditTexts, а также кнопку входа в систему. Этот фрагмент построен с использованием ViewAnimator и двух LinearLayout в качестве дочерних представлений, первый LinearLayout содержит элементы, упомянутые ранее, а второй - другие элементы.

Вот что происходит в пользовательском интерфейсе при нажатии кнопки входа в систему:

    @Override
public void setUILoggingIn() {
    spinnerLogin.setVisibility(View.VISIBLE);
    loginButton.setEnabled(false);
    loginButton.setText(R.string.logging_in);
    usernameText.setEnabled(false);
    passwordText.setEnabled(false);
}

После аутентификации на сервере вот как я обрабатываю интерфейс:

@Override
public void setUIAuthorized() {
    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            viewAnimator.showNext();
            // elements on the first child of the ViewAnimator
            loginButton.setEnabled(true);
            spinnerLogin.setVisibility(View.GONE);

            // elements on the second child of the ViewAnimator
            sendMessageButton.setEnabled(true); 
            chatInputText.setEnabled(true);
        }
    });
}

Эспрессо Тест

ViewInteraction loginButton2 = onView(withId(R.id.login_button));
        loginButton2.perform(click());        // Test gets stuck here.
        loginButton2.check(doesNotExist());   // Never reached.

Кто-нибудь знает, как успешно тестировать по этому сценарию? Этого будет достаточно, чтобы определить, когда изменяется ViewAnimator, но тест застревает при щелчке.

Также: это было не начало теста, прежде чем код, показанный ранее, я запускаю этот тест, и он работает как сон:

ViewInteraction loginButton = onView(withId(R.id.login_button));

    /** Failed login **/

    loginButton.perform(click());

    ViewInteraction snackBarTextView = onView(
            allOf(withId(R.id.snackbar_text), withText("Login error"), isDisplayed()));
    snackBarTextView.check(matches(withText("Login error")));

Спасибо всем за помощь и советы

2 ответа

Решение

У меня была похожая проблема, и в моем случае это был индикатор выполнения, который был загружен на фрагмент, который не отображался. Этот индикатор не был отклонен по ошибке и блокировал тесты. У меня был тот же результат с ошибками тестов через 45 секунд, как вы описали. Подводя итог, убедитесь, что в потоке пользовательского интерфейса нет анимации в виде индикатора выполнения или любого другого.

У меня была та же проблема, когда я работал с ListView.

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

onView(withId(R.id.myListView)).perform(swipeUp());

Другие вопросы по тегам