Перейти к основному содержимому

API DOM

@grant CAT.agent.dom

API DOM предоставляет полный набор возможностей автоматизации страниц браузера: навигацию, чтение содержимого, скриншоты, взаимодействие с формами и мониторинг DOM.

Управление вкладками

listTabs — список вкладок

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

Возвращает информацию о каждой открытой вкладке.

Возвращаемое значение, TabInfo[]:

ПолеТипОписание
tabIdnumberID вкладки
urlstringТекущий URL
titlestringЗаголовок страницы
activebooleanЯвляется ли текущей активной вкладкой
windowIdnumberID окна, которому принадлежит
discardedbooleanБыла ли выгружена (приостановлена)

Навигация

const result = await CAT.agent.dom.navigate(url, options?);

Параметры:

ПараметрТипПо умолчаниюОписание
urlstringЦелевой URL (обязательно)
options.tabIdnumberтекущая активная вкладкаУказать вкладку
options.waitUntilbooleantrueЖдать ли окончания загрузки страницы
options.timeoutnumber30000Таймаут в миллисекундах

Возвращаемое значение, NavigateResult:

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

Чтение содержимого

readPage — прочитать содержимое страницы

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

Преобразует DOM страницы в структурированный текст, автоматически удаляя нерелевантные элементы вроде <script>, <style>, <noscript>, <svg> и <link[rel=stylesheet]>.

Параметры:

ПараметрТипПо умолчаниюОписание
options.tabIdnumberтекущая активная вкладкаУказать вкладку
options.selectorstringCSS-селектор; возвращает только содержимое совпадающих элементов
options.maxLengthnumberМаксимальное число символов; сверх — обрезка
options.removeTagsstring[]Дополнительные имена тегов для удаления

Возвращаемое значение, PageContent:

ПолеТипОписание
titlestringЗаголовок страницы
urlstringURL страницы
htmlstringОбработанное текстовое содержимое страницы
truncatedbooleanБыло ли содержимое обрезано
totalLengthnumberИсходная полная длина содержимого

screenshot — сделать скриншот

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

Параметры:

ПараметрТипПо умолчаниюОписание
options.tabIdnumberтекущая активная вкладкаУказать вкладку
options.qualitynumber80Качество JPEG (0-100)
options.fullPagebooleanfalseСнять всю страницу
options.selectorstringCSS-селектор; снимает только область совпадающего элемента
options.saveTostringПуть сохранения в рабочем пространстве OPFS

Возвращаемое значение, ScreenshotResult:

ПолеТипОписание
dataUrlstringData URL в base64
pathstringПуть сохранения в OPFS (если использован saveTo)
sizenumberРазмер файла (если использован saveTo)

Выбор режима скриншота:

