Android 单击按钮时出现 Espresso 错误

Android Espresso error on button click

我正在尝试使用 espresso 框架为 Android APP 编写一些 UI 测试。

现在我只是检查初始屏幕上是否存在所有元素,然后尝试单击登录按钮。

单击按钮后,测试失败,原因是出现错误,我似乎无法理解为什么会发生这种情况。

我的测试代码是

@RunWith(AndroidJUnit4.class)
@SmallTest
public class WelcomeTest {

  @Rule
  public ActivityTestRule<Welcome> mActivityRule = new ActivityTestRule<>(
          Welcome.class);

  @Test
  public void elements_present() {
      // Check login
      onView(withId(R.id.wv_login)).check(matches(isDisplayed()));
      // Check signup
      onView(withId(R.id.wv_signup)).check(matches(isDisplayed()));
      // Check video
      onView(withId(R.id.videoView)).check(matches(isDisplayed()));
      // Check swipe right
      onView(withId(R.id.videoView)).perform(swipeRight());
      // Check swipe left
      onView(withId(R.id.videoView)).perform(swipeLeft());
  }

  @Test
  public void tap_login() {
      // Tap login button
      onView(withId(R.id.wv_login)).perform(click());
  }

}

我得到的输出是:

Caused by: java.lang.RuntimeException: Action will not be performed because the target view does not match one or more of the following constraints: at least 90 percent of the view's area is displayed to the user.

这是什么意思,这是由我的测试方法引起的还是代码中的错误?该应用程序似乎在我的设备上运行良好。

PS:我已经按照 espresso 文档的建议禁用了动画

Caused by: java.lang.RuntimeException: Action will not be performed because the target view does not match one or more of the following constraints: at least 90 percent of the view's area is displayed to the user.

我会在任何预期的视图不完全可见时发生,默认情况下 Espresso 正在寻找在设备屏幕上完全可见的元素。

您的实际设备屏幕似乎没有显示您的登录 activity xml 文件的全部内容。

  • 你用的是ScrollView还是ListView
  • 您的布局如何?
  • 是否在测试设备上完整显示?

可能有帮助:

onView(withId(R.id.wv_login))
    .perform(scrollTo(), click());

我的问题还是会出现,请您补充到您的问题xml或截图。我会修复它 ;-)


NOTE: To check if something is completely visible (it means more then 90%) you can use

onView(withId(R.id.wv_login)).check(matches(isCompletelyDisplayed()));

instead of:

onView(withId(R.id.wv_login)).check(matches(isDisplayed()));

运行 你在大屏幕设备上测试,看看它是否仍然发生。

如有疑问请随时提问

这里看到的RuntimeException java.lang.RuntimeException: Action will not be performed because the target view does not match one or more of the following constraints: at least 90 percent of the view's area is displayed to the user. 确实,其实是由于View的一个失败而没有得到充分展示。然而,@piotrek1543 给出的答案并没有真正找到解决方案,尽管它充满了非常好的信息。

此问题是由竞争条件引起的。您正在尝试打开视图,并且在打开视图期间您正在尝试单击它。如果时机不对,那么 View 不到 90% 的资源可用于 Espresso 框架 click()。您可以按照 The Espresso Setup Instructions

中的建议通过禁用动画来解决问题
  • 导航到您 phone 的 Developer Options
  • 设置如下
    • Window 动画比例 = 0.0x
    • 过渡动画比例 = 0.0x
    • 动画师持续时间比例 = 0.0x

我自己的测试表明,您只需将 Transition Animation Scale 设置为 0.0x 即可。可以想象,这是针对您遇到的竞争条件的完美一致的解决方案。

如果按钮未放置在滚动视图中并且动画已关闭,则当按钮设置了高度并且父布局中的高度设置为 wrap_content 时,可能会发生此错误。

失败

<LinearLayout
        ...
        android:layout_width="match_parent"
        **android:layout_height="wrap_content">**

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btn_attendance"
            app:backgroundTint="@color/surveyColor"
            android:textAllCaps="false"
            android:text="View Attendance"
            android:layout_weight="1"
            android:layout_marginRight="5dp"
            android:layout_width="0dp"
            **android:layout_height="60dp"/>**
</LinearLayout>

传递:高度的值应该传递给父布局

    <LinearLayout
        ...
        android:layout_width="match_parent"
        **android:layout_height="60dp">**

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btn_attendance"
            app:backgroundTint="@color/surveyColor"
            android:textAllCaps="false"
            android:text="View Attendance"
            android:layout_weight="1"
            android:layout_marginRight="5dp"
            android:layout_width="0dp"
            **android:layout_height="60dp"/>**
</LinearLayout>