grafana/k6 · error

unsupported vision deficiency: %s

Error message

unsupported vision deficiency: %s

What it means

Page.EmulateVisionDeficiency validates its argument against a fixed allowlist (achromatopsia, blurredVision, deuteranopia, none, protanopia, tritanopia) and returns this error before any CDP call when the value is not in the map. It is a pure input-validation error, deterministic and entirely caller-side.

Source

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

	return nil
}

// EmulateVisionDeficiency activates/deactivates emulation of a vision deficiency.
func (p *Page) EmulateVisionDeficiency(typ string) error {
	p.logger.Debugf("Page:EmulateVisionDeficiency", "sid:%v typ:%s", p.sessionID(), typ)

	validTypes := map[string]emulation.SetEmulatedVisionDeficiencyType{
		"achromatopsia": emulation.SetEmulatedVisionDeficiencyTypeAchromatopsia,
		"blurredVision": emulation.SetEmulatedVisionDeficiencyTypeBlurredVision,
		"deuteranopia":  emulation.SetEmulatedVisionDeficiencyTypeDeuteranopia,
		"none":          emulation.SetEmulatedVisionDeficiencyTypeNone,
		"protanopia":    emulation.SetEmulatedVisionDeficiencyTypeProtanopia,
		"tritanopia":    emulation.SetEmulatedVisionDeficiencyTypeTritanopia,
	}
	t, ok := validTypes[typ]
	if !ok {
		return fmt.Errorf("unsupported vision deficiency: %s", typ)
	}

	action := emulation.SetEmulatedVisionDeficiency(t)
	if err := action.Do(cdp.WithExecutor(p.ctx, p.session)); err != nil {
		return fmt.Errorf("setting emulated vision deficiency %q: %w", typ, err)
	}

	applySlowMo(p.ctx)

	return nil
}

// Evaluate runs JS code within the execution context of the main frame of the page.
func (p *Page) Evaluate(pageFunc string, args ...any) (any, error) {
	p.logger.Debugf("Page:Evaluate", "sid:%v", p.sessionID())

	return p.MainFrame().Evaluate(pageFunc, args...)
}

View on GitHub (pinned to 93accf6570)

Solutions

  1. Use one of the exact values: 'none', 'achromatopsia', 'blurredVision', 'deuteranopia', 'protanopia', 'tritanopia'
  2. Copy-paste the value from the k6 browser API docs rather than retyping
  3. Define the value once as a constant if reused across scripts

Example fix

// before
await page.emulateVisionDeficiency('blurred'); // invalid

// after
await page.emulateVisionDeficiency('blurredVision');
Defensive patterns

Strategy: validation

Validate before calling

const VALID = ['achromatopsia','blurredVision','deuteranopia','none','protanopia','tritanopia'];
if (!VALID.includes(typ)) throw new Error(`invalid vision deficiency: ${typ}`);

Type guard

const isVisionDeficiency = (v) =>
  ['achromatopsia','blurredVision','deuteranopia','none','protanopia','tritanopia'].includes(v);

Prevention

When it happens

Trigger: page.emulateVisionDeficiency('deuteranopia ') with trailing whitespace, a misspelling like 'deuteranopia'/'blurriedVision', or a casing error like 'None'. The lookup is an exact, case-sensitive map hit.

Common situations: Typos in test scripts; copying values from Puppeteer/Playwright docs that use different names; passing undefined/null which stringifies to something invalid.

Related errors


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