Estoy intentando programar una aplicación de prueba automática utilizando la nueva interfaz de automatización 3.0 de Microsoft UI nativa (en VC++ 2010, Win7). La aplicación bajo prueba (AUT) es una aplicación WPF.Árbol de automatización de IU obsoleto
Casi todo funciona bien ... Puedo instalar manejadores de eventos, navegar por el árbol, buscar elementos usando varias condiciones y controlar los elementos encontrados usando sus patrones.
Pero ayer encontré un comportamiento que me deja desesperado: el árbol UIA de mi AUT simplemente no se actualiza después de cambiar su panel principal de GUI haciendo clic en uno de sus botones de menú principal.
Después de hacer clic en el botón de menú principal, puedo ver los nuevos widgets de interfaz gráfica de usuario de la AUT pero el árbol UIA todavía contiene los controles que han estado allí antes clic en el botón del menú principal. El árbol UIA (desactualizado) todavía se puede leer completamente utilizando las funciones de búsqueda o usando walker pero, por supuesto, no se puede escribir dado que los widgets ya no existen.
Esto parece exactamente que habría una memoria caché obsoleta ... sin embargo, NO utilizo ninguna función UIA de almacenamiento en memoria caché. Ninguna. Nunca. En ninguna parte.
No pude hacer la actualización del árbol UIA programáticamente ... ni llamando a ninguna función UIA ni reiniciando la aplicación tester ni cambiando la GUI de AUT de un lado a otro. Esto no sucede todo el tiempo. A veces, después de hacer clic en el botón principal, el árbol parece estar actualizado y todo funciona bien. Sin embargo, la mayoría de las ejecuciones falla. Solo hay una (misteriosa) forma de actualizar el árbol UIA de forma confiable: utilizando inspect.exe. ¡Cuando uso la herramienta inspect.exe para echar un vistazo al subárbol UIA de AUT, el problema desaparece repentinamente y mi aplicación tester puede acceder al árbol actual y actualizado inmediatamente! Por supuesto, el problema vuelve a aparecer después de reiniciar el AUT.
¿Qué hace inspect.exe para actualizar el árbol UIA (de otra aplicación)? ¿Cómo es posible acceder a los elementos sin usar ningún almacenamiento en caché? ¿Qué me perdí?
Realmente necesito ayuda.
bien, algunos de los hallazgos más:
UISpy.exe es capaz de actualizar el árbol de la UIA de la misma manera misteriosa inspect.exe hace (esto es especialmente extraño, porque utiliza el mismo inspect.exe interfaz nativa como lo hago, pero UISpy.exe utiliza la interfaz .NET AFAIK). Esto significa que este es un tipo de problema de UIA persistente y amplio del sistema y no un problema puro de UIA nativa.
El problema no ocurre si no accedo al árbol antes de cambiar la vista. Es decir. si mi aplicación de prueba no accede a la vista de AUT antes de cambiar la vista haciendo clic en el botón del menú principal, verá los nuevos widgets sin problemas. Esto indica fuertemente algún problema de almacenamiento en caché de la API UIA nativa, incluso si no tengo idea de cómo podría suceder esto porque no estoy almacenando en caché. ¿Alguien sabe si hay algún almacenamiento interno en caché?
Creo que esto podría ser un error de la API. Sin embargo, teniendo en cuenta mis experiencias actuales con Microsoft Connect, estoy algo perdido con ese inconveniente :-(
Alguien alguna idea?
También probé la herramienta Snoop. El uso de Snoop no cura temporalmente el problema como Inspect y UISpy. En cuanto a Inspect.exe, hay otro detalle ... es suficiente para colapsar y expande el subárbol de AUT para curar temporalmente el problema.
Tengo el [problema] similar (http://stackoverflow.com/questions/11014771/contentcontrol-is-not-visible-when-application-starts-via-ui-automation-test-bu). Si tiene alguna solución, ¡sugiérala! – stukselbax
¿Cómo navegas por el árbol? Por lo general, debería obtener un nuevo elemento de inicio (root/topmost) en algún momento después de la actualización. Pero ... ¿ya que dices que también tienes el problema después de reiniciar un programa? ¿Ayuda a la fuerza a actualizar el árbol a través de UISpy, etc.? Además, ¿probó diferentes métodos para obtener sus Elementos de UI? ¿Te gusta usar AutomationElement.FromPoint al pasar el mouse sobre un elemento? Además ... Noté que con algunas aplicaciones, el árbol de IU está roto de una manera u otra, lo que significa que algunos enlaces no conducen a ninguna parte o son cíclicos. Así que ir hacia abajo y hacia arriba no siempre cede el lugar de inicio. –
Tal vez pueda proporcionar algún código, el problema suena interesante. – Kooki