Passa al contenuto principale

API Manipolazione DOM

@grant CAT.agent.dom

L'API di manipolazione del DOM fornisce un'automazione completa delle pagine del browser: navigazione, lettura dei contenuti, screenshot, interazione con moduli e monitoraggio del DOM.

Gestione delle schede

listTabs — elencare le schede

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

Restituisce informazioni su ogni scheda aperta.

Restituisce TabInfo[]:

CampoTipoDescrizione
tabIdnumberID della scheda
urlstringURL corrente
titlestringTitolo della pagina
activebooleanSe è la scheda attiva corrente
windowIdnumberID della finestra a cui appartiene
discardedbooleanSe è stata scartata (sospesa)
const result = await CAT.agent.dom.navigate(url, options?);

Parametri:

ParametroTipoPredefinitoDescrizione
urlstringURL obiettivo (obbligatorio)
options.tabIdnumberscheda attiva correnteQuale scheda usare
options.waitUntilbooleantrueSe attendere che la pagina finisca di caricare
options.timeoutnumber30000Timeout in millisecondi

Restituisce NavigateResult:

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

Lettura dei contenuti

readPage — leggere il contenuto della pagina

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

Converte il DOM della pagina in testo strutturato, rimuovendo automaticamente elementi irrilevanti come <script>, <style>, <noscript>, <svg> e <link[rel=stylesheet]>.

Parametri:

ParametroTipoPredefinitoDescrizione
options.tabIdnumberscheda attiva correnteQuale scheda usare
options.selectorstringSelettore CSS; viene restituito solo il contenuto dell'elemento corrispondente
options.maxLengthnumberMassimo caratteri; troncato oltre questo
options.removeTagsstring[]Nomi di tag aggiuntivi da rimuovere

Restituisce PageContent:

CampoTipoDescrizione
titlestringTitolo della pagina
urlstringURL della pagina
htmlstringContenuto testuale della pagina elaborato
truncatedbooleanSe il contenuto è stato troncato
totalLengthnumberLunghezza totale del contenuto originale

screenshot — fare uno screenshot

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

Parametri:

ParametroTipoPredefinitoDescrizione
options.tabIdnumberscheda attiva correnteQuale scheda usare
options.qualitynumber80Qualità JPEG (0-100)
options.fullPagebooleanfalseCatturare l'intera pagina
options.selectorstringSelettore CSS; catturare solo l'area dell'elemento corrispondente
options.saveTostringPercorso per salvare nello spazio di lavoro OPFS

Restituisce ScreenshotResult:

CampoTipoDescrizione
dataUrlstringURL dati base64
pathstringPercorso di salvataggio OPFS (quando si usa saveTo)
sizenumberDimensione del file (quando si usa saveTo)
// Salvare uno screenshot in OPFS
const shot = await CAT.agent.dom.screenshot({
saveTo: "screenshots/page.png",
quality: 90
});
console.log(`Salvato in ${shot.path}, dimensione ${shot.size} byte`);

Interazione con la pagina

click — fare clic su un elemento

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

Parametri:

ParametroTipoPredefinitoDescrizione
selectorstringSelettore CSS (obbligatorio)
options.tabIdnumberscheda attiva correnteQuale scheda usare
options.trustedbooleanfalseUsare CDP per inviare un evento mouse reale

Restituisce ActionResult:

CampoTipoDescrizione
successbooleanSe ha avuto successo
navigatedbooleanSe il clic ha attivato una navigazione
urlstringIl nuovo URL dopo la navigazione
newTabbooleanSe è stata aperta una nuova scheda

trusted vs. un clic normale:

  • trusted: false (predefinito) — simula element.click() tramite JS iniettato; veloce, ma alcuni siti possono rilevarlo come un evento non genuino
  • trusted: true — invia un evento mouse reale tramite Chrome DevTools Protocol, indistinguibile dall'interazione reale dell'utente, ma richiede i permessi di debug

fill — compilare un campo del modulo

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

Parametri:

ParametroTipoDescrizione
selectorstringSelettore CSS (obbligatorio)
valuestringValore da inserire (obbligatorio)
options.tabIdnumberQuale scheda usare
options.trustedbooleanUsare CDP per simulare l'input da tastiera

Comportamento:

  • Modo normale: imposta element.value e invia un evento input
  • Modo trusted: CDP mette a fuoco l'elemento → digita carattere per carattere

