Ga naar hoofdinhoud

DOM-manipulatie-API

@grant CAT.agent.dom

De DOM-manipulatie-API biedt volledige browserpagina-automatisering: navigatie, inhoud lezen, schermafbeeldingen, formulierinteractie en DOM-bewaking.

Tabbladbeheer

listTabs — tabbladen weergeven

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

Retourneert informatie over elk geopend tabblad.

Retourneert TabInfo[]:

VeldTypeBeschrijving
tabIdnumberTabblad-ID
urlstringHuidige URL
titlestringPaginatitel
activebooleanOf dit het momenteel actieve tabblad is
windowIdnumberID van het venster waartoe het behoort
discardedbooleanOf het is weggegooid (onderbroken)
const result = await CAT.agent.dom.navigate(url, options?);

Parameters:

ParameterTypeStandaardBeschrijving
urlstringDoel-URL (vereist)
options.tabIdnumberhuidig actief tabbladWelk tabblad u wilt gebruiken
options.waitUntilbooleantrueOf u wilt wachten tot de pagina is geladen
options.timeoutnumber30000Time-out in milliseconden

Retourneert NavigateResult:

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

Inhoud lezen

readPage — pagina-inhoud lezen

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

Converteert de pagina-DOM naar gestructureerde tekst en verwijdert automatisch irrelevante elementen zoals <script>, <style>, <noscript>, <svg> en <link[rel=stylesheet]>.

Parameters:

ParameterTypeStandaardBeschrijving
options.tabIdnumberhuidig actief tabbladWelk tabblad u wilt gebruiken
options.selectorstringCSS-selector; alleen de inhoud van het overeenkomende element wordt geretourneerd
options.maxLengthnumberMaximaal aantal inhoudstekens; wordt hierboven afgekapt
options.removeTagsstring[]Extra tagnamen om te verwijderen

Retourneert PageContent:

VeldTypeBeschrijving
titlestringPaginatitel
urlstringPagina-URL
htmlstringVerwerkte paginatekstinhoud
truncatedbooleanOf de inhoud is afgekapt
totalLengthnumberTotale lengte van de oorspronkelijke inhoud

screenshot — een schermafbeelding maken

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

Parameters:

ParameterTypeStandaardBeschrijving
options.tabIdnumberhuidig actief tabbladWelk tabblad u wilt gebruiken
options.qualitynumber80JPEG-kwaliteit (0-100)
options.fullPagebooleanfalseDe volledige pagina vastleggen
options.selectorstringCSS-selector; alleen het gebied van het overeenkomende element vastleggen
options.saveTostringPad om op te slaan in de OPFS-werkruimte

Retourneert ScreenshotResult:

VeldTypeBeschrijving
dataUrlstringbase64-data-URL
pathstringOPFS-opslagpad (wanneer saveTo wordt gebruikt)
sizenumberBestandsgrootte (wanneer saveTo wordt gebruikt)

Hoe de opnamemodus wordt gekozen:

ScenarioGedrag
selector gegevenLokaliseert de grenzen van het element via CDP en cropt de schermafbeelding
AchtergrondtabbladProbeert een CDP-schermafbeelding; als dat mislukt, activeert het het tabblad en gebruikt captureVisibleTab
VoorgrondtabbladGebruikt rechtstreeks captureVisibleTab
// Bewaar een schermafbeelding in OPFS
const shot = await CAT.agent.dom.screenshot({
saveTo: "screenshots/page.png",
quality: 90
});
console.log(`Opgeslagen als ${shot.path}, grootte ${shot.size} bytes`);

Pagina-interactie

click — op een element klikken

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

Parameters:

ParameterTypeStandaardBeschrijving
selectorstringCSS-selector (vereist)
options.tabIdnumberhuidig actief tabbladWelk tabblad u wilt gebruiken
options.trustedbooleanfalseCDP gebruiken om een echt muisgebeurtenis te verzenden

Retourneert ActionResult:

VeldTypeBeschrijving
successbooleanOf het is gelukt
navigatedbooleanOf de klik een paginanavigatie heeft geactiveerd
urlstringDe nieuwe URL na navigatie
newTabbooleanOf er een nieuw tabblad is geopend

trusted vs. een gewone klik:

  • trusted: false (standaard) — simuleert element.click() via geïnjecteerde JS; snel, maar sommige sites kunnen het detecteren als een niet-echte gebeurtenis
  • trusted: true — verzendt een echt muisgebeurtenis via het Chrome DevTools Protocol, niet te onderscheiden van echte gebruikersinteractie, maar vereist debugger-machtiging

fill — een formulierveld invullen

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

Parameters:

ParameterTypeBeschrijving
selectorstringCSS-selector (vereist)
valuestringWaarde om in te vullen (vereist)
options.tabIdnumberWelk tabblad u wilt gebruiken
options.trustedbooleanCDP gebruiken om toetsenbordinvoer te simuleren

