--- name: browser-debugging description: "Chrome DevTools MCP ile browser debugging. Console, network, performance, DOM analizi." --- # Browser Debugging (Chrome DevTools MCP) ## Chrome DevTools MCP Setup ### Kurulum ```bash # NPM ile npm install -g @anthropic/chrome-devtools-mcp # veya npx ile (kurulum gerektirmez) npx @anthropic/chrome-devtools-mcp ``` ### MCP Config (~/.mcp.json) ```json { "mcpServers": { "chrome-devtools": { "command": "npx", "args": ["-y", "@anthropic/chrome-devtools-mcp"], "env": { "CHROME_DEVTOOLS_PORT": "9222" } } } } ``` ### Chrome'u Debug Modunda Baslat ```bash # macOS /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --remote-debugging-port=9222 \ --user-data-dir=/tmp/chrome-debug # Linux google-chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug # Headless mod google-chrome --headless --remote-debugging-port=9222 ``` ## Console Log Okuma ve Analiz ### Console Mesajlarini Yakala ``` devtools.get_console_logs({ level: "error", // log | warn | error | info | debug limit: 50, clear_after: false }) ``` ### Console Mesaj Analizi | Seviye | Anlam | Aksiyon | |--------|-------|---------| | error | Runtime hatasi | HEMEN fix et | | warn | Potansiyel sorun | Incele, gerekiyorsa fix | | info | Bilgi mesaji | Debug icin kullan | | log | Debug output | Temizle (production'da olmamali) | ### Yaygin Console Hatalari ``` // TypeError: Cannot read properties of undefined → Null check eksik, optional chaining kullan: obj?.prop // CORS error → Backend'de Access-Control-Allow-Origin header eksik // Uncaught Promise rejection → async/await'te try/catch eksik // React: Each child should have a unique key → map() icinde key={unique_id} ekle // React: Maximum update depth exceeded → useEffect dependency array'de sonsuz dongu ``` ## Network Request Izleme ### Request'leri Listele ``` devtools.get_network_requests({ url_filter: "/api/", method: "POST", status_code: 500, limit: 20 }) ``` ### Request Detayi ``` devtools.get_request_detail({ request_id: "req-123", include_body: true, include_headers: true }) ``` ### Network Analiz Tablosu | Metrik | Iyi | Kotu | Kontrol | |--------|-----|------|---------| | TTFB | <200ms | >600ms | Server response suresi | | Download | <100ms | >500ms | Payload buyuklugu | | Total time | <500ms | >2s | Butun pipeline | | Payload size | <100KB | >1MB | Compression, pagination | | Request count | <50/sayfa | >100/sayfa | Batching, caching | ### Yaygin Network Sorunlari ``` Status 401 → Token expired, auth flow kontrol et Status 403 → Permission eksik, RBAC kontrol et Status 404 → URL yanlis, routing kontrol et Status 429 → Rate limited, backoff ekle Status 500 → Server error, backend log'lara bak Status 502 → Proxy/gateway sorunu, infra kontrol et CORS error → Preflight (OPTIONS) basarisiz Mixed content → HTTPS sayfada HTTP request ``` ## Performance Profiling ### Performance Snapshot ``` devtools.get_performance_metrics({ include_timing: true, include_memory: true }) ``` ### Core Web Vitals Olcumu ``` devtools.evaluate_expression({ expression: ` new PerformanceObserver((list) => { for (const entry of list.getEntries()) { console.log(entry.name, entry.value || entry.startTime); } }).observe({ type: 'largest-contentful-paint', buffered: true }); ` }) ``` ### Performance Metrikleri | Metrik | Hedef | Olcum | |--------|-------|-------| | LCP | <2.5s | En buyuk elementin renderlanma suresi | | FID/INP | <100ms | Ilk input'a tepki suresi | | CLS | <0.1 | Gorsel kayma skoru | | FCP | <1.8s | Ilk icerigin gorundugu an | | TTI | <3.8s | Tamamen interaktif olma suresi | | TBT | <200ms | Main thread bloklanma suresi | ### Performance Anti-Patterns ``` 1. Layout thrashing: DOM oku/yaz/oku/yaz (batch et) 2. Forced reflow: offsetHeight gibi prop'lar reflow tetikler 3. Unoptimized images: WebP/AVIF kullan, lazy load et 4. Render blocking CSS: Critical CSS inline, gerisi async 5. Long tasks: 50ms+ main thread task'lari parcala 6. Excessive DOM: 1500+ node varsa virtual scroll kullan ``` ## DOM Inspection ### Element Sec ve Incele ``` devtools.query_selector({ selector: "#main-content .card", include_styles: true, include_attributes: true }) ``` ### DOM Tree ``` devtools.get_dom_tree({ depth: 3, root_selector: "#app" }) ``` ### Element Sayisi Kontrol ``` devtools.evaluate_expression({ expression: "document.querySelectorAll('*').length" }) // 1500+ ise performance sorunu ``` ### Computed Styles ``` devtools.get_computed_styles({ selector: ".problematic-element", properties: ["display", "position", "z-index", "overflow"] }) ``` ## JavaScript Debugging ### Expression Evaluate Et ``` devtools.evaluate_expression({ expression: "JSON.stringify(window.__NEXT_DATA__, null, 2)" }) ``` ### State Inspection (React) ``` devtools.evaluate_expression({ expression: ` // React DevTools hook const fiber = document.querySelector('#root')._reactRootContainer?._internalRoot?.current; JSON.stringify(fiber?.memoizedState, null, 2); ` }) ``` ### Event Listener Kontrolu ``` devtools.evaluate_expression({ expression: ` const el = document.querySelector('.button'); getEventListeners(el); ` }) ``` ### Breakpoint Yonetimi ``` // Conditional breakpoint devtools.set_breakpoint({ url: "main.js", line: 42, condition: "user.role === 'admin'" }) // DOM breakpoint devtools.set_dom_breakpoint({ selector: "#dynamic-content", type: "subtree-modifications" // subtree-modifications | attribute-modifications | node-removal }) ``` ## Memory Leak Tespiti ### Heap Snapshot ``` devtools.take_heap_snapshot({ include_summary: true }) ``` ### Memory Timeline ``` devtools.get_memory_info() // Response: { jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize } ``` ### Memory Leak Tespiti Adimlari ``` 1. Baslangic heap snapshot al 2. Suphelenen aksiyonu yap (navigate, modal ac/kapa) 3. GC tetikle (devtools uzerinden) 4. Ikinci heap snapshot al 5. Comparison view'da "Detached" DOM node'lari ara 6. Retained size buyuk olan objeleri incele ``` ### Yaygin Memory Leak Sebepleri | Sebep | Cozum | |-------|-------| | Event listener temizlenmemis | useEffect return cleanup | | setInterval temizlenmemis | clearInterval in cleanup | | Detached DOM | removeChild + null referans | | Closure capturing | WeakRef veya scope daralt | | Global degisken birikimi | Scope'a al, gereksizini sil | | WebSocket kapatilmamis | close() in cleanup | ## CSS Debugging ### CSS Coverage ``` devtools.get_css_coverage({ url_filter: "styles.css" }) // Kullanilmayan CSS oranini goster ``` ### Layout Sorunlari ``` // Overflow tespiti devtools.evaluate_expression({ expression: ` [...document.querySelectorAll('*')].filter(el => { return el.scrollWidth > el.clientWidth || el.scrollHeight > el.clientHeight; }).map(el => ({ tag: el.tagName, class: el.className, overflow: { w: el.scrollWidth - el.clientWidth, h: el.scrollHeight - el.clientHeight } })); ` }) ``` ### Z-index Debugging ``` devtools.evaluate_expression({ expression: ` [...document.querySelectorAll('*')] .filter(el => getComputedStyle(el).zIndex !== 'auto') .map(el => ({ tag: el.tagName, class: el.className, zIndex: getComputedStyle(el).zIndex, position: getComputedStyle(el).position })) .sort((a, b) => Number(b.zIndex) - Number(a.zIndex)); ` }) ``` ### CSS Anti-Patterns | Anti-Pattern | Dogru Yol | |-------------|-----------| | !important kullanimi | Specificity'yi artir | | Inline style | Class/utility kullan | | Magic number z-index | z-index scale tanimla | | Fixed px font size | rem/em kullan | | * selector | Spesifik selector | ## Lighthouse Audit ### Programmatic Lighthouse ``` devtools.run_lighthouse({ url: "http://localhost:3000", categories: ["performance", "accessibility", "best-practices", "seo"], form_factor: "mobile" // mobile | desktop }) ``` ### Lighthouse Skor Hedefleri | Kategori | Minimum | Hedef | |----------|---------|-------| | Performance | 70 | 90+ | | Accessibility | 80 | 100 | | Best Practices | 80 | 100 | | SEO | 80 | 100 | ### Accessibility Kontrolleri ``` devtools.evaluate_expression({ expression: ` // Eksik alt text [...document.querySelectorAll('img:not([alt])')].length; ` }) devtools.evaluate_expression({ expression: ` // Eksik label [...document.querySelectorAll('input:not([aria-label]):not([id])')].length; ` }) ``` ## Real-Time Browser State Inspection ### Page State ``` devtools.get_page_info() // Response: url, title, status, loading_state ``` ### Tab Yonetimi ``` // Tum tab'lari listele devtools.list_targets() // Tab'a baglan devtools.attach_to_target({ target_id: "target-123" }) ``` ### Screenshot ``` devtools.take_screenshot({ format: "png", quality: 80, full_page: true }) ``` ### Cookie Inspection ``` devtools.get_cookies({ url: "http://localhost:3000" }) ``` ### Local/Session Storage ``` devtools.evaluate_expression({ expression: ` ({ localStorage: Object.keys(localStorage).reduce((acc, key) => { acc[key] = localStorage.getItem(key); return acc; }, {}), sessionStorage: Object.keys(sessionStorage).reduce((acc, key) => { acc[key] = sessionStorage.getItem(key); return acc; }, {}) }) ` }) ``` ## Debug Workflow ### Sistematik Debug Adimlari ``` 1. REPRODUCE - Console log'lari oku (error seviyesi) - Network request'leri incele (4xx/5xx) - Screenshot al (goruntuyu dogrula) 2. ISOLATE - DOM inspect et (element var mi, dogru mu) - CSS kontrol et (gorunum sorunu mu) - JS evaluate et (state dogru mu) - Network filtrele (hangi request basarisiz) 3. DIAGNOSE - Performance profil al (yavas mi) - Memory kontrol et (leak var mi) - Lighthouse calistir (genel skor) 4. FIX & VERIFY - Kodu duzelt - Browser'da tekrar kontrol et - Console temiz mi - Network basarili mi - Performance iyilesti mi ``` ## Entegrasyon: browser-use MCP Mevcut browser-use MCP ile birlikte kullanim: ``` browser-use: Sayfa navigasyon, form doldurma, tikla, icerik cek chrome-devtools: Console, network, performance, DOM, memory analizi Workflow: 1. browser-use ile sayfaya git 2. chrome-devtools ile console error kontrol 3. chrome-devtools ile network analiz 4. browser-use ile interaksiyon yap 5. chrome-devtools ile performance olc ```