Playground Crawler
حين يقصر crawl من جهة العميل — Chromium من جهة الخادم لفحص DOM واكتشاف patterns ومراجعة لقطات الشاشة.
متى تحتاجه
Client-side crawl لا يكفي
SPA ثقيل بـ JS، late mount، محتوى ديناميكي، shadow DOM — هنا يتدخل Chromium من جهة الخادم.
SPA ثقيل بـ JS
تطبيقات React/Vue/Angular أحادية الصفحة — عندما يُعرَض الـ DOM بالكامل عبر JS.
Late mount
HTML الأولي فارغ؛ المحتوى الحقيقي يُحمَّل بعد 2-5 ثوانٍ — Chromium يستطيع الانتظار.
DOM يُحمَّل ديناميكياً
Scroll + click + lazy load — عناصر تحتاج تفاعلاً برمجياً لتظهر.
Shadow DOM
الوصول من جهة العميل إلى shadow root لـ web component محدود؛ Chromium من جهة الخادم يستطيع اختراقه.
3 أوضاع crawl
Single · Multi · لقطة شاشة فقط
ثلاثة أوضاع بحسب الحاجة. Multi-page يسحب قوائم URL ديناميكية من CH events_canonical.
single_page
single_pageأعطِ URL واحداً → فحص DOM + اكتشاف pattern + لقطة شاشة. أسرع وضع — مثالي لمعاينة playground.
multi_page
multi_pageCH events_canonical آخر 7 أيام distinct source_context['context_url'] → crawl متعدد الصفحات. يبحث عن نفس الـ pattern عبر الصفحات (إجمالي العدد).
screenshot_only
screenshot_onlyلقطة كاملة + viewport بلا فحص DOM. للـ UX review / regression.
مولّد selector بـ 6 استراتيجيات
Selectors متعددة الطبقات للـ auto-healing fail-safe
كل event يحصل على 6 أنواع selector — إذا انكسرت واحدة، تحلّ التالية محلها (5 طبقات fallback healing).
لماذا 6 طبقات؟
إعادة تصميم الواجهة قد تكسر CSS classes أو ARIA labels أو النصوص. ما لم تنكسر الـ 6 دفعة واحدة، يستمر تتبّع الأحداث.
dataAttrخاصية data-* — الأكثر استقراراً (تُضاف يدوياً، يتحكم بها المطور)textالنص الظاهر — قد ينكسر مع تغييرات i18ncssCSS class / id — مخاطرة أثناء refactor الـ classesxpathتعبير XPath — يعتمد على هرمية DOMregexمطابقة regex على السمات — مبنية على patternsariaARIA role + label — بدرجة accessibility، مستقر نسبياً
// 6 strateji, en spesifikten en gevşeğe doğru
{
"selectors": [
{ "type": "data_attr", "value": "[data-testid='cart-add']" },
{ "type": "aria", "value": "[role='button'][aria-label='Sepete ekle']" },
{ "type": "text", "value": "button:has-text('Sepete ekle')" },
{ "type": "css", "value": ".product-card .add-to-cart" },
{ "type": "xpath", "value": "//button[contains(., 'Sepete ekle')]" },
{ "type": "regex", "value": "button[name=~'add.cart']" }
]
}اكتشاف Patterns
1,248 زر سلة → event واحد
تجميع تلقائي للعناصر المتكررة بنفس التصميم — تعريف event واحد يغطي كل الصفحات.
كيف يجمّع؟
تجميع بـ selector + بنية DOM المجاورة + تشابه accessible label. كل العناصر في cluster واحد تُربط بـ event واحد.
# Multi-page crawl → 1.248 add-to-cart noktası bulundu
gurulu playground crawl \
--mode multi_page \
--base https://shop.example.com \
--discover ch_events_last_7d \
--max-pages 200
# Sonuç: pattern grouping (eşleşen selector → tek event'e bağla)
# event:add_to_cart → matched 1.248 instances across 47 pagesمراجعة لقطات الشاشة
MinIO presigned + thumbnail
بعد crawl، تُكتَب لقطة كل صفحة إلى MinIO؛ يُعيد الـ API redirect 302 إلى URL presigned.
GET /v1/playground/crawl/{crawl_id}/screenshot
→ 302 redirect → MinIO presigned URL (15 dk TTL)
# Thumbnail (JPEG, dashboard list için)
GET /v1/playground/crawl/{crawl_id}/screenshot?variant=thumbالتحكم بالوصول
تُعاد URLs presigned بـ TTL مدته 15 دقيقة — يُفحَص إذن workspace أولاً، ثم إعادة توجيه إلى bucket في MinIO. صور dashboard المصغّرة بصيغة JPEG.
تهيئة الأداء
Browser pool 2، timeout 30s، shm 1gb
قطاع SHM لـ Chromium 1 GB — قيمة Docker الافتراضية لـ shm_size 64 MB لن تعمل، يجب تجاوزها.
230 s1 GB1 job / workerحالات الاستخدام
Onboarding + اكتشاف
سيناريوهان نموذجيان — إعداد workspace جديد، واكتشاف patterns جديدة في workspace قائم.
Playground الـ onboarding
إعداد workspace جديد: استخدم زر 'scan multi-page' من قائمة sessions لاكتشاف patterns عبر كل الصفحات وإنشاء events دفعة واحدة.
اكتشاف Patterns
في workspace قائم بعد الإطلاق — شغّل multi-page crawl من الـ playground لإيجاد عناصر جديدة وإضافتها إلى event registry.
وثائق ذات صلة
اقرأ بعد ذلك
ابنِ جماهير من patterns، شاهد patterns تظهر في ملخص الـ AI، تعلّم المعمارية.