Avant de RESTing sur Selenium Grid pour diverses raisons, j'ai essayé de voir par programme l'état du nœud connecté au Hub. Vous pouvez le voir sur la console de l'écran Web, mais si possible, j'aimerais que vous le renvoyiez avec Json, mais il n'y a pas une telle fonction ...
Je n'ai pas pu trouver le code en me référant à l'original Personnalisation de la grille, et la méthode de démarrage semblait être ancienne: innocent: Y a-t-il les dernières informations quelque part? : en pensant:
Pour cela, c'est uniquement côté Hub, mais je l'enregistrerai pour ne pas oublier la méthode d'extension.
doux | version | Utilisation |
---|---|---|
java | 1.8.0_191 | |
selenium-server-standalone.jar | 3.14.0 |
Je construis un environnement de développement sur Windows. Installez-le simplement à Maven. Utilisez gson pour générer le serveur sélénium et la réponse Json.
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>
Selon Personnalisation de la grille, héritez de RegistryBasedServlet lors de l'accès à l'intérieur de Hub, et héritez de HttpServlet sinon. CA a l'air d etre bon.
Cette fois, nous voulons voir l'état du nœud connecté au Hub, nous hériterons donc du RegistryBasedServlet. J'ai créé deux programmes à titre d'essai.
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;
}
}
Seule la classe créée est incluse. Cette fois, je l'ai créé avec le nom extend.jar.
Placez tous les fichiers JAR dépendants dans lib.
C:\GRID
├─start-hub-extend.bat
│
└─lib
├ extend.jar
├ gson-2.8.5.jar
└ selenium-server-standalone-3.14.0.jar
Tout ce que vous avez à faire est de spécifier le chemin de classe et de le démarrer. Je spécifie la classe à ajouter avec -servlets, mais cette fois il y en a deux, donc ils sont séparés par une virgule.
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"
Lorsque j'essaye d'exécuter le lot, les caractères "[Hub. \ <Init >]" qui n'apparaissent généralement pas sur les 3e et 4e lignes apparaissent. En termes simples, vous devez y accéder avec "/ grid / admin / AllNodes /".
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 est dans l'état suivant
Avec / 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
}
}
}
]
}
Avec / 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": []
}
]
}
C'était inattendu, mais même si certains navigateurs sont configurés pour s'exécuter, le nœud semble être occupé même si un seul navigateur est en cours d'exécution. Je n'ai pas étudié l'API que j'utilise cette fois, donc j'ai peut-être fait une erreur en l'utilisant en premier lieu: penser:
Par exemple, même si un seul Firefox est en cours d'exécution ...
Si vous regardez / grid / admin / AllNodesState, il est déterminé qu'il s'agit de BusyNodes.
{
"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
}
}
}
]
}
]
}