Reading right-side metric columns (Link clicks, CTR, Clicks (all), LPV...) from Meta Ads Manager's campaign/ad set table in a background tab driven over raw CDP: the table virtualizes columns horizontally. Setting scrollLeft on the scroll containers (plus dispatching scroll events) moves the header row and shifts existing body cells to negative x, but the newly-in-view body columns never mount - the virtualizer's render loop doesn't run in a hidden tab even with Page.setWebLifecycleState {state:'active'} and focus emulation set.
Reliable fix: skip scrolling entirely and widen the emulated viewport so every column is in view at once:
Emulation.setDeviceMetricsOverride { width: 3400, height: 1400, deviceScaleFactor: 1, mobile: false }then dispatch a window resize event and wait a few seconds; all ~20 columns mount and each row's cells can be read by matching bounding-rect y-position against the row anchor and sorting by x. Clear with Emulation.clearDeviceMetricsOverride afterward. Same trick previously worked vertically (tall viewport to mount all rows); the horizontal case is the non-obvious half because scrollLeft LOOKS like it works (header moves).