Chrome 在 selenium 网格中进行远程调试
Chrome remote debugging in a seleniumgrid
我是 运行 具有多个 chrome 实例的硒网格。硒网格是 2 台机器(windows),有几个节点。测试是从连接到网格的另一台机器执行的。为了能够使用远程调试的功能,我需要从执行机器(可以读取会话主机和驱动程序 debugUrl)连接到其他机器,最后连接到 chrome 个实例。
但是 chrome 拒绝除 localhost 之外的任何其他内容。
我只能找到解决方案,当只有一个实例时,人们使用隧道或端口转发,这可能没问题。在网格中,我没有静态端口或静态规则来提供静态转发。
在我的场景中,网格是自动构建的,而不是一个 运行 系统。
有没有人提示如何解决这个问题?
由于我自己找到了解决方案,所以我想分享一下。我只会 post 部分代码来给出提示,而不是完整的代码,因为这里的工作量很大,但对于有经验的开发人员来说,这应该足够了。
为了能够找到正确的浏览器并访问其 remote-debug websocket,我为我的节点实现了一个自定义 servlet。
首先是 servlet:
public class DebugServlet extends RegistryBasedServlet
正在通过node.json 赞
注册
"servlets" :["com.....ui.util.DebugServlet"],
为了访问节点(在正确的机器上),我向 selenium session 询问:
"http://" + hubHost + ":" + hubPort + "/grid/api/testsession?session=" + sessionId
可以从 chromedriver 检索 "sessionid"。
从返回的json我们可以提取session的节点信息,这里我们需要url.
url = JSONUtil.get(response.getBody(), "proxyId")
不,我们可以调用正确主机的 servlet 并为浏览器提供 websocket url 以及所需的任何数据。在我的示例中,为 BasicAuth 添加默认值 network-header。
url+ "/extra/DebugServlet"
与java中的header(也可以是参数或其他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);
我是 运行 具有多个 chrome 实例的硒网格。硒网格是 2 台机器(windows),有几个节点。测试是从连接到网格的另一台机器执行的。为了能够使用远程调试的功能,我需要从执行机器(可以读取会话主机和驱动程序 debugUrl)连接到其他机器,最后连接到 chrome 个实例。
但是 chrome 拒绝除 localhost 之外的任何其他内容。
我只能找到解决方案,当只有一个实例时,人们使用隧道或端口转发,这可能没问题。在网格中,我没有静态端口或静态规则来提供静态转发。
在我的场景中,网格是自动构建的,而不是一个 运行 系统。
有没有人提示如何解决这个问题?
由于我自己找到了解决方案,所以我想分享一下。我只会 post 部分代码来给出提示,而不是完整的代码,因为这里的工作量很大,但对于有经验的开发人员来说,这应该足够了。
为了能够找到正确的浏览器并访问其 remote-debug websocket,我为我的节点实现了一个自定义 servlet。
首先是 servlet:
public class DebugServlet extends RegistryBasedServlet
正在通过node.json 赞
注册"servlets" :["com.....ui.util.DebugServlet"],
为了访问节点(在正确的机器上),我向 selenium session 询问:
"http://" + hubHost + ":" + hubPort + "/grid/api/testsession?session=" + sessionId
可以从 chromedriver 检索 "sessionid"。
从返回的json我们可以提取session的节点信息,这里我们需要url.
url = JSONUtil.get(response.getBody(), "proxyId")
不,我们可以调用正确主机的 servlet 并为浏览器提供 websocket url 以及所需的任何数据。在我的示例中,为 BasicAuth 添加默认值 network-header。
url+ "/extra/DebugServlet"
与java中的header(也可以是参数或其他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);