Google Espresso java.lang.RuntimeException: не удалось запустить намерение Intent {act=android.intent.action.MAIN

Я новичок в тестировании пользовательского интерфейса Espresso.

Я получаю эту ошибку при выполнении тестов (ADT Eclipse IDE).

Приложение уже разработано, и при запуске приложения происходит много запросов. переписать приложение невозможно. но мне нужно найти способ протестировать этот пользовательский интерфейс, даже если есть какая-либо задержка в загрузке компонентов.

        java.lang.RuntimeException: Could not launch intent Intent { act=android.intent.action.MAIN flg=0x14000000 cmp=com.xx.android/com.yy.core.android.map.MapActivity } within 45 seconds. Perhaps the main thread has not gone idle within a reasonable amount of time? There could be an animation or something constantly repainting the screen. Or the activity is doing network calls on creation? See the threaddump logs. For your reference the last time the event queue was idle before your activity launch request was 1390913271702 and and now the last time the queue went idle was: 1390913271767. If these numbers are the same your activity might be hogging the event queue.
        at com.google.android.apps.common.testing.testrunner.GoogleInstrumentation.startActivitySync(GoogleInstrumentation.java:277)
        at android.test.InstrumentationTestCase.launchActivityWithIntent(InstrumentationTestCase.java:119)
        at android.test.InstrumentationTestCase.launchActivity(InstrumentationTestCase.java:97)
        at android.test.ActivityInstrumentationTestCase2.getActivity(ActivityInstrumentationTestCase2.java:104)
        at com.gulesider.android.test.UItest.setUp(UItest.java:25)
        at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
        at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
        at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
        at com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner.onStart(GoogleInstrumentationTestRunner.java:167)
        at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1799)
  1. У меня есть один проект библиотеки под названием «Core» — он не будет генерировать .apk
  2. Также у меня есть один проект Android под названием «AA», который будет иметь доступ к «Core». - Это АА.apk
  3. Теперь я создал тестовый проект под названием «UItest».

Манифест:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.AA.android.test"
        android:versionCode="1"
        android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="8" 
            android:targetSdkVersion="18" />
    <instrumentation
      android:name="com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
      android:targetPackage="com.AA.android"/>
    <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >
    <activity
                android:name="com.core.android.map.MapActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <uses-library android:name="android.test.runner" />
        </application>
    </manifest>

Мой тест:

    public class UItest extends ActivityInstrumentationTestCase2<MapActivity> {
        public UItest() {
            super(MapActivity.class);
        }

        @Override
        public void setUp() throws Exception {
            super.setUp();

            getActivity();

        }

        public void testSearchBox() {

            Espresso.onView(ViewMatchers.withId(R.id.menu_button_logo)).perform(ViewActions.click());

        }

    }

person user3241003    schedule 28.01.2014    source источник
comment
опубликуйте свой код, что вы сделали..   -  person Shailendra Madda    schedule 28.01.2014


Ответы (10)


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

В разделе: Настройки->
Параметры разработчика-> Рисование

  1. Оконная анимация масштабируется до OFF
  2. Масштаб анимации перехода в положение ВЫКЛ.
  3. Шкала длительности аниматора выключена
person testsingh    schedule 08.04.2015
comment
Мне интересно, есть ли описание того, почему это происходит и как решить эту проблему без отключения анимации - person Roger Alien; 12.10.2017
comment
Я столкнулся с той же проблемой. Анимация уже отключена в настройках разработчика. - person Inderdeep Singh; 31.08.2018

Если при создании активности работает индикатор выполнения, вы получаете такую ​​ошибку. Вы должны вызвать остановку индикатора выполнения, чтобы продолжить выполнение теста.

person Murat    schedule 21.11.2015
comment
Да, это правильно - видимо ProgressBar возможно причина этого исключения. Убедитесь, что ваша активность/фрагмент не имеет видимых ProgressBar (и будьте осторожны при использовании альфы с ProgressBar) - person xCh3Dx; 19.04.2016

Я столкнулся с этой ошибкой при выполнении тестов Espresso на устройствах 6.0, но не на устройствах 5.1.1 или 7.0. Я отследил причину до использования android:fadeScrollbars в стиле. Удаление этого элемента из моего стиля решило проблему.

person dev5678    schedule 24.02.2017

