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
- Read the wrapped message: parsing -> fix the selector (see 'parsing selector'); evaluation -> fix the timing (see 'querying all selectors')
- Wait for a stable load state before bulk queries
- Validate dynamically built selectors are non-empty before calling $$
- 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
- Branch on the wrapped message: parse errors vs evaluation races
- Validate dynamic selectors non-empty
- Wait for stable state before bulk scrapes
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
- provided selector is empty
- only one of the selectors can capture using * modifier
- finding iframe with selector %q: %w
- getting iframe frame: %w
- parsing selector %q: %w
AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15).
Data as JSON: /api/errors/895a74c6bb0149b7.
Report an issue: GitHub.