Saltar al contenido principal

API de Manipulación del DOM

@grant CAT.agent.dom

La API de manipulación del DOM proporciona automatización completa de páginas del navegador: navegación, lectura de contenido, capturas de pantalla, interacción con formularios y monitoreo del DOM.

Gestión de pestañas

listTabs — listar pestañas

const tabs = await CAT.agent.dom.listTabs();

Retorna información sobre cada pestaña abierta.

Retorna TabInfo[]:

CampoTipoDescripción
tabIdnumberID de la pestaña
urlstringURL actual
titlestringTítulo de la página
activebooleanSi es la pestaña activa actual
windowIdnumberID de la ventana a la que pertenece
discardedbooleanSi ha sido descartada (suspendida)
const result = await CAT.agent.dom.navigate(url, options?);

Parámetros:

ParámetroTipoPredeterminadoDescripción
urlstringURL objetivo (obligatoria)
options.tabIdnumberpestaña activa actualQué pestaña usar
options.waitUntilbooleantrueSi esperar a que la página termine de cargar
options.timeoutnumber30000Tiempo de espera en milisegundos

Retorna NavigateResult:

{ tabId: number; url: string; title: string }

Lectura de contenido

readPage — leer contenido de la página

const page = await CAT.agent.dom.readPage(options?);

Convierte el DOM de la página en texto estructurado, eliminando automáticamente elementos irrelevantes como <script>, <style>, <noscript>, <svg> y <link[rel=stylesheet]>.

Parámetros:

ParámetroTipoPredeterminadoDescripción
options.tabIdnumberpestaña activa actualQué pestaña usar
options.selectorstringSelector CSS; solo se retorna el contenido del elemento coincidente
options.maxLengthnumberMáximo de caracteres; se trunca más allá
options.removeTagsstring[]Nombres de etiquetas adicionales a eliminar

Retorna PageContent:

CampoTipoDescripción
titlestringTítulo de la página
urlstringURL de la página
htmlstringContenido de texto de la página procesada
truncatedbooleanSi el contenido fue truncado
totalLengthnumberLongitud total del contenido original

screenshot — tomar una captura de pantalla

const shot = await CAT.agent.dom.screenshot(options?);

Parámetros:

ParámetroTipoPredeterminadoDescripción
options.tabIdnumberpestaña activa actualQué pestaña usar
options.qualitynumber80Calidad JPEG (0-100)
options.fullPagebooleanfalseCapturar la página completa
options.selectorstringSelector CSS; solo capturar el área del elemento coincidente
options.saveTostringRuta para guardar en el espacio de trabajo OPFS

Retorna ScreenshotResult:

CampoTipoDescripción
dataUrlstringURL de datos base64
pathstringRuta de guardado en OPFS (cuando se usa saveTo)
sizenumberTamaño del archivo (cuando se usa saveTo)
// Guardar una captura en OPFS
const shot = await CAT.agent.dom.screenshot({
saveTo: "screenshots/page.png",
quality: 90
});
console.log(`Guardado en ${shot.path}, tamaño ${shot.size} bytes`);

Interacción con la página

click — hacer clic en un elemento

const result = await CAT.agent.dom.click(selector, options?);

Parámetros:

ParámetroTipoPredeterminadoDescripción
selectorstringSelector CSS (obligatorio)
options.tabIdnumberpestaña activa actualQué pestaña usar
options.trustedbooleanfalseUsar CDP para enviar un evento de ratón real

Retorna ActionResult:

CampoTipoDescripción
successbooleanSi tuvo éxito
navigatedbooleanSi el clic activó una navegación
urlstringLa nueva URL después de la navegación
newTabbooleanSi se abrió una nueva pestaña

trusted vs. un clic normal:

  • trusted: false (predeterminado) — simula element.click() mediante JS inyectado; rápido, pero algunos sitios pueden detectarlo como un evento no genuino
  • trusted: true — envía un evento de ratón real mediante Chrome DevTools Protocol, indistinguible de la interacción real del usuario, pero requiere permisos de depuración

fill — llenar un campo de formulario

const result = await CAT.agent.dom.fill(selector, value, options?);

Parámetros:

ParámetroTipoDescripción
selectorstringSelector CSS (obligatorio)
valuestringValor a llenar (obligatorio)
options.tabIdnumberQué pestaña usar
options.trustedbooleanUsar CDP para simular entrada de teclado

Comportamiento:

  • Modo normal: establece element.value y envía un evento input
  • Modo trusted: CDP enfoca el elemento → escribe carácter por carácter

scroll — desplazar la página

const result = await CAT.agent.dom.scroll(direction, options?);

Parámetros:

