Перейти до основного вмісту

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:

ПолеТипОпис
dataUrlstringbase64 data URL
pathstringШлях збереження OPFS (коли використовується saveTo)
sizenumberРозмір файлу (коли використовується saveTo)

Як вибирається режим захоплення:

СценарійПоведінка
selector вказаноЗнаходить межі елемента через CDP і обрізає скріншот
Фонова вкладкаПробує скріншот CDP; якщо не вдається, активує вкладку та використовує captureVisibleTab
Вкладка на передньому планіВикористовує captureVisibleTab безпосередньо
// Зберегти скріншот в 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, не відрізнити від реальної взаємодії користувача, але потребує дозволу налагоджувача

fill — заповнення поля форми

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

Параметри:

ПараметрТипОпис
selectorstringCSS-селектор (обов'язково)
valuestringЗначення для заповнення (обов'язково)
options.tabIdnumberЯку вкладку використовувати
options.trustedbooleanВикористовувати CDP для імітації введення з клавіатури

Поведінка:

  • Звичайний режим: встановлює element.value і надсилає подію input
  • Довірений режим: 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.rolestringРоль ARIA
element.typestringтип input
element.visiblebooleanЧи видимий

Виконання скриптів

executeScript — запуск JavaScript

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

Параметри:

ПараметрТипЗа замовчуваннямОпис
codestringКод JavaScript (обов'язково)
options.tabIdnumberпоточна активна вкладкаЯку вкладку використовувати

Код завжди виконується в MAIN світі сторінки (ділиться тим самим об'єктом window, що й власний JS сторінки), тому він може викликати власні функції сторінки та читати змінні сторінки безпосередньо — але з тієї ж причини він не може отримати доступ до blob URL розширення (напр. blob: URL, створений через URL.createObjectURL() з Blob, повернутого CAT.agent.opfs.read у режимі "blob"), оскільки blob URL обмежені власним походженням розширення. Якщо вам потрібно працювати з blob URL в ізольованому контексті, використовуйте натомість SkillScript (див. Розробка Skill).

// Викликати власну JS-функцію сторінки / прочитати змінну сторінки
const data = await CAT.agent.dom.executeScript(
"return window.__APP_STATE__"
);

// Читання вмісту DOM
const title = await CAT.agent.dom.executeScript(
"return document.querySelector('h1')?.textContent"
);

Код обгортається у new Function() для виконання та підтримує значення return. Час очікування — 30 секунд.

Моніторинг DOM

Використовує Chrome DevTools Protocol для моніторингу змін DOM і подій діалогів на сторінці.

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

addedNodes дедуплікується за ID вузла та обмежується 50 записами; вузли, які з тих пір були видалені зі сторінки або не видимі, автоматично пропускаються. text — це звичайний текст, витягнутий з outerHTML вузла, обрізаний до 300 символів.

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

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

Недеструктивно перевіряє поточний статус моніторингу.

Повертає MonitorStatus:

ПолеТипОпис
hasChangesbooleanЧи є зміни
dialogCountnumberКількість діалогів
nodeCountnumberКількість нових вузлів

Повний приклад

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

// Чекати завантаження форми
await CAT.agent.dom.waitFor("form#signup", { timeout: 5000 });

// Заповнити форму
await CAT.agent.dom.fill("input[name=username]", "test_user");
await CAT.agent.dom.fill("input[name=email]", "[email protected]");

// Позначити прапорець згоди
await CAT.agent.dom.click("input[type=checkbox]#agree");

// Зробити скріншот заповненої форми
await CAT.agent.dom.screenshot({
selector: "form#signup",
saveTo: "screenshots/form-filled.png"
});

// Натиснути «Надіслати»
const result = await CAT.agent.dom.click("button[type=submit]", { trusted: true });
if (result.navigated) {
console.log("Form submitted successfully, navigated to:", result.url);
}