Ulaşım
- Adres:Batıkent Mh. 8910 Sk. 6. Etap 1H No: 18 Yeni Toki Eyyübiye / Şanlıurfa (Yeni Alım Satım Karşısı)
- Telefon:0 (545) 528 88 93
- eMail: info@alestaweb.com
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, 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:
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.
Error: locator.click: Timeout 30000ms exceeded.
Call log:
- waiting for locator('button.submit')
- locator resolved to 0 elements
// ❌ 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.
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).
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>
// ❌ 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).
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:
// playwright.config.ts
export default defineConfig({
retries: process.env.CI ? 2 : 0, // CI'da 2 retry
workers: process.env.CI ? 1 : undefined,
});
// 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'),
]);
// ❌ 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ı');
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.
Locator'ınız hiçbir element bulamadığında ortaya çıkan sinir bozucu bir hata (a frustrating error when your locator finds no elements).
Error: locator.click: Timeout 30000ms exceeded.
Call log:
- waiting for locator('#dynamic-content')
- locator resolved to 0 elements
// 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).
Özellikle CI/CD ortamlarında ve Docker container'larda sık karşılaşılan bir hata (commonly encountered in CI/CD and Docker environments):
Error: browserType.launch: Executable doesn't exist at
/home/user/.cache/ms-playwright/chromium-1140/chrome-linux/chrome
# 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"]
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!
Sayfa yönlendirmelerinde ve ağ isteklerinde karşılaşılan hatalar (errors during page navigation and network requests):
Error: page.goto: net::ERR_CONNECTION_REFUSED
Error: page.goto: Navigation timeout of 30000ms exceeded
Error: page.goto: net::ERR_NAME_NOT_RESOLVED
// 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' }]),
});
});
Alesta Web ekibinin yıllarca deneyimiyle derlediği en iyi uygulamalar (best practices compiled from years of experience):
// 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');
});
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).
getByRole(), getByLabel(), getByText() kullanın. CSS selector'lardan kaçının.
Alesta Web olarak tüm çözümleri test ettik ve doğruladık (we tested and verified all solutions).
Artık Playwright test hataları (Playwright testing errors) sizi durduramaz! Alesta Web olarak bu rehberin testlerinizi güçlendirmesini umuyoruz.
Hızlı Özet / Quick Summary:
npx playwright install --with-depsFaydalı Linkler / Useful Links:
© 2026 AlestaWeb - Tüm hakları saklıdır.