karatelabs/karate · error · DriverException
WebDriver response missing element ID: " + elementMap
Error message
WebDriver response missing element ID: " + elementMap
What it means
extractElementId() extracts the element reference from a WebDriver response value map. W3C-compliant servers return the key 'element-6066-11e4-a52e-4f735466cecf'; a legacy 'ELEMENT' fallback is tried first via W3C_ELEMENT_KEY then 'ELEMENT'. If neither key is present the response shape is unusable, so this DriverException is thrown including the whole map for debugging.
Solutions
- Upgrade the browser driver to a W3C-compliant version (Chrome 75+, modern Firefox/Edge)
- Inspect the printed elementMap to see what the server actually returned
- Confirm the locate command's response status was success before extracting the ID
- If forced onto a legacy server, use a client/library version matching that protocol
Example fix
// before // old driver returning non-W3C payload // after // upgrade driver: chromedriver matching installed Chrome (W3C mode default)
Defensive patterns
Strategy: validation
Validate before calling
// verify the response value looks like an element map before use
static boolean looksLikeElement(Object value) {
return value instanceof Map
&& (((Map<?, ?>) value).containsKey("element-6066-11e4-a52e-4f735466cecf")
|| ((Map<?, ?>) value).containsKey("ELEMENT"));
} Type guard
static String safeElementId(Map<String, Object> value) {
Object id = value.get("element-6066-11e4-a52e-4f735466cecf");
if (id == null) id = value.get("ELEMENT");
return id instanceof String ? (String) id : null; // null => not an element
} Try / catch
try {
String id = session.findElement(selector);
} catch (DriverException e) {
if (e.getMessage().startsWith("WebDriver response missing element ID")) {
// driver/protocol mismatch: inspect response or upgrade driver
} else { throw e; }
} Prevention
- Use W3C-compliant drivers (modern Chrome/Firefox/Edge)
- Match client library protocol to server protocol version
- Check response status before extracting element IDs
- Add integration tests against the actual driver version in CI
When it happens
Trigger: findElement(), findElements() or elementIdFrom() receiving a value map with neither the W3C element key nor the legacy ELEMENT key — typically when the server returned an error object or a non-element value instead of an element reference.
Common situations: Using a very old Selenium Server / driver that predates the W3C key with a mismatched client, or a driver returning an unexpected payload because the locate command actually failed silently.
Related errors
- WebDriver session create response missing sessionId: " +…
- Failed to start
- javascript failed
- PDF generation not supported on WebDriver backend
- Request interception not supported on WebDriver backend
AI-assisted analysis of karatelabs/karate@a22eb90246 (2026-09-12).
Data as JSON: /api/errors/534054f774711487.
Report an issue: GitHub.
Appendix: source
Thrown at karate-core/src/main/java/io/karatelabs/driver/w3c/W3cSession.java:482
}
throw new DriverException("WebDriver request failed: " + request.method() + " "
+ request.uri() + ": " + e.getMessage(), e);
}
}
private static Object getValue(Map<String, Object> response) {
return response.get("value");
}
@SuppressWarnings("unchecked")
private static String extractElementId(Map<String, Object> elementMap) {
String id = (String) elementMap.get(W3C_ELEMENT_KEY);
if (id == null) {
// Fallback for legacy servers
id = (String) elementMap.get("ELEMENT");
}
if (id == null) {
throw new DriverException("WebDriver response missing element ID: " + elementMap);
}
return id;
}
/**
* Check if a value is a W3C element reference.
*/
@SuppressWarnings("unchecked")
static boolean isElementReference(Object value) {
if (value instanceof Map) {
Map<String, Object> map = (Map<String, Object>) value;
return map.containsKey(W3C_ELEMENT_KEY) || map.containsKey("ELEMENT");
}
return false;
}
/**
* Extract element ID from a W3C element reference.View on GitHub (pinned to a22eb90246)