{"record":{"id":"3414b7b449db1a8e","repo":"grafana/k6","slug":"querying-all-selectors-q-w","errorCode":null,"errorMessage":"querying all selectors %q: %w","messagePattern":"querying all selectors %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/common/element_handle.go","lineNumber":1272,"sourceCode":"\t\treturn nil, fmt.Errorf(\"querying all selector %q: %w\", selector, err)\n\t}\n\n\treturn handles, nil\n}\n\nfunc (h *ElementHandle) queryAll(selector string, eval evalFunc) (_ []*ElementHandle, rerr error) {\n\tparsedSelector, err := NewSelector(selector)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"parsing selector %q: %w\", selector, err)\n\t}\n\tresult, err := eval(\n\t\th.ctx,\n\t\tevalOptions{forceCallable: true, returnByValue: false},\n\t\tjs.QueryAll,\n\t\tparsedSelector,\n\t)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"querying all selectors %q: %w\", selector, err)\n\t}\n\tif result == nil {\n\t\t// it is ok to return a nil slice because it means we didn't find any elements.\n\t\treturn nil, nil\n\t}\n\n\thandles, ok := result.(JSHandleAPI)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"getting element handle for selector %q: %w\", selector, ErrJSHandleInvalid)\n\t}\n\tdefer func() {\n\t\tif err := handles.Dispose(); err != nil {\n\t\t\terr = fmt.Errorf(\"disposing element handles: %w\", err)\n\t\t\trerr = errors.Join(err, rerr)\n\t\t}\n\t}()\n\n\tprops, err := handles.GetProperties()","sourceCodeStart":1254,"sourceCodeEnd":1290,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/browser/common/element_handle.go#L1254-L1290","documentation":"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.","triggerScenarios":"Navigation, iframe removal, or page close between the $$ call and evaluation; browser crash under load; stale element handle from a previous document.","commonSituations":"Scraping all rows right as an SPA transitions routes; browser teardown racing pending $$ promises at k6 iteration end.","solutions":["Wait for load state after navigating actions before $$","Re-query the base element handle after navigation — the old handle's context is gone","try/catch with one retry for transient races","If crashes correlate with VU load, reduce parallelism or check chromium memory"],"exampleFix":"// before\nawait page.click('button.load-more');\nconst items = await page.$$('.item'); // may race the re-render\n// after\nawait page.click('button.load-more');\nawait page.waitForLoadState('networkidle');\nconst items = await page.$$('.item');","handlingStrategy":"try-catch","validationCode":"await page.waitForLoadState('domcontentloaded');\nif (!(await el.isVisible())) throw new Error('element context probably navigated away');","typeGuard":null,"tryCatchPattern":"try { return await el.$$(sel); }\ncatch (e) {\n  if (/querying all selectors/.test(e.message)) { await page.waitForLoadState(); return await el.$$(sel); }\n  throw e;\n}","preventionTips":["Await load state after route changes before scraping","Re-acquire base handles after navigation","Retry transient races once"],"tags":["browser","evaluation","navigation","race-condition"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}