UiAutomator getLastTraversedText ()

Estaba tratando de probar una vista web de Android con Android UiAutomator. Según entiendo la documentación , el desplazamiento a través de un WebvView generaría eventos de recorrido de UI, y aquellos deberían ser legibles a través de getUiDevice().getLastTraversedText().

Sin embargo, cuando utilizo getUiDevice().pressDPadDown() para desplazarse a través de una vista web, getUiDevice().getLastTraversedText() sigue devolviendo null.

¿Qué he extrañado?

Si alguien ha conseguido esta llamada al trabajo yo apreciaría mucho una muestra corta del código.

Malas noticias: He pasado varias horas tratando de averiguar cómo conseguir este trabajo, sin embargo, todavía tengo que obtener nada más que nulo en respuesta a las llamadas a getUiDevice().getLastTraversedText() .

FYI aquí son las cosas que he probado y descubierto:

  • uiautomator events en un adb shell debe volcar todos los eventos de accesibilidad. Sin duda, informa de varios eventos, sin embargo, es prácticamente silencioso cuando me desplace manualmente a través del contenido de un WebView. Si el contenido en el WebView se desplaza, por ejemplo, después de navegar hacia arriba o hacia abajo más allá de lo que se muestra en la pantalla, obtengo el siguiente tipo de evento reportado:

03-10 19:44:47.436 EventType: TYPE_VIEW_SCROLLED; EventTime: 911700; PackageName: com.example.simplewebview; MovementGranularity: 0; Action: 0 [ ClassName: android.webkit.WebView; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: true; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: 0; ScrollY: 270; MaxScrollX: 0; MaxScrollY: 544; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

  • Si habilito la opción de accesibilidad Explore-by-touch, entonces no puedo usar uiautomator en adb shell . Cada vez que ejecuto un comando uiautomator, recibo una respuesta de Killed . Yo estaba usando Explore-By-Touch para hablar el texto que se muestra. Aunque no he podido navegar a todos los enlaces con Explore-By-Touch habilitado (o al usar el Virtual D-Pad que es parte de la Suite de Accesibilidad de Android) leyó LinkText para algunos de los enlaces ( Por ejemplo, saltó los caracteres japoneses en la página que estaba usando para la prueba de http://pickalize.info/ )

  • Si ejecuto un script similar al tuyo (para una simple aplicación WebView he creado para el propósito), entonces puedo ver la interfaz de usuario en el WebView resaltar varios elementos, en mi caso los enlaces web de la siguiente página web que estaba investigando por otras razones en El tiempo http://pickalize.info/ El fondo del enlace actualmente seleccionado pasa a azul pálido, sin embargo no se devuelve ningún texto por la llamada a getUiDevice().getLastTraversedText()

Mi mejor conjetura es que estamos tratando de usar el método de manera inapropiada. Tal vez se supone que debemos solicitar y analizar el DOM de la WebView (bondad sabe cómo), pero ver el siguiente comentario de la documentación de getLastTraversedText ()

When the view control used can return a reference to is Document Object Model, it is recommended then to use the view's DOM instead.

BTW: Estoy probando con Android 4.2.2 en dispositivos físicos.

Buena suerte con sus investigaciones. Seguiré viendo el problema de vez en cuando para ayudarme a aprender más sobre la idoneidad y las capacidades de Ui Automator.

Actualización (26 de marzo de 2013): probé de nuevo con "Mejorar la accesibilidad web" establecido en "Permitido" en el menú Configuración de accesibilidad del dispositivo. Todavía obtengo null devuelto por getLastTraversedText()

Aquí está la tripa de mi código de prueba:

Public class WebViewNavigator extends UiAutomatorTestCase {

 public void testNavigationDownGeneratesEventText() throws UiObjectNotFoundException { getUiDevice().pressHome(); UiObject allAppsButton = new UiObject(new UiSelector().description("Apps")); allAppsButton.clickAndWaitForNewWindow(); UiObject appsTab = new UiObject(new UiSelector().text("Apps")); appsTab.click(); UiScrollable appViews = new UiScrollable(new UiSelector().scrollable(true)); appViews.setAsHorizontalList(); String nameOfAppToLaunch = "SimpleWebView"; UiAutomatorHelpers.launchAppCalled(nameOfAppToLaunch); UiObject simpleWebViewValidation = new UiObject(new UiSelector().packageName("com.example.simplewebview")); assertTrue("The package name seems incorrect for the app we want to launch", simpleWebViewValidation.exists()); simpleWebViewValidation.clickAndWaitForNewWindow(); // Ok we should have started the app now... On to the test Log.i("WebViewNavigatorTest", "About to start navigating down the contents of the webview"); int closeToInfinity = 10; for (int i = 0; i < closeToInfinity; i++) { boolean goneDown = getUiDevice().pressDPadDown(); if (!goneDown) { break; } String lastTraversedText = getUiDevice().getLastTraversedText(); if (lastTraversedText != null) { Log.i("WebViewNavigatorTest", lastTraversedText); } else { Log.w("WebViewNavigatorTest", "(null) returned for getLastTraversedText()"); } } } 

}

Y aquí está el comando adb que utilizo para ver los mensajes cuando se ejecuta este código en el dispositivo Android: adb logcat WebViewNavigatorTest:I *:S

Seguido por la salida:

 I/WebViewNavigatorTest(29358): About to start navigating down the contents of the webview W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText() W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText() W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText() W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText() W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText() W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText() W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText() W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText() W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText() W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText() 
  • Android UIAutomator Testing: Cuenta de todos los elementos presentes en la vista de lista
  • UIautomator cómo obtener el hijo por índice o instancia
  • UiAutomator volcado para Lollipop Lost WebView Ver jerarquía
  • uiautomator - no puede obtener ListView para desplazarse como validar el texto en cada elemento de la lista. sólo falla cuando golpeo el último elemento en la pantalla
  • Cómo depurar las secuencias de comandos de UIAutomator con Eclipse
  • ¿Cómo presionar un botón dos veces con Google UiAutomator?
  • Prueba de UiAutomator 2.0 desde la línea de comandos
  • UIAutomator corriendo con espresso
  • Cómo cambiar el título de las actividades en attach ()
  • Cómo automatizar el patrón de desbloqueo en un teléfono real utilizando uiautomator?
  • UIAutomator haga clic en la vista de lista basada en el índice
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.