在seleniumgrid中进行Chrome远程调试

时间:2018-02-02 14:49:54

标签: google-chrome selenium google-chrome-devtools selenium-chromedriver selenium-grid2

我正在运行一个带有几个chrome实例的硒网格。硒网格是2台具有多个节点的机器(窗口)。测试从连接到网格的另一台机器执行。为了能够使用远程调试的功能,我需要从执行机器(可以读取会话主机和驱动程序debugUrl)连接到其他机器,最后连接到chrome实例。

但Chrome拒绝除localhost以外的任何内容。

我只能找到人们隧道或端口转发的解决方案,当只有一个实例时,这可能是好的。在网格中,我没有静态端口或静态规则来提供静态转发。

在我的场景中,网格是自动构建的,而不是一个永远运行的系统。

有人提示如何解决这个问题吗?

1 个答案:

答案 0 :(得分:-1)

自从我找到了自己想要分享的解决方案。我将只发布部分代码来提供提示而不是完整的代码,因为它在这里工作很多,但对于有经验的开发人员来说,这应该足够了。

为了能够解决正确的浏览器并访问其远程调试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);