Technical note

The page was fine. The screenshot robot scrolled too fast.

We screenshot our pages after changes. During one build, the captures kept coming back with blank sections below the fold. Empty white bands where content should be. In a real browser, on a real phone, the page was perfect. We chased that ghost 3 times in one session before the rule stuck.

The page used scroll-reveal animations, the common pattern where a section starts invisible and fades in when you scroll to it. The mechanism watching for that moment is IntersectionObserver, a browser feature that fires when an element enters the viewport.

The robot outran the porch lights

Our capture script scrolled the page programmatically: jump to position, screenshot, jump again. Those jumps are faster than any human scroll, and the observer's notifications, plus the fade-in animation they trigger, take real time to land. The script was photographing sections in the same instant it arrived at them, before the reveal had run.

It is a car with motion-sensor porch lights on every house. Drive past at walking pace and every porch is lit. Drive past at 90 and your camera catches dark houses. The houses are not dark. You are outrunning the sensor.

So the blank captures were not showing a bug. They were manufacturing one, and we spent real diagnosis time on it. A false bug from bad instrumentation costs the same hours as a real one.

The two fixes

Pace the walk. Scroll in steps small enough that every element crosses the viewport boundary, and wait after each step, long enough for the observer to fire and the animation to finish. A few hundred milliseconds per step turned our blank bands into rendered sections.

Verify by measurement, not by eyeball. The screenshot tells you what the pixels looked like at one instant. The page can tell you the truth directly: after the walk, read each section's computed opacity and assert it reached 1. A section that measures visible is visible, whatever the timing of your camera. We assert the numbers first and keep the screenshots for humans.

The general rule reaches past screenshots. Any automated reader of a modern page, a capture script, a scraper, a test, is racing the page's own choreography. When the machine sees something a human does not, the first suspect is not the page. It is the speed of the machine that looked at it.

Slow the robot down. The lights come on for anyone who arrives like a person.