پرش به مطلب اصلی

API دستکاری DOM

@grant CAT.agent.dom

API دستکاری DOM اتوماسیون کامل صفحه مرورگر را فراهم می‌کند: ناوبری، خواندن محتوا، اسکرین‌شات، تعامل با فرم و نظارت DOM.

مدیریت تب

listTabs — فهرست تب‌ها

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

اطلاعات مربوط به هر تب باز را برمی‌گرداند.

بازگشت TabInfo[]:

فیلدنوعتوضیحات
tabIdnumberشناسه تب
urlstringURL فعلی
titlestringعنوان صفحه
activebooleanآیا این تب فعال فعلی است
windowIdnumberشناسه پنجره‌ای که به آن تعلق دارد
discardedbooleanآیا کنار گذاشته شده (به حالت تعلیق درآمده)

ناوبری

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

پارامترها:

پارامترنوعپیش‌فرضتوضیحات
urlstringURL هدف (الزامی)
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.selectorstringانتخابگر CSS؛ فقط محتوای عنصر مطابق برگردانده می‌شود
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.selectorstringانتخابگر CSS؛ فقط ناحیه عنصر مطابق را ضبط کنید
options.saveTostringمسیر ذخیره در فضای کار OPFS

بازگشت ScreenshotResult:

فیلدنوعتوضیحات
dataUrlstringURL داده base64
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(`ذخیره شد در ${shot.path}, اندازه ${shot.size} bytes`);

تعامل با صفحه

click — کلیک روی یک عنصر

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

پارامترها:

پارامترنوعپیش‌فرضتوضیحات
selectorstringانتخابگر CSS (الزامی)
options.tabIdnumberتب فعال فعلیاز کدام تب استفاده شود
options.trustedbooleanfalseاز CDP برای ارسال یک رویداد واقعی ماوس استفاده کنید

بازگشت ActionResult:

فیلدنوعتوضیحات
successbooleanآیا موفق بود
navigatedbooleanآیا کلیک ناوبری صفحه را فعال کرد
urlstringURL جدید پس از ناوبری
newTabbooleanآیا تب جدیدی باز شد

trusted در برابر کلیک معمولی:

  • trusted: false (پیش‌فرض) — element.click() را از طریق JS تزریق‌شده شبیه‌سازی می‌کند؛ سریع، اما برخی سایت‌ها ممکن است آن را به عنوان رویداد غیرواقعی تشخیص دهند
  • trusted: true — یک رویداد واقعی ماوس از طریق Chrome DevTools Protocol ارسال می‌کند، غیرقابل تشخیص از تعامل واقعی کاربر، اما نیاز به مجوز debugger دارد

fill — پر کردن فیلد فرم

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

پارامترها:

پارامترنوعتوضیحات
selectorstringانتخابگر CSS (الزامی)
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ارتفاع viewport
atBottombooleanآیا اکنون به پایین اسکرول شده است

waitFor — انتظار برای یک عنصر

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

برای ظاهر شدن عنصر مشخص‌شده در صفحه نظرسنجی می‌کند (هر ۵۰۰ میلی‌ثانیه بررسی).

پارامترها:

پارامترنوعپیش‌فرضتوضیحات
selectorstringانتخابگر CSS (الزامی)
options.tabIdnumberتب فعال فعلیاز کدام تب استفاده شود
options.timeoutnumber10000مهلت زمانی در میلی‌ثانیه

بازگشت WaitForResult:

فیلدنوعتوضیحات
foundbooleanآیا عنصر پیدا شد
elementobjectاطلاعات عنصر (فقط زمانی که found=true)
element.selectorstringانتخابگر مطابق
element.tagstringنام تگ
element.textstringمحتوای متنی
element.rolestringنقش ARIA
element.typestringنوع ورودی
element.visiblebooleanآیا قابل مشاهده است

اجرای اسکریپت

executeScript — اجرای جاوااسکریپت

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

پارامترها:

پارامترنوعپیش‌فرضتوضیحات
codestringکد جاوااسکریپت (الزامی)
options.tabIdnumberتب فعال فعلیاز کدام تب استفاده شود

کد همیشه در دنیای MAIN صفحه اجرا می‌شود (همان شیء window را با JS خود صفحه به اشتراک می‌گذارد)، بنابراین می‌تواند توابع خود صفحه را فراخوانی کند و متغیرهای صفحه را مستقیماً بخواند — اما به همین دلیل نمی‌تواند به URLهای blob افزونه دسترسی پیدا کند (مثلاً یک URL blob: که از طریق URL.createObjectURL() از Blob برگردانده‌شده توسط CAT.agent.opfs.read در حالت "blob" ایجاد می‌کنید)، زیرا URLهای blob محدود به مبدأ خود افزونه هستند. اگر نیاز به کار با یک URL blob در یک زمینه ایزوله دارید، به جای آن از یک 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 پشتیبانی می‌کند. مهلت زمانی ۳۰ ثانیه است.

نظارت 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 بر اساس شناسه گره حذف تکراری می‌شود و به ۵۰ ورودی محدود می‌شود؛ گره‌هایی که از آن زمان از صفحه حذف شده‌اند یا قابل مشاهده نیستند به طور خودکار رد می‌شوند. text متن ساده استخراج‌شده از outerHTML گره است که به ۳۰۰ کاراکتر بریده شده است.

peekMonitor — بررسی وضعیت نظارت

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

به صورت غیرمخرب وضعیت نظارت فعلی را بررسی می‌کند.

بازگشت MonitorStatus:

فیلدنوعتوضیحات
hasChangesbooleanآیا تغییری وجود دارد
dialogCountnumberتعداد گفتگوها
nodeCountnumberتعداد گره‌های تازه اضافه‌شده

مثال کامل

// ==UserScript==
// @name پرکننده خودکار فرم
// @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("فرم با موفقیت ارسال شد، به موارد زیر هدایت شد:", result.url);
}