Удаленная отладка Chrome в сети

Я управляю сеткой селена с несколькими экземплярами хрома. Селеновая сетка - это 2 машины (окна) с несколькими узлами. Тесты выполняются с другой машины, которая подключается к сети. Чтобы иметь возможность использовать функции удаленной отладки, мне нужно подключиться с исполняющей машины (которая может читать узел сеансов и драйверы debugUrl) к другим машинам и, наконец, к экземплярам Chrome.

Но Chrome отвергает все, кроме localhost.

Я могу только найти решения, когда люди туннелируют или перенаправляют порты, что, возможно, нормально, когда есть только один экземпляр. В сетке у меня нет статических портов или статических правил для обеспечения статической пересылки.

В моем сценарии система построена автоматически, а не постоянно работающая система.

У кого-нибудь есть подсказка, как это решить?

1 ответ

Решение

Так как я нашел решение сам, хочу поделиться. Я буду публиковать только части кода, чтобы дать подсказки, а не полный код, так как здесь много работы, но для опытного разработчика этого должно быть достаточно.

Чтобы иметь возможность обратиться к нужному браузеру и получить доступ к удаленной отладке веб-сокета, я реализовал собственный сервлет для своих узлов.

Первый сервлет:

public class DebugServlet extends RegistryBasedServlet

быть зарегистрированным через node.json как

"servlets" :["com.....ui.util.DebugServlet"],

Чтобы получить доступ к узлу (на правильном компьютере), я прошу сеанс селена для него как:

"http://" + hubHost + ":" + hubPort + "/grid/api/testsession?session=" + sessionId

где "sessionid" может быть получен из chromedriver.

Из возвращенного json мы можем извлечь информацию об узле сессии, здесь нам нужен url.

url = JSONUtil.get(response.getBody(), "proxyId")

Нет, мы можем вызвать сервлет правильного хоста и указать URL-адрес веб-сокета для браузера и все необходимые данные. В моем примере добавить сетевой заголовок по умолчанию для BasicAuth.

url+ "/extra/DebugServlet"

с заголовком в Java (также могут быть параметры или другие http-возможности)

new BasicHeader("BrowserUrl", webSocketDebuggerUrl), new BasicHeader("Name", name),
                new BasicHeader("Value", value)

В сервлете мы теперь извлекаем данные и открываем веб-сокет в браузере с заданным URL и делаем наши звонки.

В сервлете:

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