grafana/k6 · error
unknown page on event
Error message
unknown page on event: %q
What it means
Returned by page.on(eventName, handler) when eventName is not in the supported pageEvents map. k6 maps exactly six page events: 'console', 'metric', 'request', 'response', 'requestfinished', 'requestfailed'. Registering any other Playwright page event name fails synchronously when page.on is called.
Solutions
- Use one of the six supported names, all lowercase: 'console', 'metric', 'request', 'response', 'requestfinished', 'requestfailed'.
- For load-state concerns use page.waitForLoadState(); for popups use context.waitForEvent('page'); for dialogs there is no support — avoid triggering them.
- Check exact spelling/casing against the k6 browser API docs before registering.
- Register handlers once at the top of the default export to avoid duplicating listeners each iteration.
Example fix
// before
page.on('requestFinished', r => console.log(r.url()));
// after
page.on('requestfinished', r => console.log(r.url())); Defensive patterns
Strategy: validation
Validate before calling
const PAGE_ON_EVENTS = ['console', 'metric', 'request', 'response', 'requestfinished', 'requestfailed'];
function onPage(page, name, handler) {
if (!PAGE_ON_EVENTS.includes(name)) throw new Error(`page.on does not support '${name}'`);
return page.on(name, handler);
} Type guard
const isSupportedPageOnEvent = (n) => ['console','metric','request','response','requestfinished','requestfailed'].includes(n);
Prevention
- Register listeners through a wrapper that validates the event name against the supported list.
- Remember event names are lowercase ('requestfinished', not 'requestFinished').
- During Playwright porting, replace page.on('pageerror'/'load') with supported equivalents.
When it happens
Trigger: page.on('pageerror', ...), page.on('load', ...), page.on('dialog', ...), page.on('popup', ...), page.on('close', ...), or any misspelled event like 'requestFinished' (case-sensitive: the mapped name is 'requestfinished').
Common situations: Porting Playwright scripts that register common listeners; case mismatches ('requestFinished' vs 'requestfinished'); expecting dialog or download handling that the k6 browser module does not expose.
Related errors
- executing page.on(' ') handler
- waitForEvent does not support mapping for event
- evaluate requires a page function
- evaluateHandle requires a page function
- executing waitForEvent predicate
AI-assisted analysis of grafana/k6@8d06114777 (2026-08-18).
Data as JSON: /api/errors/71ab7e58d2186866.
Report an issue: GitHub.
Appendix: source
Thrown at internal/js/modules/k6/browser/browser/page_mapping.go:793
return func(eventName common.PageEventName, handle sobek.Callable) error {
if handle == nil {
panic(vu.Runtime().NewTypeError(`The "listener" argument must be a function`))
}
pageEvents := map[common.PageEventName]struct {
mapp func(vu moduleVU, event common.PageEvent) mapping
wait bool // Whether to wait for the handler to complete.
}{
common.PageEventConsole: {mapp: mapConsoleMessage},
common.PageEventMetric: {mapp: mapMetricEvent, wait: true},
common.PageEventRequest: {mapp: mapRequestEvent},
common.PageEventResponse: {mapp: mapResponseEvent},
common.PageEventRequestFinished: {mapp: mapRequestEvent},
common.PageEventRequestFailed: {mapp: mapRequestEvent},
}
pageEvent, ok := pageEvents[eventName]
if !ok {
return fmt.Errorf("unknown page on event: %q", eventName)
}
ctx := vu.Context()
tq := vu.get(ctx, p.TargetID())
return p.On(eventName, func(event common.PageEvent) error {
wait := queueTask(ctx, tq, func() (sobek.Value, error) {
_, err := handle(sobek.Undefined(), vu.Runtime().ToValue(pageEvent.mapp(vu, event)))
if err != nil {
return nil, fmt.Errorf("executing page.on('%s') handler: %w", eventName, err)
}
return nil, nil
})
if pageEvent.wait {
if _, err := wait(); errors.Is(err, context.Canceled) {
return errors.New("iteration ended before page.on handler completed executing")
}
}View on GitHub (pinned to 8d06114777)