如何在运行Espresso测试时禁用代码中的动画效果

17

有人能在运行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个回答

26

我对每种动画类型都执行了这三个命令,它们对我有效:

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 模拟器。


1
在第一个adb命令的末尾有一个额外字符。我尝试将其删除,但是edit要求至少6个字符。 - Sungam
我已经删除了那个不可打印的字符,所以现在复制粘贴应该可以正常工作了。 - Aaron Harris
链接已失效。 - Chisko

10

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

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

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

在清单文件中添加权限并运行反射步骤似乎并不足够。


3
尝试执行该命令时,我收到了以下错误提示:操作不允许:java.lang.SecurityException:权限android.permission.SET_ANIMATION_SCALE不是可修改的权限类型。你有任何想法为什么我不能授予权限吗? - Matt Kranzler
2
@MattKranzler 你在使用真实设备吗?它在非root设备上无法工作。 - Yenchi
@Yenchi 我尝试使用模拟器,但仍然出现了异常。 - Daniel Gomez Rico
1
只有使用棉花糖模拟器才能运行 @Yenchi。 - Daniel Gomez Rico
@MattKranzlerиЇ·зЎ®дїќењЁз›®ж ‡еє”з”ЁзЁ‹еєЏзљ„AndroidManifest.xmlдё­жњ‰<uses-permission android:name="android.permission.SET_ANIMATION_SCALE"/>пј€ж‚ЁеЏЄиѓЅдёєи°ѓиЇ•з­‰ж·»еЉ е®ѓпј‰гЂ‚ - Artem Zinnatullin
假设我已经被授予了这个权限,如何使用 ADB 命令禁用和启用动画,基于之前的设置?我希望只是暂时地禁用动画,然后将它们恢复到之前的状态。 - android developer

5
更好的方法是更新app/build.gradle文件,如果你是通过命令行运行测试的话
android {
    ...
    ...

    testOptions {
        animationsDisabled = true
    }
}

在重新构建之前,您可能需要执行./gradlew clean。如果您使用的是Android Studio,则假设apk文件未发生任何更改,它可能不会更新您设备上的apk文件。请注意这些内容,以确保更改实际上正在影响您的设备。

此外,请阅读文档此处

禁用从命令行运行的仪器测试期间的动画。

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

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


不要复制并粘贴无效的答案。这并不会禁用动画。 - Max Fratane
我在发现这对我有效后添加了答案。你认为谷歌为什么提供了这个选项?在重新构建之前,您可能需要执行./gradlew clean。如果您使用的是Android Studio,则可能不会更新设备上的apk,假设apk中没有任何更改。请注意这些内容,以确保更改实际上正在影响您的设备。已更新带有这些说明的答案。 - rpattabi
此选项仅禁用活动转换动画,不影响代码中的其他动画。 - Max Fratane
很有趣。我正在运行 ./gradlew app:connectedAndroidTest,并且它对我的目的起作用。请查看文档中的信息(已更新答案)。它说:“此属性不影响您使用Android Studio运行的测试”。这可能会导致混淆。 - rpattabi

3

使用方法:


1. 在 Gradle 中使用

android {

  //...

  testOptions {
    animationsDisabled = true
  }

  // ...
}

2. 在ADB中用于设备

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. Use the Rule

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}")
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接