【问题标题】:Espresso.pressBack() does not call onBackPressed()Espresso.pressBack() 不调用 onBackPressed()
【发布时间】:2017-03-17 15:17:03
【问题描述】:

在 Espresso 类中:

 @Rule
    public IntentsTestRule<MainActivity> mIntentsRule = new IntentsTestRule<>(
            MainActivity.class);

@Test
public void test_backButton(){
onView(withId(R.id.NEXT_ACTIVITY)).perform(scrollTo(), click());

Espresso.pressBack();
}

活动中:

 @Override
public void onBackPressed() {
    Log.d("TEST_pressBack", "inside onBackPressed()");
    do_something();
    super.onBackPressed();

}
   @Override
public void finish() {
    Log.d("TEST_pressBack", "inside finish()");
    super.finish();

}

当我调用 Espresso 测试方法时,执行直接转到 finish()

当我按下Activity 中的后退按钮(用手)时,执行首先在onBackPressed() 中进行,然后在finish() 中进行。 如何使用 Espresso 测试功能 onBackPressed()? 谢谢!

编辑: 这是我的错误。问题是在我想调用 pressBack 的 Activity 中打开了屏幕键盘。当软键盘打开时,按钮不会调用 onBackPressed 而是使键盘不显示。我连续尝试了两个 pressBack(),它工作正常:

    @Rule
    public IntentsTestRule<MainActivity> mIntentsRule = new IntentsTestRule<>(
            MainActivity.class);

@Test
public void test_backButton(){
onView(withId(R.id.NEXT_ACTIVITY)).perform(scrollTo(), click());

Espresso.pressBack();

//The extra pressBack()
Espresso.pressBack();

}

【问题讨论】:

  • 你可以使用 Espresso.closeSoftKeyboard()

标签: android android-espresso


【解决方案1】:

如果您不在根活动中,Espresso.pressBack() 方法看起来就像您期望的那样工作。当您查看它的实施评论时:

  /**
  * Press on the back button.
  *
  * @throws PerformException if currently displayed activity is root activity, since pressing back
  *         button would result in application closing.
  */
  public static void pressBack() {
        onView(isRoot()).perform(ViewActions.pressBack());
  }

我对其进行了测试,如果您在非根活动的活动中执行此操作,它可以正常工作。如果你想在那里做,我建议你改用 ui-automator(ui-automator 在 espresso 测试中完全可用):

将此添加到您的 gradle 中:

androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'

然后在你的测试中这样做:

UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
mDevice.pressBack();

【讨论】:

  • 这是我的错误。问题是在我想调用 pressBack 的 Activity 中打开了屏幕键盘。当软键盘打开时,按下按钮不会调用 onBackPressed 而是使键盘不显示。我尝试了两个 pressBack() 并且它工作正常
  • Espresso.closeSoftKeyboard() 本来是上述问题的答案,但你的答案是我正在寻找的完美答案。非常感谢! :-) 对于未来的读者,这里是 androidx 版本:androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
  • 注意有Espresso.pressBackUnconditionally()
  • 我的活动覆盖 onBackPressed 以更改 viewPager 当前位置。但是,当我使用 Espresso.pressBack() 时,它会关闭应用程序而不是更改 viewPager 当前位置。知道为什么会这样吗?
【解决方案2】:

@billst 你是对的,我在打开软键盘时也遇到了同样的问题,我在阅读你的评论后进行了调试,更好的解决方案是使用 ViewAction.closeSoftKeyboard() 而不是使用两次后按。

@Test
public void afterStartedEditing_dialogDisplayed_when_home_or_back_pressed() {
    //find view
    onView(withId(R.id.add_pet_breed))
            .perform(click())
            .perform(closeSoftKeyboard());
    onView(isRoot()).perform(pressBack());

    //check assertion
    onView(withText(R.string.discard))
            .check(matches(isDisplayed()));
}

【讨论】:

    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多