إنتقل إلى المحتوى الرئيسي

واجهة برمجة معالجة DOM

@grant CAT.agent.dom

توفر واجهة برمجة معالجة DOM أتمتة كاملة لصفحات المتصفح: التنقل، قراءة المحتوى، لقطات الشاشة، التفاعل مع النماذج، ومراقبة الـ DOM.

إدارة التبويبات

listTabs — سرد التبويبات

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

يرجع معلومات عن كل تبويب مفتوح.

يرجع TabInfo[]:

الحقلالنوعالوصف
tabIdnumberمعرف التبويب
urlstringالرابط الحالي
titlestringعنوان الصفحة
activebooleanيحدد ما إذا كان هذا هو التبويب النشط حالياً
windowIdnumberمعرف النافذة التي ينتمي إليها
discardedbooleanيحدد ما إذا كان قد تم إهماله (معلق)

التنقل

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

المعلمات:

المعاملالنوعالافتراضيالوصف
urlstringالرابط الهدف (إلزامي)
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عنوان الصفحة
urlstringرابط الصفحة
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:

الحقلالنوعالوصف
dataUrlstringعنوان بيانات 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?);

المعلمات:

المعاملالنوعالافتراضيالوصف
selectorstringمحدد CSS (إلزامي)
options.tabIdnumberالتبويب النشط الحاليالتبويب المراد استخدامه
options.trustedbooleanfalseاستخدام CDP لإرسال حدث ماوس حقيقي

يرجع ActionResult:

الحقلالنوعالوصف
successbooleanيحدد ما إذا نجحت العملية
navigatedbooleanيحدد ما إذا كان النقر قد تسبب في تنقل الصفحة
urlstringالرابط الجديد بعد التنقل
newTabbooleanيحدد ما إذا تم فتح تبويب جديد

trusted مقابل نقرة عادية:

  • trusted: false (الافتراضي) — يحاكي element.click() عبر JS محقون؛ سريع، لكن بعض المواقع قد تكتشفه كحدث غير أصيل
  • trusted: true — يرسل حدث ماوس حقيقياً عبر Chrome DevTools Protocol، لا يمكن تمييزه عن تفاعل مستخدم فعلي، لكنه يتطلب إذن المطور

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ارتفاع نافذة العرض
atBottombooleanيحدد ما إذا تم التمرير إلى الأسفل

waitFor — انتظار عنصر

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

يستقصي ظهور العنصر المحدد على الصفحة (كل 500ms).

المعلمات:

المعاملالنوعالافتراضيالوصف
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 — تشغيل JavaScript

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

المعلمات:

المعاملالنوعالافتراضيالوصف
codestringكود JavaScript (إلزامي)
options.tabIdnumberالتبويب النشط الحاليالتبويب المراد استخدامه

يعمل الكود دائماً في الوضع MAIN للصفحة (بمشاركة نفس كائن window مع JS الصفحة نفسها)، لذا يمكنه استدعاء دوال الصفحة وقراءة متغيرات الصفحة مباشرة — لكن لنفس السبب لا يمكنه الوصول إلى روابط blob الخاصة بالإضافة (مثل رابط blob: تنشئه عبر URL.createObjectURL() من Blob الذي يرجع CAT.agent.opfs.read في وضع "blob")، لأن روابط blob مقيدة بأصل الإضافة نفسه. إذا كنت بحاجة إلى العمل مع رابط blob في سياق معزول، استخدم SkillScript بدلاً من ذلك (انظر تطوير Skills).

// Call a page's own JS function / read a page variable
const data = await CAT.agent.dom.executeScript(
"return window.__APP_STATE__"
);

// Read DOM content
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 يُزال تكراره حسب معرف العقدة ويُحد إلى 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==

// 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 box
await CAT.agent.dom.click("input[type=checkbox]#agree");

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