A Playwright test clicks a button that is visibly on screen, and roughly one run in twenty nothing happens. The button is server-rendered but the app hydrates after load. Why does the click get lost, and how do you fix the flake properly?
Playwright actionability checks pass on server-rendered markup because the element is attached, visible, stable and enabled - none of which imply React has attached its listener. The click lands on inert HTML, so this is a race with hydration, not a timing problem. Wait on a readiness signal the app exposes deliberately.