Вероятно, у вас есть анимация внутри вашей активности, которая блокирует выполнение эспрессо. Вы должны отключить его — см. https://github.com/googlesamples/android-testing/tree/master/ui/espresso/BasicSample

person denys    schedule 28.01.2014
comment
Когда я следовал приведенному выше решению, я получил эту ошибку. Невозможно отключить анимацию из-за отсутствия разрешения. - person user3241003; 29.01.2014
comment
Попробуйте добавить разрешение запроса, как указано в комментариях к приведенной выше ссылке. - person Bolhoso; 14.02.2014

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

person luckyhandler    schedule 12.09.2016
comment
Как ты его отключил? - person anuja jain; 12.01.2017
comment
Я сказал представлению, которое было пользовательским, не прокручивать во время выполнения теста. Чтобы определить, работает ли он, я использовал следующее решение: stackoverflow.com/a/28701836/3734116 - person luckyhandler; 12.01.2017

Я застрял в этой проблеме в течение нескольких часов. Наконец-то я узнал причину.

Это работает для меня.

Вот несколько разных причин, в зависимости от явления.

  • Активность не может быть запущена
  • Активность запущена, но пользовательский интерфейс выполняет действия, которые не работают

Первый сценарий: активность не может быть запущена

Из-за того, что ваше целевое действие может уже находиться в стеке действий. Добавьте флаг CLEAR и флаг NEW_TASK

    @get:Rule
    val activityRule = ActivityTestRule<MainActivity>(MainActivity::class.java)

    private lateinit var launchedActivity: MainActivity

    @Before
    fun setUp() {
        val intent = Intent(Intent.ACTION_PICK)
        //this is the key part
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
        //this is the key part
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        launchedActivity = activityRule.launchActivity(intent)
    }

Второй сценарий: активность запущена, но пользовательский интерфейс выполняет действия, которые не работают

В этом сценарии может быть из-за

  1. Ваш код выполняет анимацию в течение длительного времени
  2. Your code is doing a UI logic that you don't notice
    • (like Handler post event or runnable)
    • (зарегистрируйте прослушиватель в ViewTreeObserver, например OnPreDrawListener, и не отмените регистрацию вовремя)

Эти действия могут привести к занятости потока пользовательского интерфейса, поэтому эспрессо не сможет выполнить тест.

person Jeffery Ma    schedule 16.09.2019
comment
Любые советы о том, как отлаживать второй сценарий, помимо точек останова и println()? ;) то есть блокировка логики пользовательского интерфейса.... - person xavierdominguez; 06.11.2020
comment
Собственно из-за того, что не удалось запустить активность и сработал ваш первый трюк, т.е. добавление флагов CLEAR_TASK и NEW TASK. Огромное спасибо! Мучался с этим месяцами. Хотя я получал ошибку ниже, что заставило меня подумать, что это больше похоже на ваше второе объяснение. Сообщение ниже должно помочь другим. - person xavierdominguez; 06.11.2020

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

person ajitksharma    schedule 28.01.2014

Ну, в моем случае это было вызвано странной вещью.

Один из моих тестов пользовательского интерфейса открыл внешнее намерение «android.app.action.CONFIRM_DEVICE_CREDENTIAL», поэтому я решил заглушить его. С этого момента ГЛАВНОЕ намерение не запускалось снова, пока я вручную не закрыл экран, открытый «android.app.action.CONFIRM_DEVICE_CREDENTIAL» из недавних задач.

Понятия не имею, почему это произошло, и сейчас нет времени на исследования. Возможно, позже я обновлю эту тему.

person Ignacio Tomas Crespo    schedule 15.04.2019

Я столкнулся с этой ошибкой, когда пытался проверить открытие другого действия, когда пользователь щелкнул данное представление. Что я делал неправильно, так это не заменять:

@Rule
public ActivityTestRule<MyActivity> myActivityActivityTestRule = new ActivityTestRule<>(MyActivity.class);

Пер:

@Rule
public IntentsTestRule<MyActivity> myActivityActivityTestRule =
            new IntentsTestRule<>(MyActivity.class);
person Ricardo    schedule 28.05.2019

У меня тоже была эта проблема, и в тот момент, когда я сменил физическое устройство на другой телефон Android, тесты работали. Просто попробуйте использовать другое устройство. И используйте @rule для запуска активности

person Pesa    schedule 29.01.2021