ParámetroTipoDescripción
direction"up" | "down" | "top" | "bottom"Dirección de desplazamiento (obligatoria)
options.tabIdnumberQué pestaña usar
options.selectorstringDesplazar un contenedor específico en lugar de toda la página

Retorna ScrollResult:

CampoTipoDescripción
scrollTopnumberPosición de desplazamiento después de desplazar
scrollHeightnumberAltura total del contenido
clientHeightnumberAltura del viewport
atBottombooleanSi ahora está desplazado hasta el fondo

waitFor — esperar un elemento

const result = await CAT.agent.dom.waitFor(selector, options?);

Hace polling para que aparezca el elemento especificado en la página (verificando cada 500ms).

Parámetros:

ParámetroTipoPredeterminadoDescripción
selectorstringSelector CSS (obligatorio)
options.tabIdnumberpestaña activa actualQué pestaña usar
options.timeoutnumber10000Tiempo de espera en milisegundos

Retorna WaitForResult:

CampoTipoDescripción
foundbooleanSi se encontró el elemento
elementobjectInformación del elemento (solo cuando found=true)
element.selectorstringEl selector coincidente
element.tagstringNombre de la etiqueta
element.textstringContenido de texto
element.rolestringRol ARIA
element.typestringTipo de input
element.visiblebooleanSi es visible

Ejecución de scripts

executeScript — ejecutar JavaScript

const result = await CAT.agent.dom.executeScript(code, options?);

Parámetros:

ParámetroTipoPredeterminadoDescripción
codestringCódigo JavaScript (obligatorio)
options.tabIdnumberpestaña activa actualQué pestaña usar

El código siempre se ejecuta en el mundo MAIN de la página (compartiendo el mismo objeto window que el JS de la página), por lo que puede llamar a las funciones de la página y leer variables directamente — pero por la misma razón no puede acceder a las URLs blob de la extensión (por ejemplo, una URL blob: creada con URL.createObjectURL() a partir del Blob devuelto por CAT.agent.opfs.read en modo "blob"), ya que las URLs blob están restringidas al origen de la extensión. Si necesitas trabajar con una URL blob en un contexto aislado, usa un SkillScript (ver Desarrollo de Skills).

// Llamar a una función JS propia de la página / leer una variable
const data = await CAT.agent.dom.executeScript(
"return window.__APP_STATE__"
);

// Leer contenido del DOM
const title = await CAT.agent.dom.executeScript(
"return document.querySelector('h1')?.textContent"
);

El código se envuelve en new Function() para su ejecución, y soporta un valor de return. El tiempo de espera es de 30 segundos.

Monitoreo del DOM

Usa Chrome DevTools Protocol para monitorear cambios del DOM y eventos de diálogo en una página.

startMonitor — iniciar monitoreo

await CAT.agent.dom.startMonitor(tabId);

Inicia el monitoreo de cambios del DOM y diálogos (alert/confirm/prompt) en la pestaña especificada.

stopMonitor — detener monitoreo

const result = await CAT.agent.dom.stopMonitor(tabId);

Detiene el monitoreo y retorna los cambios recopilados.

Retorna MonitorResult:

CampoTipoDescripción
dialogsArray<{ type, message }>Lista de diálogos
addedNodesArray<{ tag, id?, class?, role?, text }>Resumen de nodos DOM recién añadidos

peekMonitor — verificar estado del monitoreo

const status = await CAT.agent.dom.peekMonitor(tabId);

Verifica el estado actual del monitoreo de forma no destructiva.

Retorna MonitorStatus:

CampoTipoDescripción
hasChangesbooleanSi hay cambios
dialogCountnumberNúmero de diálogos
nodeCountnumberNúmero de nodos recién añadidos

Ejemplo completo

// ==UserScript==
// @name Rellenador automático de formularios
// @match https://example.com/form
// @grant CAT.agent.dom
// ==/UserScript==

// Esperar a que el formulario cargue
await CAT.agent.dom.waitFor("form#signup", { timeout: 5000 });

// Llenar el formulario
await CAT.agent.dom.fill("input[name=username]", "test_user");
await CAT.agent.dom.fill("input[name=email]", "[email protected]");

// Marcar la casilla de acuerdo
await CAT.agent.dom.click("input[type=checkbox]#agree");

// Captura del formulario lleno
await CAT.agent.dom.screenshot({
selector: "form#signup",
saveTo: "screenshots/form-filled.png"
});

// Hacer clic en enviar
const result = await CAT.agent.dom.click("button[type=submit]", { trusted: true });
if (result.navigated) {
console.log("Formulario enviado exitosamente, navegado a:", result.url);
}