Gedrag:

  • Normale modus: stelt element.value in en verzendt een input-gebeurtenis
  • Vertrouwde modus: CDP focust het element → typt teken voor teken

scroll — de pagina scrollen

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

Parameters:

ParameterTypeBeschrijving
direction"up" | "down" | "top" | "bottom"Scrollrichting (vereist)
options.tabIdnumberWelk tabblad u wilt gebruiken
options.selectorstringEen specifieke container scrollen in plaats van de hele pagina

Retourneert ScrollResult:

VeldTypeBeschrijving
scrollTopnumberScrollpositie na het scrollen
scrollHeightnumberTotale inhoudshoogte
clientHeightnumberViewporthoogte
atBottombooleanOf er nu naar beneden is gescrold

waitFor — wachten op een element

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

Pollt totdat het opgegeven element op de pagina verschijnt (elke 500 ms controleren).

Parameters:

ParameterTypeStandaardBeschrijving
selectorstringCSS-selector (vereist)
options.tabIdnumberhuidig actief tabbladWelk tabblad u wilt gebruiken
options.timeoutnumber10000Time-out in milliseconden

Retourneert WaitForResult:

VeldTypeBeschrijving
foundbooleanOf het element is gevonden
elementobjectElementinformatie (alleen wanneer found=true)
element.selectorstringDe overeenkomende selector
element.tagstringTagnaam
element.textstringTekstinhoud
element.rolestringARIA-rol
element.typestringinvoertype
element.visiblebooleanOf het zichtbaar is

Scriptuitvoering

executeScript — JavaScript uitvoeren

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

Parameters:

ParameterTypeStandaardBeschrijving
codestringJavaScript-code (vereist)
options.tabIdnumberhuidig actief tabbladWelk tabblad u wilt gebruiken

De code wordt altijd uitgevoerd in de MAIN-wereld van de pagina (deelt hetzelfde window-object als de eigen JS van de pagina), dus het kan de eigen functies van de pagina aanroepen en paginavariabelen rechtstreeks lezen — maar om dezelfde reden kan het geen toegang krijgen tot de blob-URL's van de extensie (bv. een blob:-URL die u maakt via URL.createObjectURL() van de Blob die door CAT.agent.opfs.read in de "blob"-modus wordt geretourneerd), omdat blob-URL's zijn gebonden aan de eigen oorsprong van de extensie. Als u met een blob-URL in een geïsoleerde context moet werken, gebruik dan in plaats daarvan een SkillScript (zie Skill-ontwikkeling).

// Roep een eigen JS-functie van de pagina aan / lees een paginavariabele
const data = await CAT.agent.dom.executeScript(
"return window.__APP_STATE__"
);

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

De code wordt voor uitvoering verpakt in new Function() en ondersteunt een return-waarde. De time-out is 30 seconden.

DOM-bewaking

Gebruikt het Chrome DevTools Protocol om DOM-wijzigingen en dialooggebeurtenissen op een pagina te bewaken.

startMonitor — bewaking starten

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

Start de bewaking van het opgegeven tabblad op DOM-wijzigingen en dialoogvensters (alert/confirm/prompt).

stopMonitor — bewaking stoppen

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

Stopt de bewaking en retourneert de verzamelde wijzigingen.

Retourneert MonitorResult:

VeldTypeBeschrijving
dialogsArray<{ type, message }>Lijst van dialoogvensters
addedNodesArray<{ tag, id?, class?, role?, text }>Samenvatting van nieuw toegevoegde DOM-knooppunten

addedNodes wordt op node-ID gededupliceerd en beperkt tot 50 vermeldingen; knooppunten die inmiddels uit de pagina zijn verwijderd of niet zichtbaar zijn, worden automatisch overgeslagen. text is gewone tekst uit de outerHTML van het knooppunt, afgekapt tot 300 tekens.

peekMonitor — bewakingsstatus controleren

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

Controleert niet-destructief de huidige bewakingsstatus.

Retourneert MonitorStatus:

VeldTypeBeschrijving
hasChangesbooleanOf er wijzigingen zijn
dialogCountnumberAantal dialoogvensters
nodeCountnumberAantal nieuw toegevoegde knooppunten

Volledig voorbeeld

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

// Wacht tot het formulier is geladen
await CAT.agent.dom.waitFor("form#signup", { timeout: 5000 });

// Vul het formulier in
await CAT.agent.dom.fill("input[name=username]", "test_user");
await CAT.agent.dom.fill("input[name=email]", "[email protected]");

// Vink het akkoordvakje aan
await CAT.agent.dom.click("input[type=checkbox]#agree");

// Maak een schermafbeelding van het ingevulde formulier
await CAT.agent.dom.screenshot({
selector: "form#signup",
saveTo: "screenshots/form-filled.png"
});

// Klik op verzenden
const result = await CAT.agent.dom.click("button[type=submit]", { trusted: true });
if (result.navigated) {
console.log("Formulier succesvol verzonden, genavigeerd naar:", result.url);
}