The Deceptively Simple Task
Take a screenshot of a running application. It sounds like one operation, and in practice it is a timing problem with no universally correct answer, because the only hard question is when is the page finished? — and different applications answer that in incompatible ways.
Clock One: Real Time
Wait a fixed number of seconds, then shoot. Crude, and correct for a specific class of application: anything that polls continuously. A page that schedules work forever has no moment of quiescence to detect, so any cleverer method waits indefinitely. For these, a blunt real-time timeout is the only thing that terminates.
Clock Two: Virtual Time
Rather than waiting in real seconds, let the browser run its own clock as fast as it can until a budget of virtual time is exhausted. This is correct for load-once applications, especially those whose startup restores state asynchronously — a session restore that takes an unpredictable real duration but a bounded amount of scheduled work. A fixed real-time wait either cuts these off mid-restore or wastes time on every run to accommodate the worst case.
Point this at a polling application and it never terminates: there is always more scheduled work, so the virtual clock never drains.
Clock Three: Ask the Page
Some applications defeat both. Interfaces that hydrate in waves are ready in a real sense — nothing is scheduled, real time has passed — but visibly incomplete, showing half-populated rows or skeletons. Neither blind clock can see this, because both are measuring time and the actual question is about state.
The answer is to poll a readiness condition from inside the page and shoot when it reports true. That means each application needs its own definition of ready, which is more work and is the only thing that actually answers the question being asked.