grafana/k6 · error
adding init script to browser context: %w
Error message
adding init script to browser context: %w
What it means
browserContext.addInitScript(script) records the script for future pages and immediately injects it into every currently open page (browser_context.go:171). If any page's CDP Page.addScriptToEvaluateOnNewDocument call fails, the whole operation errors with this wrap naming the init-script step.
Source
Thrown at internal/js/modules/k6/browser/common/browser_context.go:171
if err := b.AddInitScript(js.WebVitalInitScript); err != nil {
return nil, fmt.Errorf("adding web vital init script to new browser context: %w", err)
}
if err := b.setDownloadsPath(opts.DownloadsPath); err != nil {
return nil, fmt.Errorf("setting downloads path: %w", err)
}
return &b, nil
}
// AddInitScript adds a script that will be initialized on all new pages.
func (b *BrowserContext) AddInitScript(script string) error {
b.logger.Debugf("BrowserContext:AddInitScript", "bctxid:%v", b.id)
b.evaluateOnNewDocumentSources = append(b.evaluateOnNewDocumentSources, script)
for _, p := range b.browser.getPages() {
if err := p.evaluateOnNewDocument(script); err != nil {
return fmt.Errorf("adding init script to browser context: %w", err)
}
}
return nil
}
func (b *BrowserContext) applyAllInitScripts(p *Page) error {
for _, source := range b.evaluateOnNewDocumentSources {
if err := p.evaluateOnNewDocument(source); err != nil {
return fmt.Errorf("adding init script to browser context: %w", err)
}
}
return nil
}
// Browser returns the browser instance that this browser context belongs to.
func (b *BrowserContext) Browser() *Browser {View on GitHub (pinned to 93accf6570)
Solutions
- Call addInitScript immediately after newContext(), before any pages exist, so the per-page loop is empty
- Close/remove crashed pages before adding scripts; the wrapped error identifies the failing page
- Minify or split very large init scripts
- Recreate the context if the wrapped error shows the connection is dead
Example fix
// before
const page = ctx.newPage()
await page.goto('https://example.com')
ctx.addInitScript('window.token = "x"') // injects into live pages, can fail
// after
const ctx = browser.newContext()
ctx.addInitScript('window.token = "x"') // no pages yet — safe
const page = ctx.newPage() Defensive patterns
Strategy: validation
Validate before calling
// register init scripts before any page exists
const ctx = browser.newContext()
ctx.addInitScript('window.bootstrap = true') // no pages yet — cannot fail per-page
const page = ctx.newPage() Try / catch
try {
ctx.addInitScript(script)
} catch (e) {
if (/adding init script/.test(String(e))) {
// a live page's session failed; recreate the context for a clean slate
throw e
}
throw e
} Prevention
- Call addInitScript immediately after newContext()
- Minify large init scripts
- Close crashed pages before injecting scripts
When it happens
Trigger: Calling addInitScript after one of the open pages crashed or its session closed at the CDP level; connection lost mid-loop over pages; extremely large script payloads troubling the websocket transport.
Common situations: Injecting auth/bootstrap scripts after navigation has started; races between page.close() and addInitScript(); injecting big bundled JS as an init script.
Related errors
- adding web vital script to new browser context: %w
- adding web vital init script to new browser context: %w
- adding k6 object to new browser context: %w
- browser connect: %w
- disposing browser context ID %s: %w
AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15).
Data as JSON: /api/errors/f50c2c70cba8abb8.
Report an issue: GitHub.