API de JavaScript
Repeato permite ejecutar JavaScript mediante pasos de script. Las siguientes variables globales están disponibles mientras se ejecuta una prueba o un lote.
Para obtener documentación legible por máquinas, usa la referencia Markdown sin formato o las declaraciones de TypeScript. Consulta Recetas de JavaScript para ver ejemplos completos y ejecutables.
Globales
Sección titulada «Globals»Tipo: object
Un objeto que puedes usar para compartir datos entre pasos.
data.scannedText
Sección titulada «data.scannedText»Tipo: string
La cadena escaneada por el último paso de comprobación de texto ejecutado.
workspaceDir
Sección titulada «workspaceDir»Tipo: string
El directorio del espacio de trabajo actual.
currentStepIndex
Sección titulada «currentStepIndex»Tipo: number
El índice, basado en cero, del paso que se está ejecutando.
testDir
Sección titulada «testDir»Tipo: string
El directorio de la prueba actual.
testRunDir
Sección titulada «testRunDir»Tipo: string
El directorio de la ejecución de prueba actual.
Tipo: AxiosInstance
El cliente HTTP Axios.
const response = await axios.get('https://example.com')log(message: object)Registra un mensaje o un objeto.
sleep()
Sección titulada «sleep()»sleep(milliseconds: number): Promise<void>Retrasa la ejecución durante el número de milisegundos indicado.
getResponse()
Sección titulada «getResponse()»getResponse(host: string, path: string, headers?: object): Promise<string>Envía una solicitud GET a un host.
sendPost()
Sección titulada «sendPost()»sendPost( host: string, path: string, body: string | object, acceptHeader?: string, headers?: object,): Promise<string>Envía una solicitud POST.
showDialog()
Sección titulada «showDialog()»showDialog({ title, content, onConfirm, onClose,}: { title: string content: string onConfirm?: () => void onClose?: () => void}): { cancel: Function; confirm: Function }Muestra un diálogo cuyo contenido admite Markdown, incluido texto con formato, enlaces e imágenes. Las devoluciones de llamada opcionales se ejecutan cuando ocurre la acción correspondiente. La instancia de diálogo devuelta se puede cerrar mediante cancel() o confirm().
batchRunner
Sección titulada «batchRunner»Controla el lote de pruebas actual y proporciona hooks del ciclo de vida del lote.
batchRunner.testBatch
Sección titulada «batchRunner.testBatch»Tipo: TestBatch
El lote de pruebas actual.
batchRunner.currentExceptionHandlerIndex
Sección titulada «batchRunner.currentExceptionHandlerIndex»Tipo: number
El índice del gestor de excepciones actual.
batchRunner.currentTestIndex
Sección titulada «batchRunner.currentTestIndex»Tipo: number
El índice de la prueba actual.
batchRunner.batchRun
Sección titulada «batchRunner.batchRun»Tipo: BatchRun
La ejecución del lote actual. Usa log(batchRunner.batchRun) para inspeccionar todas las propiedades.
batchRunner.isPlaying
Sección titulada «batchRunner.isPlaying»Tipo: boolean
Indica si el ejecutor de lotes está ejecutándose actualmente.
batchRunner.runMode
Sección titulada «batchRunner.runMode»Tipo: string
El modo de ejecución actual.
batchRunner.stop()
Sección titulada «batchRunner.stop()»stop(): Promise<void>Detiene el ejecutor de lotes.
batchRunner.createBatchRunExport()
Sección titulada «batchRunner.createBatchRunExport()»createBatchRunExport(): Promise<string>Crea una exportación de la ejecución del lote actual en la carpeta batchRuns del espacio de trabajo y devuelve su ruta.
batchRunner.uploadReport()
Sección titulada «batchRunner.uploadReport()»uploadReport(dirPath: string): Promise<string>Sube el informe ubicado en dirPath a la nube de Repeato y devuelve la URL del informe.
batchRunner.setTestBatchById()
Sección titulada «batchRunner.setTestBatchById()»batchRunner.setTestBatchById(batchId: string)Establece el lote de pruebas para el ejecutor de lotes.
batchRunner.setRunMode()
Sección titulada «batchRunner.setRunMode()»batchRunner.setRunMode(mode: string)Establece el modo de ejecución para todas las pruebas o solo para las pruebas fallidas.
batchRunner.setRunMode('AllTests')batchRunner.setRunMode('OnlyFailed')batchRunner.addOnBatchStart()
Sección titulada «batchRunner.addOnBatchStart()»batchRunner.addOnBatchStart(key: string, callback: (batch: Batch) => void)Registra una devolución de llamada que se ejecuta justo antes de que comience el lote.
batchRunner.addOnTestFail()
Sección titulada «batchRunner.addOnTestFail()»batchRunner.addOnTestFail( key: string, callback: (test: Test, testRun: TestRun, stepResult: StepResult) => void,)Registra una devolución de llamada que se ejecuta cuando falla una prueba.
batchRunner.addOnTestSuccess()
Sección titulada «batchRunner.addOnTestSuccess()»batchRunner.addOnTestSuccess( key: string, callback: (test: Test, testRun: TestRun) => void,)Registra una devolución de llamada que se ejecuta cuando una prueba finaliza correctamente.
batchRunner.addOnBatchCompleted()
Sección titulada «batchRunner.addOnBatchCompleted()»batchRunner.addOnBatchCompleted( key: string, callback: (batchRun: BatchRun) => void,)Registra una devolución de llamada que se ejecuta cuando el lote finaliza, tanto si se completa correctamente como si falla.
batchRunner.removeOnBatchStart()
Sección titulada «batchRunner.removeOnBatchStart()»batchRunner.removeOnBatchStart(key: string)Elimina una devolución de llamada registrada con addOnBatchStart().
batchRunner.removeOnTestFail()
Sección titulada «batchRunner.removeOnTestFail()»batchRunner.removeOnTestFail(key: string)Elimina una devolución de llamada registrada con addOnTestFail().
batchRunner.removeOnTestSuccess()
Sección titulada «batchRunner.removeOnTestSuccess()»batchRunner.removeOnTestSuccess(key: string)Elimina una devolución de llamada registrada con addOnTestSuccess().
batchRunner.removeOnBatchCompleted()
Sección titulada «batchRunner.removeOnBatchCompleted()»batchRunner.removeOnBatchCompleted(key: string)Elimina una devolución de llamada registrada con addOnBatchCompleted().
batchRunner.testRunner
Sección titulada «batchRunner.testRunner»Tipo: TestRunner
Proporciona acceso a todos los testRunner propiedades y métodos. Usa log(batchRunner.testRunner) para inspeccionarlos.
testRunner
Sección titulada «testRunner»Controla la ejecución de la prueba actual y expone hooks del ciclo de vida de los pasos.
testRunner.currentTest
Sección titulada «testRunner.currentTest»Tipo: Test
La prueba actual. Usa log(testRunner.currentTest) para inspeccionar todas las propiedades.
testRunner.currentTestRun
Sección titulada «testRunner.currentTestRun»Tipo: TestRun
La ejecución de prueba actual. Usa log(testRunner.currentTestRun) para inspeccionar todas las propiedades.
testRunner.currentTestRun.partial es un booleano síncrono de solo lectura en todas las plataformas, disponible en pasos de script y callbacks de configuración avanzada. Es verdadero al ejecutar un solo paso o ejecutar hasta aquí, sin interacción con el dispositivo ni otros efectos secundarios. Las ejecuciones parciales conservan sus resultados de pasos, pero no pueden ser exitosas ni convertirse en ejecuciones de referencia; wasSuccessful permanece en falso. Las ejecuciones guardadas antiguas usan por defecto partial: false.
testRunner.lastStepResult
Sección titulada «testRunner.lastStepResult»Tipo: StepResult
El resultado del paso ejecutado anteriormente. Usa log(testRunner.lastStepResult) para inspeccionar todas las propiedades.
Haz clic en la evidencia de acuerdo semántico
Sección titulada «Haz clic en la evidencia de acuerdo semántico»En los pasos de Script y las devoluciones de llamada de configuración avanzada, step.semanticAgreement es un indicador de configuración de clic síncrono y de solo lectura (falso de forma predeterminada; ausente para otros tipos de pasos). Configúralo mediante el editor de clics de Studio o MCP. Los clics habilitados requieren una jerarquía actualizada con un objetivo semántico visible y único que contenga el punto de toque propuesto; si falla, el toque se rechaza, y los dispositivos sin una jerarquía o localizadores utilizables no pueden establecer el acuerdo.
stepResult.semanticAgreement es una lectura síncrona sin efectos secundarios. Está presente cuando la protección evaluó un objetivo y contiene agreed, reason, candidateCounty el objetivo opcional bounds, resuelto locatorso un elemento ambiguo locatorType. Los límites utilizan coordenadas normalizadas de 0 a 1. La ausencia de evidencia no significa que el acuerdo se haya superado. Esto registra el acuerdo geométrico, no la entrega real del evento ni los resultados de negocio.
const agreement = testRunner.lastStepResult?.semanticAgreementif (agreement) log(agreement)Evidencia y advertencias de la ejecución del clic
Sección titulada «Evidencia y advertencias de la ejecución del clic»En los pasos de Script y la configuración avanzada, stepResult.executionEvidence es una propiedad opcional, sincrónica y de solo lectura, disponible en los resultados de coincidencia/clic recién ejecutados, antes de las devoluciones de llamada de finalización del paso. Devuelve datos de ejecución almacenados o undefined en resultados anteriores, sin efectos secundarios en el dispositivo. Incluye el searchedRegion, requestedLocators, matchSource, opcional resolvedLocator, matchedBounds, el tapPointrealmente intentado y las marcas de tiempo/estados del envío. Los límites y los puntos de toque usan coordenadas normalizadas de todo el fotograma, de 0 a 1; el ancho y la altura del fotograma de origen son píxeles de la imagen procesada. Los clics por coordenadas no tienen región de búsqueda ni límites de elemento resuelto.
sourceFrame identifica una captura de pantalla asociada al resultado. Su phase distingue la entrada exacta del trabajador matching_frame de una captura de pantalla leída after_locator_resolution (que no es la jerarquía utilizada para resolver el localizador). receivedAt es una marca de tiempo de recepción/lectura del cliente en formato ISO, no una marca de tiempo de captura del proveedor; matchedAt registra la finalización del trabajador cuando se conoce. Las capturas de pantalla son nombres de archivo relativos al directorio de ejecución normal y se recuperan mediante la API de capturas de pantalla de la ejecución o los metadatos de artefactos de MCP. Los campos ausentes permanecen como null. Los búferes de coincidencia no se almacenan insertados en el resultado.
tapStatus es not_dispatched, dispatching, completed (el comando del controlador se resolvió), o unknown (un comando rechazado después del envío puede haberse aplicado parcialmente). Que el envío se complete no demuestra que el evento se haya entregado ni que la aplicación haya alcanzado el resultado deseado. Un fotograma coincidente es histórico; la pantalla física puede cambiar antes del toque. No se realiza ningún reintento automático ante un envío incierto.
stepResult.warnings es una matriz de solo lectura de códigos de advertencia. Un fallback correcto del localizador conserva success: true y añade fingerprint_fallback_used; las advertencias ya no impiden su toque. Los pasos opcionales fallidos aún pueden tener success: undefinedLos límites derivados del localizador usan su centro sin aplicar un desplazamiento de huella registrado; los clics mediante huella/OCR conservan el comportamiento de desplazamiento configurado.
const result = testRunner.lastStepResultif (result?.executionEvidence) { log(result.executionEvidence) log(result.warnings)}Jerarquía de fallos almacenada
Sección titulada «Jerarquía de fallos almacenada»En los pasos de Script y la configuración avanzada, stepResult.failureEvidence es un valor persistido opcional y de solo lectura. Leerlo es síncrono, devuelve la evidencia almacenada o undefinedy no tiene efectos secundarios en el dispositivo. Studio la captura después de los pasos fallidos (incluidos los fallos opcionales), una vez que terminan las addOnStepCompleted callbacks. Esas callbacks todavía no ven esta captura; los pasos de Script posteriores o las callbacks de fallo de prueba pueden inspeccionarla cuando la ejecución continúa. Los resultados correctos y los más antiguos pueden omitirla.
failureEvidence.hierarchy contiene status (captured, unavailable o capture_failed), data (la jerarquía completa del controlador serializable en JSON o null), y capturedAt (una marca de tiempo ISO o null ). La captura requiere un dispositivo conectado compatible con jerarquías y tiene un límite de tres segundos. La falta de compatibilidad con jerarquías, la desconexión, el tiempo de espera agotado o los errores de serialización no hacen que la prueba falle adicionalmente. La captura se realiza después de la acción fallida, por separado de su captura de pantalla. Una jerarquía vacía se distingue de los datos no disponibles.
La evidencia también incluye la clasificación, las fases de búsqueda cuando están disponibles y el momento de la captura. La visibilidad del teclado, los límites del IME, el desplazamiento, el paquete en primer plano y la entrega del toque desconocidos siguen siendo desconocidos. Los atributos y límites de la jerarquía conservan la estructura y las unidades específicas del controlador; no están no coordenadas táctiles normalizadas de 0–1. Las jerarquías pueden contener texto introducido. La evidencia permanece en la estructura de ejecución normal. Cada prueba conserva como máximo cinco ejecuciones, protegiendo la ejecución de referencia; los resultados fallidos o interrumpidos y las capturas de pantalla permanecen hasta que se elimina su ejecución. Las exportaciones manuales pueden conservar una copia durante más tiempo. MCP repeato_get_step_result devuelve el JSON completo de resultados, incluida esta jerarquía, de las ejecuciones de prueba conservadas.
const evidence = testRunner.lastStepResult?.failureEvidenceif (evidence?.hierarchy.status === 'captured') { log(evidence.hierarchy.data)}testRunner.currentStepIndex
Sección titulada «testRunner.currentStepIndex»Tipo: number
El índice de base cero del paso actual.
testRunner.setNextStepId()
Sección titulada «testRunner.setNextStepId()»testRunner.setNextStepId(id: string)Establece el siguiente paso que se ejecutará mediante su ID.
testRunner.setNextStepId('AH23D6')testRunner.setNextStepIndex()
Sección titulada «testRunner.setNextStepIndex()»testRunner.setNextStepIndex(index: number)Establece el siguiente paso que se ejecutará mediante su índice de base cero.
testRunner.goBackBy()
Sección titulada «testRunner.goBackBy()»testRunner.goBackBy(stepCount: number)Retrocede stepCount pasos y continúa la ejecución desde allí.
testRunner.addOnScreenshotSaved()
Sección titulada «testRunner.addOnScreenshotSaved()»testRunner.addOnScreenshotSaved( key: string, listener: (stepResult: StepResult, screenshotPath: string) => void,)Registra un listener que se ejecuta en cuanto se guarda una captura de pantalla.
testRunner.addOnStepCompleted()
Sección titulada «testRunner.addOnStepCompleted()»testRunner.addOnStepCompleted( key: string, callback: (stepResult: StepResult) => void,)Registra un callback que se ejecuta cada vez que se completa un paso.
testRunner.removeOnScreenshotSaved()
Sección titulada «testRunner.removeOnScreenshotSaved()»testRunner.removeOnScreenshotSaved(key: string)Elimina un listener registrado con addOnScreenshotSaved().
testRunner.removeOnStepCompleted()
Sección titulada «testRunner.removeOnStepCompleted()»testRunner.removeOnStepCompleted(key: string)Elimina una devolución de llamada registrada con addOnStepCompleted().
testRunner.setScaleInvariantMatchingEnabled()
Sección titulada «testRunner.setScaleInvariantMatchingEnabled()»testRunner.setScaleInvariantMatchingEnabled(enabled: boolean)Activa o desactiva la coincidencia invariante a la escala. Está activada de forma predeterminada.
deviceConnector
Sección titulada «deviceConnector»Proporciona información sobre el dispositivo conectado actualmente y le envía comandos.
deviceConnector.selectedDeviceData
Sección titulada «deviceConnector.selectedDeviceData»Tipo: DeviceData
Todos los datos relacionados con el dispositivo conectado actualmente. Usa log(deviceConnector.selectedDeviceData) para inspeccionarla.
deviceConnector.sendString()
Sección titulada «deviceConnector.sendString()»sendString(value: string): Promise<void>Envía una cadena al dispositivo. La aplicación bajo prueba debe tener un campo de entrada enfocado para recibir los datos.
deviceConnector.clearText()
Sección titulada «deviceConnector.clearText()»clearText(): Promise<void>Disponible en los pasos de Script y en la configuración avanzada con un dispositivo conectado y un campo de entrada enfocado. Borra ese campo de forma asíncrona y se resuelve sin ningún valor; no escribe texto de reemplazo.
Cloud Android utiliza el menú de selección de pulsación prolongada del campo de entrada y Seleccionar todo, seguido de Retroceso y una comprobación de campo vacío. Requiere un único EditText enfocado e inspeccionable, además de un control de selección disponible; no utiliza ADB. La eliminación en Cloud iOS no es compatible. La falta de enfoque, los controles no disponibles, los dispositivos no compatibles y los tiempos de espera del proveedor rechazan la promesa. Un fallo puede dejar modificado el estado del campo de entrada o de la selección, así que inspecciona la pantalla antes de volver a intentarlo.
await deviceConnector.clearText()await deviceConnector.sendString('Replacement text')deviceConnector.sendClick()
Sección titulada «deviceConnector.sendClick()»sendClick(xPercentage: number, yPercentage: number): Promise<void>Envía un evento táctil al dispositivo. Las coordenadas van de 0 a 1; sendClick(0.5, 0.5) toca el centro de la pantalla.
deviceConnector.sendDown()
Sección titulada «deviceConnector.sendDown()»sendDown(xPercentage: number, yPercentage: number): Promise<void>Envía un evento de pulsación táctil. Cada sendDown() necesita un sendUp(); combínalo con sendMove() para simular un gesto de arrastre.
deviceConnector.sendMove()
Sección titulada «deviceConnector.sendMove()»sendMove(xPercentage: number, yPercentage: number): Promise<void>Envía un evento de movimiento. Usa sendDown() primero y finaliza el arrastre con sendUp().
deviceConnector.sendUp()
Sección titulada «deviceConnector.sendUp()»sendUp(xPercentage: number, yPercentage: number): Promise<void>Envía un evento de liberación táctil.
deviceConnector.sendAdbCommand()
Sección titulada «deviceConnector.sendAdbCommand()»sendAdbCommand(command: string): Promise<string>Envía un comando de Android Debug Bridge (ADB).
deviceConnector.addOnDeviceLog()
Sección titulada «deviceConnector.addOnDeviceLog()»deviceConnector.addOnDeviceLog( listenerName: string, callback: (log: string) => void,)Registra un callback que se ejecuta para cada línea de registro enviada por la aplicación bajo prueba.
deviceConnector.sendIdbCommand()
Sección titulada «deviceConnector.sendIdbCommand()»sendIdbCommand(command: string): Promise<string>Envía un comando de iOS Development Bridge (IDB).
await deviceConnector.sendIdbCommand('list-targets')deviceConnector.takeScreenshot()
Sección titulada «deviceConnector.takeScreenshot()»takeScreenshot(filepath: string): Promise<void>Toma una captura de pantalla y la guarda en filepath.
deviceConnector.setClipboard()
Sección titulada «deviceConnector.setClipboard()»setClipboard(content: string): Promise<void>Establece el portapapeles del dispositivo con una cadena.
deviceConnector.getClipboard()
Sección titulada «deviceConnector.getClipboard()»getClipboard(): Promise<string>Obtiene el contenido del portapapeles del dispositivo.
deviceConnector.vision()
Sección titulada «deviceConnector.vision()»vision( prompt: string, region: { x: number; y: number; width: number; height: number } | undefined,): Promise<string>Envía un prompt y una captura de pantalla de la pantalla actual del dispositivo al módulo de visión. Pasa una región para limitar la captura a una parte de la pantalla.
audioTools
Sección titulada «audioTools»Proporciona conversión de texto a voz, reproducción de audio y grabación de audio.
audioTools.say()
Sección titulada «audioTools.say()»audioTools.say(text: string)Convierte el texto indicado en audio.
audioTools.playAudio()
Sección titulada «audioTools.playAudio()»playAudio(url: string): Promise<number>Reproduce audio desde la URL indicada.
audioTools.stopAudio()
Sección titulada «audioTools.stopAudio()»audioTools.stopAudio()Detiene el audio que se está reproduciendo.
audioTools.recordAudio()
Sección titulada «audioTools.recordAudio()»recordAudio(duration: number): Promise<string>Graba audio durante la duración indicada en milisegundos y devuelve la URL de la grabación temporal.
Evidencias de ejecución de OCR y localizadores
Sección «Evidencias de ejecución de OCR y localizadores»testRunner.lastStepResult.executionEvidence es una instantánea síncrona de solo lectura. Su objeto opcional ocr conserva el último texto reconocido completamente en recognizedText, incluso si falla la comparación, junto con el motor, el texto esperado, el operador, el número de fotogramas completados y la hora de finalización. El estado distingue no_frame_processed, no_completed_frame, engine_error, no_text, no_match y matched. Cuando no existe una salida completada, el valor es null, mientras que un reconocimiento completado sin texto produce una cadena vacía. La referencia al fotograma de origen identifica la captura examinada cuando está disponible. La finalización tardía del proceso de trabajo no actualiza un resultado de tiempo agotado ya devuelto. La espera a que se estabilice la animación consume como máximo una cuarta parte del presupuesto de búsqueda o un segundo, dejando el resto para el reconocimiento. El tiempo y la precisión del OCR dependen del motor y del contenido del dispositivo.
executionEvidence.locatorResults registra los candidatos de localizadores de la jerarquía y los motivos de rechazo. Los mecanismos alternativos de jerarquía nativa requieren un único control habilitado y accionable dentro de la región de búsqueda normalizada configurada; se rechazan las etiquetas estáticas, los controles ambiguos y los puntos de toque que se sabe que están cubiertos por el teclado. Android admite un localizador exacto de hint . Si faltan evidencias del teclado, su estado sigue siendo desconocido. Una coincidencia y el envío completado de una entrada no demuestran el resultado en la aplicación.
Los pasos de texto pueden configurar expectedFocusHint en Studio o mediante MCP. Antes de borrar o escribir durante la grabación y la reproducción, esta comprobación opcional lee de forma asíncrona la jerarquía del dispositivo y exige exactamente un campo editable enfocado con ese texto de ayuda exacto. Falla antes de modificar texto si la jerarquía no está disponible o el foco no coincide. No cambia el foco. step.expectedFocusHint es en sí una lectura síncrona de la expectativa configurada. Android nativo expone textos de ayuda cuando la aplicación o el proveedor los facilita; otras plataformas pueden no exponerlos.
Evidencia del paso de navegación
Sección titulada «Evidencia del paso de navegación»En los pasos de script y la configuración avanzada, los pasos de navegación exponen propiedades síncronas de solo lectura goal, startCondition, inputReferences y maxActions propiedades. Los demás tipos de paso las omiten. La condición inicial opcional debe verificarse antes de cualquier acción. Las referencias de entrada seleccionan campos existentes data campos. La navegación envía los nombres seleccionados y los valores resueltos al proveedor en state.inputData y se guardan en la evidencia de la decisión. No selecciones secretos. Los valores introducidos por el tiempo de ejecución siguen procediendo de los datos proporcionados y no son generados por el modelo. maxActions acepta valores de 1 a 100 y tiene 20 como valor predeterminado. La navegación requiere un dispositivo con jerarquía y capturas de pantalla, una clave de OpenRouter configurada y el modelo de decisión compatible. El tiempo de espera heredado del paso es su presupuesto total de ejecución en segundos (60 de forma predeterminada, 300 como máximo).
Después de la ejecución, stepResult.executionEvidence.navigation es un objeto opcional, síncrono y de solo lectura, disponible antes de las devoluciones de llamada de finalización. No produce efectos secundarios en el dispositivo y está ausente en otros resultados o en resultados antiguos. Contiene model (el modelo resuelto fijado), requestedModel, status, elapsedMs, actionCount, modelCalls y trace. Cada entrada de la traza incluye la operación, el número de destino dinámico, el estado, los milisegundos transcurridos y, opcionalmente, goalConfidence, operationConfidence, visibilityDecision (VISIBLE/HIDDEN/UNCERTAIN), visibilityConfidence, inputReference y el nombre de archivo exacto de la captura de observación en el directorio de ejecución de la prueba. Los números de destino solo se aplican a esa observación; no son localizadores reutilizables. La fuente de evidencia correspondiente es navigation; las acciones individuales se registran en la traza de navegación, no en los campos de toque de nivel superior.
Un juicio de objetivo, tiempo de espera agotado, cancelación, condición inicial no válida, destino inseguro, pantalla inestable, falta de progreso o agotamiento del presupuesto finaliza el paso sin reintentar automáticamente la prueba. El reconocimiento del objetivo es un juicio del modelo; conserva una aserción ordinaria independiente para el resultado empresarial final. La geometría de la jerarquía utiliza coordenadas normalizadas de 0 a 1. Las capturas de pantalla y el contenido visible de la página se envían al proveedor de modelos configurado; usa datos de demostración para las pruebas comparativas y mantén los secretos fuera de los objetivos.
Varios resultados de Navigation
Sección titulada «Varios resultados de Navigation»En los pasos de script y la configuración avanzada de Studio y CLI, testRun.stepResults es una lista plana cronológica. Un paso de Navigation puede generar varios resultados reales con el mismo step.id: observaciones informativas seguidas de un resultado final. Lee estos campos de forma síncrona; leerlos no produce efectos secundarios. resultKind es intermediate o final; los resultados antiguos cargados tienen como valor predeterminado final. Opcionalmente, executionId agrupa una ejecución, sequence ordena sus resultados y elapsedMs mide los milisegundos transcurridos desde el inicio de esa ejecución de Navigation. El resultado intermedio executionEvidence.navigationObservation registra la operación, el estado, el destino y, opcionalmente, detalles del error o la referencia. Su captura de pantalla es la observación del modelo previa a la acción, no una confirmación posterior a la acción. screenshot es un nombre de archivo opcional relativo al directorio de ejecución de la prueba; si la imagen no está disponible, no se genera una imagen simulada.
testRun.getStepResultsByStepId(stepId) devuelve síncronamente todos los resultados de ese paso en el orden registrado, sin modificar la ejecución. getStepResultByStepId(stepId) devuelve el resultado final más reciente o undefined antes de la finalización. getSuccessfulStepResults() incluye únicamente resultados finales correctos. testRunner.lastStepResult y las devoluciones de llamada de finalización del paso siguen refiriéndose al resultado final, no a las decisiones intermedias. Los resultados intermedios no incrementan los recuentos de pasos correctos, fallidos u opcionales. Las ejecuciones históricas existentes conservan el resultado único original; el visor no convierte las trazas JSON antiguas en resultados inventados.
Para las nuevas observaciones de navegación, executionEvidence.navigationObservation.decisionInput es una instantánea síncrona y de solo lectura de la solicitud estructurada al modelo: estado, preguntas, modelo/proveedor y referencia a la captura de pantalla guardada. Leerla no tiene efectos secundarios. Excluye la autorización y los bytes de imagen insertados, y no está disponible en ejecuciones antiguas. Solo se resuelven e incluyen las inputReferences seleccionadas explícitamente, como el mapa de nombre a valor de cadena decisionInput.state.inputData. Estos valores se transmiten al proveedor de navegación configurado y se conservan en la evidencia de ejecución; no selecciones secretos. Se excluyen el objeto de datos completo y los campos no relacionados. La captura de pantalla también puede mostrar el contenido visible de los campos. Las aserciones independientes del resultado esperado no se incluyen. Batch Run Viewer muestra esta instantánea en una región expandible de entrada de decisión. El seguimiento final omite las cargas duplicadas de entrada; inspecciona los resultados intermedios reales de cada decisión.
Los nuevos resultados intermedios de Navigation exponen opcionalmente executionEvidence.navigationObservation.decisionOutputel cuerpo JSON exacto recibido del modelo, guardado antes de la validación de la respuesta local. Es una instantánea síncrona y de solo lectura en Studio y CLI, también disponible mediante las herramientas de ejecución y resultados de MCP; leerla no tiene efectos secundarios. No se almacenan encabezados de autorización. Los resultados antiguos y las solicitudes sin una respuesta JSON recibida no lo incluyen; las salidas ausentes nunca se reconstruyen a partir de la acción ejecutada. El visor lo muestra con el mismo árbol expandible que la entrada de Decision. La traza final omite los cuerpos de entrada/salida duplicados.
Opcional decisionMetrics registra localmente requestDurationMs (obtenido mediante la decodificación JSON, excluida la codificación de imágenes), requestBytes (cuerpo JSON UTF-8 que incluye la imagen en base64, excluidos los encabezados HTTP), structuredBytes (serialización UTF-8 del modelo, el estado estructurado, las preguntas y el proveedor sin la imagen), y imageBytes (bytes JPEG/PNG antes de base64). Los tamaños no representan el uso de tokens ni el coste facturado. El uso real, cuando lo proporciona el proveedor, sigue estando en decisionOutput. Estos campos comparten la misma disponibilidad y el mismo comportamiento de solo lectura que decisionOutput.
La navegación envía una captura de pantalla JPEG entrante sin cambios, con su tipo de contenido multimedia JPEG correspondiente; los demás fotogramas conservan la normalización PNG. Esto no cambia el tamaño de la imagen ni añade compresión con pérdida. La observación guardada sigue siendo el fotograma de origen exacto.
La finalización de la navegación requiere actualmente una probabilidad del objetivo del modelo de al menos 0,70; una condición de inicio explícita sigue requiriendo 0,85 en la primera decisión. Esta política de ejecución compartida por Studio/CLI/MCP no establece por sí sola el éxito de la tarea. Mantén las aserciones explícitas del resultado, especialmente para reservas, guardado o estados de error esperados. Las probabilidades son evaluaciones del modelo, no una garantía. El experimento de la política de finalización y las regresiones se registran en el registro de iteraciones de Studio.
Las decisiones de navegación TYPE_TEXT eligen conjuntamente el destino editable y la referencia de datos con nombre en una sola opción. El ejecutor valida el par frente a sus opciones actuales, verifica el foco y, cuando se necesita un clic para enfocarlo, la visibilidad del destino o la accesibilidad mediante el controlador, y resuelve localmente el valor proporcionado antes de escribirlo. Los nombres de referencia seleccionados y los valores de cadena esperados también se transmiten en decisionInput.state.inputData y se conservan en la evidencia; los datos de prueba no relacionados se excluyen. La observación persistente sigue exponiendo el ID del candidato en target y la ruta de datos existente en inputReference; los resultados de modelos anteriores utilizaban cabezales separados para el destino y la entrada. La lectura de esta evidencia es síncrona y no tiene efectos secundarios. La selección conjunta no garantiza que el par campo/referencia elegido sea semánticamente correcto.
La navegación actualmente acepta como máximo 250 candidatos visibles filtrados localmente, incluidos textos estáticos y controles accionables. Las observaciones más grandes fallan explícitamente sin truncar los objetivos de forma silenciosa. Este es un límite de recursos de ejecución, no un número mínimo de elementos ni un requisito del modelo. Los presupuestos de tiempo de espera y acciones existentes siguen aplicándose.
Adaptador nativo de decisiones GPT-6 Luna
Sección titulada «Adaptador nativo de decisiones GPT-6 Luna»Establece REPEATO_NAVIGATION_MODEL=gpt-6-luna y OPENAI_API_KEY antes de iniciar Studio/CLI/MCP. Jev sigue siendo la opción predeterminada. GPT-6 Luna usa POST https://api.openai.com/v1/decisions, con el mismo estado filtrado, la captura de pantalla original y el significado original de las preguntas. Las preguntas noul internas heredadas se asignan a preguntas de predicados nativos; los criterios fijos se asignan a valores/descripciones de opciones nativas. Este adaptador no usa la generación de JSON de Responses, la configuración de razonamiento, el límite de tokens de salida, valores de coordenadas/texto generados ni una alternativa de modelo. Siguen siendo aplicables la cancelación/límite de tiempo, la visibilidad, la actualidad, el foco, los presupuestos y las aserciones de resultados independientes existentes.
Sin procesar navigationObservation.decisionOutput conserva el cuerpo de la API nativa antes de la validación. El adaptador hace coincidir el array de respuestas por el nombre único de cada pregunta, valida los tipos, los rangos de probabilidad y los valores permitidos, y asigna la probabilidad del predicado a las comprobaciones existentes de objetivo/inicio (0.70/0.85 sin cambios). Una negativa obligatoria, nombres duplicados, ausentes o desconocidos y opciones no válidas fallan sin realizar el envío. La confianza y las probabilidades proceden de la API, no de valores inventados. No se presupone que la calibración de probabilidades de distintos modelos sea equivalente. Cualquier modelo devuelto debe coincidir con gpt-6-luna; si la API omite la identidad del modelo, el modelo resuelto sigue siendo null en lugar de inventarse.
decisionInput.api es openai-decisions; requestOptions.questions registra las preguntas exactas asignadas al protocolo, mientras que el estado y la referencia a la captura de pantalla reconstruyen las evidencias compartidas. El campo de proveedor exclusivo de Jev está ausente. Las lecturas son síncronas y no tienen efectos secundarios. Para GPT, structuredBytes serializa la solicitud nativa con una URL de imagen vacía; los bytes de imagen se informan por separado. Si falta el coste del proveedor, se desconoce, no es cero. Los informes históricos existentes openai-responses no se modifican y no deben etiquetarse como ejecuciones nativas de Decisions.
El paso guía oficial de Decisions documenta las entradas de texto/imagen y las respuestas de predicados/opciones. La disponibilidad del modelo y de la cuenta en tiempo real sigue requiriendo una comprobación previa correcta. Todas las evidencias de ejecución siguen estando disponibles mediante las herramientas existentes de ejecución/resultados de MCP; no se requiere ningún endpoint de acción de MCP separado.
Native Decisions conserva las negativas individuales o las ramas especulativas no disponibles sin inventar respuestas: el ejecutor compartido rechaza una negativa si es necesaria para la operación elegida, el objetivo, el inicio aplicable o la visibilidad del destino elegido. Una rama rechazada que no se utiliza no cancela otra operación verificada de forma independiente. Los arrays de opciones nativas requieren al menos dos entradas; una rama con una sola opción real incluye una abstención explícita de «ninguna opción aplicable». Este valor reservado no puede activar ninguna operación y se conserva en la salida sin procesar de la API; si se elige, esa rama se considera no disponible.
Para TYPE_TEXTLa navegación puede reutilizar un campo editable con foco y habilitado identificado de forma única en la jerarquía actualizada. Así, omite el clic para establecer el foco y la aprobación de visibilidad del modelo. La identidad, si está disponible, el rol, la etiqueta y los límites deben coincidir. El foco se comprueba de nuevo antes de modificar el texto, y el valor resultante del campo debe coincidir exactamente con la referencia proporcionada. Esto no establece la visibilidad visual. El campo de observación opcional de solo lectura focusClickDispatched es false cuando se reutilizó el foco existente y true cuando se envió un clic para establecer el foco. Las ejecuciones antiguas lo omiten. Leerlo en los pasos de Script de Studio o CLI y en la configuración avanzada es síncrono y no tiene efectos secundarios. El visor no dibuja un marcador de clic cuando este campo está false.
Browser Navigation trata un control Date nativo como un único objetivo editable y omite sus candidatos de segmento internos. Proporciona las fechas como cadenas YYYY-MM-DD en inputReferences. El ejecutor asíncrono hace clic localmente en los segmentos nativos en inglés Year, Month y Day, introduce las partes proporcionadas y verifica la fecha ISO completa antes de continuar. Comprueba que el objetivo, los límites de los segmentos y el foco sean actuales; las fechas no válidas, los segmentos no compatibles, los controles desactivados o las discrepancias de valor provocan un error. Esta ruta exclusiva del navegador no añade compatibilidad con selectores de fecha de Android/iOS. Los clics en segmentos son internos a una única acción TYPE_TEXT del modelo; el presupuesto de acciones existente cuenta esa acción una vez. No se requiere mutar el valor del DOM ni implementar Browser Host.
La navegación del navegador ofrece controles accionables cuando al menos el 50 % del área de su rectángulo se encuentra dentro de la ventana gráfica normalizada. Los demás nodos mantienen el filtrado del rectángulo completo. Un candidato parcialmente recortado conserva sus límites originales y expone clickPoint (x/y normalizados), el centro del rectángulo visible. El envío y el marcador del informe utilizan ese punto. Esta fracción geométrica no garantiza la ausencia de superposiciones: la comprobación de visibilidad de la captura de pantalla debe identificar un punto de clic expuesto, y se mantienen las comprobaciones recientes de accesibilidad y teclado. No se reutiliza una prueba positiva de impacto del host para el centro original como prueba de un punto diferente. El filtrado de destinos nativos no cambia. Las opciones CLICK también describen explícitamente los valores esperados seleccionados que ya coinciden con los campos editables; no se envía el contenido actual de campos no relacionados.
Las nuevas observaciones de navegación obsoletas incluyen un campo opcional hierarchyChanges con comparison=“hierarchy_paths”, totalChanges y un array changes. Cada entrada identifica una ruta de puntero JSON, el tipo de cambio y los valores before/after disponibles de la jerarquía de la solicitud original y de la jerarquía de comprobación del dispatch actualizada. Esta es una comparación estructural basada en rutas, no una inferencia de identidad de elementos ni un diagnóstico causal. Los contenidos editables y las propiedades de valor se redactan; sus cambios siguen registrados. Se almacena localmente, no se añade a la entrada del modelo y se puede leer de forma síncrona y sin efectos secundarios mediante executionEvidence.navigationObservation en los pasos Script, la configuración avanzada y las herramientas existentes de ejecución/resultados de MCP. Los informes antiguos omiten este campo y el visor indica explícitamente que la comparación no se registró. La detección de elementos obsoletos y el comportamiento de no realizar dispatch existentes no cambian.