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
- Use one of the exact values: 'none', 'achromatopsia', 'blurredVision', 'deuteranopia', 'protanopia', 'tritanopia'
- Copy-paste the value from the k6 browser API docs rather than retyping
- 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
- Keep the allowlist next to the call site as a constant
- Copy values from the k6 docs; do not port names from other tools
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
- setting emulated vision deficiency %q: %w
- setting viewport size: %w
- %q is not a valid lifecycle
- predicate function is not callable
- "handler" argument cannot be nil
AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15).
Data as JSON: /api/errors/74cb54f7e1565abe.
Report an issue: GitHub.