15

有没有人在运行 Espresso 测试时设法通过代码禁用动画?我一直在尝试遵循此网页中的说明(从此处链接到):
https ://code.google.com/p/android-test-kit/wiki/DisablingAnimations

不幸的是,它似乎没有工作,因为我一直看到这个权限错误:

04-27 15:48:28.694      303-342/system_process W/PackageManager﹕ Not granting permission android.permission.SET_ANIMATION_SCALE to package com.cookbrite.dev (protectionLevel=50 flags=0x18be46)

我真的希望避免重新配置我的设备/模拟器。我们经常在本地运行单独的测试,如果我必须继续切换设置,这会让我很恼火。

我注意到其他一些开发人员抱怨这不起作用,所以我可能并不孤单:
https ://groups.google.com/forum/#!msg/android-test-kit-discuss/TCil7kMQRTM/QK1qCjzM6KQJ

4

4 回答 4

24

我正在为每种动画类型执行这三个命令,它们对我有用:

adb shell settings put global window_animation_scale 0.0
adb shell settings put global transition_animation_scale 0.0
adb shell settings put global animator_duration_scale 0.0

更多信息在这里 -为 UI 测试自动化准备 android 模拟器。

于 2017-01-14T19:40:42.683 回答
10

我终于让这个工作了。这是列出所需步骤的要点:
https ://gist.github.com/daj/7b48f1b8a92abf960e7b

我错过的关键步骤是运行adb以授予权限:

adb shell pm grant com.mypackage android.permission.SET_ANIMATION_SCALE    

将权限添加到清单并运行反射步骤似乎还不够。

于 2015-05-05T03:57:56.407 回答
1

使用这种方式:


1. 你在 Gradle 中使用这个

android {

  //...

  testOptions {
    animationsDisabled = true
  }

  // ...
}

2.在ADB for device中使用

adb shell settings put global window_animation_scale 0 &
adb shell settings put global transition_animation_scale 0 &
adb shell settings put global animator_duration_scale 0 &

3.使用规则

class DisableAnimationsRule : TestRule {
    override fun apply(base: Statement, description: Description): Statement {
        return object : Statement() {
            @Throws(Throwable::class)
           override fun evaluate() {
                // disable animations for test run
                changeAnimationStatus(enable = false)
                try {
                    base.evaluate()
                } finally {
                    // enable after test run
                    changeAnimationStatus(enable = true)
                }
            }
        }
    }

    @Throws(IOException::class)
    private fun changeAnimationStatus(enable:Boolean = true) {
        with(UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())){
            executeShellCommand("settings put global transition_animation_scale ${if(enable) 1 else 0}")
            executeShellCommand("settings put global window_animation_scale ${if(enable) 1 else 0}")
            executeShellCommand("settings put global animator_duration_scale ${if(enable) 1 else 0}")
        }
    }
}
于 2021-05-21T11:27:04.777 回答
1

如果您从命令行运行测试app/build.gradle,更好的方法是更新。

android {
    ...
    ...

    testOptions {
        animationsDisabled = true
    }
}

您可能必须./gradlew clean在重建之前执行此操作。如果您使用 android studio,假设 apk 没有任何变化,它可能不会更新您设备上的 apk。注意那些以确保更改实际上在您的设备上生效。

另请阅读此处的文档。

在从命令行运行的检测测试期间禁用动画。

如果将此属性设置为 true,则从命令行使用 Gradle 运行检测测试会使用 --no-window-animation 标志执行 am instrument。默认情况下,此属性设置为 false。

此属性不会影响您使用 Android Studio 运行的测试。

于 2020-05-05T04:45:39.693 回答