En uno de nuestros proyectos de automatización de pruebas funcionales en SAP R/3, donde la herramienta que estábamos utilizando era HP QuickTest Professional, nos encontramos con un problema bastante complicado de solucionar.
Las pruebas automáticas habitualmente son realizadas por un tester que graba cada una de las acciones de un caso de prueba con un “Recorder”, proporcionado por la herramienta que se está utilizando. El “Recorder” se encarga de transformar cada acción en código. El resultado de todo esto es un script formado por métodos que se pueden parametrizar y posteriormente ejecutar.
En un momento dado del proceso que se estaba automatizando, descubrimos que no existía un método que simulara la acción de “arrastrar y soltar” (drag&drop) para un objeto SAPTreeView y por lo tanto el “Recorder” era incapaz de traducir esta acción a código.
El SAPTreeView es un elemento grafico del SAPGUI, es una estructura dinámica de árbol n-ario, usada en SAP, sobre todo para gestión de menús o estructuras jerárquicas en general (p.e. organización del personal de empresa, jerarquía de CECOs, plan de cuentas, etc.). Las característica principales de un SAPTreeView son:
- Tener un único nodo de origen, llamado raíz
- Está formado por nodos que pueden tener de 0 a n hijos
- Los nodos sin hijos se llaman también hojas.
Objetos SAPTreeViews del SAPGUI
Finalmente, la solución encontrada fue escribir el código manualmente basándonos en las posiciones (“coordenadas”) de cada objeto en cuestión. Esta programación es poco recomendada porque resulta poco reusable. La razón por la que se utilizo fue porque era un caso extremo. El principal problema consistía en que las posiciones de los nodos del SAPTreeView no eran fijas y, por lo tanto, sus coordenadas se tenían que extrapolar de su posición en el árbol durante la ejecución del script.
Pasos del algoritmo
El algoritmo desarrollado se puede resumir en 3 pasos principales.
Paso 1: inicialización coordenadas “fijas”
El script empieza con la definición e inicialización de las coordenadas “fijas”. A estas pertenecen dos grupos de coordenadas:
- Coordenadas de la ventana SAPTreeView (pop-up) que contiene los dos SAPTreeViews. La posición del pop-up siempre es fija, por lo tanto el cálculo de las coordenadas “iniciales” se basa en la resolución de la pantalla. Los otros grupos de coordenadas se obtienen a partir de las iniciales.
- Coordenadas de cada SAPTreeView. Estas coordenadas, se calculan en base a las anteriores más una distancia fija para los distintos SAPTreeViews.
Paso 2: búsquedas SAPTreeViews
Se realizan las búsquedas de los nodos, de origen (“drag”) en el SAPTreeView1 y destino (“drop”) en el SAPTreeView2. Estas búsquedas tienen un doble objetivo:
- Crear, por cada nodo, un “camino” desde el nodo raíz al nodo final (origen o destino). Para poder hacer el drag&drop por coordenadas, es necesario expandir el árbol, es decir, tener los nodos origen y destino visibles en pantalla. Por defecto el SAPTreeView se muestra colapsado.
- Definir las coordenadas de los nodos, sobre los que se va a realizar el drag&drop, coordenadas “dinámicas”. Estas se obtienen a partir de las coordenadas “fijas” y de la “posición” de los nodos en el árbol.
Esquema de coordenadas para el drag&drop
La búsqueda de un nodo en un árbol n-ario se puede realizar de varias formas. Para nuestra búsqueda se han utilizado los métodos nativos del objeto “GuiTree” del SAP Scripting API: GetNodeTextbyKey, GetSubNodesCol y GetNodeChildrenCount.
- Se realiza una búsqueda recursiva, empezando por el nodo raíz, “Root”, en la que se va comparando el nodo actual, con el nombre del nodo que se está buscando. La condición de salida será que se ha encontrado o que se ha recorrido todo el árbol sin ninguna coincidencia.
- Se obtiene el “camino” del nodo encontrado mediante el uso del método nativo GetNodePathByKey.
- Finalmente se parsea el “camino” del nodo, se obtienen las coordenadas del nodo en pantalla.
Paso 3: expandir y drap&drop
Se visualizan los nodos en pantalla con el método “Expand” del objeto “SAPGuiTree” del add-in SAP.
Una vez que los dos nodos estén expandidos y visibles en pantalla, se realiza el drag&drop con el método “DragandDrop” del objeto QTP “Mercury.DeviceReplay”.
[Nota: este algoritmo no gestiona el “scroll” del los SAPTreeViews, con lo cual es válido siempre y cuando el “Expand” de los nodos no genere ningún “scroll” de pantalla.]
Algoritmo para el drag&drop automático entre dos SAPTreeViews
Conclusión
Con este articulo espero ayudar a todos aquellos que se encuentren con este tipo de problema. Resultará muy útil hasta que SAP publique una nueva versión del objeto “GuiTree” que proporcione métodos para mover nodos sin tener que usar coordenadas.
Más Información:
0 comments on “Algoritmo práctico para el Drag&Drop automático entre dos SAPTreeViews del SAPGUI”