Loading skill
Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Browser automation and E2E testing with Playwright. Use when testing web applications, automating browser interactions, validating user flows, checking responsive design, or performing browser-based testing. Auto-detects dev servers and writes clean test scripts.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 64% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 160% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 44% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 63% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 140% | 0% |
Playwright ile web uygulaması E2E testi ve browser otomasyonu rehberi.
bashnpm install playwright npx playwright install chromium
Adım 1 — Dev server tespit et:
bash# Çalışan port'ları kontrol et npx detect-port 3000 3001 3002 4000 8080 | grep -v "available"
Adım 2 — Test script'i /tmp'ye yaz: Test dosyalarını proje dizinine değil /tmp/playwright-test-*.js'e yaz.
Adım 3 — Çalıştır:
bashnode /tmp/playwright-test-example.js
javascriptconst { chromium } = require('playwright') const TARGET_URL = 'http://localhost:3000' ;(async () => { const browser = await chromium.launch({ headless: false }) const page = await browser.newPage() try { await page.goto(TARGET_URL, { waitUntil: 'networkidle', timeout: 10000 }) console.log('Başlık:', await page.title()) await page.screenshot({ path: '/tmp/screenshot.png', fullPage: true }) console.log('📸 Screenshot: /tmp/screenshot.png') } catch (error) { console.error('❌ Hata:', error.message) } finally { await browser.close() } })()
javascriptconst { chromium } = require('playwright') const TARGET_URL = 'http://localhost:3000' ;(async () => { const browser = await chromium.launch({ headless: false, slowMo: 50 }) const page = await browser.newPage() await page.goto(`${TARGET_URL}/contact`) await page.fill('input[name="name"]', 'Test Kullanıcı') await page.fill('input[name="email"]', 'test@example.com') await page.fill('textarea[name="message"]', 'Test mesajı') await page.click('button[type="submit"]') await page.waitForSelector('.success-message') console.log('✅ Form başarıyla gönderildi') await browser.close() })()
javascriptconst { chromium } = require('playwright') const TARGET_URL = 'http://localhost:3000' ;(async () => { const browser = await chromium.launch({ headless: false }) const page = await browser.newPage() await page.goto(`${TARGET_URL}/login`) await page.fill('input[name="email"]', 'test@example.com') await page.fill('input[name="password"]', 'password123') await page.click('button[type="submit"]') await page.waitForURL('**/dashboard', { timeout: 5000 }) console.log("✅ Login başarılı, dashboard'a yönlendirildi") await browser.close() })()
javascriptconst { chromium } = require('playwright') const TARGET_URL = 'http://localhost:3000' ;(async () => { const browser = await chromium.launch({ headless: false }) const page = await browser.newPage() const viewports = [ { name: 'Desktop', width: 1440, height: 900 }, { name: 'Tablet', width: 768, height: 1024 }, { name: 'Mobile', width: 375, height: 667 }, ] for (const viewport of viewports) { console.log(`Testing ${viewport.name} (${viewport.width}x${viewport.height})...`) await page.setViewportSize({ width: viewport.width, height: viewport.height }) await page.goto(TARGET_URL) await page.waitForTimeout(500) await page.screenshot({ path: `/tmp/${viewport.name.toLowerCase()}.png`, fullPage: true, }) console.log(` 📸 /tmp/${viewport.name.toLowerCase()}.png`) } await browser.close() })()
javascriptconst { chromium } = require('playwright') ;(async () => { const browser = await chromium.launch({ headless: false }) const page = await browser.newPage() await page.goto('http://localhost:3000') const links = await page.locator('a[href^="http"]').all() const results = { working: 0, broken: [] } for (const link of links) { const href = await link.getAttribute('href') try { const response = await page.request.head(href) if (response.ok()) { results.working++ } else { results.broken.push({ url: href, status: response.status() }) } } catch (e) { results.broken.push({ url: href, error: e.message }) } } console.log(`✅ Çalışan linkler: ${results.working}`) if (results.broken.length > 0) { console.log(`❌ Kırık linkler:`, results.broken) } await browser.close() })()
javascriptconst { chromium } = require('playwright') ;(async () => { const browser = await chromium.launch({ headless: false }) const page = await browser.newPage() const consoleErrors = [] page.on('console', (msg) => { if (msg.type() === 'error') consoleErrors.push(msg.text()) }) await page.goto('http://localhost:3000') await page.waitForTimeout(2000) if (consoleErrors.length > 0) { console.log('🚨 Console hataları bulundu:') consoleErrors.forEach((err) => console.log(` - ${err}`)) } else { console.log('✅ Console hatası yok') } await browser.close() })()
javascript// ✅ İyi — duruma göre bekle await page.waitForURL('**/dashboard') await page.waitForSelector('.success-message') await page.waitForLoadState('networkidle') await page.waitForResponse((response) => response.url().includes('/api/')) // ❌ Kötü — sabit timeout (çok kırılgan) await page.waitForTimeout(3000) // Sadece gerektiğinde
javascript// En sağlam — test-id ile await page.locator('[data-testid="submit-button"]').click() // ARIA role ile await page.getByRole('button', { name: 'Kaydet' }).click() await page.getByRole('textbox', { name: 'Email' }).fill('test@example.com') // Label ile await page.getByLabel('Email adresi').fill('test@example.com') // Metin ile await page.getByText('Başarıyla kaydedildi').waitFor() // CSS seçici (daha kırılgan) await page.locator('button[type="submit"]').click()
javascriptconst { chromium } = require('playwright') const path = require('path') ;(async () => { const browser = await chromium.launch({ headless: false }) const page = await browser.newPage() await page.goto('http://localhost:3000/cv/upload') const fileChooserPromise = page.waitForEvent('filechooser') await page.click('[data-testid="upload-area"]') const fileChooser = await fileChooserPromise await fileChooser.setFiles(path.join(__dirname, 'test-cv.pdf')) await page.waitForSelector('[data-testid="upload-success"]', { timeout: 30000 }) console.log('✅ CV yükleme başarılı') await browser.close() })()
javascript;(async () => { const browser = await chromium.launch({ headless: false }) const page = await browser.newPage() await page.goto('http://localhost:3000/ats') await page.fill('[data-testid="job-description"]', 'Senior Software Engineer...') await page.click('[data-testid="analyze-button"]') // AI analizi uzun sürebilir await page.waitForSelector('[data-testid="ats-score"]', { timeout: 60000 }) const score = await page.textContent('[data-testid="ats-score"]') console.log('✅ ATS skoru:', score) await browser.close() })()
headless: false — görsel debugging için/tmp/playwright-test-*.js — projeyi kirletmeconst TARGET_URL = '...'slowMo: 100 — aksiyonları izlemeyi kolaylaştırırwaitForSelector, waitForURL tercih etOther measured skills in the registry, with their headline benchmark lift.