/** * A helper method that enriches a {@link RemoteWebDriver} instance with the ability to route all browser * interaction requests directly to the node on which the session was created and route only the session termination * request to the hub. * * @param driver - A {@link RemoteWebDriver} instance. * @param hub - A {@link Host} object that represents the Hub information. * @return - A {@link RemoteWebDriver} instance that is enriched with the ability to route all browser interactions * directly to the node. */ public static RemoteWebDriver enrichRemoteWebDriverToInteractDirectlyWithNode(RemoteWebDriver driver, Host hub) { if (hub == null) { return driver; } try { CommandExecutor grid = driver.getCommandExecutor(); String sessionId = driver.getSessionId().toString(); GridApiAssistant assistant = new GridApiAssistant(hub); Host nodeHost = assistant.getNodeDetailsForSession(sessionId); URL url = new URL(String.format("http://%s:%d/wd/hub", nodeHost.getIpAddress(), nodeHost.getPort())); CommandExecutor node = new HttpCommandExecutor(url); CommandCodec commandCodec = getCodec(grid, "commandCodec"); ResponseCodec responseCodec = getCodec(grid, "responseCodec"); setCodec(node, commandCodec, "commandCodec"); setCodec(node, responseCodec, "responseCodec"); appendListenerToWebDriver(driver, grid, node); LOG.info("Traffic will now be routed directly to the node."); LOG.warning(constructWarningMessage(hub)); } catch (Exception e) { //Gobble exceptions LOG.warning("Unable to enrich the RemoteWebDriver instance. Root cause :" + e.getMessage() + ". Returning back the original instance that was passed, as is."); } return driver; }