Tarayıcı görevlerini otomatikleştirmek, web sitelerinden veri çıkarmak, formları doldurmak, ekran görüntüsü almak, web sayfalarından yapılandırılmış veri extract etmek veya web automation workflow'ları oluşturmak için kullanın. Test işlemleri için değildir — bunun yerine playwright-pro kullanın.
cd ~/.claude/skills
git clone https://github.com/alirezarezvani/claude-skills.git claude-skills mkdir -p ~/.claude/skills/browser-automation
curl -fsSL https://raw.githubusercontent.com/alirezarezvani/claude-skills/HEAD/.gemini/skills/browser-automation/SKILL.md \
-o ~/.claude/skills/browser-automation/SKILL.md Browser Automation skill, Playwright kullanarak production-grade web automation iş akışları oluşturmak için kapsamlı araçlar ve bilgi sağlar. Bu skill veri çıkarma, form doldurma, ekran görüntüsü alma, oturum yönetimi ve ölçekte güvenilir browser automation için anti-detection desenlerini kapsar.
Bu skill ne zaman kullanılmalı:
Bu skill ne zaman kullanılmamalı:
Selenium veya Puppeteer yerine Playwright neden:
sleep() veya waitForElement() gerekmezplaywright codegen eylemlerinizi kaydeder ve script'ler üretirSelector önceliği (en güvenilir olan ilk):
data-testid, data-id veya custom data attributes — tasarımlar arası stabil#id selector'ları — benzersiz ancak deploy'lar arasında değişebilirarticle, nav, main, section — CSS değişikliklerine dayanıklı.product-card, .price — oluşturulan classlar varsa kırılgan (ör. CSS modules)nth-child(), nth-of-type() — son çare, layout değişikliklerinde kırılırXPath'i yalnızca CSS ilişkiyi ifade edemediğinde kullanın (ör. ancestor traversal, metin tabanlı seçim).
Pagination stratejileri: next-button, URL tabanlı (?page=N), infinite scroll, load-more butonu. Tam pagination handler'ları ve scroll desenleri için data_extraction_recipes.md dosyasına bakın.
Multi-step form'ları adım başına ayrık function'lara bölün. Her function alanları doldurur, "Next"/"Continue" öğesine tıklar ve bir sonraki adımın yüklenmesini bekler (URL değişikliği veya DOM elementi).
Anahtar desenler: login flow'ları, multi-page form'lar, dosya yüklemeleri (drag-and-drop zone'lar dahil), native ve custom dropdown yönetimi. fill(), select_option(), set_input_files() ve expect_file_chooser() için tam API referansı playwright_browser_api.md dosyasına bakın.
await page.screenshot(path="full.png", full_page=True)await page.locator("div.chart").screenshot(path="chart.png")await page.pdf(path="out.pdf", format="A4", print_background=True){page}_{viewport}_{state}.pngTam ekran görüntüsü/PDF seçenekleri için playwright_browser_api.md dosyasına bakın.
Temel çıkarma desenleri:
<thead> header'ları ve <tbody> satırlarını sözlüklere çıkarın::attr() destekler)Tam çıkarma function'ları, fiyat parsing, veri temizleme utilities ve output format helper'ları (JSON, CSV, JSONL) için data_extraction_recipes.md dosyasına bakın.
context.cookies() ve context.add_cookies()context.storage_state(path="state.json") kaydetmek için, browser.new_context(storage_state="state.json") geri yüklemek içinBest practice: Login'den sonra state kaydedin, scraping oturumları arasında yeniden kullanın. Uzun bir job başlatmadan önce oturum geçerliliğini kontrol edin — protected bir sayfaya hafif bir istek yapın ve login'e yönlendirilmediğinizi doğrulayın. Cookie ve storage state API detayları için playwright_browser_api.md dosyasına bakın.
Modern web siteleri automation'ı birden fazla vektör aracılığıyla algılarlar. Bunları öncelik sırasına göre uygulayın:
navigator.webdriver = true öğesini kaldırın (kritik)random.uniform() delay'leri ekleyinNavigator property hardening, WebGL/canvas fingerprint evasion, behavioral simulation (mouse movement, typing speed, scroll patterns), proxy rotation stratejileri ve detection self-test URL'leri için tam stealth stack anti_detection_patterns.md dosyasına bakın.
wait_for_selector)page.expect_response("**/api/data*") kullanın>> operator'ü ile pierces'ler: page.locator("custom-element >> .inner-class")scroll_into_view_if_needed() ileWait stratejileri, network interception ve Shadow DOM detayları için playwright_browser_api.md dosyasına bakın.
TimeoutError'da başarısız olmadan önce alternative selector'ları deneyinpage.screenshot(path="error-state.png") alınRetry-After header'larına saygı gösterinTam exponential backoff implementation'ı ve rate limiter class'ını anti_detection_patterns.md dosyasına bakın.
Senaryo: JavaScript render'ı yapılmış içeriğe sahip bir sayfadan product verisi çıkarın.
Adımlar:
headless=False), production için headless'a geçinquery_selector_all kullanarak veri çıkarınasync def extract_single_page(url, selectors):
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
context = await browser.new_context(
viewport={"width": 1920, "height": 1080},
user_agent="Mozilla/5.0 ..."
)
page = await context.new_page()
await page.goto(url, wait_until="networkidle")
data = await extract_listings(page, selectors["container"], selectors["fields"])
await browser.close()
return data
Senaryo: 50+ sayfa arasında arama sonuçlarını scrape'leyin.
Adımlar:
async def scrape_paginated(base_url, selectors, max_pages=100):
all_data = []
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await (await browser.new_context()).new_page()
await page.goto(base_url)
for page_num in range(max_pages):
items = await extract_listings(page, selectors["container"], selectors["fields"])
all_data.extend(items)
next_btn = page.locator(selectors["next_button"])
if await next_btn.count() == 0 or await next_btn.is_disabled():
break
await next_btn.click()
await page.wait_for_selector(selectors["container"])
await human_delay(800, 2000)
await browser.close()
return all_data
Senaryo: Bir portal'da login yapın, multi-step form'da navigate edin, bir report indirin.
Adımlar:
async def authenticated_workflow(credentials, form_data, download_dir):
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
state_file = "session_state.json"
# Restore or create session
if os.path.exists(state_file):
context = await browser.new_context(storage_state=state_file)
else:
context = await browser.new_context()
page = await context.new_page()
await login(page, credentials["url"], credentials["user"], credentials["pass"])
await context.storage_state(path=state_file)
page = await context.new_page()
await page.goto(form_data["target_url"])
# Fill form steps
for step_fn in [fill_step_1, fill_step_2]:
await step_fn(page, form_data)
# Handle download
async with page.expect_download() as dl_info:
await page.click("button:has-text('Download Report')")
download = await dl_info.value
await download.save_as(os.path.join(download_dir, download.suggested_filename))
await browser.close()
| Script | Amaç | Anahtar Flagler | Output |
|---|---|---|---|
scraping_toolkit.py |
Playwright scraping script iskeletini oluştur | --url, --selectors, --paginate, --output |
Python script veya JSON config |
form_automation_builder.py |
Field spec'ten form-fill automation script'i oluştur | --fields, --url, --output |
Python automation script |
anti_detection_checker.py |
Bir Playwright script'i detection vektörleri için audit et | --file, --verbose |
Risk raporu ve score |
Tüm script'ler stdlib-only'dir. Tam kullanım için python3 <script> --help çalıştırın.
Kötü: Her işlemden önce await page.wait_for_timeout(5000).
İyi: wait_for_selector, wait_for_url, expect_response veya wait_for_load_state kullanın. Hardcoded wait'ler flaky ve yavaştır.
Kötü: İlk hatada crash'e giren linear script. İyi: Her page interaction'ı try/except'e sarmalayın. Error-state screenshot'ları alın. Exponential backoff ile retry implement edin.
Kötü: robots.txt directive'lerini kontrol etmeden scrape etme.
İyi: Scrape'lemeden önce robots.txt dosyasını fetch'leyin ve parse'leyin. Crawl-delay'e saygı gösterin. Disallowed path'leri skip edin. Ölçekte çalıştırıyorsanız User-Agent'a bot isminizi ekleyin.
Kötü: Python dosyalarında username ve password hardcode'lama.
İyi: Environment variable'ları, .env dosyaları (gitignored) veya secrets manager kullanın. Credentials'ları CLI argument'leri aracılığıyla geçin.
Kötü: Bir site'ye saniyede 100 request ile vurmak. İyi: Request'ler arasına random delay'ler ekleyin (polite scraping için 1-3s). 429 yanıtlarını monitör edin. Exponential backoff implement edin.
Kötü: Auto-generated class name'lere (.css-1a2b3c) veya deep nesting'e (div > div > div > span:nth-child(3)) güvenmek.
İyi: Data attribute'leri, semantic HTML veya text-based locator'ları kullanın. Selector'ları browser DevTools'ta test edin.
Kötü: Browser'ları kapatmadan başlatmak, resource leak'lerine yol açmak.
İyi: try/finally veya async context manager'larını kullanarak browser.close()'ın çağrıldığından emin olun.
Kötü: Production/CI'da headless=False kullanmak.
İyi: Debugging için headed mode'da geliştirin, headless=True ile deploy edin. Toggle etmek için environment variable kullanın: headless = os.environ.get("HEADLESS", "true") == "true".
Herhangi bir yaratıcı çalışmaya başlamadan önce bunu mutlaka kullanın - feature oluştururken, component inşa ederken, functionality eklerken veya davranış değiştirirken. Kullanıcı niyetini, gereksinimleri ve tasarımı implementation öncesinde araştırır.
Uygulama tamamlandığında, tüm testler geçtiğinde ve çalışmanızı nasıl entegre edeceğinize karar vermeniz gerektiğinde kullanın - merge, PR veya cleanup seçeneklerini sunarak geliştirme sürecinin tamamlanmasını rehberlik eder.
Kod incelemesi geri bildirimi alırken, önerileri uygulamadan önce kullanın; özellikle geri bildirim belirsiz veya teknik olarak şüpheli görünüyorsa - performatif anlaşmadan veya körü körüne uygulamadan ziyade teknik titizlik ve doğrulama gerekir.
Görevleri tamamlarken, büyük özellikleri hayata geçirirken veya merge etmeden önce çalışmanın gereksinimleri karşıladığını doğrulamak için kullanın.
Yeni bir feature üzerinde çalışmaya başlarken veya implementasyon planını yürütmeden önce kullanın - native araçlar veya git worktree fallback aracılığıyla izole edilmiş bir workspace sağlar.
Herhangi bir konuşma başlatırken kullanın - skill'lerin nasıl bulunacağını ve kullanılacağını belirler, clarification soruları da dahil olmak üzere HERHANGİ bir yanıt vermeden önce skill invocation gerektirir.