Playwright Test Hatalari ve Cozumleri: 6 Yaygin Hata ve Fix Rehberi (2026)

05.03.2026 16:38 Haber

Playwright testleriniz sürekli başarısız mı oluyor? Timeout hataları, strict mode ihlalleri ya da flaky test'ler canınızı mı sıkıyor? Yalnız değilsiniz! Alesta Web ekibi olarak yüzlerce E2E test yazdık ve en sık karşılaşılan Playwright hatalarını (most common Playwright errors) sizin için bir araya getirdik. Bu rehber ile testlerinizi sağlam ve güvenilir hale getireceksiniz (make your tests reliable and stable). Hadi başlayalım!

Playwright Nedir? (What is Playwright Testing Framework?)

Playwright, Microsoft tarafından geliştirilen modern bir end-to-end (E2E) test framework'üdür (end-to-end testing framework developed by Microsoft). Chromium, Firefox ve WebKit tarayıcılarında otomatik test yazmanızı sağlar.

2026 itibarıyla Playwright, Cypress'i geçerek en popüler E2E test aracı konumuna geldi (became the most popular E2E testing tool surpassing Cypress). Alesta Web olarak tüm web projelerimizde Playwright kullanıyoruz. Ama her güçlü araç gibi, Playwright'ın da kendine has hataları var. İşte en yaygın olanları ve çözümleri:

❌ Hata 1: Timeout Exceeded Error (Zaman Aşımı Hatası)

Bu muhtemelen en sık karşılaşacağınız Playwright hatasıdır (the most common Playwright error you'll encounter). Test belirli bir sürede tamamlanamadığında ortaya çıkar.

Hata Mesajı / Error Message:

Error: locator.click: Timeout 30000ms exceeded.
Call log:
  - waiting for locator('button.submit')
  - locator resolved to 0 elements

Sebepler / Causes:

  • Element henüz DOM'a yüklenmemiş (Element not yet loaded in DOM)
  • Yavaş ağ bağlantısı veya sunucu yanıtı (Slow network or server response)
  • Yanlış selector kullanımı (Wrong selector usage)
  • SPA'larda dinamik içerik geç yükleniyor

✅ Çözümler / Solutions:

// ❌ Yanlış - Sabit bekleme / Wrong - Fixed wait
await page.waitForTimeout(5000);
await page.click('button.submit');

// ✅ Doğru - Element görünene kadar bekle / Wait for element
await page.locator('button.submit').waitFor({ state: 'visible' });
await page.locator('button.submit').click();

// ✅ Alternatif - Timeout süresini artır / Increase timeout
await page.locator('button.submit').click({ timeout: 60000 });

// ✅ En iyi - playwright.config.ts'de global ayar
// Best - Global setting in playwright.config.ts
export default defineConfig({
  timeout: 60000,
  expect: {
    timeout: 10000,
  },
});

Alesta Web ipucu: waitForTimeout() kullanmaktan kaçının! Bunun yerine her zaman element bazlı bekleme yapın (always use element-based waiting). Bu, testlerinizi hem daha hızlı hem daha güvenilir kılar.

❌ Hata 2: Strict Mode Violation (Kesin Mod İhlali)

Playwright varsayılan olarak "strict mode" kullanır. Eğer locator'ınız birden fazla element bulursa bu hata fırlatılır (throws this error if your locator finds multiple elements).

Hata Mesajı / Error Message:

Error: locator.click: Error: strict mode violation:
locator('button') resolved to 3 elements:
  1) <button class="btn-primary">Kaydet</button>
  2) <button class="btn-secondary">İptal</button>
  3) <button class="btn-danger">Sil</button>

✅ Çözümler / Solutions:

// ❌ Yanlış - Çok genel selector / Wrong - Too generic
await page.locator('button').click();

// ✅ Doğru - Spesifik selector / Correct - Specific selector
await page.locator('button.btn-primary').click();

