Open Playwright's auto-waiting documentation and look at what happens before a click() executes. Everything before.
The element must be:
- Attached to the DOM
- Visible
- Stable
- Receiving events
- Enabled
Five preconditions for a click.
Each one is specific in ways that reward close reading. "Visible" means the element has a non-empty bounding box and isn't hidden with visibility:hidden. But an element set to opacity:0, fully transparent, still counts as visible. The spec draws a line between structurally present and perceptually obvious, and it picks structural presence. "Stable" means the element held the same bounding box across two consecutive animation frames. The button has to stop moving. If it's sliding into position mid-animation, Playwright waits.
"Receives events" is the one that catches people. It means the element is the actual hit target at the action point. If something else floats on top of it, a cookie banner, a loading spinner, an overlay, the check fails. The click would land on the wrong thing. So Playwright won't attempt it.
Each precondition is a codified failure mode. Something that went wrong often enough, in enough production environments, that someone wrote a check for it.
The W3C WebDriver specification, still a Working Draft as of May 2026, layers on its own ceremony. Before Element Click executes, WebDriver scrolls the element into view if it isn't already pointer-interactable. Then it checks paint order: is another element sitting on top? If so, element click intercepted. If the element is outside the viewport entirely, element not interactable. Only after clearing all of that does it dispatch mouse events and wait for navigation to settle.
That spec describes itself as:
"Primarily intended to allow web authors to write tests."
Twenty-two years after browser automation began, the click is still being specified.
A person clicks a button in a fraction of a second. They don't check whether the element is stable across two animation frames. They don't verify hit-target ownership. They just click. If something feels off, they click again.
But every precondition in that auto-waiting list corresponds to something a person resolves without noticing. Is the button there? Can I see it? Has it stopped moving? Is something in the way? Is it grayed out? Five questions you'd answer in a glance, spelled out for a system that can't just look and know.

