You re-run. It passes. You move on.
Until your whole team is trained to ignore failures. That's when real bugs slip through.
Here are the 3 root causes behind 90% of flaky Playwright tests.
Race Condition
// bad
const text = await page.locator('.welcome').textContent();
// good
await expect(page.getByText('Welcome back')).toBeVisible();
// auto-retries until element exists
Shared Data
// bad
await request.delete('/api/users/test-user-1');
// 5 workers fight over this
// good
const user = await createUniqueUser(request);
await request.delete(`/api/users/${user.id}`);
// each test gets its own
Network Timing
// bad
await page.goto('/search?q=laptop');
await page.locator('.result').first().click();
// results not loaded yet
// good
await page.goto('/search?q=laptop');
await page.waitForResponse('**/api/search');
await page.getByTestId('result').first().click();
Which of these three has burned you the most on your current project?









![[Tanwydd]](https://media2.dev.to/dynamic/image/width=640,height=640,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3874697%2Faf7553e1-11dc-4b40-b171-7d67491de89f.png)



