Удаленная отладка 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);