onChildView并与Espresso同伴

我正尝试从特定视图访问button。 相同的视图显示6次。 这是我正在使用的代码。

public void testTimeConfig(){ onData(withDesc("description")).onChildView(withId(R.id.positive)).perform(click()); } private static Matcher<Object> withDesc(String desc) { return allOf(is(instanceOf(String.class)), is(desc)); } 

当我运行时,我得到一个错误:

在视图上执行“加载适配器数据”时出错可以从类:class android.widget.AdapterView'分配。

这是访问子视图的最佳方式吗? 如果是这样,怎么样?

编辑

这是我正在尝试使用的代码。

  onView(allOf((withContentDescription("description")), hasSibling(withContentDescription("SettingsLayout")), hasSibling(withId(R.id.positive)))).perform(click()); 

  onView(allOf((withContentDescription("description")), hasSibling(withId(R.id.positive)))).perform(click()); 

有了这个错误:

  No views in hierarchy found matching 

xml

  <view android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/setAGoalTitle" android:layout_alignParentLeft="true" class="com.xxx" android:layout_marginTop="30dp" android:id="@+id/timeGoalWidget" app:goalLabel="@string/time_min_upper" app:icon="@drawable/ic_icn_summary_time" app:step="300" app:valueFormat="time" android:gravity="center_horizontal" android:layout_marginBottom="60dp" android:contentDescription="setAGoalTimeConfigurator"/> <view android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignTop="@id/timeGoalWidget" class="com.xxx" android:id="@+id/distanceGoalWidget" app:goalLabel="@string/distance_upper" app:icon="@drawable/ic_icn_summary_track" app:step="0.25" app:valueFormat="decimal_two" android:gravity="center_horizontal" android:contentDescription="setAGoalDistanceConfigurator"/> <view android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/timeGoalWidget" android:layout_alignLeft="@id/timeGoalWidget" class="com.xxx" android:id="@+id/paceGoalWidget" app:goalLabel="@string/pace_upper" app:icon="@drawable/ic_icn_summary_pace" app:valueFormat="time" app:step="10" android:gravity="center_horizontal" android:layout_marginBottom="60dp" android:contentDescription="setAGoalPaceConfigurator"/> <view android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@id/distanceGoalWidget" android:layout_alignTop="@id/paceGoalWidget" class="com.xxx" android:id="@+id/speedGoalWidget" app:goalLabel="@string/speed_upper" app:icon="@drawable/ic_icn_summary_speed" app:step="0.5" app:valueFormat="decimal_two" android:gravity="center_horizontal" android:contentDescription="setAGoalSpeedConfigurator"/> <view android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/paceGoalWidget" android:layout_alignLeft="@id/paceGoalWidget" class="com.xxx" android:id="@+id/inclineGoalWidget" app:goalLabel="@string/incline_percent_upper" app:icon="@drawable/ic_icn_summary_elevation" app:step="0.5" app:valueFormat="decimal_two" android:gravity="center_horizontal" android:contentDescription="setAGoalInclineConfigurator"/> <view android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@id/speedGoalWidget" android:layout_alignTop="@id/inclineGoalWidget" class="com.xxx" android:id="@+id/caloriesGoalWidget" app:goalLabel="@string/calories_upper" app:icon="@drawable/ic_icn_summary_calories" app:step="10" app:valueFormat="decimal_zero" android:gravity="center_horizontal" android:contentDescription="setAGoalCaloriesConfigurator"/> </RelativeLayout> 

视图xml使用了6次。

 <ImageButton android:id="@+id/increaseGoalButton" android:layout_height="@dimen/view_goal_setting_incrementor_button_height_width" android:layout_width="@dimen/view_goal_setting_incrementor_button_height_width" android:background="@drawable/button_goal_widget" android:gravity="center" android:src="@drawable/ic_plus" android:textSize="@dimen/view_goal_setting_incrementor_button_text_size" android:textColor="@color/goal_configuration_widget_button_text_color" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginBottom="1dp" android:contentDescription="@string/increase"/> <ImageButton android:id="@+id/decreaseGoalButton" android:layout_height="@dimen/view_goal_setting_incrementor_button_height_width" android:layout_width="@dimen/view_goal_setting_incrementor_button_height_width" android:background="@drawable/button_goal_widget" android:gravity="center" android:src="@drawable/ic_minus" android:textSize="@dimen/view_goal_setting_incrementor_button_text_size" android:layout_alignParentRight="true" android:textColor="@color/goal_configuration_widget_button_text_color" android:layout_below="@id/increaseGoalButton" android:contentDescription="@string/decrease"/> <LinearLayout android:id="@+id/goalWidgetValueContainer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_toLeftOf="@id/increaseGoalButton" android:layout_centerVertical="true" android:gravity="center_vertical|right" android:layout_marginRight="@dimen/view_goal_setting_value_margin_right" > <TextView android:id="@+id/goalValueTextView" android:layout_height="wrap_content" android:layout_width="wrap_content" android:textColor="@color/goal_configuration_widget_value_text_color" android:textSize="@dimen/view_goal_setting_value_text_size" android:lineSpacingExtra="-10sp" app:typeface="proxima_bold" android:text="999:00"/> <TextView android:id="@+id/goalValueLabelTextView" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="right" android:textSize="@dimen/view_goal_setting_value_label_text_size" android:textColor="@color/goal_configuration_widget_value_text_color" android:includeFontPadding="false" android:lineSpacingExtra="10sp" android:text="@string/incline_percent_upper"/> </LinearLayout> 

它是我想要点击的ID increaseGoalButton GoButton的ImageView。

Solutions Collecting From Web of "onChildView并与Espresso同伴"

根据你最后的评论你应该使用onView()而不是onData() 。 我想你可以使用hasSibling() – 例子来点击button

 onView(allOf(withId(R.id.positive), hasSibling(withDesc(someString)))) .perform(click()); 

或没有自定义匹配器的示例(同级视图有文本):

 onView(allOf(withId(R.id.positive), hasSibling(withText(someString)))) .perform(click()); 

或(同级视图有内容描述):

 onView(allOf(withId(R.id.positive), hasSibling(withContentDescription(someString)))) .perform(click()); 

编辑:

好吧,我会尝试这两个变种:

 onView(allOf(withId(R.id.increaseGoalButton), isDescendantOfA(withId(R.id.timeGoalWidget)))) .perform(click()); 

要么

 onView(allOf(withId(R.id.increaseGoalButton), withParent(withId(R.id.timeGoalWidget)))) .perform(click()); 

没有任何内容描述匹配string“description”,这就是为什么它没有find任何东西。

假设buttonID是R.id.positive,并且该ID在当前活动视图中是唯一的,则可以简单地使用:

 onView(withId(R.id.positive)).perform(click());