【问题标题】:Chrome remote debugging in a seleniumgrid硒网格中的 Chrome 远程调试
【发布时间】:2018-07-13 02:27:42
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 2014-06-13
    • 2018-09-19
    • 1970-01-01
    • 2018-12-22
    • 2017-08-23
    • 2014-10-25
    相关资源
    最近更新 更多