Aller au contenu principal

API de manipulation DOM

@grant CAT.agent.dom

L'API de manipulation DOM fournit une automatisation complète des pages du navigateur : navigation, lecture de contenu, captures d'écran, interaction avec les formulaires et surveillance du DOM.

Gestion des onglets

listTabs — lister les onglets

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

Retourne des informations sur chaque onglet ouvert.

Retourne TabInfo[] :

ChampTypeDescription
tabIdnumberID de l'onglet
urlstringURL actuelle
titlestringTitre de la page
activebooleanIndique s'il s'agit de l'onglet actuellement actif
windowIdnumberID de la fenêtre à laquelle il appartient
discardedbooleanIndique s'il a été mis en veille (suspended)
const result = await CAT.agent.dom.navigate(url, options?);

Paramètres :

ParamètreTypeDéfautDescription
urlstringURL cible (obligatoire)
options.tabIdnumberonglet actif courantOnglet à utiliser
options.waitUntilbooleantrueIndique s'il faut attendre la fin du chargement de la page
options.timeoutnumber30000Délai d'expiration en millisecondes

Retourne NavigateResult :

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

Lecture de contenu

readPage — lire le contenu d'une page

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

Convertit le DOM de la page en texte structuré, en supprimant automatiquement les éléments sans rapport comme <script>, <style>, <noscript>, <svg> et <link[rel=stylesheet]>.

Paramètres :

ParamètreTypeDéfautDescription
options.tabIdnumberonglet actif courantOnglet à utiliser
options.selectorstringSélecteur CSS ; seul le contenu de l'élément correspondant est retourné
options.maxLengthnumberNombre maximal de caractères du contenu ; tronqué au-delà
options.removeTagsstring[]Noms de balises supplémentaires à supprimer

Retourne PageContent :

ChampTypeDescription
titlestringTitre de la page
urlstringURL de la page
htmlstringContenu texte de la page traité
truncatedbooleanIndique si le contenu a été tronqué
totalLengthnumberLongueur totale du contenu d'origine

screenshot — prendre une capture d'écran

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

Paramètres :

ParamètreTypeDéfautDescription
options.tabIdnumberonglet actif courantOnglet à utiliser
options.qualitynumber80Qualité JPEG (0-100)
options.fullPagebooleanfalseCapturer la page entière
options.selectorstringSélecteur CSS ; ne capturer que la zone de l'élément correspondant
options.saveTostringChemin d'enregistrement dans l'espace de travail OPFS

Retourne ScreenshotResult :

ChampTypeDescription
dataUrlstringURL de données base64
pathstringChemin d'enregistrement OPFS (lorsque saveTo est utilisé)
sizenumberTaille du fichier (lorsque saveTo est utilisé)

Comment le mode de capture est choisi :

ScénarioComportement
selector fourniLocalise les limites de l'élément via CDP et recadre la capture
Onglet en arrière-planEssaie une capture CDP ; en cas d'échec, active l'onglet et utilise captureVisibleTab
Onglet au premier planUtilise directement captureVisibleTab
// Save a screenshot to OPFS
const shot = await CAT.agent.dom.screenshot({
saveTo: "screenshots/page.png",
quality: 90
});
console.log(`Saved to ${shot.path}, size ${shot.size} bytes`);

Interaction avec la page

click — cliquer sur un élément

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

Paramètres :

ParamètreTypeDéfautDescription
selectorstringSélecteur CSS (obligatoire)
options.tabIdnumberonglet actif courantOnglet à utiliser
options.trustedbooleanfalseUtiliser CDP pour envoyer un véritable événement de souris

Retourne ActionResult :

ChampTypeDescription
successbooleanIndique si l'opération a réussi
navigatedbooleanIndique si le clic a déclenché une navigation de page
urlstringLa nouvelle URL après la navigation
newTabbooleanIndique si un nouvel onglet a été ouvert

trusted vs un simple clic :

  • trusted: false (défaut) — simule element.click() via du JS injecté ; rapide, mais certains sites peuvent le détecter comme un événement non authentique
  • trusted: true — envoie un véritable événement de souris via le Chrome DevTools Protocol, impossible à distinguer d'une interaction utilisateur réelle, mais nécessite la permission de débogage

fill — remplir un champ de formulaire

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

Paramètres :

ParamètreTypeDescription
selectorstringSélecteur CSS (obligatoire)
valuestringValeur à saisir (obligatoire)
options.tabIdnumberOnglet à utiliser
options.trustedbooleanUtiliser CDP pour simuler la saisie clavier

