Bevor ich aus verschiedenen Gründen zu Selenium Grid zurückkehrte, habe ich versucht, den Status des mit dem Hub verbundenen Knotens programmgesteuert anzuzeigen. Sie können es auf der Konsole des Webbildschirms sehen, aber wenn möglich, möchte ich, dass Sie es mit Json zurückgeben, aber es gibt keine solche Funktion ...
Ich konnte den Code nicht finden, indem ich mich auf das Original Anpassen des Rasters bezog, und die Startmethode schien alt zu sein: unschuldig: Gibt es irgendwo die neuesten Informationen? : Denken:
Zu diesem Zweck befindet es sich nur auf der Hub-Seite, aber ich werde es aufzeichnen, damit ich die Erweiterungsmethode nicht vergesse.
Sanft | Ausführung | Verwenden |
---|---|---|
java | 1.8.0_191 | |
selenium-server-standalone.jar | 3.14.0 |
Ich baue eine Entwicklungsumgebung unter Windows. Stellen Sie es einfach in Maven ein. Verwenden Sie gson, um Selen-Server und Antwort-Json zu generieren.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>selenium-grid-extend</groupId>
<artifactId>selenium-grid-extend</artifactId>
<version>0.0.1</version>
<build>
<sourceDirectory>src</sourceDirectory>
<testSourceDirectory>src</testSourceDirectory>
<resources>
<resource>
<directory>resource</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>resource</directory>
</testResource>
</testResources>
</build>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.141.5</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
<file.encoding>UTF-8</file.encoding>
<project.build.sourceEncoding>${file.encoding}</project.build.sourceEncoding>
<project.reporting.outputEncoding>${file.encoding}</project.reporting.outputEncoding>
<maven.compiler.encoding>${file.encoding}</maven.compiler.encoding>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
</project>
Erben Sie gemäß Anpassen des Grids RegistryBasedServlet, wenn Sie auf das Innere von Hub zugreifen, und erben Sie HttpServlet, wenn nicht. Es scheint gut zu sein.
Dieses Mal möchten wir den Status des mit dem Hub verbundenen Knotens anzeigen, damit wir das RegistryBasedServlet erben. Ich habe zwei Programme als Testversion erstellt.
AllNodes.java
package selenium.extend.hub.servlet;
import java.io.IOException;
import java.util.Iterator;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.openqa.grid.common.exception.GridException;
import org.openqa.grid.internal.GridRegistry;
import org.openqa.grid.internal.ProxySet;
import org.openqa.grid.internal.RemoteProxy;
import org.openqa.grid.web.servlet.RegistryBasedServlet;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
public class AllNodes extends RegistryBasedServlet {
public AllNodes() {
this(null);
}
public AllNodes(GridRegistry registry) {
super(registry);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
process(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
process(request, response);
}
protected void process(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setStatus(200);
try {
JsonObject res = getResponse(request);
response.getWriter().print(res);
response.getWriter().close();
} catch (JsonSyntaxException e) {
throw new GridException(e.getMessage());
}
}
private JsonObject getResponse(HttpServletRequest request) {
JsonObject json = new JsonObject();
ProxySet proxies = super.getRegistry().getAllProxies();
json.add("Nodes", getNodes(proxies));
return json;
}
private JsonArray getNodes(ProxySet proxies) {
JsonArray array = new JsonArray();
Iterator<RemoteProxy> itr = proxies.iterator();
Gson gson = new Gson();
while (itr.hasNext()) {
RemoteProxy proxy = itr.next();
JsonObject proxyJson = new JsonObject();
proxyJson.add("Node", gson.toJsonTree(proxy.getOriginalRegistrationRequest()));
array.add(proxyJson);
}
return array;
}
}
AllNodesState.java
package selenium.extend.hub.servlet;
import java.io.IOException;
import java.util.Iterator;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.openqa.grid.common.exception.GridException;
import org.openqa.grid.internal.GridRegistry;
import org.openqa.grid.internal.ProxySet;
import org.openqa.grid.internal.RemoteProxy;
import org.openqa.grid.web.servlet.RegistryBasedServlet;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
public class AllNodesState extends RegistryBasedServlet {
public AllNodesState() {
this(null);
}
public AllNodesState(GridRegistry registry) {
super(registry);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
process(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
process(request, response);
}
protected void process(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setStatus(200);
try {
JsonObject res = getResponse(request);
response.getWriter().print(res);
response.getWriter().close();
} catch (JsonSyntaxException e) {
throw new GridException(e.getMessage());
}
}
private JsonObject getResponse(HttpServletRequest request) {
JsonObject json = new JsonObject();
ProxySet proxies = super.getRegistry().getAllProxies();
json.add("Nodes", getNodes(proxies));
return json;
}
private JsonArray getNodes(ProxySet proxies) {
JsonArray array = new JsonArray();
Iterator<RemoteProxy> itr = proxies.iterator();
Gson gson = new Gson();
JsonArray freeProxies = new JsonArray();
JsonArray busyProxies = new JsonArray();
while (itr.hasNext()) {
RemoteProxy proxy = itr.next();
JsonObject proxyJson = new JsonObject();
proxyJson.add("Node", gson.toJsonTree(proxy.getOriginalRegistrationRequest()));
if (!proxy.isBusy()) {
freeProxies.add(proxyJson);
} else {
busyProxies.add(proxyJson);
}
}
JsonObject freeJson = new JsonObject();
freeJson.add("FreeNodes", freeProxies);
array.add(freeJson);
JsonObject busyJson = new JsonObject();
busyJson.add("BusyNodes", busyProxies);
array.add(busyJson);
return array;
}
}
Nur die erstellte Klasse ist enthalten. Diesmal habe ich es mit dem Namen verlängern.jar erstellt.
Stellen Sie alle abhängigen Gläser in lib.
C:\GRID
├─start-hub-extend.bat
│
└─lib
├ extend.jar
├ gson-2.8.5.jar
└ selenium-server-standalone-3.14.0.jar
Sie müssen lediglich den Klassenpfad angeben und starten. Ich gebe die Klasse an, die mit -servlets hinzugefügt werden soll, aber da es diesmal zwei gibt, werden sie durch Kommas getrennt.
start-hub-extend.bat
java -cp lib/* org.openqa.grid.selenium.GridLauncherV3 -role hub -servlets "selenium.extend.hub.servlet.AllNodes,selenium.extend.hub.servlet.AllNodesState"
Wenn ich versuche, den Stapel auszuführen, werden die Zeichen "[Hub. \ <Init >]" angezeigt, die normalerweise nicht in der 3. und 4. Zeile erscheinen. Einfach ausgedrückt, sollten Sie mit "/ grid / admin / AllNodes /" darauf zugreifen.
14:43:51.090 INFO [GridLauncherV3.launch] - Selenium build info: version: '3.14.0', revision: 'aacccce0'
14:43:51.106 INFO [GridLauncherV3$2.launch] - Launching Selenium Grid hub on port 4444
14:43:51.137 INFO [Hub.<init>] - binding selenium.extend.hub.servlet.AllNodes to /grid/admin/AllNodes/*
14:43:51.137 INFO [Hub.<init>] - binding selenium.extend.hub.servlet.AllNodesState to /grid/admin/AllNodesState/*
2018-11-09 14:43:51.480:INFO::main: Logging initialized @780ms to org.seleniumhq.jetty9.util.log.StdErrLog
14:43:51.777 INFO [Hub.start] - Selenium Grid hub is up and running
14:43:51.777 INFO [Hub.start] - Nodes should register to http://XXX.XXX.XXX.XXX:4444/grid/register/
14:43:51.777 INFO [Hub.start] - Clients should connect to http://XXX.XXX.XXX.XXX:4444/wd/hub
/ grid / console befindet sich im folgenden Zustand
Mit / grid / admin / AllNodes ...
{
"Nodes": [
{
"Node": {
"configuration": {
"remoteHost": "http://XXX.XXX.XXX.XXX:37803",
"id": "http://XXX.XXX.XXX.XXX:37803",
"capabilities": [
{
"caps": {
"browserName": "chrome",
"maxInstances": 1,
"platform": "WINDOWS",
"platformName": "WINDOWS",
"seleniumProtocol": "WebDriver",
"server:CONFIG_UUID": "8405f2b4-e375-4251-a2e8-50e432eb24b8"
}
}
],
"downPollingLimit": 2,
"hub": "http://XXX.XXX.XXX.XXX:4444/grid/register",
"nodePolling": 5000,
"nodeStatusCheckTimeout": 5000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"register": true,
"registerCycle": 5000,
"unregisterIfStillDownAfter": 60000,
"enablePlatformVerification": true,
"custom": {},
"maxSession": 5,
"servlets": [],
"withoutServlets": [],
"avoidProxy": false,
"browserSideLog": false,
"captureLogsOnQuit": false,
"browserTimeout": 0,
"debug": false,
"host": "172.16.11.134",
"port": 37803,
"role": "node",
"timeout": 1800
}
}
},
{
"Node": {
"configuration": {
"remoteHost": "http://XXX.XXX.XXX.XXX:3753",
"id": "http://XXX.XXX.XXX.XXX:3753",
"capabilities": [
{
"caps": {
"browserName": "firefox",
"maxInstances": 2,
"platform": "WINDOWS",
"platformName": "WINDOWS",
"seleniumProtocol": "WebDriver",
"server:CONFIG_UUID": "61acf94e-1db8-4274-9587-1e32a0ebb378"
}
},
{
"caps": {
"browserName": "internet explorer",
"maxInstances": 1,
"platform": "WINDOWS",
"platformName": "WINDOWS",
"seleniumProtocol": "WebDriver",
"server:CONFIG_UUID": "4adb7e6b-784e-46c3-896f-a2fcb7413bfb"
}
}
],
"downPollingLimit": 2,
"hub": "http://XXX.XXX.XXX.XXX:4444/grid/register",
"nodePolling": 5000,
"nodeStatusCheckTimeout": 5000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"register": true,
"registerCycle": 5000,
"unregisterIfStillDownAfter": 60000,
"enablePlatformVerification": true,
"custom": {},
"maxSession": 5,
"servlets": [],
"withoutServlets": [],
"avoidProxy": false,
"browserSideLog": false,
"captureLogsOnQuit": false,
"browserTimeout": 0,
"debug": false,
"host": "172.16.8.84",
"port": 3753,
"role": "node",
"timeout": 1800
}
}
}
]
}
Mit / grid / admin / AllNodesState ...
{
"Nodes": [
{
"FreeNodes": [
{
"Node": {
"configuration": {
"remoteHost": "http://XXX.XXX.XXX.XXX:37803",
"id": "http://XXX.XXX.XXX.XXX:37803",
"capabilities": [
{
"caps": {
"browserName": "chrome",
"maxInstances": 1,
"platform": "WINDOWS",
"platformName": "WINDOWS",
"seleniumProtocol": "WebDriver",
"server:CONFIG_UUID": "8405f2b4-e375-4251-a2e8-50e432eb24b8"
}
}
],
"downPollingLimit": 2,
"hub": "http://XXX.XXX.XXX.XXX:4444/grid/register",
"nodePolling": 5000,
"nodeStatusCheckTimeout": 5000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"register": true,
"registerCycle": 5000,
"unregisterIfStillDownAfter": 60000,
"enablePlatformVerification": true,
"custom": {},
"maxSession": 5,
"servlets": [],
"withoutServlets": [],
"avoidProxy": false,
"browserSideLog": false,
"captureLogsOnQuit": false,
"browserTimeout": 0,
"debug": false,
"host": "172.16.11.134",
"port": 37803,
"role": "node",
"timeout": 1800
}
}
},
{
"Node": {
"configuration": {
"remoteHost": "http://XXX.XXX.XXX.XXX:3753",
"id": "http://XXX.XXX.XXX.XXX:3753",
"capabilities": [
{
"caps": {
"browserName": "firefox",
"maxInstances": 2,
"platform": "WINDOWS",
"platformName": "WINDOWS",
"seleniumProtocol": "WebDriver",
"server:CONFIG_UUID": "61acf94e-1db8-4274-9587-1e32a0ebb378"
}
},
{
"caps": {
"browserName": "internet explorer",
"maxInstances": 1,
"platform": "WINDOWS",
"platformName": "WINDOWS",
"seleniumProtocol": "WebDriver",
"server:CONFIG_UUID": "4adb7e6b-784e-46c3-896f-a2fcb7413bfb"
}
}
],
"downPollingLimit": 2,
"hub": "http://XXX.XXX.XXX.XXX:4444/grid/register",
"nodePolling": 5000,
"nodeStatusCheckTimeout": 5000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"register": true,
"registerCycle": 5000,
"unregisterIfStillDownAfter": 60000,
"enablePlatformVerification": true,
"custom": {},
"maxSession": 5,
"servlets": [],
"withoutServlets": [],
"avoidProxy": false,
"browserSideLog": false,
"captureLogsOnQuit": false,
"browserTimeout": 0,
"debug": false,
"host": "172.16.8.84",
"port": 3753,
"role": "node",
"timeout": 1800
}
}
}
]
},
{
"BusyNodes": []
}
]
}
Es war unerwartet, aber selbst wenn einige Browser ausgeführt werden können, scheint der Knoten ausgelastet zu sein, wenn nur ein Browser ausgeführt wird. Ich habe die API, die ich dieses Mal verwende, nicht untersucht, daher habe ich möglicherweise einen Fehler bei der Verwendung gemacht: Denken:
Zum Beispiel, auch wenn nur ein Firefox läuft ...
Wenn Sie sich / grid / admin / AllNodesState ansehen, wird festgestellt, dass es sich um BusyNodes handelt.
{
"Nodes": [
{
"FreeNodes": [
{
"Node": {
"configuration": {
"remoteHost": "http://172.16.11.134:37803",
"id": "http://172.16.11.134:37803",
"capabilities": [
{
"caps": {
"browserName": "chrome",
"maxInstances": 1,
"platform": "WINDOWS",
"platformName": "WINDOWS",
"seleniumProtocol": "WebDriver",
"server:CONFIG_UUID": "8405f2b4-e375-4251-a2e8-50e432eb24b8"
}
}
],
"downPollingLimit": 2,
"hub": "http://goto-main:4444/grid/register",
"nodePolling": 5000,
"nodeStatusCheckTimeout": 5000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"register": true,
"registerCycle": 5000,
"unregisterIfStillDownAfter": 60000,
"enablePlatformVerification": true,
"custom": {},
"maxSession": 5,
"servlets": [],
"withoutServlets": [],
"avoidProxy": false,
"browserSideLog": false,
"captureLogsOnQuit": false,
"browserTimeout": 0,
"debug": false,
"host": "172.16.11.134",
"port": 37803,
"role": "node",
"timeout": 1800
}
}
}
]
},
{
"BusyNodes": [
{
"Node": {
"configuration": {
"remoteHost": "http://172.16.8.84:3753",
"id": "http://172.16.8.84:3753",
"capabilities": [
{
"caps": {
"browserName": "firefox",
"maxInstances": 2,
"platform": "WINDOWS",
"platformName": "WINDOWS",
"seleniumProtocol": "WebDriver",
"server:CONFIG_UUID": "61acf94e-1db8-4274-9587-1e32a0ebb378"
}
},
{
"caps": {
"browserName": "internet explorer",
"maxInstances": 1,
"platform": "WINDOWS",
"platformName": "WINDOWS",
"seleniumProtocol": "WebDriver",
"server:CONFIG_UUID": "4adb7e6b-784e-46c3-896f-a2fcb7413bfb"
}
}
],
"downPollingLimit": 2,
"hub": "http://localhost:4444/grid/register",
"nodePolling": 5000,
"nodeStatusCheckTimeout": 5000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"register": true,
"registerCycle": 5000,
"unregisterIfStillDownAfter": 60000,
"enablePlatformVerification": true,
"custom": {},
"maxSession": 5,
"servlets": [],
"withoutServlets": [],
"avoidProxy": false,
"browserSideLog": false,
"captureLogsOnQuit": false,
"browserTimeout": 0,
"debug": false,
"host": "172.16.8.84",
"port": 3753,
"role": "node",
"timeout": 1800
}
}
}
]
}
]
}