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).
- Cómo obtener una instancia de android.app.UiAutomation
- ¿Cómo desplazarse por la pantalla en la prueba de espresso android? Necesito validar el texto presente en la pantalla
- Actividad Actual en Espresso android
- Cómo cambiar la orientación del dispositivo Android con ADB
- Prueba de integración de Android: Robotium o UIAutomator?
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(); } }
- ¿Cómo puedo probar automáticamente la funcionalidad de las aplicaciones iOS y Android?
- Automatización de Android APK con Espresso
- Android Espresso Ui Test verifica el texto de la etiqueta de ActionPage
- En el visor del automatizador de la UI Error al obtener la captura de pantalla Dispositivo, Razón: Error No se puede conectar con el adaptador. Compruebe si adb está instalado correctamente
- Tamaño de pantalla en Samsung Tablet 10.1
- Appium: Cómo iniciar la aplicación de Android para el perfil de trabajo
- Cómo rellenar la contraseña EditText con Android uiautomator?
- Construcción de hormigas: incapaz de localizar tools.jar. Se espera encontrarlo en C: \ Archivos de programa \ Java \ jre7 \ lib \ tools.jar
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
- Cómo utilizar una actividad de Android en React Native
- Hoja inferior no aparece a veces en vista complicada