{"record":{"id":"afbbebf8a10417ba","repo":"karatelabs/karate","slug":"browser-did-not-return-a-targetid-for-context-contextid","errorCode":null,"errorMessage":"browser did not return a targetId for context: {contextId}","messagePattern":"browser did not return a targetId for context: (.+?)","errorType":"exception","errorClass":"DriverException","httpStatus":null,"severity":"error","filePath":"karate-core/src/main/java/io/karatelabs/driver/cdp/CdpDriver.java","lineNumber":554,"sourceCode":"     *\n     * @param browserWebSocketUrl a BROWSER-level endpoint (ws://host:port/devtools/browser/...),\n     *                            not a page endpoint — see /json/version\n     */\n    public static CdpDriver connectNewContext(String browserWebSocketUrl, CdpDriverOptions options) {\n        CdpClient browser = CdpClient.connect(browserWebSocketUrl, options.getTimeoutDuration());\n        try {\n            String contextId = browser.browserMethod(\"Target.createBrowserContext\")\n                    .send().getResultAsString(\"browserContextId\");\n            if (contextId == null) {\n                throw new DriverException(\"browser did not return a browserContextId: \" + browserWebSocketUrl);\n            }\n            try {\n                String targetId = browser.browserMethod(\"Target.createTarget\")\n                        .param(\"url\", \"about:blank\")\n                        .param(\"browserContextId\", contextId)\n                        .send().getResultAsString(\"targetId\");\n                if (targetId == null) {\n                    throw new DriverException(\"browser did not return a targetId for context: \" + contextId);\n                }\n                CdpDriver driver = new CdpDriver(pageWsUrlFrom(browserWebSocketUrl, targetId), options);\n                driver.ownedBrowserContextId = contextId;\n                driver.browserWebSocketUrl = browserWebSocketUrl;\n                logger.debug(\"created driver in browser context {} target {}\", contextId, targetId);\n                return driver;\n            } catch (RuntimeException e) {\n                // Never leave an orphan context behind on a half-built driver — it would\n                // pin its storage partition for the life of the browser.\n                try {\n                    browser.browserMethod(\"Target.disposeBrowserContext\")\n                            .param(\"browserContextId\", contextId).send();\n                } catch (Exception ignored) {\n                    logger.debug(\"could not dispose orphan browser context: {}\", contextId);\n                }\n                throw e;\n            }\n        } finally {","sourceCodeStart":536,"sourceCodeEnd":572,"githubUrl":"https://github.com/karatelabs/karate/blob/a22eb90246d958d15a47bf436693d0121ad2812d/karate-core/src/main/java/io/karatelabs/driver/cdp/CdpDriver.java#L536-L572","documentation":"After successfully creating an owned browser context, Karate calls Target.createTarget (about:blank) inside it to get a page targetId. If the response has no targetId, Karate cannot derive the page WebSocket endpoint and throws this DriverException. The context creation succeeded, so the browser is talking CDP but refused or failed to create the page target.","triggerScenarios":"CdpDriver.connectNewContext when Target.createTarget with browserContextId returns no targetId — e.g. browser hit its max-targets limit, the context was already torn down, or the browser sends a malformed/empty CDP result.","commonSituations":"Running many parallel tests against one browser exhausting target limits; headless shell variants with restricted Target domains; the browser crashing or being killed mid-connect; corporate browser policies (e.g. Edge/Chrome enterprise) blocking target creation.","solutions":["Check the browser is still alive and not over target/process limits when connecting (kill -9'd or crashed browsers will fail here)","Retry with fewer concurrent contexts or restart the browser","Verify the browser version is compatible with the Karate version's CDP usage and upgrade either side","Enable CDP debug logging to inspect the Target.createTarget response for the actual failure"],"exampleFix":"// before\nCdpDriver.connectNewContext(wsUrl, options); // browser already saturated\n// after\n// ensure browser capacity, e.g. launch with higher limits\nstartChrome(\"--remote-debugging-port=9222 --max-active-web-contexts=50\");\nCdpDriver.connectNewContext(wsUrl, options);","handlingStrategy":"retry","validationCode":"// verify browser is responsive before connecting\nString ver = Http.get(\"http://host:port/json/version\");\nif (ver == null || ver.isEmpty()) throw new IllegalStateException(\"browser debug endpoint not responding\");","typeGuard":null,"tryCatchPattern":"try { return CdpDriver.connectNewContext(wsUrl, options); } catch (DriverException e) { if (e.getMessage().contains(\"targetId\")) { restartBrowser(); return retryConnect(wsUrl, options); } throw e; }","preventionTips":["Avoid saturating one browser with too many parallel contexts","Monitor browser process health during long test runs","Pin compatible browser versions in CI","Retry transient connect failures once or twice"],"tags":["cdp","browser-automation","target-creation"],"backgroundTag":"unexpected-api-response-shape","analyzedSha":"a22eb90246d958d15a47bf436693d0121ad2812d","analyzedAt":"2026-09-12T09:01:00.220Z","contentChangedAt":"2026-09-12T09:01:00.220Z","schemaVersion":2},"datasetVersion":"2026-09-16T19:17:19.609Z"}