// ✅ Doğru - Metin ile bulma / Find by text
await page.getByRole('button', { name: 'Kaydet' }).click();

// ✅ Doğru - Test ID kullanma / Use test ID
await page.getByTestId('save-button').click();

// ✅ nth() ile spesifik element seç / Select specific with nth()
await page.locator('button').nth(0).click();

// ✅ first() veya last() kullan / Use first() or last()
await page.locator('button').first().click();

Alesta Web deneyimi: Her zaman getByRole() veya getByTestId() kullanın. CSS selector'lar kırılgan olabilir ama rol bazlı selector'lar çok daha dayanıklıdır (role-based selectors are much more resilient).

❌ Hata 3: Flaky Tests Sorunu (Dengesiz Testler)

Testleriniz bazen geçiyor bazen kalıyor mu? Buna "flaky test" denir ve CI/CD pipeline'ınız için tam bir kabus (a nightmare for your CI/CD pipeline). Alesta Web ekibi olarak bu sorunla çok uğraştık, işte çözümler:

✅ Çözüm 1: Retry Mekanizması (Retry Mechanism):

// playwright.config.ts
export default defineConfig({
  retries: process.env.CI ? 2 : 0,  // CI'da 2 retry
  workers: process.env.CI ? 1 : undefined,
});

✅ Çözüm 2: Network İsteklerini Bekle (Wait for Network):

// API yanıtını bekle / Wait for API response
await Promise.all([
  page.waitForResponse(resp =>
    resp.url().includes('/api/data') && resp.status() === 200
  ),
  page.click('button.load-data'),
]);

✅ Çözüm 3: Web-First Assertions Kullan:

// ❌ Yanlış - Anlık kontrol / Wrong - Instant check
const text = await page.locator('.result').textContent();
expect(text).toBe('Başarılı');

// ✅ Doğru - Otomatik bekleme / Correct - Auto-waiting
await expect(page.locator('.result')).toHaveText('Başarılı');
⚠️ Dikkat / Warning:

CI ortamında testler genelde daha yavaş çalışır (tests usually run slower in CI environments). Bu yüzden CI için daha uzun timeout'lar ayarlayın ve worker sayısını azaltın.

❌ Hata 4: Element Bulunamadı Hatası (Element Not Found Error)

Locator'ınız hiçbir element bulamadığında ortaya çıkan sinir bozucu bir hata (a frustrating error when your locator finds no elements).

Hata Mesajı / Error Message:

Error: locator.click: Timeout 30000ms exceeded.
Call log:
  - waiting for locator('#dynamic-content')
  - locator resolved to 0 elements

✅ Çözümler / Solutions:

// Playwright Inspector ile debug et / Debug with Playwright Inspector
npx playwright test --debug

// Veya UI modunda çalıştır / Or run in UI mode
npx playwright test --ui

// Trace viewer ile analiz et / Analyze with trace viewer
npx playwright test --trace on
npx playwright show-trace trace.zip

Alesta Web ipucu: Playwright'ın --ui modu harika bir debugging aracı. Her adımı görsel olarak takip edebilir, DOM'u inceleyebilir ve locator'ları test edebilirsiniz (you can visually track each step, inspect DOM and test locators).

❌ Hata 5: Browser Installation Hatası (Browser Install Error)

Özellikle CI/CD ortamlarında ve Docker container'larda sık karşılaşılan bir hata (commonly encountered in CI/CD and Docker environments):

Hata Mesajı / Error Message:

Error: browserType.launch: Executable doesn't exist at
/home/user/.cache/ms-playwright/chromium-1140/chrome-linux/chrome

✅ Çözümler / Solutions:

# Tarayıcıları yükle / Install browsers
npx playwright install

# Sistem bağımlılıklarıyla birlikte / With system dependencies
npx playwright install --with-deps

# Sadece belirli tarayıcı / Only specific browser
npx playwright install chromium

