Hacer que los agentes de IA entiendan la pantalla: Guía práctica de diseño de Semantics en Jetpack Compose
Introducción
Para que los agentes de IA y las herramientas de automatización de pruebas en Jetpack Compose entiendan con precisión "qué hace este botón", el diseño adecuado de Semantics es clave.
Compose tiene internamente un "Semantics Tree" que funciona como estructura semántica de referencia para accesibilidad, pruebas de UI y IA de operación automática (como Appium/UIAutomator/MCP). Es el equivalente a ARIA y DOM en la web.
Atributos principales de Semantics
contentDescription
El atributo más básico para dar significado a los botones que solo tienen iconos.
IconButton(
onClick = onDelete,
modifier = Modifier.semantics {
contentDescription = "Eliminar"
}
) {
Icon(Icons.Default.Delete, contentDescription = null)
}
La IA y la accesibilidad lo reconocen como "botón Eliminar · clicable · rol Button".
role
Especifica el tipo de UI para componentes personalizados. Un simple Box(clickable) sería "algo clicable", pero añadiendo role queda claro el significado: Button, Switch, Checkbox, Tab, etc.
Modifier.semantics {
role = Role.Button
}
stateDescription
Informa a la IA del estado actual de la UI.
Modifier.semantics {
stateDescription =
if (subscribed) "Suscrito"
else "No suscrito"
}
testTag
El identificador más importante para MCP, Appium y agentes automáticos de UI. Permite una identificación estable que no depende de coordenadas, OCR ni cambios de texto.
Modifier.testTag("login_button")
Configuración para integración con UIAutomator
Compose no crea directamente una jerarquía de vistas, por lo que UIAutomator puede no ver testTag. Esto se soluciona añadiendo lo siguiente a la raíz:
Scaffold(
modifier = Modifier.semantics {
testTagsAsResourceId = true
}
)
testTag se reconocerá como resource-id y podrá obtenerse directamente desde UIAutomator.
El patrón de implementación más comprensible para la IA
La mejor práctica es combinar múltiples atributos.
Button(
onClick = login,
modifier = Modifier
.testTag("login_button")
.semantics {
contentDescription = "Iniciar sesión"
role = Role.Button
}
) {
Text("Iniciar sesión")
}
| Atributo | Comprensión de la IA |
|---|---|
| testTag | Identificación única |
| contentDescription | Comprensión del significado |
| role | Comprensión del tipo de UI |
| clickable | Comprensión de ejecutabilidad |
Unificar una UI compleja en un único significado
Para presentar a la IA una composición compleja de iconos, texto y Badge como un único botón, se usa clearAndSetSemantics.
Modifier.clearAndSetSemantics {
contentDescription = "Agregar producto al carrito"
role = Role.Button
}
Se puede ignorar la estructura anidada interna y los grupos de iconos, pasando solo el significado a la IA.
Lo que se puede lograr con el diseño de Semantics
Estabilización de la automatización
Con testTag, se puede operar de forma estable sin coordenadas ni OCR. Aunque se rediseñe la UI, la automatización no se rompe mientras el testTag sea el mismo. También mejora la resistencia a la internacionalización.
Reducción de tokens
Cuando se depende solo de capturas de pantalla, el análisis de imágenes requiere muchos tokens, pero con Semantics Tree se puede tratar como datos estructurados ligeros.
[
{"type": "Button", "label": "Iniciar sesión"},
{"type": "TextField", "label": "Correo electrónico"},
{"type": "TextField", "label": "Contraseña"}
]
Especialmente efectivo en operaciones automáticas prolongadas y análisis de pantallas a gran escala, contribuyendo también a prevenir el context overflow.
Comprensión del estado por parte de la IA
Gracias a stateDescription, la IA puede estimar el estado actual de la pantalla y tomar decisiones como "ahora está pausado, así que presionaré el botón de reproducir". Permite entender la pantalla como una máquina de estados.
Análisis estructurado en integración MCP
Obteniendo el Semantics Tree a través de MCP Server y pasándolo al LLM Agent, es posible la comprensión del significado de toda la pantalla, la estimación de candidatos para la siguiente operación y el análisis de transiciones de estado.
Compose UI → Semantics Tree → MCP Server → LLM Agent
Resumen del uso de atributos de Semantics
| Atributo | Uso |
|---|---|
| testTag | Identificación única |
| contentDescription | Significado |
| role | Tipo de UI |
| stateDescription | Estado |
| collectionInfo | Estructura de lista |
| traversalIndex | Orden de navegación |
| customActions | Operaciones personalizadas para IA |
Conclusión
Compose permite separar "apariencia" de "significado". La esencia del diseño de Semantics radica en poder diseñar de forma independiente la UI para humanos y la estructura semántica para IA.
Si vas a utilizar agentes de IA, MCP, UIAutomator y pruebas automáticas E2E, la siguiente estandarización para cada componente ofrece un alto retorno de inversión:
Modifier
.testTag(...)
.semantics {
contentDescription = ...
role = ...
}
Transmitir "qué es este botón · qué pasa al presionarlo · cuál es su estado ahora" a través de Semantics en lugar de color, posición y tamaño — esta es la esencia del diseño de UI preparado para IA.