Android 在回收器视图中单击:浓缩咖啡

Android 在回收器视图中单击:浓缩咖啡,android,automation,android-espresso,Android,Automation,Android Espresso,我试图点击回收器视图中的一个菜单项,我有以下代码 onView(allOf(withId(R.id.section_list),isDisplayed())).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("ABC")), MyViewAction.clickChildViewWithId(R.id.payment_menu))); MyViewAction如下所示: class MyViewAction {

我试图点击回收器视图中的一个菜单项,我有以下代码

onView(allOf(withId(R.id.section_list),isDisplayed())).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("ABC")), MyViewAction.clickChildViewWithId(R.id.payment_menu)));
MyViewAction如下所示:

class MyViewAction {

public static ViewAction clickChildViewWithId(final int id) {
    return new ViewAction() {
        @Override
        public Matcher<View> getConstraints() {
            return null;
        }

        @Override
        public String getDescription() {
            return "Click on a child view with specified id.";
        }

        @Override
        public void perform(UiController uiController, View view) {
            View v = view.findViewById(id);
            v.performClick();
        }
    };
}
类MyViewAction{
公共静态视图操作单击id为(最终int id)的子视图{
返回新的ViewAction(){
@凌驾
公共匹配器getConstraints(){
返回null;
}
@凌驾
公共字符串getDescription(){
返回“单击具有指定id的子视图”;
}
@凌驾
公共作废执行(UiController UiController,视图){
视图v=View.findViewById(id);
v、 performClick();
}
};
}
  • 当我测试它时,我可以看到滚动发生在正确的位置,但是单击失败,出现以下错误
android.support.test.espresso.PerformException:执行“android.support.test.espresso.contrib.RecycleServiceActions”时出错$ActionOnItemAtPositionViewAction@2fd64b56id为com.em3Agri.operation.debug:id/section\u list的“查看中”。 位于android.support.test.espresso.PerformException$Builder.build(PerformException.java:83) 在 原因:java.lang.IllegalStateException:位置38处无视图保持架 位于android.support.test.espresso.contrib.RecycleServiceActions$ActionOnItemPositionViewAction.perform(RecycleServiceActions.java:290) 位于android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.java:144)


我不知道这是否是您面临的错误的根本原因,但您应该严格遵守
matcher
action
之间的区别,即

RecyclerViewActions.actionOnItem(
    hasDescendant(withText("ABC")), 
    MyViewAction.clickChildViewWithId(R.id.payment_menu)
)
应该写成

RecyclerViewActions.actionOnItem(
    <something-that-selects-R.id.payment_menu-in-your-view-item>, 
    click()
)
RecycleServiceActions.ActionItem(
, 
单击()
)
这个
something-that-selects-R.id.payment\u菜单-in-your-view-item
实际上是什么取决于视图的设置,可能很难正确定义,因此可能是其他方法之一(
actionholderitem
e.g.)可能更合适。这也应该运行得更快,因为它可以直接跳转到由特定的视图持有者标识的视图,而
Matcher
版本只能逐项“滚动”您的
RecyclerView
并检查每个新绑定的版本。

怎么样:

onView(withId(R.id.section_list))
  .perform(
    RecyclerViewActions.actionOnItem(
      hasDescendant(withId(R.id.payment_menu)), 
      ViewActions.click()
    )
  ); 

是否在设备开发设置中禁用了动画?