СценарийПоведение
Используется selectorГраницы элемента находятся через CDP, скриншот обрезается
Фоновая вкладкаПытается CDP-скриншот; при неудаче активирует вкладку и использует captureVisibleTab
Передняя вкладкаСразу использует 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`);

Взаимодействие со страницей

click — клик по элементу

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

Параметры:

ПараметрТипПо умолчаниюОписание
selectorstringCSS-селектор (обязательно)
options.tabIdnumberтекущая активная вкладкаУказать вкладку
options.trustedbooleanfalseИспользовать CDP для настоящего события мыши

Возвращаемое значение, ActionResult:

ПолеТипОписание
successbooleanУспешность
navigatedbooleanПривёл ли клик к навигации страницы
urlstringНовый URL после навигации
newTabbooleanБыла ли открыта новая вкладка

trusted и обычный клик:

  • trusted: false (по умолчанию) — симулирует element.click() через внедрённый JS; быстро, но некоторые сайты могут распознать как ненастоящее событие
  • trusted: true — отправляет настоящее событие мыши через Chrome DevTools Protocol, ведёт себя как действие реального пользователя, но требует разрешение debugger

fill — заполнить форму

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

Параметры:

ПараметрТипОписание
selectorstringCSS-селектор (обязательно)
valuestringЗначение для ввода (обязательно)
options.tabIdnumberУказать вкладку
options.trustedbooleanИспользовать CDP для имитации ввода с клавиатуры

Поведение:

  • Обычный режим: устанавливает element.value и отправляет событие input
  • Режим trusted: CDP фокусирует элемент → вводит посимвольно

scroll — прокрутить страницу

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

Параметры:

ПараметрТипОписание
direction"up" | "down" | "top" | "bottom"Направление прокрутки (обязательно)
options.tabIdnumberУказать вкладку
options.selectorstringПрокрутить конкретный контейнер вместо всей страницы

Возвращаемое значение, ScrollResult:

ПолеТипОписание
scrollTopnumberПозиция прокрутки после действия
scrollHeightnumberПолная высота содержимого
clientHeightnumberВысота видимой области
atBottombooleanДостигнут ли низ

waitFor — ждать элемент

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

Опрашивает появление указанного элемента на странице (проверка каждые 500 мс).

Параметры:

ПараметрТипПо умолчаниюОписание
selectorstringCSS-селектор (обязательно)
options.tabIdnumberтекущая активная вкладкаУказать вкладку
options.timeoutnumber10000Таймаут в миллисекундах

Возвращаемое значение, WaitForResult:

ПолеТипОписание
foundbooleanНайден ли элемент
elementobjectИнформация об элементе (только при found=true)
element.selectorstringСовпавший селектор
element.tagstringИмя тега
element.textstringТекстовое содержимое
element.rolestringARIA role
element.typestringinput type
element.visiblebooleanВидимость

Выполнение скриптов

executeScript — выполнить JavaScript

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

Параметры:

ПараметрТипПо умолчаниюОписание
codestringКод JavaScript (обязательно)
options.tabIdnumberтекущая активная вкладкаУказать вкладку
options.world"MAIN" | "ISOLATED""ISOLATED"Окружение выполнения

Два окружения выполнения:

ОкружениеОписаниеСценарий
ISOLATEDИзолированное окружение расширения, отделённое от JS страницыМанипуляции DOM, чтение контента, использование blob URL расширения
MAINСобственное окружение страницы, общий объект windowВызов JS-функций страницы, чтение переменных страницы
// ISOLATED — safely read the DOM
const title = await CAT.agent.dom.executeScript(
"return document.querySelector('h1')?.textContent",
{ world: "ISOLATED" }
);

// MAIN — call a JS function on the page
const data = await CAT.agent.dom.executeScript(
"return window.__APP_STATE__",
{ world: "MAIN" }
);

Код оборачивается в new Function() для выполнения и поддерживает return. Таймаут — 30 секунд.

Мониторинг DOM

Отслеживает изменения DOM и события диалогов на странице через Chrome DevTools Protocol.

startMonitor — начать мониторинг

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

Начинает мониторинг изменений DOM и диалогов (alert/confirm/prompt) на указанной вкладке.

stopMonitor — остановить мониторинг

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

Останавливает мониторинг и возвращает собранные изменения.

Возвращаемое значение, MonitorResult:

ПолеТипОписание
dialogsArray<{ type, message }>Список диалогов
addedNodesArray<{ tag, id?, class?, role?, text }>Сводка вновь добавленных узлов DOM

peekMonitor — проверить статус мониторинга

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

Неразрушающе проверяет текущий статус мониторинга.

Возвращаемое значение, MonitorStatus:

ПолеТипОписание
hasChangesbooleanЕсть ли изменения
dialogCountnumberЧисло диалогов
nodeCountnumberЧисло вновь добавленных узлов

Полный пример

// ==UserScript==
// @name Automatic Form Filling
// @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 checkbox
await CAT.agent.dom.click("input[type=checkbox]#agree");

// Screenshot the filled-in result
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);
}