Compruebe si se muestra un identificador de recurso de la vista en matriz y haga clic en él (Android-Espresso)

Tengo el siguiente caso. Estamos utilizando el lenguaje Gherkin para impulsar nuestra automatización ui nativa con Espresso. En nuestras líneas de pepinillos tenemos una línea llamada:

And I tap on button "Next" 

Donde "Siguiente" es una variable String pasamos a nuestro código de pegamento (estamos usando el marco de pepino).

Como ocurre, nuestra aplicación tiene muchos "Siguiente" botones con diferentes recursos ids. Terminé usando líneas de pepinillo con variables como:

 And I tap on button "Next in screen 1" And I tap on button "Next in screen 2" 

Ahora quiero usar sólo la variable Gherkin "Next" en mi código. Recibo una matriz de Integer que contiene todos los ids de recursos de todos los botones Next, pero cuando quiero comprobar qué id se muestra en la pantalla tengo una NoMatchingViewException.

Esta es mi solución actual por ahora:

  final int[] uiElementIds = getArrayWithIdsFromUIElement("Next"); int testId = 0; for(int id : uiElementIds) { try { onView(withId(id)).check(matches(isDisplayed())); testId = id; break; } catch(NoMatchingViewException ex) { // do nothing } } final int uiElementId = testId; onView(withId(uiElementId)).withFailureHandler(new FailureHandler() { @Override public void handle(Throwable error, Matcher<View> viewMatcher) { onView(withId(uiElementId)).perform(scrollTo(), click()); } }).perform(click()); 

Como se puede ver, simplemente captura la NoMatchingViewException lanzada y no hago nada con ella hasta que encuentre la ID correcta y salga del bucle for.


Mi pregunta es:

¿Hay un mejor enfoque que podemos utilizar para realizar un bucle a través de ella para ver qué ID se muestra y si es así, haga clic en él?

En mi mente me surgió esta idea, pero no está integrado en Espresso:

 for(int id : uiElementIds) { if(onView(withId(id)).exist()) { performClick(); } } 

De acuerdo con tu pregunta

Mi pregunta es:

¿Hay un mejor enfoque que podemos utilizar para realizar un bucle a través de ella para ver qué ID se muestra y si es así, haga clic en él?

En mi mente me surgió esta idea, pero no está integrado en Espresso:

 for(int id : uiElementIds) { if(onView(withId(id)).exist()) { performClick(); } } 

Aquí está mi viejo Espresso marco Pruebas de Activity :

 @RunWith(AndroidJUnit4.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class DetailsActivityTest { @Rule public ActivityTestRule<MainActivity_> mRule = new ActivityTestRule<>(MainActivity_.class); //TODO: Write tests to check if views are visible private final int[] allDetailsActivityViewsIdis = { R.id.dItem, R.id.dDayAndDate, R.id.dDay, R.id.dDate, R.id.dCity, R.id.dTempAndIcon, R.id.dTemperature, R.id.dHighTemp, R.id.dLowTemp, R.id.dDescriptionLayout, R.id.dDescription, R.id.dForecast, R.id.dHumidityLayout, R.id.dHumidityDesc, R.id.dHumidityVal, R.id.dPressureLayout, R.id.dPressureDesc, R.id.dPressureVal, R.id.dWindLayout, R.id.dWindDesc, R.id.dWindVal }; private final int[] detailsActivityTextViewsIdis = { R.id.dDay, R.id.dDate, R.id.dHighTemp, R.id.dLowTemp, R.id.dDescription, R.id.dHumidityVal, R.id.dPressureVal, R.id.dWindVal, }; private final int[] detailsActivityTextViewsDefaultValues = { R.string.day, R.string.date, R.string.high_temp, R.string.low_temp, R.string.description, R.string.humidity_val, R.string.pressure_val, R.string.wind_val, }; @Before //TODO: Rewrite this code using espresso-intents public void checkIfAllDetailActivityViewsAreDisplayed() throws InterruptedException { for (int viewId : allDetailsActivityViewsIdis) onView(withId(viewId)).perform(click()); } @Test public void checkIfDetailsActivityViewsHaveNoDefaultValue() throws InterruptedException { for (int viewId : detailsActivityTextViewsIdis) for (int valueId : detailsActivityTextViewsDefaultValues) onView(withId(viewId)).check(matches(not(withText(valueId)))); } } 

Como puedes ver, usar foreach con Espresso es posible, pero en lugar de exists() use check(matches(...) con value: isDisplayed , isDisplayedAtLeast o isCompletelyDisplayed

Espero que te ayude

  • Proporcionando retraso entre eventos en UiAutomator Android
  • Android Testing - Problema con ActivityInstrumentationTestCase2?
  • Cómo configurar Appium en Mac OS para ejecutar pruebas automatizadas de clases JAVA en dispositivos Android e iOS
  • Prueba Espresso en un módulo separado
  • Cómo automatizar el patrón de desbloqueo en un teléfono real utilizando uiautomator?
  • UiAutomator getLastTraversedText ()
  • Error 'adb not installed' al intentar tomar una instantánea con uiautomatorviewer
  • UiAutomator falla en el dispositivo 4.1.2
  • Cuando ejecuto mi código androide UIAutomator, muestra error
  • Cómo inyectar el evento de clic con Android UiAutomation.injectInputEvent
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.