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);