# Docker için / For Docker
FROM mcr.microsoft.com/playwright:v1.50.0-jammy
WORKDIR /app
COPY . .
RUN npm ci
CMD ["npx", "playwright", "test"]
✅ Alesta Web İpucu:

Docker kullanıyorsanız, Microsoft'un resmi Playwright Docker imajını kullanın (use Microsoft's official Docker image). Tüm tarayıcılar ve bağımlılıklar önceden yüklü gelir!

❌ Hata 6: Navigation ve Network Hataları (Navigation & Network Errors)

Sayfa yönlendirmelerinde ve ağ isteklerinde karşılaşılan hatalar (errors during page navigation and network requests):

Hata Mesajları / Error Messages:

Error: page.goto: net::ERR_CONNECTION_REFUSED
Error: page.goto: Navigation timeout of 30000ms exceeded
Error: page.goto: net::ERR_NAME_NOT_RESOLVED

✅ Çözümler / Solutions:

// Sunucunun hazır olmasını bekle / Wait for server to be ready
// playwright.config.ts
export default defineConfig({
  webServer: {
    command: 'npm run dev',
    url: 'http://localhost:3000',
    reuseExistingServer: !process.env.CI,
    timeout: 120000,
  },
});

// Navigation için doğru bekleme / Correct wait for navigation
await page.goto('http://localhost:3000', {
  waitUntil: 'networkidle',
  timeout: 60000,
});

// Network intercept ile mock / Mock with network intercept
await page.route('**/api/users', route => {
  route.fulfill({
    status: 200,
    body: JSON.stringify([{ id: 1, name: 'Test' }]),
  });
});

✅ Best Practices: Sağlam Playwright Testleri Yazma (Writing Robust Tests)

Alesta Web ekibinin yıllarca deneyimiyle derlediği en iyi uygulamalar (best practices compiled from years of experience):

1. Page Object Model Kullanın (Use Page Object Model)

// pages/login.page.ts
export class LoginPage {
  constructor(private page: Page) {}

  async login(email: string, password: string) {
    await this.page.getByLabel('E-posta').fill(email);
    await this.page.getByLabel('Şifre').fill(password);
    await this.page.getByRole('button', { name: 'Giriş Yap' }).click();
  }
}

// tests/login.spec.ts
test('kullanıcı giriş yapabilmeli', async ({ page }) => {
  const loginPage = new LoginPage(page);
  await loginPage.login('test@alestaweb.com', 'sifre123');
  await expect(page).toHaveURL('/dashboard');
});

2. Test İzolasyonu Sağlayın (Ensure Test Isolation)

Her test bağımsız çalışmalı. Testler arası veri paylaşımı yapmayın (each test should run independently, don't share data between tests).

3. Accessibility Locator'ları Tercih Edin

getByRole(), getByLabel(), getByText() kullanın. CSS selector'lardan kaçının.

? Kaynaklar ve Referanslar / Sources and References

Alesta Web olarak tüm çözümleri test ettik ve doğruladık (we tested and verified all solutions).

✅ Playwright Hatalarını Yendiniz! (You Conquered Playwright Errors!)

Artık Playwright test hataları (Playwright testing errors) sizi durduramaz! Alesta Web olarak bu rehberin testlerinizi güçlendirmesini umuyoruz.

Hızlı Özet / Quick Summary:

  • ✅ Timeout hatası → Element bazlı bekleme kullan (Use element-based waiting)
  • ✅ Strict mode → Spesifik locator kullan (Use specific locators)
  • ✅ Flaky test → Retry + web-first assertions
  • ✅ Element bulunamadı → Playwright Inspector ile debug
  • ✅ Browser hatası → npx playwright install --with-deps
  • ✅ Network hatası → webServer config + route mock

Faydalı Linkler / Useful Links:

© 2026 AlestaWeb - Tüm hakları saklıdır.

WM Tools
💫

WebMaster Tools

15 Profesyonel Araç