grafana/k6 · error

creating a new blank page: %w

Error message

creating a new blank page: %w

What it means

Wraps the failure of the CDP Target.createTarget call that browserContext.newPage() (and browser.newPage()) issues to open a blank page inside the given browser context (browser.go:540). The %w chain carries the underlying CDP/transport error, so the real cause — lost connection, invalid browser context ID, target limit, crashed browser — is in the wrapped text.

Source

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

		bc, // browser context will emit the following event:
		[]string{EventBrowserContextPage},
		func(e any) bool {
			tid := <-targetID

			b.logger.Debugf("Browser:newPageInContext:createWaitForEventHandler",
				"tid:%v ptid:%v bctxid:%v", tid, e.(*Page).targetID, id) //nolint:forcetypeassert

			// we are only interested in the new page.
			return e.(*Page).targetID == tid //nolint:forcetypeassert
		},
	)
	defer removeEventHandler()

	// create a new page.
	action := target.CreateTarget(BlankPage).WithNewWindow(true).WithBrowserContextID(id)
	tid, err := action.Do(cdp.WithExecutor(ctx, b.conn))
	if err != nil {
		return nil, fmt.Errorf("creating a new blank page: %w", err)
	}
	// let the event handler know about the new page.
	targetID <- tid
	var page *Page
	select {
	case <-waitForPage:
		b.logger.Debugf("Browser:newPageInContext:<-waitForPage", "tid:%v bctxid:%v", tid, id)
		b.pagesMu.RLock()
		page = b.pages[tid]
		b.pagesMu.RUnlock()
	case <-ctx.Done():
		b.logger.Debugf("Browser:newPageInContext:<-ctx.Done", "tid:%v bctxid:%v err:%v", tid, id, ContextErr(ctx))
	}

	if err = ContextErr(ctx); err != nil {
		err = &k6ext.UserFriendlyError{
			Err:     err,
			Timeout: b.browserOpts.Timeout,

View on GitHub (pinned to 93accf6570)

Solutions

  1. Read the wrapped error: 'connection closed'/'context canceled' means chromium died — find out why (dmesg/OOM, K6_BROWSER_LOG=debug)
  2. Raise container resources (--shm-size=1g, more memory) or reduce VUs/pages if chromium is being killed
  3. Verify newPage() is not called on a closed context or after browser.close()
  4. Align K6_BROWSER_EXECUTABLE_PATH with a chromium version supported by your k6 release and keep k6 updated
Defensive patterns

Strategy: retry

Validate before calling

// create pages while the browser/context is definitely open, early in the iteration
// const page = ctx.newPage() — do this before heavy load, not after possible crashes

Try / catch

try {
  page = await ctx.newPage()
} catch (e) {
  if (/creating a new blank page/.test(String(e)) && /connection|target closed/i.test(String(e))) {
    // chromium died — abort this iteration; a retry needs a new browser
    throw e
  }
  throw e
}

Prevention

When it happens

Trigger: The chromium process or its CDP websocket is already dead (crash, OOM-kill, browser.close() already called); creating a page in a context that was just disposed; hitting chromium's target/tab limit under high parallelism; container running out of /dev/shm or file descriptors.

Common situations: Containers without --shm-size or memory limits where chromium dies mid-test; calling newPage() after closing the context or browser; many VUs each opening pages; a stale K6_BROWSER_EXECUTABLE_PATH pointing at an incompatible chromium build.

Related errors


AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15). Data as JSON: /api/errors/ba01873cd023125e. Report an issue: GitHub.