点击按钮时出现Android Espresso错误

点击按钮时出现Android Espresso错误,android,android-espresso,ui-testing,Android,Android Espresso,Ui Testing,我正在尝试为一个使用espresso框架的Android应用程序编写一些UI测试 现在我只是检查一下启动屏幕上是否有所有的元素,然后我试着点击登录按钮 当点击按钮时,由于一个错误,测试失败,我似乎无法理解为什么会发生这种情况 我的测试代码是 @RunWith(AndroidJUnit4.class) @SmallTest public class WelcomeTest { @Rule public ActivityTestRule<Welcome> mActivityRu

我正在尝试为一个使用espresso框架的Android应用程序编写一些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());
  }

}
@RunWith(AndroidJUnit4.class)
@小测验
公共类福利测验{
@统治
公共活动测试规则mActivityRule=新活动测试规则(
欢迎光临;
@试验
公共空间元素_present(){
//检查登录
onView(使用id(R.id.wv_登录)).check(匹配项(isDisplayed());
//检查注册
onView(带id(R.id.wv_注册))。检查(匹配项(isDisplayed());
//查看视频
onView(带id(R.id.videoView)).check(匹配项(isDisplayed()));
//支票向右刷卡
onView(带id(R.id.videoView)).perform(swipeRight());
//支票向左刷卡
onView(带id(R.id.videoView)).perform(swipleft());
}
@试验
公共无效tap_登录(){
//点击登录按钮
onView(使用id(R.id.wv_登录)).perform(单击());
}
}
我得到的结果是:

原因:java.lang.RuntimeException:将不执行操作,因为目标视图与以下一个或多个约束不匹配: 至少90%的视图区域显示给用户

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

PS:我已经按照浓缩咖啡文档的建议禁用了动画

原因:java.lang.RuntimeException:将不执行操作 因为目标视图与以下一项或多项不匹配 约束:至少90%的视图区域显示给用户 用户

当任何预期的视图都不完全可见时会发生这种情况,默认情况下,Espresso会查找在设备屏幕上完全可见的元素

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

  • 您使用的是
    滚动视图
    还是
    列表视图
  • 你的布局看起来怎么样
  • 它是否完全显示在测试设备上
这可能有助于:

onView(withId(R.id.wv_login))
    .perform(scrollTo(), click());
我想问题仍然会发生,请您添加到您的问题xml或屏幕截图。我会修好它;-)


注意:检查某物是否完全可见(它意味着更多 90%)您可以使用

onView(withId(R.id.wv_login)).check(matches(isCompletelyDisplayed()));
而不是:

onView(withId(R.id.wv_login)).check(matches(isDisplayed()));
在大屏幕设备上运行您的测试,以检查它是否仍然发生


如果您有问题,请随时询问此处所示的
RuntimeException
java.lang.RuntimeException:将不执行操作,因为目标视图不符合以下一个或多个约束条件:至少90%的视图区域显示给用户。
符合,实际上,这是由于
视图
无法完全显示所致。然而,@piotrek1543给出的答案并没有真正找到解决方案,尽管它充满了非常好的信息

该问题是由竞争条件引起的。您正在尝试打开视图,并且在视图打开期间,您正在尝试单击它。如果时间不对,那么只有不到90%的
视图可供浓缩咖啡框架
单击()。按照中的建议,可以通过禁用动画来解决此问题

  • 导航到手机的
    开发者选项
  • 设置以下内容
    • 窗口动画比例=0.0x
    • 过渡动画比例=0.0x
    • 动画师持续时间比例=0.0x

我自己的测试表明,只需将
过渡动画比例设置为
0.0x
,就可以成功。正如您所想象的,这是一个完全一致的解决方案,可以解决您所遇到的竞争条件。

如果按钮未放置在scrollview中,并且动画处于关闭状态,则当按钮设置为高度且在父布局中高度设置为环绕内容时,可能会发生此错误

失败

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

    <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>
**
**

谢谢这是一个节省,我不明白为什么这个问题偶尔发生。他开始工作了!我认为情况并非总是如此……在关闭动画并设置断点以便在scrollTo()之前加载屏幕时,单击()。我仍然得到:原因:java.lang.RuntimeException:尝试滚动到视图,但视图未显示Dear Oyrm,Espresso安装说明链接不工作,请附加工作链接好吗??
    <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>