grafana/k6 · error

querying all selector %q: %w

Error message

querying all selector %q: %w

What it means

ElementHandle.QueryAll() ($$) wraps every failure of its internal queryAll with 'querying all selector' (element_handle.go:1254). The wrapped message tells the real story — almost always either 'parsing selector' (bad selector string) or 'querying all selectors' (evaluation/context failure).

Source

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

	if element == nil {
		defer func() {
			if err := handle.Dispose(); err != nil {
				err = fmt.Errorf("disposing element handle: %w", err)
				rerr = errors.Join(err, rerr)
			}
		}()
		return nil, fmt.Errorf("querying selector %q", selector)
	}

	return element, nil
}

// QueryAll queries element subtree for matching elements.
// If no element matches the selector, the return value resolves to "null".
func (h *ElementHandle) QueryAll(selector string) ([]*ElementHandle, error) {
	handles, err := h.queryAll(selector, h.evalWithScript)
	if err != nil {
		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)

View on GitHub (pinned to 93accf6570)

Solutions

  1. Read the wrapped message: parsing -> fix the selector (see 'parsing selector'); evaluation -> fix the timing (see 'querying all selectors')
  2. Wait for a stable load state before bulk queries
  3. Validate dynamically built selectors are non-empty before calling $$
  4. Retry once on transient navigation races
Defensive patterns

Strategy: try-catch

Validate before calling

// Validate before $$
if (!sel || sel.trim() === '') throw new Error('empty selector');
await page.waitForLoadState('domcontentloaded');

Try / catch

try { const all = await el.$$(sel); }
catch (e) {
  if (/parsing selector/.test(e.message)) throw new Error(`bad selector: ${sel}`);
  if (/querying all selectors/.test(e.message)) { await page.waitForLoadState(); return await el.$$(sel); }
  throw e;
}

Prevention

When it happens

Trigger: $$() with an empty/invalid selector or duplicate '*' captures; evaluating the injected js.QueryAll script while the context is destroyed by navigation or the target closes.

Common situations: Bulk-scraping loops (collecting all rows/links) that run across SPA navigations or at iteration teardown; dynamic selectors that can be blank.

Related errors


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