grafana/k6 · error

resetting screenshot background color

Error message

resetting screenshot background color: %w

What it means

After a successful capture with omitBackground, the module resets the background color override by calling Emulation.SetDefaultBackgroundColorOverride with no color. If that reset fails, 'resetting screenshot background color' wraps the CDP error. The screenshot bytes were already produced but are discarded — the function returns nil on this path, so a failed cleanup aborts the whole call.

Solutions

  1. Take omitBackground screenshots before initiating teardown, not between close() calls.
  2. Check the wrapped error for target/session closure and treat it as a teardown race rather than a screenshot defect.
  3. Retry the screenshot if transparent capture is essential to the test's assertions.

Example fix

// before
await page.screenshot({ path: 'a.png', omitBackground: true });
await context.close(); // next run raced here

// after
await page.screenshot({ path: 'a.png', omitBackground: true });
await page.waitForTimeout(100); // let CDP settle
await context.close();
Defensive patterns

Strategy: try-catch

Validate before calling

if (!page.isClosed()) { await page.screenshot({ path: 'a.png', omitBackground: true }); }

Try / catch

try {
  await page.screenshot({ path: 'a.png', omitBackground: true });
} catch (e) {
  if (/resetting screenshot background color/i.test(String(e))) {
    // capture itself succeeded; treat as teardown race and continue
  } else throw e;
}

Prevention

When it happens

Trigger: page.screenshot({ omitBackground: true, type: 'png' }) where the capture succeeds but the CDP session dies between capture and reset (page closing, target destroyed, browser crash) — a narrow race window.

Common situations: Screenshots taken as the very last action before context.close()/browser.close(); crashed target immediately after capture.

Related errors


AI-assisted analysis of grafana/k6@3fcf5388d7 (2026-09-20). Data as JSON: /api/errors/50847db8e4da8904. Report an issue: GitHub.

Appendix: source

Thrown at internal/js/modules/k6/browser/common/screenshotter.go:190

	}
	return p.resetViewport(ctx)
}

func (s *screenshotter) screenshot(
	sess session, doc, viewport *Rect, format ImageFormat, omitBackground bool, quality int64, path string,
) (buf []byte, err error) {
	var clip *cdppage.Viewport
	capture := cdppage.CaptureScreenshot()

	shouldSetDefaultBackground := omitBackground && format == "png"
	if shouldSetDefaultBackground {
		action := emulation.SetDefaultBackgroundColorOverride().
			WithColor(&cdp.RGBA{R: 0, G: 0, B: 0, A: 0})
		defer func() {
			ctx, cancel := s.cleanupContext()
			defer cancel()
			if restoreErr := emulation.SetDefaultBackgroundColorOverride().Do(cdp.WithExecutor(ctx, sess)); restoreErr != nil {
				err = errors.Join(err, fmt.Errorf("resetting screenshot background color: %w", restoreErr))
			}
		}()
		if err := action.Do(cdp.WithExecutor(s.ctx, sess)); err != nil {
			return nil, fmt.Errorf("setting screenshot background transparency: %w", err)
		}
	}

	// Add common options
	capture.WithQuality(quality)
	switch format {
	case ImageFormatJPEG:
		capture.WithFormat(cdppage.CaptureScreenshotFormatJpeg)
	default:
		capture.WithFormat(cdppage.CaptureScreenshotFormatPng)
	}

	visualViewportScale, visualViewportPageX, visualViewportPageY, err := getViewPortDimensions(s.ctx, sess, s.logger)
	if err != nil {

View on GitHub (pinned to 3fcf5388d7)