Playwright, Microsoft''un 2020''de açık kaynak yaptığı ve bugün E2E testing''in gerçek standardına dönüşen tarayıcı otomasyon framework''üdür. Chromium, Firefox ve WebKit''i tek API ile yönetir; Cypress''in kısıtlarını (iframe, multi-tab, file upload) aşar.

Kurulum

İlgili rehberler: Yazılım geliştirme süreçleri · PostgreSQL optimizasyonu · Git ileri seviye komutlar · Redis nedir, nasıl kullanılır · Docker ile deploy

npm init playwright@latest
# Sorular: TS mi, tests klasörü, GitHub Actions workflow, browsers install

# Test çalıştır
npx playwright test
npx playwright test --headed         # browser'ı gör
npx playwright test --ui             # interaktif UI mode
npx playwright show-report           # HTML rapor

İlk Test

// tests/login.spec.ts
import { test, expect } from '@playwright/test';

test('kullanıcı giriş yapabilir', async ({ page }) => {
    await page.goto('https://example.com/login');

    await page.getByLabel('Email').fill('test@example.com');
    await page.getByLabel('Parola').fill('password123');
    await page.getByRole('button', { name: 'Giriş yap' }).click();

    await expect(page).toHaveURL(/\/dashboard/);
    await expect(page.getByText('Hoş geldin, Test')).toBeVisible();
});

Selector Stratejileri

Playwright''in tercih ettiği user-facing selector sıralaması:

// 1) Role (erişilebilirlik odaklı — en sağlam)
page.getByRole('button', { name: 'Kaydet' });
page.getByRole('heading', { level: 1, name: 'Başlık' });

// 2) Label — form input
page.getByLabel('Email');

// 3) Text — görünür metin
page.getByText('Hoş geldiniz');

// 4) Placeholder
page.getByPlaceholder('Arama...');

// 5) Test ID (dev control altında)
page.getByTestId('submit-btn');
// <button data-testid="submit-btn">Kaydet</button>

// SON ÇARE — CSS/XPath
page.locator('.btn-primary');  // kırılgan, kaçın

Auto-wait ve Assertions

Playwright''te wait_for artık gerekmez — her aksiyon element''in hazır olmasını otomatik bekler. Assert''ler de retry''lı.

// Otomatik bekleme — element DOM'a gelsin, visible olsun, stable olsun
await page.getByRole('button', { name: 'Yükle' }).click();

// Retry-able assertions (web-first)
await expect(page.getByText('Başarılı')).toBeVisible();  // 5 sn retry
await expect(page.getByRole('list')).toHaveCount(10);
await expect(page).toHaveTitle('Dashboard');
await expect(page).toHaveURL('/dashboard');

Fixture ve Auth

// playwright.config.ts — login state'i bir kere kaydet
import { defineConfig } from '@playwright/test';

export default defineConfig({
    globalSetup: './global-setup.ts',
    use: {
        storageState: 'storage-state.json',
        baseURL: 'http://localhost:3000',
        trace: 'on-first-retry'
    }
});

// global-setup.ts
import { chromium } from '@playwright/test';

export default async () => {
    const browser = await chromium.launch();
    const page = await browser.newPage();
    await page.goto('/login');
    await page.getByLabel('Email').fill('admin@test.com');
    await page.getByLabel('Parola').fill('admin');
    await page.getByRole('button', { name: 'Giriş' }).click();
    await page.waitForURL('/dashboard');
    await page.context().storageState({ path: 'storage-state.json' });
    await browser.close();
};

API Mocking

test('user list fetch fails gracefully', async ({ page }) => {
    // Network intercept
    await page.route('/api/users', route => {
        route.fulfill({ status: 500, body: 'Server error' });
    });

    await page.goto('/users');
    await expect(page.getByText('Hata oluştu')).toBeVisible();
});

Mobile ve Multi-Browser

// playwright.config.ts
export default defineConfig({
    projects: [
        { name: 'chromium',  use: { ...devices['Desktop Chrome'] } },
        { name: 'firefox',   use: { ...devices['Desktop Firefox'] } },
        { name: 'webkit',    use: { ...devices['Desktop Safari'] } },
        { name: 'mobile',    use: { ...devices['iPhone 14'] } },
        { name: 'tablet',    use: { ...devices['iPad Pro'] } }
    ]
});

// Çalıştır — tüm projeler
npx playwright test
// Sadece chromium
npx playwright test --project=chromium

Trace Viewer

Flaky test''in ne zaman fail ettiğini anlamak için trace altın değerinde. Her aksiyonun DOM snapshot''ı, network log''u, console output''u.

# config'te aktif: trace: 'on-first-retry'
npx playwright test
npx playwright show-trace trace.zip
# Tarayıcıda timeline açılır, tıkladığın her adımda DOM + screenshot

Parallel Testing

Playwright default paralel çalışır — her .spec.ts ayrı worker''da. Tek dosyadaki testler sıralıdır ama test.describe.parallel ile onları da paralel hâle getirebilirsin.

CI (GitHub Actions)

# .github/workflows/e2e.yml
name: E2E
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 20 }
      - run: npm ci
      - run: npx playwright install --with-deps chromium
      - run: npm run build
      - run: npx playwright test
      - uses: actions/upload-artifact@v4
        if: failure()
        with:
          name: playwright-report
          path: playwright-report/

Playwright vs Cypress

ÖzellikPlaywrightCypress
BrowserChromium, Firefox, WebKitChrome, Edge, Firefox
LanguageTS/JS/Python/Java/.NETSadece JS/TS
Multi-tabKısıtlı
iframeZor
SpeedÇok hızlıOrta
DevTools protokolCDP direktBridge ile
Ücretsiz cloudYokCypress Cloud (ücretli)

Modern Yazılım Geliştirme ve DevOps Pratikleri

Profesyonel yazılım geliştirme süreci üç pillar üzerine kuruludur: kaynak kontrolü (Git + GitHub/GitLab pull request akışı, code review zorunlu), CI/CD pipeline (otomatik test + lint + build + deploy), ve gözlemlenebilirlik (Sentry/Datadog/Grafana ile log, metric, trace toplama). Test piramidi (unit > integration > e2e) ile kod kalitesini garantilemek, mikroservis mimarisinde Docker container ve Kubernetes orkestrasyonu kullanmak, REST veya GraphQL API tasarımında OpenAPI/GraphQL Schema sözleşmesi tutmak modern standardlardır. Yazılım geliştirme yaşam döngüsü boyunca (gereksinim → tasarım → implementasyon → test → deploy → bakım) Agile/Scrum sprintleri 1-2 hafta, DevOps takımları sürekli teslim (continuous delivery) prensibiyle çalışır.

E2E test altyapısı

Playwright ile E2E test suite tasarımı ve CI entegrasyonu için iletişime geçin

WhatsApp