Dynamic Content

Timestamps, ads, carousels, avatars, live counters, animated banners - anything that renders differently on every visit will produce a diff on every session, drowning out the changes you actually care about.

The fix is to exclude those elements from the comparison. The ignored region is not compared, so the rest of the page still gets full coverage.

Ignoring elements in the suite

In the suite settings, add entries to the Ignore list using XPath or CSS selectors pointing at the dynamic elements:

//div[@id='live-chat'] //*[@data-testid='ad-slot'] .cookie-banner

Suite-level entries apply to every snapshot. To ignore an element on a single view only, add the override on that snapshot instead of the suite.

Ignoring elements in scriptless captures

The bdy tests capture command takes the same selectors with --ignore (prefixed with CSS= or XPATH=), optionally scoped to a domain:

bash
bdy tests capture --sitemap https://example.com/sitemap.xml \ --ignore "CSS=.ad-banner" "XPATH=//div[@id='popup']" "example.com::CSS=.cookie-notice" $$

Ignoring elements in E2E snapshots

When you take snapshots from E2E frameworks (Playwright, Puppeteer, and others), pass cssIgnores or xpathIgnores to takeSnap() to exclude dynamic elements on that snapshot only:

javascript
await visualTestPlugin.takeSnap(page, "dashboard", { fullPage: true, cssIgnores: [".timestamp", ".live-counter"], xpathIgnores: ["//*[@data-testid='ad-slot']"], });

Use suite-level Ignore for selectors that apply to every snapshot; use cssIgnores / xpathIgnores when only one view has unstable content.

Animations

For animated fragments (auto-playing videos, CSS animations, spinners), you have two options:

  • ignore the animated element like any other dynamic content, or
  • if the animation settles after load, add a Delay or Wait for selector so the capture happens after it finishes - see Lazy loading

As a last resort, Post page capture JS in the suite settings can disable animations or hide elements programmatically before the comparison.

Last modified on Jul 17, 2026