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
- Read the wrapped error: 'connection closed'/'context canceled' means chromium died — find out why (dmesg/OOM, K6_BROWSER_LOG=debug)
- Raise container resources (--shm-size=1g, more memory) or reduce VUs/pages if chromium is being killed
- Verify newPage() is not called on a closed context or after browser.close()
- 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
- Watch container memory and shm; chromium death is the dominant cause
- Never call newPage() on a closed context or after browser.close()
- Cap pages per VU to avoid target limits
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
- getting browser version information: %w
- the page may have navigated away or the element is now mi
- WebSocket endpoint cannot be empty
- can't fetch the page for unknown reason
- errorText
AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15).
Data as JSON: /api/errors/ba01873cd023125e.
Report an issue: GitHub.