Pular para o conteúdo principal

API de Manipulação do DOM

@grant CAT.agent.dom

A API de manipulação do DOM fornece automação completa de páginas do navegador: navegação, leitura de conteúdo, capturas de tela, interação com formulários e monitoramento do DOM.

Gerenciamento de abas

listTabs — listar abas

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

Retorna informações sobre cada aba aberta.

Retorna TabInfo[]:

CampoTipoDescrição
tabIdnumberID da aba
urlstringURL atual
titlestringTítulo da página
activebooleanSe é a aba ativa atual
windowIdnumberID da janela a que pertence
discardedbooleanSe foi descartada (suspensa)
const result = await CAT.agent.dom.navigate(url, options?);

Parâmetros:

ParâmetroTipoPadrãoDescrição
urlstringURL alvo (obrigatório)
options.tabIdnumberaba ativa atualQual aba usar
options.waitUntilbooleantrueSe aguardar a página terminar de carregar
options.timeoutnumber30000Timeout em milissegundos

Retorna NavigateResult:

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

Leitura de conteúdo

readPage — ler conteúdo da página

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

Converte o DOM da página em texto estruturado, removendo automaticamente elementos irrelevantes como <script>, <style>, <noscript>, <svg> e <link[rel=stylesheet]>.

Parâmetros:

ParâmetroTipoPadrãoDescrição
options.tabIdnumberaba ativa atualQual aba usar
options.selectorstringSeletor CSS; apenas o conteúdo do elemento correspondente é retornado
options.maxLengthnumberMáximo de caracteres; truncado além disso
options.removeTagsstring[]Nomes de tags adicionais a remover

Retorna PageContent:

CampoTipoDescrição
titlestringTítulo da página
urlstringURL da página
htmlstringConteúdo de texto da página processado
truncatedbooleanSe o conteúdo foi truncado
totalLengthnumberComprimento total do conteúdo original

screenshot — tirar uma captura de tela

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

Parâmetros:

ParâmetroTipoPadrãoDescrição
options.tabIdnumberaba ativa atualQual aba usar
options.qualitynumber80Qualidade JPEG (0-100)
options.fullPagebooleanfalseCapturar a página inteira
options.selectorstringSeletor CSS; apenas capturar a área do elemento correspondente
options.saveTostringCaminho para salvar no espaço de trabalho OPFS

Retorna ScreenshotResult:

CampoTipoDescrição
dataUrlstringURL de dados base64
pathstringCaminho de salvamento no OPFS (quando saveTo é usado)
sizenumberTamanho do arquivo (quando saveTo é usado)
// Salvar uma captura no OPFS
const shot = await CAT.agent.dom.screenshot({
saveTo: "screenshots/page.png",
quality: 90
});
console.log(`Salvo em ${shot.path}, tamanho ${shot.size} bytes`);

Interação com a página

click — clicar em um elemento

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

Parâmetros:

ParâmetroTipoPadrãoDescrição
selectorstringSeletor CSS (obrigatório)
options.tabIdnumberaba ativa atualQual aba usar
options.trustedbooleanfalseUsar CDP para enviar um evento de mouse real

Retorna ActionResult:

CampoTipoDescrição
successbooleanSe teve sucesso
navigatedbooleanSe o clique acionou uma navegação
urlstringA nova URL após a navegação
newTabbooleanSe uma nova aba foi aberta

trusted vs. um clique normal:

  • trusted: false (padrão) — simula element.click() via JS injetado; rápido, mas alguns sites podem detectá-lo como um evento não genuíno
  • trusted: true — envia um evento de mouse real via Chrome DevTools Protocol, indistinguível da interação real do usuário, mas requer permissões de depuração

fill — preencher um campo de formulário

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

Parâmetros:

ParâmetroTipoDescrição
selectorstringSeletor CSS (obrigatório)
valuestringValor a preencher (obrigatório)
options.tabIdnumberQual aba usar
options.trustedbooleanUsar CDP para simular entrada de teclado

Comportamento:

  • Modo normal: define element.value e dispara um evento input
  • Modo trusted: CDP foca o elemento → digita caractere por caractere

