OnChildView y hasSiblings con Espresso
Estoy tratando de acceder a un botón desde una vista específica. La misma vista se muestra 6 veces. Este es el código que estoy usando.
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)); }
Cuando corro, obtengo un error:
- Robolectric: cómo probar una SherlockActivity
- Android Espresso: ViewPager no tiene instancia de adaptador
- Nullpointerexception cuando compruebo para el servicio corriente en la prueba de Roboelectric
- Almacenamiento de archivos de prueba en el proyecto de prueba
- AndroidJUnit4.class + org.junit.Assume.assumeTrue = AssumptionViolatedException
Error al ejecutar 'datos de adaptador de carga' en la vista 'es asignable desde class: class android.widget.AdapterView'.
¿Es esta la mejor manera de acceder a una vista de niño? ¿Si es así, cómo?
EDITAR
Este es el código que estoy intentando usar ahora.
onView(allOf((withContentDescription("description")), hasSibling(withContentDescription("SettingsLayout")), hasSibling(withId(R.id.positive)))).perform(click());
y
onView(allOf((withContentDescription("description")), hasSibling(withId(R.id.positive)))).perform(click());
Con este error:
No views in hierarchy found matching
El 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>
El xml de vista que se usa 6 veces.
<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>
Es el ImageView con id increaseGoalButton
que estoy tratando de hacer clic.
- Prueba de una clase Fragment en aislamiento usando Mockito
- Prueba de ViewPager (y CursorLoader) con Robolectric
- Uso de Espresso ¿Cómo puedo comprobar el número de elementos en mi alerta Cuadro de diálogo
- ¿Cómo puedo permitir que los probadores beta / beta de las aplicaciones de Android descarguen la aplicación de forma gratuita?
- Cómo rellenar la contraseña EditText con Android uiautomator?
- Java.lang.RuntimeException: ¡Stub! - ¿Cobertura de código de Android?
- "No se encontraron pruebas" para las pruebas de instrumentación de Lollipop y superiores
- ¿Cómo probar una ListActivity burlándose de su contentProvider y así aislar la prueba de la base de datos?
Sobre la base de su último comentario debe utilizar onView()
lugar de onData()
. Creo que podrás hacer clic en el botón usando hasSibling()
– ejemplo
onView(allOf(withId(R.id.positive), hasSibling(withDesc(someString)))) .perform(click());
O ejemplos sin su matcher personalizado (la vista hermana tiene texto):
onView(allOf(withId(R.id.positive), hasSibling(withText(someString)))) .perform(click());
O (la vista del hermano tiene descripción del contenido):
onView(allOf(withId(R.id.positive), hasSibling(withContentDescription(someString)))) .perform(click());
EDITADO:
OK, intentaría estas dos variantes:
onView(allOf(withId(R.id.increaseGoalButton), isDescendantOfA(withId(R.id.timeGoalWidget)))) .perform(click());
o
onView(allOf(withId(R.id.increaseGoalButton), withParent(withId(R.id.timeGoalWidget)))) .perform(click());
Ninguna de las descripciones de contenido coincide con la cadena "descripción" por eso no encuentra nada.
Asumiendo que el ID del botón es R.id.positive, y el identificador es único en la vista de actividad actual, puede utilizar simplemente:
onView(withId(R.id.positive)).perform(click());
- Proyecto LibGDX HelloWorld se bloquea cuando se ejecuta en el emulador de Android
- Cordova / Phonegap Todas las Solicitudes de Ajax Externas Devuelve 404