Espresso largo haga clic en el menú y el menú emergente

ACTUALIZACIÓN: parece que al usar la aplicación, en algunos momentos al azar, la aplicación se bloqueará cuando haga clic largo, especialmente en los elementos hacia la parte inferior de la pantalla. ¿Alguna idea de por qué podría ser?

Así que hay un listview en mi aplicación. Si hace clic largo en un elemento de vista de lista, aparecerá un menú emergente, anclado al elemento que ha seleccionado largamente, con opciones para eliminar o editar el elemento de menú. Sólo con la aplicación, todo funciona bien. Puede hacer clic en cualquier elemento de la lista, los datos asociados subyacentes se eliminan y la vista de lista se actualiza sin ese elemento que acaba de eliminar.

Lo que estoy tratando de hacer : Espresso no le gusta mi lista de vista y hacer clic largo. Simplemente estoy tratando de probar que el menú emergente aparece, pero no puedo obtener espresso a longclick con éxito. Estoy pensando que el problema tiene algo que ver con el menú emergente. Así que para empezar, sólo estoy tratando de conseguir espresso a longclick sin molestarse en mí. Una vez que espresso longchicks con éxito, creo que puedo averiguar cómo comprobar si o no el popup se muestra.

Lo que he probado hasta ahora : He leído que apagar animaciones se supone que ayudar a espresso ser menos escamosa. Apagué todas las animaciones que pude y el problema persiste. Incluso puedo ver la prueba ejecutada en mi teléfono y ver que es longclicking el elemento de menú correcto, pero cuando el longclick está completo y el menú emergente debe aparecer, la prueba falla

Código : Esta es la línea de prueba de espresso que falla. He utilizado la misma línea de código antes, excepto con click() y la aplicación hace lo que se supone que y espresso es feliz. MCourseCount es simplemente el índice del último elemento de la lista. Ese no es el problema. I y actualizar el mismo índice en varias otras pruebas y todo funciona bien.

 onData(anything()).inAdapterView(withId(R.id.listview_class)) .atPosition(mCourseCount).perform(longClick()); 

En caso de fallo, existen un par de líneas interesantes en el seguimiento de la pila

  android.support.test.espresso.PerformException: Error performing 'long click' on view ' displaying data matching: ANYTHING within adapter vieW matching: with id: com.cmsc355.classcompass.classcompass:id/listview_class' 

Y más tarde

  Caused by: java.lang.IllegalStateException: MenuPopupHelper cannot be used without an anchor at com.android.internal.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:101) at android.widget.PopupMenu.show(PopupMenu.java:108)at com.cmsc355.classcompass.classcompass.CourseMenuFragment$2. onItemLongClick(CourseMenuFragment.java:91) 

Este último bit del rastreo de la pila es confuso porque definitivamente he configurado el menú emergente con un ancla como sigue (esto es de CourseMenuFragment alrededor de la línea 91):

  listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, final View view, final int position, long id) { PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position)); popupEdit.getMenuInflater().inflate(R.menu.course_longclick_popup, popupEdit.getMenu()); popupEdit.show(); popupEdit.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { if (item.getItemId() == R.id.edit_course) { } else if (item.getItemId() == R.id.delete_course) { throwCourseDeleteAlert(position); listView.setAdapter(mCourseNameAdapter); } return true; } }); return true; } }); 

En la línea en la que se listView.getChildAt(position) primera instancia, listView.getChildAt(position) define el ancla para el menú emergente. Tal vez hay un problema con esto? Pero como se mencionó, todo funciona completamente bien como se esperaba cuando sólo interactuar con el mí mismo.

Cualquier orientación sería apreciada. Por favor, hágamelo saber si es necesario aclarar más.

Solución encontrada. Yo estaba accediendo a los elementos de la lista de forma incorrecta. En lugar de

 PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position)); 

Cambié a

 PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position - listView.getFirstVisiblePosition())); 

Tuve que ajustar el índice de la posición para cuando fui desplazado hacia abajo más lejos en la lista. Me gusta odiar contestando mis propias preguntas sobre SO, pero tal vez esto ayudará a alguien más.

  • Espresso: Recyclerview scroll to end
  • El recurso de ralentí Espresso no funciona
  • Android: activar un botón
  • Cómo escribir prueba funcional automatizada con Facebook SDK en la aplicación de Android?
  • Prueba de RxJava2 usando Espresso y obtener una excepción de puntero nulo cuando suscribeOn
  • ¿Hay alguna manera de probar las pestañas personalizadas de Chrome con Espresso?
  • Android Espresso: longClick () no funciona y se comporta como click ()
  • Espresso check all in list
  • Cómo probar el gesto de desplazamiento del buscapersonas en Android con Espresso 2.2
  • Mocking resultados de los servidores en Android (Wiremock, MockWebServer etc)
  • ¿Cómo podemos usar espresso para probar una actividad de configuración de Android con un PreferenceFragment?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.