UiScrollable no funciona en Android uiautomator

¿Alguien probar el marco UIAutomator Android UIAutomator ? Cuando uso la clase UiScrollabl "para encontrar algunos objetos en un objeto desplazable , no puede encontrar el objeto si la longitud del objeto desplazable es demasiado larga (necesidad de deslizar dos veces para encontrarlo), como" Opciones de desarrollador "en La aplicación "Configuración" ¿Alguien tiene el mismo problema?

6 Solutions collect form web for “UiScrollable no funciona en Android uiautomator”

Lo he arreglado reemplazando una clase UiScrollable .

 public class UiScrollable extends com.android.uiautomator.core.UiScrollable { public UiScrollable(UiSelector container) { super(container); } @Override public boolean scrollIntoView(UiSelector selector) throws UiObjectNotFoundException { if (exists(getSelector().childSelector(selector))) { return (true); } else { System.out.println("It doesn't exist on this page"); // we will need to reset the search from the beginning to start search scrollToBeginning(getMaxSearchSwipes()); if (exists(getSelector().childSelector(selector))) { return (true); } for (int x = 0; x < getMaxSearchSwipes(); x++) { System.out.println("I'm going forward a page: " + x); if(!scrollForward() && x!=0) { // x!=0 is the hack return false; } if(exists(getSelector().childSelector(selector))) { return true; } } } return false; } } 

He copiado la fuente de: UiScrollable.java (que puede estar obsoleta en algún momento, ten cuidado) y simplemente cambió la línea if(!scrollForward() && x!=0) .

De mis observaciones, en el caso del código de ejemplo en la página de pruebas ui de Google que desplaza la pantalla de aplicaciones de la aplicación de configuración, el método scrollForwards() falla en el primer intento. Dios sabe por qué.

Lo anterior simplemente dice que si falla en el primer desplazamiento, siga adelante independientemente. Si falla en desplazarse por el segundo desplazamiento, entonces de hecho devuelve un fallo.

Para encontrar y cualquier elemento en una vista donde el desplazamiento es necesario he utilizado el método mencionado a continuación y parece funcionar bien.

 public void searchForText(String searchText) throws UiObjectNotFoundException { UiScrollable textScroll = null; UiObject text = null; if (searchText != null) { textScroll = new UiScrollable(new UiSelector().scrollable(true)); textScroll.scrollIntoView(new UiSelector().text(searchText)); text = new UiObject(new UiSelector().text(searchText)); text.click(); } } 

¿Puede proporcionar más detalles por favor, por ejemplo

  • ¿Qué versión de adt está usando?
  • ¿Qué versión de Android son las pruebas que se ejecutan en / on?

La razón por la que hago estas preguntas es porque hay algunos problemas específicos de la versión con UIAutomator. Por ejemplo, descubrí un problema de desplazamiento que se ejecuta en dispositivos con 4.2.2 de Android que parece similar a la que usted mencionó. He codificado una solución en la que mi código hace el desplazamiento si el método estándar de Android no parece encontrar el elemento que esperaba estar disponible.

He reproducido la esencia de mi código aquí, usted encontrará el ejemplo completo en http://blog.bettersoftwaretesting.com/?p=84

  // The following loop is to workaround a bug in Android 4.2.2 which // fails to scroll more than once into view. for (int i = 0; i < maxSearchSwipes; i++) { try { appToLaunch = appViews.getChildByText(selector, nameOfAppToLaunch); if (appToLaunch != null) { // Create a UiSelector to find the Settings app and simulate // a user click to launch the app. appToLaunch.clickAndWaitForNewWindow(); break; } } catch (UiObjectNotFoundException e) { System.out.println("Did not find match for " + e.getLocalizedMessage()); } for (int j = 0; j < i; j++) { appViews.scrollForward(); System.out.println("scrolling forward 1 page of apps."); } } 

Nota: No sé si este código resolverá tu problema ya que no tengo un ejemplo de tu aplicación. Si usted es capaz de publicar sus pruebas y el diseño XML de la interfaz de usuario pertinente que haría más fácil diagnosticar el problema.

En general tengo más suerte con el drag() UiDevice drag() que con los métodos de Scrollable .

 scrollableObject.scrollIntoView(btn_1); try {if(scrollableObject.scrollIntoView(btn_1)) btn_1.click(); } catch (UiObjectNotFoundException e){ System.out.print("error1: "+e); } 

No estoy seguro de si esto puede ayudar, pero esto es lo que hago en mi aplicación. La primera línea es hacer que se desplace hasta encontrar btn_1, entonces si encuentra el objeto, realizará un clic en él.

También conozco getChildByText sólo una vez, e intento rastrearlo. Encuentro que la causa raíz puede ser del sistema.

Cuando llama a getChildByText , su flujo es:

 getChildByText -> scrollIntoView -> scrollForward -> scrollSwipe 

En scrollSwipe , el sistema ejecutará el comando swipe, espera, que encuentre AccessibilityEvent y filtre AccessibilityEvent.TYPE_VIEW_SCROLLED en la pantalla actual. Este paso hace que UiScrollable vuelva a desplazarse o lo revise al final.

Pero el error está aquí, el sistema no puede devolver AccessibilityEvent derecho.

 public boolean scrollSwipe(final int downX, final int downY, final int upX, final int upY, final int steps) { Runnable command = new Runnable() { @Override public void run() { swipe(downX, downY, upX, upY, steps); } }; // Collect all accessibility events generated during the swipe command and get the // last event ArrayList<AccessibilityEvent> events = new ArrayList<AccessibilityEvent>(); runAndWaitForEvents(command, new EventCollectingPredicate(AccessibilityEvent.TYPE_VIEW_SCROLLED, events), Configurator.getInstance().getScrollAcknowledgmentTimeout()); //**Root cause** //Some times the events list size will be 0 , //but in fact it can scroll again. Log.e(LOG_TAG,"events size = " + events.size()); AccessibilityEvent event = getLastMatchingEvent(events, AccessibilityEvent.TYPE_VIEW_SCROLLED); if (event == null) { // end of scroll since no new scroll events received recycleAccessibilityEvents(events); return false; } ... .. . } 

Creo que la mejor manera es que la sustitución del código y la definición de los MaxSearchSwipes adecuado, y si el elemento es más de este tamaño, hacer que la prueba falla.

 public class UiScrollableFix extends UiScrollable { public UiScrollableFix(UiSelector container) { super(container); } @Override public boolean scrollIntoView(UiSelector selector) throws UiObjectNotFoundException { Tracer.trace(selector); // if we happen to be on top of the text we want then return here UiSelector childSelector = getSelector().childSelector(selector); if (exists(childSelector)) { return (true); } else { // we will need to reset the search from the beginning to start search scrollToBeginning(getMaxSearchSwipes()); if (exists(childSelector)) { return (true); } for (int x = 0; x < getMaxSearchSwipes(); x++) { Log.e("test", "x=" + x); boolean scrolled = scrollForward(); if (exists(childSelector)) { return true; } //For avoiding the scroll fail. // if (!scrolled && x!=0) { // return false; // } } } return false; } } 
  • Android recibe texto del navegador
  • UIAutomator corriendo con espresso
  • Android UIAutomator haga clic en el dispositivo
  • Proyecto Ui Automator 2.0 en Android Studio
  • Cómo cambiar el título de las actividades en attach ()
  • AccessibilityService se destruye cuando se ejecuta uiautomator
  • Android UIAutomator Testing: Cuenta de todos los elementos presentes en la vista de lista
  • ¿Cómo puedo obtener el padre de una vista usando uiautomator?
  • Uiautomator "soy comienzo"
  • Error en el código UIAuitomator
  • ¿Puede una aplicación Android controlar otra aplicación a través de UI Automator?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.