grafana/k6 · error

querying all selectors %q: %w

Error message

querying all selectors %q: %w

What it means

queryAll evaluated the injected js.QueryAll script in the element's context and the evaluation failed (element_handle.go:1272). The wrapped error is a CDP/evaluation error — context destroyed by navigation, target closed/crashed — identical in nature to the $() evaluation failure but on the multi-select path.

Source

Thrown at internal/js/modules/k6/browser/common/element_handle.go:1272

		return nil, fmt.Errorf("querying all selector %q: %w", selector, err)
	}

	return handles, nil
}

func (h *ElementHandle) queryAll(selector string, eval evalFunc) (_ []*ElementHandle, rerr error) {
	parsedSelector, err := NewSelector(selector)
	if err != nil {
		return nil, fmt.Errorf("parsing selector %q: %w", selector, err)
	}
	result, err := eval(
		h.ctx,
		evalOptions{forceCallable: true, returnByValue: false},
		js.QueryAll,
		parsedSelector,
	)
	if err != nil {
		return nil, fmt.Errorf("querying all selectors %q: %w", selector, err)
	}
	if result == nil {
		// it is ok to return a nil slice because it means we didn't find any elements.
		return nil, nil
	}

	handles, ok := result.(JSHandleAPI)
	if !ok {
		return nil, fmt.Errorf("getting element handle for selector %q: %w", selector, ErrJSHandleInvalid)
	}
	defer func() {
		if err := handles.Dispose(); err != nil {
			err = fmt.Errorf("disposing element handles: %w", err)
			rerr = errors.Join(err, rerr)
		}
	}()

	props, err := handles.GetProperties()

View on GitHub (pinned to 93accf6570)

Solutions

  1. Wait for load state after navigating actions before $$
  2. Re-query the base element handle after navigation — the old handle's context is gone
  3. try/catch with one retry for transient races
  4. If crashes correlate with VU load, reduce parallelism or check chromium memory

Example fix

// before
await page.click('button.load-more');
const items = await page.$$('.item'); // may race the re-render
// after
await page.click('button.load-more');
await page.waitForLoadState('networkidle');
const items = await page.$$('.item');
Defensive patterns

Strategy: try-catch

Validate before calling

await page.waitForLoadState('domcontentloaded');
if (!(await el.isVisible())) throw new Error('element context probably navigated away');

Try / catch

try { return await el.$$(sel); }
catch (e) {
  if (/querying all selectors/.test(e.message)) { await page.waitForLoadState(); return await el.$$(sel); }
  throw e;
}

Prevention

When it happens

Trigger: Navigation, iframe removal, or page close between the $$ call and evaluation; browser crash under load; stale element handle from a previous document.

Common situations: Scraping all rows right as an SPA transitions routes; browser teardown racing pending $$ promises at k6 iteration end.

Related errors


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