junit.framework.AssertionFailedError:无法按下后退按钮

时间:2014-07-11 11:54:42

标签: java android ui-automation uiautomator android-uiautomator

我这样做是为了使用 Android UIAutomator 退出应用程序。

assertTrue("Back button can't be pressed", getUiDevice().pressBack());

assertTrue("Back button can't be pressed", getUiDevice().pressBack());   // This line will giving exception.

当我们按两次后退按钮时,我的应用程序将退出,这就是我调用它两次的原因。

但是

然后它会给我例外。

但是当我手动回来两次时,它会完美地运作。

例外是:

junit.framework.AssertionFailedError: Back button can't be pressed
        at com.android.jdsu.automation.youtube.YoutubeUiTest.exitApplicaion(Yout
ubeUiTest.java:487)
        at com.android.jdsu.automation.youtube.YoutubeUiTest.testYouTube(Youtube
UiTest.java:208)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at com.android.uiautomator.testrunner.UiAutomatorTestRunner.start(UiAuto
matorTestRunner.java:160)
        at com.android.uiautomator.testrunner.UiAutomatorTestRunner.run(UiAutoma
torTestRunner.java:96)
        at com.android.commands.uiautomator.RunTestCommand.run(RunTestCommand.ja
va:91)
        at com.android.commands.uiautomator.Launcher.main(Launcher.java:83)
        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:243)
        at dalvik.system.NativeStart.main(Native Method)

INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testYouTube
INSTRUMENTATION_STATUS: class=com.android.jdsu.automation.youtube.YoutubeUiTest
INSTRUMENTATION_STATUS: stack=junit.framework.AssertionFailedError: Back button
can't be pressed
        at com.android.jdsu.automation.youtube.YoutubeUiTest.exitApplicaion(Yout
ubeUiTest.java:487)
        at com.android.jdsu.automation.youtube.YoutubeUiTest.testYouTube(Youtube
UiTest.java:208)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at com.android.uiautomator.testrunner.UiAutomatorTestRunner.start(UiAuto
matorTestRunner.java:160)
        at com.android.uiautomator.testrunner.UiAutomatorTestRunner.run(UiAutoma
torTestRunner.java:96)
        at com.android.commands.uiautomator.RunTestCommand.run(RunTestCommand.ja
va:91)
        at com.android.commands.uiautomator.Launcher.main(Launcher.java:83)
        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:243)
        at dalvik.system.NativeStart.main(Native Method)

4 个答案:

答案 0 :(得分:1)

Ya我也经历过同样的问题,但是没有理解这种情况发生的原因。 我按照以下方式使用它:

UiDevice device = UiDevice.getInstance();
device.pressMenu();

这对我来说很好。 否则,您也可以使用keyevent,如下所示:

Runtime.getRuntime().exec("/system/bin/input keyevent 82");

答案 1 :(得分:1)

assertTrue("Back button can't be pressed", getUiDevice().pressBack());

如果在pressBack()之后UI未发生变化,它将返回false,如果当前在主视图中,它将在getUiDevice().pressBack());之后返回false

答案 2 :(得分:1)

这是一个有趣的: https://github.com/appium/appium-android-driver/blob/ad4aa239aa8352553325c800829202d960030d25/bootstrap/src/io/appium/android/bootstrap/handler/PressBack.java#L43

基于此,至少在我们信任Appium的情况下,我们不能信任UIDevice.pressBack()

奇怪的是,它大多数时候都可以工作并且实际上返回true。以我的经验,它可以与Intent Chooser,Google Drive,Google Play Store一起使用,但不能与API 19上的“设备设置”一起使用。到目前为止,我拥有这一点,这比Appium的解决方案更为严格:

    @RequiresApi(VERSION_CODES.JELLY_BEAN)
    public static void pressBackExternal() {
        UiDevice device = UiDevice.getInstance(getInstrumentation());
        if (VERSION.SDK_INT == VERSION_CODES.KITKAT
                && "com.android.settings".equals(device.getCurrentPackageName())) {
            // fails because pressBack sometimes returns false even though the Settings is closed.
            device.pressBack();
        } else {
            assertTrue("expected to press Back button", device.pressBack());
        }
    }

答案 3 :(得分:0)

有趣的是,您是否尝试在两次通话之间添加等待时间。您的应用程序可能需要一些时间来重新加载上一个活动添加至少500毫秒或1秒的等待时间。