Google Espresso java.lang.RuntimeException:无法启动意图Intent {act = android.intent.action.MAIN

时间:2014-01-28 13:01:13

标签: android eclipse runtimeexception android-espresso

我是Espresso UI测试的新手。

我在运行测试时遇到此错误(ADT Eclipse IDE)。

该应用已经开发,启动应用时会有很多请求。无法重写应用程序。但是我需要找到测试这个UI的方法,即使组件加载有任何延迟。

        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. 我还有一个名为“AA”的Android项目,它将访问“Core”。 - 这是AA.apk
  3. 现在我创建了一个名为“UItest”的测试项目
  4. 清单:

        <?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());
    
            }
    
        }
    

10 个答案:

答案 0 :(得分:7)

对于Espresso测试,强烈建议您关闭用于测试的虚拟或物理设备上的系统动画。因此,您可以按照以下步骤手动关闭动画:

下:      设置 - &GT;
     开发者选项 - &gt;      绘制

  1. Window Animations缩放为OFF
  2. 将动画比例转换为关闭
  3. Animator持续时间刻度为OFF

答案 1 :(得分:5)

如果在创建活动时有进度条运行,则会出现如下错误。您应该停止进度条以继续运行测试。

答案 2 :(得分:2)

您的活动中可能包含动画,可阻止浓缩咖啡的执行。您必须将其停用 - 请参阅https://github.com/googlesamples/android-testing/tree/master/ui/espresso/BasicSample

答案 3 :(得分:2)

我在6.0设备上运行Espresso测试但在5.1.1或7.0设备上运行时遇到此错误。我将原因跟踪到在样式中使用android:fadeScrollbars。从我的风格中删除此项目解决了这个问题。

答案 4 :(得分:1)

在我的情况下,自定义视图导致了这种行为。它包含一个Scroller,它不断滚动。不幸的是,直到现在我都没有找到解决这个问题的方法,除非禁用它进行测试......

答案 5 :(得分:0)

在第一页,您将调用太多请求,这将花费超过15秒的时间,第一页应该非常轻。 只需尝试创建一个新的欢迎页面,然后调用原始的欢迎页面。 希望这对你有用。

答案 6 :(得分:0)

嗯,在我看来,这是由一件奇怪的事情引起的。

我的一个UI测试打开了外部意图“ android.app.action.CONFIRM_DEVICE_CREDENTIAL”,因此我决定将其存根。从现在开始,直到我手动关闭最近任务中“ android.app.action.CONFIRM_DEVICE_CREDENTIAL”提示的屏幕后,MAIN意图才再次启动。

不知道为什么会这样,并且现在没有时间进行研究。也许以后我将更新此线程。

答案 7 :(得分:0)

当用户单击给定视图时尝试测试另一个活动的打开时,我遇到了此错误。我做错的是没有替换:

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

每位:

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

答案 8 :(得分:0)

这个问题困扰了我几个小时。终于,我明白了原因。

这对我有用。

根据这种现象,这里有一些不同的原因。

  • 无法启动活动
  • 已启动活动,但UI不能执行操作

第一种情况:活动无法启动

由于您的目标活动可能已经在活动堆栈中。 添加一个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)
    }

第二种情况:已启动活动,但UI执行的操作无效

在这种情况下可能是由于

  1. 您的代码正在长时间执行某些动画
  2. 您的代码正在执行您没有注意到的UI逻辑
    • 类似处理程序后事件或可运行
    • 在诸如OnPreDrawListener之类的ViewTreeObserver中注册侦听器,并且未在适当的时间取消注册

这些操作可能导致UI线程繁忙,因此espresso无法进行测试

答案 9 :(得分:0)

我也遇到了这个问题,当我将物理设备更换为其他 Android 手机时,测试正在运行。只需尝试使用其他设备。并使用@rule 启动活动