我正在运行带有多个Chrome实例的selenium网格。selenium网格是2个带有多个节点的机器(窗口)。测试是从连接到网格的另一台机器执行的。为了能够使用远程调试功能,我需要从正在执行的计算机(可以读取会话主机和驱动程序debugUrl)连接到其他计算机,最后是chrome实例。
但是chrome拒绝localhost以外的任何东西。
我只能找到解决方案,当人们只有一个实例时,人们可以通过隧道或端口转发。在网格中,我没有静态端口或静态规则来提供静态转发。
在我的场景中,网格是自动构建的,而不是一个永远运行的系统。
有没有人提示如何解决这个问题?
因为我自己找到了解决方案,所以我想分享。我将只发布部分代码以提供提示,而不发布完整的代码,因为它可以在这里完成很多工作,但是对于有经验的开发人员来说,这应该足够了。
为了能够访问正确的浏览器并访问其远程调试Websocket,我为节点实现了自定义servlet。
首先是servlet:
public class DebugServlet extends RegistryBasedServlet
通过node.json注册像
"servlets" :["com.....ui.util.DebugServlet"],
要访问该节点(在正确的机器上),我需要进行硒会话:
"http://" + hubHost + ":" + hubPort + "/grid/api/testsession?session=" + sessionId
可以从chromedriver中检索“ sessionid”的位置。
从返回的json中,我们可以提取会话的节点信息,这里需要url。
url = JSONUtil.get(response.getBody(), "proxyId")
不,我们不能调用正确主机的servlet,并为浏览器输入websocket网址以及所需的任何数据。在我的示例中,为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);