Comportement :

  • Mode normal : définit element.value et envoie un événement input
  • Mode fiable : CDP met l'élément au point → saisit caractère par caractère

scroll — faire défiler la page

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

Paramètres :

ParamètreTypeDescription
direction"up" | "down" | "top" | "bottom"Direction du défilement (obligatoire)
options.tabIdnumberOnglet à utiliser
options.selectorstringFaire défiler un conteneur spécifique au lieu de la page entière

Retourne ScrollResult :

ChampTypeDescription
scrollTopnumberPosition de défilement après l'opération
scrollHeightnumberHauteur totale du contenu
clientHeightnumberHauteur de la zone d'affichage
atBottombooleanIndique si le bas de page est atteint

waitFor — attendre un élément

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

Interroge périodiquement la page pour détecter l'apparition de l'élément spécifié (toutes les 500 ms).

Paramètres :

ParamètreTypeDéfautDescription
selectorstringSélecteur CSS (obligatoire)
options.tabIdnumberonglet actif courantOnglet à utiliser
options.timeoutnumber10000Délai d'expiration en millisecondes

Retourne WaitForResult :

ChampTypeDescription
foundbooleanIndique si l'élément a été trouvé
elementobjectInformations sur l'élément (uniquement lorsque found=true)
element.selectorstringLe sélecteur correspondant
element.tagstringNom de la balise
element.textstringContenu texte
element.rolestringRôle ARIA
element.typestringtype d'entrée
element.visiblebooleanIndique s'il est visible

Exécution de scripts

executeScript — exécuter du JavaScript

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

Paramètres :

ParamètreTypeDéfautDescription
codestringCode JavaScript (obligatoire)
options.tabIdnumberonglet actif courantOnglet à utiliser

Le code s'exécute toujours dans le monde MAIN de la page (partageant le même objet window que le JS de la page elle-même), il peut donc appeler les fonctions de la page et lire directement les variables de la page — mais pour la même raison, il ne peut pas accéder aux URL de blob de l'extension (par ex. une URL blob: que vous créez via URL.createObjectURL() à partir du Blob retourné par CAT.agent.opfs.read en mode "blob"), car les URL de blob sont limitées à l'origine propre de l'extension. Si vous devez travailler avec une URL de blob dans un contexte isolé, utilisez plutôt un SkillScript (voir Développement de Skills).

// Call a page's own JS function / read a page variable
const data = await CAT.agent.dom.executeScript(
"return window.__APP_STATE__"
);

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

Le code est enveloppé dans new Function() pour l'exécution et prend en charge une valeur return. Le délai d'expiration est de 30 secondes.

Surveillance du DOM

Utilise le Chrome DevTools Protocol pour surveiller les modifications du DOM et les événements de dialogue sur une page.

startMonitor — démarrer la surveillance

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

Démarre la surveillance de l'onglet spécifié pour les modifications du DOM et les dialogues (alert/confirm/prompt).

stopMonitor — arrêter la surveillance

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

Arrête la surveillance et retourne les modifications collectées.

Retourne MonitorResult :

ChampTypeDescription
dialogsArray<{ type, message }>Liste des dialogues
addedNodesArray<{ tag, id?, class?, role?, text }>Résumé des nœuds DOM nouvellement ajoutés

addedNodes est dédupliqué par ID de nœud et limité à 50 entrées ; les nœuds qui ont depuis été supprimés de la page ou qui ne sont pas visibles sont ignorés automatiquement. text est le texte brut extrait du outerHTML du nœud, tronqué à 300 caractères.

peekMonitor — vérifier l'état de la surveillance

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

Vérifie de manière non destructive l'état actuel de la surveillance.

Retourne MonitorStatus :

ChampTypeDescription
hasChangesbooleanIndique s'il y a des modifications
dialogCountnumberNombre de dialogues
nodeCountnumberNombre de nœuds nouvellement ajoutés

Exemple complet

// ==UserScript==
// @name Auto form filler
// @match https://example.com/form
// @grant CAT.agent.dom
// ==/UserScript==

// Wait for the form to load
await CAT.agent.dom.waitFor("form#signup", { timeout: 5000 });

// Fill in the form
await CAT.agent.dom.fill("input[name=username]", "test_user");
await CAT.agent.dom.fill("input[name=email]", "[email protected]");

// Check the agreement box
await CAT.agent.dom.click("input[type=checkbox]#agree");

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

// Click submit
const result = await CAT.agent.dom.click("button[type=submit]", { trusted: true });
if (result.navigated) {
console.log("Form submitted successfully, navigated to:", result.url);
}