scroll — scorrere la pagina

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

Parametri:

ParametroTipoDescrizione
direction"up" | "down" | "top" | "bottom"Direzione di scorrimento (obbligatoria)
options.tabIdnumberQuale scheda usare
options.selectorstringScorrere un contenitore specifico invece dell'intera pagina

Restituisce ScrollResult:

CampoTipoDescrizione
scrollTopnumberPosizione di scorrimento dopo lo scorrimento
scrollHeightnumberAltezza totale del contenuto
clientHeightnumberAltezza del viewport
atBottombooleanSe è ora scorruto fino in fondo

waitFor — attendere un elemento

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

Fa polling per l'elemento specificato che appaia nella pagina (controllando ogni 500ms).

Parametri:

ParametroTipoPredefinitoDescrizione
selectorstringSelettore CSS (obbligatorio)
options.tabIdnumberscheda attiva correnteQuale scheda usare
options.timeoutnumber10000Timeout in millisecondi

Restituisce WaitForResult:

CampoTipoDescrizione
foundbooleanSe l'elemento è stato trovato
elementobjectInformazioni sull'elemento (solo quando found=true)
element.selectorstringIl selettore corrispondente
element.tagstringNome del tag
element.textstringContenuto testuale
element.rolestringRuolo ARIA
element.typestringTipo di input
element.visiblebooleanSe è visibile

Esecuzione degli script

executeScript — eseguire JavaScript

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

Parametri:

ParametroTipoPredefinitoDescrizione
codestringCodice JavaScript (obbligatorio)
options.tabIdnumberscheda attiva correnteQuale scheda usare

Il codice viene sempre eseguito nel mondo MAIN della pagina (condividendo lo stesso oggetto window con il JS della pagina), quindi può chiamare le funzioni della pagina e leggere le variabili direttamente — ma per lo stesso motivo non può accedere alle URL blob dell'estensione (ad esempio un URL blob: creato con URL.createObjectURL() dal Blob restituito da CAT.agent.opfs.read in modalità "blob"), poiché le URL blob sono limitate all'origine dell'estensione. Se devi lavorare con un URL blob in un contesto isolato, usa uno SkillScript (vedi Sviluppo Skill).

// Chiamare una funzione JS propria della pagina / leggere una variabile
const data = await CAT.agent.dom.executeScript(
"return window.__APP_STATE__"
);

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

Il codice viene avvolto in new Function() per l'esecuzione e supporta un valore di return. Il timeout è di 30 secondi.

Monitoraggio del DOM

Utilizza Chrome DevTools Protocol per monitorare i cambiamenti del DOM e gli eventi di dialogo in una pagina.

startMonitor — avviare il monitoraggio

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

Avvia il monitoraggio dei cambiamenti del DOM e dei dialoghi (alert/confirm/prompt) nella scheda specificata.

stopMonitor — fermare il monitoraggio

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

Ferma il monitoraggio e restituisce le modifiche raccolte.

Restituisce MonitorResult:

CampoTipoDescrizione
dialogsArray<{ type, message }>Elenco dei dialoghi
addedNodesArray<{ tag, id?, class?, role?, text }>Riepilogo dei nodi DOM appena aggiunti

peekMonitor — verificare lo stato del monitoraggio

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

Verifica lo stato corrente del monitoraggio in modo non distruttivo.

Restituisce MonitorStatus:

CampoTipoDescrizione
hasChangesbooleanSe ci sono modifiche
dialogCountnumberNumero di dialoghi
nodeCountnumberNumero di nodi appena aggiunti

Esempio completo

// ==UserScript==
// @name Riempi-modulo automatico
// @match https://example.com/form
// @grant CAT.agent.dom
// ==/UserScript==

// Attendere che il modulo si carichi
await CAT.agent.dom.waitFor("form#signup", { timeout: 5000 });

// Compilare il modulo
await CAT.agent.dom.fill("input[name=username]", "test_user");
await CAT.agent.dom.fill("input[name=email]", "[email protected]");

// Spuntare la casella di accettazione
await CAT.agent.dom.click("input[type=checkbox]#agree");

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

// Cliccare invio
const result = await CAT.agent.dom.click("button[type=submit]", { trusted: true });
if (result.navigated) {
console.log("Modulo inviato con successo, navigato a:", result.url);
}