由于我自己找到了解决方案,所以我想分享。我只会发布部分代码来提供提示,而不是完整的代码,因为这里的工作量很大,但对于有经验的开发人员来说,这应该足够了。
为了能够找到正确的浏览器并访问其远程调试 websocket,我为我的节点实现了一个自定义 servlet。
首先是servlet:
public class DebugServlet extends RegistryBasedServlet
通过 node.json 注册像
"servlets" :["com.....ui.util.DebugServlet"],
要访问节点(在正确的机器上),我向 selenium 会话询问它:
"http://" + hubHost + ":" + hubPort + "/grid/api/testsession?session=" + sessionId
“sessionid”可以从 chromedriver 中检索到。
我们可以从返回的json中提取会话的节点信息,这里我们需要url。
url = JSONUtil.get(response.getBody(), "proxyId")
不,我们可以调用正确主机的 servlet 并提供浏览器的 websocket url 以及所需的任何数据。在我的示例中,为 BasicAuth 添加默认网络标头。
url+ "/extra/DebugServlet"
带有java中的标头(也可以是参数或其他http提供的可能性)
new BasicHeader("BrowserUrl", webSocketDebuggerUrl), new BasicHeader("Name", name),
new BasicHeader("Value", value)
在 servlet 中,我们现在提取数据并使用给定的 url 打开一个到浏览器的 websocket 并进行调用。
在 servlet 中:
public static final String networkDebugging = "{\"id\": 1,\"method\": \"Network.enable\",\"params\": {\"maxTotalBufferSize\": 10000000,\"maxResourceBufferSize\": 5000000 }}";
public static final String addHeader = "{\"id\": 2,\"method\": \"Network.setExtraHTTPHeaders\",\"params\": { \"headers\": {\"${key}\": \"${value}\"}}}";
ws.connect();
ws.setAutoFlush(true);
ws.sendText(networkDebugging);
String payload = TemplateUtil.replace(addHeader, name, value);
ws.sendText(payload);