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

  1. Use one of the six supported names, all lowercase: 'console', 'metric', 'request', 'response', 'requestfinished', 'requestfailed'.
  2. For load-state concerns use page.waitForLoadState(); for popups use context.waitForEvent('page'); for dialogs there is no support — avoid triggering them.
  3. Check exact spelling/casing against the k6 browser API docs before registering.
  4. 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

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


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)