Espresso 如何点击一个 ImageView 放置在 listview 的第一项?

Posted

技术标签:

【中文标题】Espresso 如何点击一个 ImageView 放置在 listview 的第一项?【英文标题】:Espresso how to click on a ImageView placed in listview's first item? 【发布时间】:2015-04-30 16:28:07 【问题描述】:

我有一个列表视图的自定义布局,我想点击放置在列表视图项中的图像视图,列表视图中第一项的溢出图标。

我想点击id为“rcOverflow”的最后一个imageview

我的布局,

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:gravity="left"
android:paddingBottom="10dp"
android:paddingTop="5dp">

<ImageView
    android:id="@+id/rcCircle"
    android:layout_
    android:layout_
    android:layout_alignWithParentIfMissing="true"
    android:layout_alignParentTop="true" />

<TextView
    android:id="@+id/rcTime"
    android:layout_
    android:layout_
    android:layout_marginTop="20dp"
    android:gravity="right"
    android:maxLines="1"
    android:textColor="#ffffff"
    android:textSize="13sp" />

<RelativeLayout
    android:id="@+id/rsBubble"
    android:layout_
    android:layout_
    android:layout_alignWithParentIfMissing="true"
    android:layout_below="@id/recordsMonthHeader"
    android:paddingBottom="16dp"
    android:paddingTop="16dp">

    <ImageView
        android:id="@+id/rcImage"
        android:layout_
        android:layout_
        android:adjustViewBounds="true"
        android:layout_alignParentTop="true"
        android:visibility="gone"
        android:layout_marginLeft="3dp"
        android:layout_marginRight="4dp"/>

    <TextView
        android:id="@+id/rcFilename"
        android:layout_
        android:layout_
        android:layout_marginTop="5dp"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="10dp"
        android:textColor="#000000"
        android:maxLines="2"
        android:ellipsize="end"
        android:textSize="15sp" />

    <TextView
        android:id="@+id/rcDuration"
        android:layout_
        android:layout_
        android:layout_alignParentLeft="true"
        android:layout_below="@id/recordsFilename"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="2dp"
        android:textColor="#a09f9f" />

    <ImageView
        android:id="@+id/records_location_image"
        android:layout_
        android:layout_
        android:layout_alignBottom="@id/recordsDuration"
        android:layout_marginBottom="4dp" />

    <TextView
        android:id="@+id/rcLocation"
        android:layout_
        android:layout_
        android:layout_alignBottom="@id/recordsDuration"
        android:layout_marginBottom="1dp"
        android:layout_marginLeft="3dp"
        android:layout_marginTop="2dp"
        android:ellipsize="end"
        android:lines="1"
        android:textColor="#a09f9f"
        android:textSize="12sp"
        android:visibility="gone" />

    <TextView
        android:id="@+id/rcTag"
        android:layout_
        android:layout_
        android:layout_alignParentLeft="true"
        android:layout_below="@id/recordsDuration"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="3dp"
        android:textColor="#a09f9f"
        android:textSize="12sp"
        android:visibility="gone" />

    <ImageView
        android:id="@+id/rcOverflow"
        android:layout_
        android:layout_
        android:layout_below="@+id/recordsImage"
        android:layout_alignParentRight="true"
        android:layout_alignWithParentIfMissing="true"
        android:background="?android:attr/selectableItemBackground"
        android:src="@drawable/overflow" />

</RelativeLayout>

我尝试过的

onData(anything()).inAdapterView(withId(getId("recorderlistpage_listView")))
.perform(click());

onData(anything()).atPosition(0).inAdapterView(withId(getId("rcOverflow")))
.perform(click());

两个都不行

【问题讨论】:

【参考方案1】:

我不太自信,但是这个怎么样?

onData(anything())
    .inAdapterView(withId(R.id. recorderlistpage_listView))
    .atPosition(0)
    .onChildView(withId(R.id.rcOverflow))
    .perform(click());

【讨论】:

谢谢,它有效!非常感谢!稍作调整后,我也可以“单击” NavDrawer 中的特定 ListView 位置。 @AndreyKopeyko..您是如何在 NavDrawer 中的特定 ListView 位置上实现“点击”的?可以分享一下代码吗? @saamzzz 在下面看到我的答案 - 将代码放入评论中会使所有格式都失败;-(【参考方案2】:

这对我有用

onData(allOf()).atPosition(0).
onChildView(withId(R.id.rcOverflow)).
perform(click());

【讨论】:

【参考方案3】:

@saamzzz 看到这个飞船

    // open the Drawer and select rubric at position 0
    final int first_position = 0;
    DrawerActions.openDrawer(R.id.drawer_layout);
    onView(withId(R.id.drawer_layout)).check(matches(isOpen()));
    //// get position of last rubric
    final int last_position = ((ListView) mActivity.findViewById(R.id.navDrawer_rubrics))
            .getAdapter().getCount() - 1;
    //// do select rubric around the middle
    onData(anything())
            .inAdapterView(withId(R.id.navDrawer_rubrics))
            .atPosition(first_position + last_position/2)
            .perform(click());
    onView(withId(R.id.drawer_layout)).check(matches(isClosed()));

【讨论】:

以上是关于Espresso 如何点击一个 ImageView 放置在 listview 的第一项?的主要内容,如果未能解决你的问题,请参考以下文章

Espresso - 点击对话框的按钮

成功点击并阻止 60 秒后,Espresso 测试失败

Espresso Android,点击 WebView 元素错误

Espresso点击菜单项

Espresso 点击文本的特定单词

如何在一个imageview中为每次点击调用不同的可绘制动画?