【问题标题】:Android Espresso error on button click按钮单击时出现 Android Espresso 错误
【发布时间】:2016-04-03 07:35:57
【问题描述】:

我正在尝试为带有 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());
  }

}

我得到的输出是:

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

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

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

【问题讨论】:

    标签: android android-espresso ui-testing


    【解决方案1】:

    如果按钮未放置在滚动视图中并且动画关闭,则当按钮设置高度并且在高度设置为 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>
    

    Pass : height 的值应该传递给父布局

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

    【讨论】:

      【解决方案2】:

      这里看到的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中的建议通过禁用动画来解决此问题

      • 导航到您手机的Developer Options
      • 设置以下
        • 窗口动画比例 = 0.0x
        • 过渡动画比例 = 0.0x
        • 动画持续时间比例 = 0.0x

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

      【讨论】:

      • 我认为情况并非总是如此...关闭动画并设置断点以在 scrollTo(), click() 之前给屏幕加载时间。我仍然得到:原因:java.lang.RuntimeException:尝试滚动到视图,但视图没有显示
      • 亲爱的 Oyrm,Espresso 设置说明链接无效,能否请附上有效链接??
      【解决方案3】:

      原因:java.lang.RuntimeException: Action will not be executed 因为目标视图与以下一项或多项不匹配 约束:至少 90% 的视图区域显示到 用户。

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

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

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

      这可能会有所帮助:

      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()));
      

      在更大屏幕的设备上运行测试,检查它是否仍然发生。

      如果您有任何问题,请随时提问

      【讨论】:

      • 谢谢你这是一个保护程序,我不明白为什么这个问题偶尔会发生。滚动到工作!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多