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
Give the page a fixed number of seconds and shoot what is there. The flag sets a ceiling: loading is stopped at that moment if it has not ended sooner, and a page that finishes loading earlier is shot earlier. Either way the clock is blind, because it knows nothing about whether the interface is done. 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 a method that waits for the page to go quiet waits indefinitely. For these, a blunt real-time timeout is the dependable way to finish.
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.
Pointed at a polling application, the workshop's very first capture hung: its own chat app, which polls status endpoints on a timer, ran for more than five minutes against a nine-second budget, then captured in 3.9 seconds on a real-time timeout. Keep that measurement apart from its explanation. The browser's own contract says virtual time fast-forwards to the next timer whenever nothing else is ready to run and stops once the budget is spent, so recurring timers alone should not keep a budget alive; one of its policies does hold virtual time still while network fetches are pending. The workshop never isolated what held that page — the polling, a fetch left pending, or the wrapper the browser was launched through — and the log's line that the clock never drains is a guess written beside a measurement. The decision did not need the cause: the clock that worked is recorded for that target.
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.