Ir al contenido

Desktop Activities

Versión: 1.0.9  ·  ID: zoan-packages-desktop  ·  Autor: Zoan Software

El paquete Desktop automatiza aplicaciones de escritorio de Windows: programas instalados como un ERP, un sistema contable, una aplicación bancaria de escritorio o cualquier app de Windows. El bot interactúa con sus ventanas y controles —botones, campos, listas, tablas— igual que una persona con el teclado y el mouse.

Por debajo usa UI Automation (UIA3), la tecnología de accesibilidad de Windows, que le permite “ver” los controles de una aplicación de forma fiable (no por coordenadas de pantalla, sino por el elemento real). También soporta aplicaciones Java de escritorio (Swing).

Para automatizar una app primero hay que conectarse a su ventana. Tienes dos piezas:

  • Open App: lanza la aplicación (si no está abierta) y devuelve su identificador de proceso (PID).
  • Win Attach: se conecta a una ventana y devuelve una sesión (ZoanDesktopSession).

Como en Browser, hay dos formas de trabajar con la sesión:

Las actividades dentro del body heredan la sesión automáticamente; no configuras session en ninguna.

Win Attach selector = (ventana "Calculadora")
└─ body:
Win Click selector = (botón "5")
Win Click selector = (botón "+")
Win Get Text selector = (display) → output: resultado

Win Attach guarda la sesión en una variable; cada actividad la recibe en session, y al final cierras con Win Close.

Win Attach selector = (ventana "ERP") → output: app
Win Type session = app selector = (campo "Usuario") text = "admin"
Win Close session = app

Como en el navegador, un selector identifica el control con el que actuar (este botón, aquel campo). Lo capturas con UI Discover, señalando el elemento con el mouse; Zoan Automation guarda una referencia robusta basada en las propiedades UIA del control (su controlType, name, automationId…), que sobrevive a cambios de posición o tamaño de la ventana.

Un selector de escritorio es una lista de nodos de la ventana al control:

NodoQué representaAtributos que se usan al buscar
wndLa ventana de nivel superior de la aplicaciónprocess (nombre del proceso, con o sin .exe), title (título de la ventana), cls (clase de ventana)
ctrlCada control desde la ventana hasta el objetivocontrolType, automationId, name, cls, idx (posición entre hermanos, desde 1)

Cómo se resuelve:

  • Ventanas: solo se consideran ventanas visibles; gana la primera que cumpla todos los atributos del nodo wnd.
  • Coincidencia de valores: sin distinguir mayúsculas; admite comodines * y ? (Factura *) y expresiones regulares entre barras (/^Pedido-\d+$/).
  • Valores dinámicos: escribe {{ expresión }} dentro de un valor (por ejemplo Fila {{ indice }}) y se resuelve al ejecutar.
  • Sin adivinar: si varios controles coinciden y nada los distingue, o ninguno cumple las anclas, la actividad no elige uno al azar: falla y el diagnóstico dice por qué (agrega un ancla o un idx).
  • Reintentos: la búsqueda se repite cada 250 ms hasta agotar el timeout, también ante errores momentáneos de UI Automation (una app ocupada abriendo un diálogo).

Concepto 3: métodos de interacción (UIA vs físico)

Sección titulada «Concepto 3: métodos de interacción (UIA vs físico)»

Varias actividades ofrecen dos formas de actuar sobre un control, y conviene entender la diferencia:

AcciónMétodo “UIA” (por defecto)Método “físico”
Win Clickinvoke — en botones, los activa sin mover el mouse (un botón que abre un diálogo no bloquea el flujo). En otros controles hace un clic real.mouse — mueve el mouse y hace clic real.
Win Typevalue — asigna el texto por el patrón Value de UIA. Rápido y seguro.simulate — enfoca el campo y simula pulsaciones de teclado.

Empieza con el método por defecto (invoke/value): es más fiable. Cambia al físico (mouse/simulate) solo si un control “rebelde” no responde al UIA (algunos controles personalizados o que validan cada tecla).

Antes de actuar, las actividades de interacción (clic, escribir, marcar, seleccionar, desplazar) traen la ventana al frente y, si el control quedó fuera del área visible, intentan desplazarlo a la vista; si no lo logran, fallan en vez de actuar sobre otra cosa. En aplicaciones Java el clic, la escritura y la selección siempre son físicos.

  • Buscar el elemento: cada actividad espera hasta timeout ms a que su elemento exista. Si la dejas vacía, usa el tiempo de espera de interfaz de la configuración del proyecto o, si el proyecto no lo define, 30000 ms.
  • Comprobaciones instantáneas: Win Element Exists no espera por defecto (0); dale un timeout si quieres que espere.
  • Traer la ventana al frente: Win Focus espera hasta 15000 ms (o el tiempo del proyecto); Win Key Press con selector, hasta 3 s.
  • Abrir una aplicación: Open App da a Windows 30000 ms (o el tiempo del proyecto, si es mayor).
  • Retardos: los retardos antes y después de cada acción del proyecto se aplican a todas las actividades de elemento.

