Estrategias de detección
Una vez que tu macro va más allá de los toques simples, el mayor factor de fiabilidad no es el clic en sí, sino cómo detectas el objetivo. Las macros avanzadas funcionan mejor cuando eligen la estrategia de detección adecuada para la interfaz que están automatizando.
Empieza por la señal fiable más simple
Antes de ajustar los parámetros, elige primero la señal más estable:
- Usa coordenadas fijas solo cuando la posición del objetivo nunca cambia
- Usa detección de imágenes cuando la forma visual es estable y distintiva
- Usa detección de texto cuando las etiquetas son más fáciles de reconocer que los iconos
- Usa una
Region()más pequeña cuando ya sabes aproximadamente dónde debería aparecer el objetivo
Si varias estrategias funcionan, prefiere la que tenga el área de búsqueda más pequeña y la menor ambigüedad.
Screen frente a Region
El error de rendimiento más común es buscar en toda la pantalla para todo.
Usa Screen cuando:
- el objetivo puede aparecer casi en cualquier lugar
- estás construyendo la primera versión de una macro
- estás explorando un nuevo flujo de una aplicación
Usa Region cuando:
- el objetivo siempre aparece en una sección conocida de la interfaz
- la pantalla contiene iconos o texto repetidos
- quieres una coincidencia más rápida y estable
local actionArea = Region(900, 1600, 1080, 2200)
actionArea:click("continue-button.jpg")
Técnica de región ajustada (fit region)
Una de las técnicas avanzadas más útiles es lo que se conoce como fit region (región ajustada).
La idea es:
- Encontrar el objeto una vez usando
Screen:find() - Convertir esa coincidencia en una
Regionajustada usandoresult:getRegion() - Reutilizar esa región ajustada para las siguientes búsquedas si el tamaño del objeto se mantiene estable
Esto funciona bien cuando:
- el objeto siempre tiene el mismo ancho y alto
- el contenido del objeto puede cambiar, pero su área contenedora se mantiene constante
- la búsqueda en pantalla completa es costosa y se repite a menudo
local result = Screen:find("inventory-panel.jpg")
if result then
local fitRegion = result:getRegion()
local collectButton = fitRegion:find("collect-button.jpg")
if collectButton then
fitRegion:click("collect-button.jpg")
end
end
Por qué es potente:
- la primera búsqueda en pantalla completa es el paso costoso
- una vez encontrado el objeto, todas las búsquedas posteriores se limitan a los límites ajustados
- esto puede reducir significativamente el coste de OCR y de coincidencia de imágenes en flujos repetidos
Usa región ajustada cuando:
- tienes un panel, tarjeta, ventana emergente, ranura o contenedor estable
- la macro interactúa repetidamente dentro del mismo objeto coincidente
- el mismo objeto aparece en distintas posiciones pero mantiene las mismas dimensiones
Evita usar región ajustada cuando:
- el objeto cambia mucho de tamaño entre pantallas o dispositivos
- el área objetivo se expande o contrae dinámicamente
- la primera coincidencia es demasiado genérica y puede vincularse al contenedor equivocado
En la práctica, la región ajustada es una de las mejores formas de convertir una macro Screen lenta en una macro Region rápida sin codificar coordenadas fijas.
Detección de imágenes frente a detección de texto
Prefiere la detección de imágenes cuando:
- el objetivo es mayoritariamente gráfico
- el idioma de la interfaz puede cambiar
- el texto está estilizado o renderizado dentro de un botón
- el OCR tiene dificultades porque el texto es demasiado pequeño o de bajo contraste
Prefiere la detección de texto cuando:
- la etiqueta cambia de posición pero mantiene la misma redacción
- el mismo componente visual aparece en muchos temas o estados
- la forma del botón cambia pero la etiqueta sigue siendo legible
- necesitas coincidir con texto generado dinámicamente por la aplicación
OCR palabra por palabra frente a línea por línea
Al usar la detección de texto, el método de detección importa:
- Usa
setDetectionMethod(1)para una sola palabra o etiqueta muy corta - Usa
setDetectionMethod(2)cuando el objetivo es una frase o una línea completa
Screen:click("Login", ClickParams():setDetectionType("TEXT"):setDetectionMethod(1))
Screen:wait("Your session has expired", 5000, FinderParams():setDetectionType("TEXT"):setDetectionMethod(2))
Ajusta la puntuación de coincidencia gradualmente
Una puntuación de coincidencia demasiado alta provoca fallos. Una puntuación demasiado baja provoca falsos positivos.
Un proceso práctico de ajuste:
- Empieza con la puntuación predeterminada
- Si se pierde el objetivo, baja la puntuación ligeramente
- Si se coincide con lo incorrecto, sube la puntuación ligeramente
- Si ocurren ambas cosas, reduce el área de búsqueda antes de cambiar más la puntuación
En la mayoría de los casos, reducir la ambigüedad con Region() es más seguro que forzar la puntuación de coincidencia en exceso.
Usa escala de grises solo cuando ayuda
La escala de grises puede mejorar la velocidad y, a veces, mejorar la consistencia, pero no es automáticamente mejor.
Usa escala de grises cuando:
- el objetivo se define más por la forma que por el color
- los cambios de iluminación o color hacen la coincidencia inestable
- quieres una coincidencia más rápida en dispositivos de gama baja
Evita depender de la escala de grises cuando:
- el color es la principal diferencia entre objetivos similares
- estás intentando distinguir estados activos e inactivos por color
Escalado dinámico
Si la misma macro se ejecuta en dispositivos con distintas resoluciones, el escalado dinámico puede ayudar a que la detección de imágenes siga siendo utilizable.
Usa escalado dinámico cuando:
- la plantilla se capturó en un dispositivo pero se ejecuta en otro
- el mismo diseño de aplicación se redimensiona entre teléfonos o tabletas
Pero si la interfaz ya es muy consistente en un solo dispositivo, una plantilla bien recortada más una buena región suele ser más estable que ajustar el escalado en exceso.
Recorta las plantillas de forma agresiva
Una buena plantilla debe contener solo lo que hace único al objetivo.
Plantilla buena:
- el propio icono
- el área de etiqueta única
- el patrón visual mínimo estable
Plantilla mala:
- gran espacio en blanco alrededor
- fondos animados
- contenido que cambia en cada ejecución
- elementos cercanos que no forman parte del objetivo
Usa detección en dos pasos para pantallas difíciles
Cuando una pantalla es ruidosa, usa un enfoque por etapas:
- Espera a un elemento ancla estable
- Reduce el área de búsqueda
- Detecta el objetivo final dentro de esa área
Screen:wait("settings-title.jpg", 5000)
local footerArea = Region(0, 1700, 1080, 2400)
footerArea:click("save-button.jpg")
Patrón recomendado
Para macros avanzadas, este suele ser el orden más seguro:
- Espera a un estado estable
- Restringe el área de búsqueda
- Elige detección de imágenes o de texto de forma intencionada
- Ajusta la puntuación solo después de reducir la ambigüedad
- Verifica el resultado antes de continuar