scroll — rolar a página

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

Parâmetros:

ParâmetroTipoDescrição
direction"up" | "down" | "top" | "bottom"Direção da rolagem (obrigatória)
options.tabIdnumberQual aba usar
options.selectorstringRolar um contêiner específico em vez de toda a página

Retorna ScrollResult:

CampoTipoDescrição
scrollTopnumberPosição de rolagem após rolar
scrollHeightnumberAltura total do conteúdo
clientHeightnumberAltura do viewport
atBottombooleanSe agora está rolado até o fundo

waitFor — aguardar um elemento

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

Faz polling para que o elemento especificado apareça na página (verificando a cada 500ms).

Parâmetros:

ParâmetroTipoPadrãoDescrição
selectorstringSeletor CSS (obrigatório)
options.tabIdnumberaba ativa atualQual aba usar
options.timeoutnumber10000Timeout em milissegundos

Retorna WaitForResult:

CampoTipoDescrição
foundbooleanSe o elemento foi encontrado
elementobjectInformações do elemento (apenas quando found=true)
element.selectorstringO seletor correspondente
element.tagstringNome da tag
element.textstringConteúdo de texto
element.rolestringPapel ARIA
element.typestringTipo de input
element.visiblebooleanSe é visível

Execução de scripts

executeScript — executar JavaScript

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

Parâmetros:

ParâmetroTipoPadrãoDescrição
codestringCódigo JavaScript (obrigatório)
options.tabIdnumberaba ativa atualQual aba usar

O código sempre é executado no mundo MAIN da página (compartilhando o mesmo objeto window com o JS da página), então pode chamar as próprias funções da página e ler variáveis diretamente — mas pela mesma razão não pode acessar as URLs blob da extensão (por exemplo, uma URL blob: criada via URL.createObjectURL() a partir do Blob retornado por CAT.agent.opfs.read no modo "blob"), já que as URLs blob são restritas à origem da extensão. Se precisar trabalhar com uma URL blob em um contexto isolado, use um SkillScript (veja Desenvolvimento de Skills).

// Chamar uma função JS da página / ler uma variável da página
const data = await CAT.agent.dom.executeScript(
"return window.__APP_STATE__"
);

// Ler conteúdo do DOM
const title = await CAT.agent.dom.executeScript(
"return document.querySelector('h1')?.textContent"
);

O código é embrulhado em new Function() para execução e suporta um valor de return. O timeout é de 30 segundos.

Monitoramento do DOM

Usa Chrome DevTools Protocol para monitorar mudanças no DOM e eventos de diálogo em uma página.

startMonitor — iniciar monitoramento

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

Inicia o monitoramento de mudanças no DOM e diálogos (alert/confirm/prompt) na aba especificada.

stopMonitor — parar monitoramento

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

Para o monitoramento e retorna as mudanças coletadas.

Retorna MonitorResult:

CampoTipoDescrição
dialogsArray<{ type, message }>Lista de diálogos
addedNodesArray<{ tag, id?, class?, role?, text }>Resumo dos nós DOM recém-adicionados

peekMonitor — verificar status do monitoramento

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

Verifica o status atual do monitoramento de forma não destrutiva.

Retorna MonitorStatus:

CampoTipoDescrição
hasChangesbooleanSe há mudanças
dialogCountnumberNúmero de diálogos
nodeCountnumberNúmero de nós recém-adicionados

Exemplo completo

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

// Aguardar o formulário carregar
await CAT.agent.dom.waitFor("form#signup", { timeout: 5000 });

// Preencher o formulário
await CAT.agent.dom.fill("input[name=username]", "test_user");
await CAT.agent.dom.fill("input[name=email]", "[email protected]");

// Marcar a caixa de acordo
await CAT.agent.dom.click("input[type=checkbox]#agree");

// Captura do formulário preenchido
await CAT.agent.dom.screenshot({
selector: "form#signup",
saveTo: "screenshots/form-filled.png"
});

// Clicar em enviar
const result = await CAT.agent.dom.click("button[type=submit]", { trusted: true });
if (result.navigated) {
console.log("Formulário enviado com sucesso, navegado para:", result.url);
}