Para esperar a que algo aparezca o desaparezca, usa Win Wait For en vez de un Delay fijo.

Errores comunes de las actividades de elemento

Sección titulada «Errores comunes de las actividades de elemento»

Estos mensajes los comparten todas las actividades que buscan un control. Los de cada actividad están en su página.

MensajeCausa y solución
No se encontró el elemento con el selector {…}. seguido de Diagnóstico: …El elemento no apareció dentro de timeout. El diagnóstico dice en qué nodo se perdió. Comprueba que la ventana esté abierta, valida el selector en UI Discover o espera antes con Win Wait For.
… elementos coinciden con el selector y nada los distingue, así que no se eligió ninguno (no se adivina). Agrega un ancla o un índice en el selector. (en el diagnóstico)El selector es ambiguo. Agrega un automationId, un idx o un ancla.
'selector' es obligatorio y debe ser un selector de escritorio válido.Falta el selector o no es de escritorio (por ejemplo, uno de navegador). Captúralo de nuevo con UI Discover.
El selector debe contener un nodo 'wnd' cuando no hay sesión.Sin sesión, el selector necesita la ventana. Usa la actividad dentro de un Win Attach o pásale session.
El elemento está fuera del área visible y no se pudo desplazar hasta él, …El control está oculto por el desplazamiento de su contenedor. Agrega un Win Scroll antes.
No se pudo localizar el control Java sin ambigüedad, así que no se hizo nada. …En una app Java, el puente no distinguió el control. Recaptura el selector o agrega un ancla.

Para reintentar ante fallos momentáneos, envuelve los pasos en un Retry o un Try / Catch.

ActividadTipoSalidaQué hace
Open Appopen-appintLanza una aplicación y devuelve su PID
Kill Processkill-processintTermina procesos por nombre o PID (una app colgada)
Win Attachwin-attachZoanDesktopSessionSe conecta a una ventana
Win Focuswin-focus—Trae una ventana al frente
Win Closewin-close—Cierra la ventana y libera la sesión
ActividadTipoSalidaQué hace
Win Clickwin-click—Hace clic en un elemento
Win Typewin-type—Escribe texto en un campo
Win Set Valuewin-set-value—Asigna el valor de un campo (patrón Value)
Win Checkwin-check—Marca/desmarca un checkbox
Win Selectwin-select—Selecciona un ítem de un combo/lista
Win Key Presswin-key-press—Envía una tecla, una combinación o una secuencia de teclas
Win Scrollwin-scroll—Desplaza un elemento con scroll
ActividadTipoSalidaQué hace
Win Get Textwin-get-textstringTexto o valor de un elemento
Win Get Attributewin-get-attributeobjectUna propiedad del elemento (enabled, value…)
Win List Itemswin-list-itemsstring[]Ítems disponibles de un combo/lista
Win Element Existswin-element-existsboolean¿Existe el elemento?
Win Extract Tablewin-extract-tableDataTableExtrae una tabla de una ventana a una DataTable
ActividadTipoSalidaQué hace
Win Wait Forwin-wait-forbooleanEspera a que un elemento aparezca o desaparezca
Win Screenshotwin-screenshot—Captura la ventana o un elemento a un archivo
Take Screenshottake-screenshotstringCaptura todo el escritorio a un archivo y devuelve su ruta

Abrir un sistema, iniciar sesión y leer un dato:

Open App path = "C:/ERP/erp.exe" → output: pid
Win Attach selector = (ventana "ERP — Login")
└─ body:
Win Type selector = (campo "Usuario") text = credential("erp")["user"]
Win Type selector = (campo "Clave") text = credential("erp")["password"]
Win Click selector = (botón "Ingresar")
Win Attach selector = (ventana "ERP — Inicio") // espera hasta timeout a que aparezca
└─ body:
Win Get Text selector = (etiqueta "Saldo") → output: saldo

Y si la aplicación se cuelga, la recuperación habitual es dejar evidencia con Take Screenshot, terminarla con Kill Process y volver a abrirla. Las plantillas incluidas ya traen ese patrón en su playbook Recuperar.