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

  1. Upgrade the browser driver to a W3C-compliant version (Chrome 75+, modern Firefox/Edge)
  2. Inspect the printed elementMap to see what the server actually returned
  3. Confirm the locate command's response status was success before extracting the ID
  4. 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

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


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)