Espresso测试错误:AppNotIdleException

时间:2016-08-09 16:33:41

标签: android android-espresso ui-testing

我关闭了开发者选项的所有动画。 但是当我尝试点击其中一个按钮时,我仍然会遇到此异常。

我的应用程序确实非常活跃,并没有完全闲置,但我无法改变它。

android.support.test.espresso.AppNotIdleException: Looped for 6930
iterations over 60 SECONDS. The following Idle Conditions failed .
 at dalvik.system.VMStack.getThreadStackTrace(Native Method)
 at java.lang.Thread.getStackTrace(Thread.java:580)
 at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:92)
 at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:56)
 at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:184)
 at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115)
 at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87)

4 个答案:

答案 0 :(得分:3)

过去几天我一直在努力解决这个问题 这是我用来识别“违规者”的方法:

private void dumpThreads() {
    int activeCount = Thread.activeCount();
    Thread[] threads = new Thread[activeCount];
    Thread.enumerate(threads);
    for (Thread thread : threads) {
        System.err.println(thread.getName() + ": " + thread.getState());
        for (StackTraceElement stackTraceElement : thread.getStackTrace()) {
            System.err.println("\t" + stackTraceElement);
        }
    }
}

就我而言,Facebook SDK正在使用AsyncTask线程池。

答案 1 :(得分:1)

根据answer MaciejGórski对类似问题:

  

这是我的应用代码中的一个错误,其中SwipeRefreshLayout已设置动画   本身无限期。由于a bug in this component,   刷新状态甚至没有显示出来。

答案 2 :(得分:0)

您可以查看以下方式:

方式1: 在开发人员选项中禁用动画:

Setting -> developer options -> Window animation scale -> off

                                Transition animation scale -> off

                                Animator duration scale -> off

方式2: 如果您有customView 在build.gradle中使用此

defaultConfig {

   //...

   testOptions {
      animationsDisabled = true
   }

}

答案 3 :(得分:0)

在我的情况下,此问题是AnimatedVectorDrawable发生的,并且是由设置为无限重复播放动画(objectAnimator)的android:repeatCount="infinite"引起的。

仅在较旧的平台版本上也存在此问题。测试可以在Android 9上正常运行,而问题可以在Android 5和6上重现(目前不确定是7和8)。

我相信,问题的根本原因与不确定的进度条(covered in this SO question)相同。但是,我没有找到任何好的解决方案,只有解决方法。

一种解决方法是检测设置中的动画已关闭(动画时间为0),并且不启动动画。当然,这仅适用于动画无法自动启动的平台版本。

private fun startIconAnimation(imageView: ImageView) {
    if (areAnimationsEnabled()) {
        (imageView.drawable as Animatable).start()
    }
}

private fun areAnimationsEnabled(): Boolean {
    val animatorDurationScale = Settings.Global.getFloat(
        requireContext().contentResolver,
        Settings.Global.ANIMATOR_DURATION_SCALE,
        1.0f
    )
    return animatorDurationScale != 0.0f
}

注意:API级别26引入了静态方法ValueAnimator.areAnimatorsEnabled(),如果问题仅在较旧的平台版本上没有发生,该方法将很方便。