Before an agent can decide what to click, something has to confirm the click will actually land. Playwright runs four actionability checks on every single click action. Visible. Stable. Receives events. Enabled. All four must pass simultaneously, or the action doesn't fire.
The third check is worth pausing on. An element can be fully rendered, motionless, and enabled, yet a transparent overlay sitting above it will silently capture the click. Playwright calculates the exact pointer coordinates and asks: at this pixel, which element would actually receive the event? The documentation concedes that intentional overlay behavior is "indistinguishable from a bug." The infrastructure can't always tell the difference.
These checks formalized what earlier automation left to guesswork and sleep timers. They're also what agents inherit. Playwright MCP exposes this same machinery to LLMs. When an agent clicks a button, these four checks still run underneath. Agent reasoning sits on top of a layer that's still working out whether the action is physically possible.
Visible doesn't mean perceptible. An element at opacity:0 passes. One set to display:none does not. The check is about rendering geometry, not what a human would notice.
Stable means not animating. A button mid-CSS transition fails, even if it's fully visible at its current position. The click might land where the element was, not where it ends up.
Receives events performs a hit-test at the exact click coordinates. If a cookie banner, modal backdrop, or loading overlay would intercept the pointer at that pixel, the check fails.
Enabled catches disabled form elements that still look clickable. A grayed-out submit button renders fine; Playwright won't touch it.
If any check fails, Playwright retries the full sequence until timeout. It doesn't skip ahead.
force: true bypasses all of this. It exists because sometimes the infrastructure's judgment is wrong and the developer knows better.

