Una lista es una colección de elementos. Su equivalente en programación sería un vector o array.
Dependiendo del tipo de elemento que almacenemos, tendremos una lista de valores numéricos, de cadenas de texto, archivos, etc.
El concepto es sencillo de entender pero veamos algunos ejemplos de como trabajar con WinAutomation.
Crear una lista
Para empezar a usar listas tendremos que crear un objeto con la acción: Create New List -> %ListaEjemploA%
Esta lista estará vacía y con el contador de elementos a 0.
Añadir elementos
La primera operación básica es la de añadir elementos.
Por ejemplo, en las siguientes líneas añadiremos un par de palabras a la %ListaEjemploA% usando la acción Add Item to List:
Cuando añadimos un elemento nuevo se almacena por el final, poniéndose en la cola.
La acción Add Item to List no va a crear una lista nueva y dará error si no le proporcionamos una lista ya creada donde almacenar el nuevo elemento.
Tamaño de una lista
En una lista vacía el contador de elementos es cero. Podremos acceder a este valor a través del atributo Count.
Acceso a un elemento
En este ejemplo, el elemento cerezas estará en la posicion cero y el elemento fresas en la posición uno.
Para acceder directamente a un elemento de la lista lo haremos mediante su posición o índice dentro del vector: %ListaEjemploA[0]%
Si accedemos al indice de un elemento que no existe nos dará un error en tiempo de ejecución. No es mala idea comprobar los rangos antes de acceder a una posición concreta.
WinAutomation también permite eliminar elementos a partir de su índice mediante la acción Remove Item from List.
Borrar una lista
Para limpiar o vaciar una lista usaremos la acción Clear List.
Con esto borraremos todos sus elementos y se reiniciará el contador de la lista a 0.
Borrar duplicados
Si no queremos tener duplicados en la lista la filtraremos a posteriori con la acción Remove Duplicate Items from List.
Crear una lista desde texto
Para crear una lista y llenarla con información, las acciones mas comunes serán generar la lista a partir de un texto o cargar los valores desde un fichero.
Una forma rápida de hacerlo es mediante Split Text y seleccionando el separador que más nos convenga.
Ten cuidado si utilizas como salida de Split Text una lista ya existente ya que perderás la información que tuvieras guardada previamente.
Por ejemplo, si el resultado lo almacenásemos en la %ListaEjemploA% se borrarían los elementos: cerezas y fresas.
La solución es guardarlo en la %ListaEjemploB% de forma temporal y luego unir ambas listas mediante Merge Lists.
Con esto conseguiremos el resultado que buscamos.
En la foto de arriba puedes ver como Merge Lists permite juntar dos listas y volver a guardar el resultado en una de ellas sin tener que crear otra lista nueva para almacenar la combinación.
Crear una lista desde un fichero
Solo has de introducir la ruta a un archivo. Cada una de las líneas será un elemento de la lista.
Duplicar una lista
WinAutomation te permite clonar una lista mediante Set Variable.
Añadir prefijos o sufijos a los elementos de una lista
Si queremos modificar los elementos podemos hacerlo con una lista auxiliar.
Siguiendo con el ejemplo anterior, duplicamos una lista temporal y añadimos un prefijo y un sufijo a cada uno de los valores.
Podrías hacerlo sin la lista temporal usando un Loop de esta forma:
Si lo intentas con su equivalente For Each te aparecerá un error del tipo:
Runtime Error: Colección modificada; puede que no se ejecute la operación de enumeración.
Recorrer una lista
Una vez tengas tu información en una listas probablemente tendrás que recorrerla con For Each, que es un iterador específico para recorrer listas.
Esto te permitirá acceder a cada uno de los elementos con una estructura similar a la que habíamos visto anteriormente.
Otra opción es usar un loop clásico y acceder desde la posición 0 a la Count-1 a través del índice.
Buscar en una lista
Para buscar si un texto aparece en la lista puedes utilizar la acción Parse Text.
Funcionará sin problemas, pero recuerda que cada elemento está separado con los caracteres de fin de linea \r\n.
Si la función no encuentra la cadena devolverá -1.
Si la función encuentra la cadena devolverá la posición contando los caracteres desde el inicio.
No devuelve el índice en el que se encuentra el elemento, sino que considera toda la lista un solo bloque de texto y devuelve el índice general.
Si preferimos localizar el índice de la lista, podemos iterar con un For Each o un Loop de la siguiente manera:
En este caso el mensaje visualiza que la cadena se encuentra en la posición 1 que corresponde al segundo elemento.
Operar con los elementos de una lista
Ahora veremos como manipular los elementos de una lista.
En este ejemplo, vamos a suponer que tenemos unos valores en el portapapeles (clipboard) de Windows con este formato:
1,2,3,4
Y queremos coger cada uno de estos valores y sumarle 5 a cada uno.
El primer paso es obtener el texto del portapapeles y convertirlo en una lista.
Mediante un Loop recorremos los valores, convirtiéndolos antes a número para poder operar.
Sumamos 5 a cada uno de los valores.
Y por último, volvemos a unir los resultados con un Join Text, almacenando el resultado de nuevo en el portapapeles.
Ordenar una lista
Para ordenar una lista tenemos las acciones Sort List y Reverse List.
Como en el caso anterior, podemos tener el inconveniente de tener que convertir los elementos a número en caso de que no queramos una ordenación alfabética.
Este sería el algoritmo para ordenar unos números de menor a mayor.
El fichero de datos contiene números decimales, usando un punto como separador decimal.
3.5 6 1.4 2.6 2.7 6.3 2.1 2 1.5 4
Sin embargo la lista ordenada nos la devolverá según la configuración local de nuestro equipo, en mi caso separados por comas:
1,4 1,5 2 2,1 2,6 2,7 3,5 4 6 6,3
Si tuviéramos los datos de entrada con el separador coma, la cifra 2,7 se evaluaría como 27.
Lo más sencillo es hacer una comprobación previa para ver si estamos procesando todos los valores y dependiendo de cada caso, reemplazar el carácter que da problemas para la conversión a valor numérico.
Procesar cadenas en JavaScript
Desde la acción Run JavaScript podemos ejecutar código y además utilizar las variables de WinAutomation.
El problema es que no he conseguido acceder a los indices usando una variable en JavaScript, por ejemplo si x es una variable de JS, %Lista[x]% nos dará un error.
Esto sería un ejemplo:
var fruits = ["Banana", "Orange"]; var i; for (i = 0; i < %TextList.Count%; i++) { fruits.push("%TextList[i]%"); } WSH.Echo(fruits);
En este caso TextList es una variable del tipo lista de WinAutomation y aunque %TextList.Count% o %TextList[1]% son accesibles, al intentar colar una variable en JavaScript para recorrer el vector, nos saldrá un error diciendo que no la reconoce.
Una solución sencilla puede ser volver a juntar la lista en una única cadena y luego volver a crear la lista en JavaScript.
Como resultado obtenemos:
Listas persistentes
WinAutomation nos permite definir una variable y que su valor se guarde durante cada ejecución del programa.
También permite el uso de listas persistentes, solo hay que ir a Tools – Variables Manager y definir la variable.
Si te apetece probar, puedes definirla de este modo y crear una acción Add Item to List añadiendo cualquier elemento a la lista.
Ejecuta varias veces el script y verás como se van acumulando los valores.
Para borrar la lista puedes usar Clear List.
Crear encabezados en Excel usando listas
Muchas veces tendremos datos volcados en Excel y necesitaremos generar un encabezado.
Si son pocos valores podemos hacerlo de forma manual:
Pero si hay bastantes encabezados podemos crearlos a partir de una lista.
Este es el algoritmo completo:
Eliminar los elementos seleccionados por el usuario
Imagina que quieres mostrar una lista al usuario para que seleccione ciertos elementos.
Posteriormente quieres eliminar estos elementos de la lista inicial.
En este caso, el usuario selecciona los 3 nombres que se eliminarán de la lista inicial cuando pulse Ok.
La variable %DialogResults[0]% ahora contiene la lista de nombres: jose, pedro y jaime y podrán procesarse en caso de que sea necesario o descartarse.
La variable %NewFileContents% contendrá los elementos: ana y luis.
En el cuadro de diálogo solo tendremos un componente de selección múltiple y un botón, cargaremos la lista inicial en el componente desde el campo Options.
Obtener los valores de un SELECT en un formulario HTML
Quizá cuando estamos capturando datos de una web necesitemos sacar los valores de algún desplegable.
<!DOCTYPE html> <html> <body> <select> <option value="volvo">Volvo</option> <option value="saab">Saab</option> <option value="opel">Opel</option> <option value="audi">Audi</option> </select> </body> </html>
En este SELECT tenemos 4 elementos.
Con la acción Extract Data from Web Page podemos sacar todas las opciones y guardarlas en una lista.
Al estar cargando desde un iFrame el selector base es un poco largo, pero si estuviera cargando directamente sería:
html > body > select > option
y capturamos todo el texto con la expresión regular: .+
Si en lugar del texto que visualiza el SELECT necesitas el valor del atributo value (en este ejemplo las marcas de coche en minúsculas), solo tienes que reemplazar: Own Text por value en el campo Attribute.