Ich halte es für notwendig, etwas Kompliziertes zu tun, z. B. eine andere Anwendung auf dem Remote-Zielterminal sowie im Browser auszuführen.
Ah, ich verstehe das nicht mehr wirklich, also habe ich es so gemacht, dass es mit Bildern verschoben werden kann: müde_gesicht:
Ich verwende Stream nicht in meinem Code und habe viele Dinge getan, aber ich werde es als Memorandum aufzeichnen.
Aufgrund der Bildauswahl ist Node nur mit 64-Bit-Betriebssystemen kompatibel.
Dies ist die zur Überprüfung verwendete Software. Ich erstelle eine Verifizierungsversion unter Windows.
Sanft | Ausführung | Verwenden |
---|---|---|
java 64bit | jdk-8.0.212.03-hotspot(AdoptOpenJDK) | |
selenium-server-standalone.jar | 3.141.59 | |
sikulixapi | 1.1.4-SNAPSHOT | Knotenbildauswahl Funktioniert nur in 64bit |
gson | 2.8.5 | Eingabe / Ausgabe der JSON-Datei |
httpclient | 4.5.8 | Führen Sie REST aus |
Es ist ein Moment mit Maven.
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>
<repositories>
<repository>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>sonatype</id>
<name>sonatype Repository</name>
<url>http://oss.sonatype.org/content/groups/public</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>sonatype</id>
<name>sonatype Repository</name>
<url>http://oss.sonatype.org/content/groups/public</url>
</pluginRepository>
</pluginRepositories>
<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.59</version>
</dependency>
<dependency>
<groupId>com.sikulix</groupId>
<artifactId>sikulixapi</artifactId>
<version>1.1.4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.8</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>
Dieses Mal wird die Anforderung von / grid / admin / RequestToSessionMachine ~ an das Terminal der in der URL angegebenen Sitzung gesendet. Alle Austausche außer der URL werden im JSON-Format gesendet.
Seien Sie vorsichtig, es gibt keine Sitzung, nur indem Sie den Knoten verbinden. Eine Sitzung wird auf dem Hub nur erstellt, wenn Sie den Browser bedienen können.
Schließlich wird die Anfrage wie folgt an Hub gesendet
http://HubIP:HubPort/grid/admin/RequestToSessionMachine/session/99999XXXXX99999/extra/ImageSelector/doubleclick
Fordern Sie den Knoten, auf dem die Sitzung "99999XXXXX99999" ausgeführt wird, wie folgt an, warten Sie auf das Ergebnis und senden Sie es unverändert an den Anrufer zurück.
http://NodeIP:NodePort//extra/ImageSelector/doubleclick
Es wäre am besten, es mit TestSession.forward senden zu können, aber ich habe es nicht mehr verwendet, weil ich SeleniumBasedRequest als Argument brauchte und es schwierig war, ~~ zu untersuchen.
Ich aktualisiere die Zugriffszeit so, dass die Sitzungszeitüberschreitungszeit nicht benötigt wird, aber je nach Zeitüberschreitungszeit möglicherweise nicht funktioniert.
RequestToSessionMachine.java
package selenium.extend.hub.servlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.openqa.grid.common.exception.GridException;
import org.openqa.grid.internal.GridRegistry;
import org.openqa.grid.internal.TestSession;
import org.openqa.grid.internal.TestSlot;
import org.openqa.grid.web.servlet.RegistryBasedServlet;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
public class RequestToSessionMachine extends RegistryBasedServlet {
private static final Pattern SESSION_ID_PATTERN = Pattern.compile("/grid/admin/RequestToSessionMachine/session/([^/]+).*");
public RequestToSessionMachine() {
this(null);
}
public RequestToSessionMachine(GridRegistry registry) {
super(registry);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
process(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
process(request, response);
}
protected void process(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("Start RequestToSessionMachine");
response.setContentType("application/json");
response.setCharacterEncoding(StandardCharsets.UTF_8.toString());
JsonObject json = new JsonObject();
CloseableHttpClient client = null;
CloseableHttpResponse res = null;
try {
//Rufen Sie die Informationen ab, die der Sitzungs-ID der URL zugeordnet sind
TestSession session = getActiveTestSession(getSessionIdFromPath(request.getRequestURI()));
if (session != null) {
//Sitzungszugriffszeit zurücksetzen(Verlängern Sie die Zeitüberschreitung)
session.setIgnoreTimeout(false);
//Generieren Sie eine Verbindungs-URL zum Knoten mit der Sitzung
TestSlot slot = session.getSlot();
URL remoteRequestURL = new URL(slot.getRemoteURL(), trimSessionPath(request.getRequestURI()));
//Fordern Sie Json des Körpers an, wie er ist
client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(remoteRequestURL.toURI());
httpPost.setHeader("Content-type", "application/json; charset=UTF-8");
BufferedReader bufferReaderBody = new BufferedReader(request.getReader());
StringBuilder jsonBody = new StringBuilder();
String line = null;
while ((line = bufferReaderBody.readLine()) != null) {
jsonBody.append(line);
}
StringEntity entity = new StringEntity(jsonBody.toString(), StandardCharsets.UTF_8);
httpPost.setEntity(entity);
res = client.execute(httpPost);
//Sitzungszugriffszeit zurücksetzen(Verlängern Sie die Zeitüberschreitung)
session.setIgnoreTimeout(false);
int status = res.getStatusLine().getStatusCode();
response.setStatus(status);
if (status == 200) {
Gson gson = new Gson();
json = gson.fromJson(EntityUtils.toString(res.getEntity(), StandardCharsets.UTF_8), JsonObject.class);
} else {
json.addProperty("error", "Response Code " + status);
}
} else {
json.addProperty("error", "No Match Active Test Session for Session ID");
}
} catch (MalformedURLException e) {
e.printStackTrace();
json.addProperty("error", e.getMessage());
} catch (URISyntaxException e) {
e.printStackTrace();
json.addProperty("error", e.getMessage());
} catch (IOException e) {
e.printStackTrace();
json.addProperty("error", e.getMessage());
} finally {
try {
if (res != null) {
res.close();
}
} catch (IOException e) {
e.printStackTrace();
throw new GridException(e.getMessage());
} finally {
if (client != null) {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
throw new GridException(e.getMessage());
}
}
}
}
System.out.println("ResponseJson:" + json.toString());
response.getWriter().print(json);
response.getWriter().close();
System.out.println("End RequestToSessionMachine");
}
private TestSession getActiveTestSession(String sessionId) {
Iterator<TestSession> itr = super.getRegistry().getActiveSessions().iterator();
TestSession session = null;
System.out.println("Active Session Size:" + super.getRegistry().getActiveSessions().size());
System.out.println("Search Session ID:" + sessionId);
while (itr.hasNext()) {
TestSession s = itr.next();
if (s.getExternalKey().getKey().equals(sessionId)) {
session = s;
break;
}
}
return session;
}
private String getSessionIdFromPath(String pathInfo) {
Matcher matcher = SESSION_ID_PATTERN.matcher(pathInfo);
if (matcher.matches()) {
return matcher.group(1);
}
throw new IllegalArgumentException("Invalid request. Session Id is not present");
}
private String trimSessionPath(String pathInfo) {
return pathInfo.replaceFirst("/grid/admin/RequestToSessionMachine/session/" + getSessionIdFromPath(pathInfo), "");
}
}
Doppelklicken Sie mithilfe der API von sikulix im gesendeten JSON Base64-Image auf den passenden Teil auf dem Desktop.
sikulix-api Informationen zum Inhalt finden Sie auf der offiziellen Seite.
ImageSelector.java
package selenium.extend.node.servlet;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.sikuli.script.FindFailed;
import org.sikuli.script.Image;
import org.sikuli.script.Screen;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
public class ImageSelector extends HttpServlet {
private static final String DOUBLECLICK = "/extra/ImageSelector/doubleclick";
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
JsonObject jsonResponse = null;
if (request.getRequestURI().startsWith(DOUBLECLICK)) {
jsonResponse = doubleClick(request, response);
} else {
jsonResponse = new JsonObject();
jsonResponse.addProperty("error", "Request Command is No Support");
}
response.getWriter().print(jsonResponse);
response.getWriter().close();
}
protected JsonObject doubleClick(HttpServletRequest request, HttpServletResponse response) {
System.out.println("Start ImageSelector");
response.setContentType("application/json");
response.setCharacterEncoding(StandardCharsets.UTF_8.toString());
response.setStatus(200);
JsonObject json = new JsonObject();
try {
//Extrahieren Sie die Informationen des aus json auswählenden Körpers
BufferedReader bufferReaderBody = new BufferedReader(request.getReader());
StringBuilder jsonBody = new StringBuilder();
String line = null;
while ((line = bufferReaderBody.readLine()) != null) {
jsonBody.append(line);
}
Gson gson = new Gson();
JsonObject reqJson = gson.fromJson(jsonBody.toString(), JsonObject.class);
String imageBase64 = reqJson.get("imageBase64").getAsString();
String[] parts = imageBase64.split(",");
String imageString = parts[1];
byte[] imageByte = Base64.getDecoder().decode(imageString);
ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
Image image = new Image(ImageIO.read(bis));
bis.close();
//Suchen Sie das Bild auf dem gesamten Bildschirm und doppelklicken Sie
Screen sc = new Screen();
//Wartezeiteinstellung
sc.setAutoWaitTimeout(30);
sc.doubleClick(image);
json.addProperty("info", "Done DoubleClick");
} catch (IOException e) {
e.printStackTrace();
json.addProperty("error", e.getMessage());
} catch (FindFailed e) {
e.printStackTrace();
json.addProperty("error", e.getMessage());
}
System.out.println("End ImageSelector");
return json;
}
}
Jar es zum Laden in Selenium Grid. Die Verzeichnisstruktur ist wie folgt.
Im vorherigen Artikel wurde ein AllNodes-System erstellt, diesmal ist dies jedoch nicht erforderlich.
Exportieren Sie nur die folgenden Dateien in jar. Der Name ist "verlängern.jar".
Platzieren Sie "extens.jar" in den Hub- und Node-Verzeichnissen und laden Sie es.
C:.
│ start-hub.bat
│
└─lib
commons-logging-1.2.jar
extend.jar
gson-2.8.5.jar
httpclient-4.5.8.jar
httpcore-4.4.11.jar
selenium-server-standalone-3.141.59.jar
start-hub.bat
java -cp lib/* org.openqa.grid.selenium.GridLauncherV3 -role hub -servlets "selenium.extend.hub.servlet.RequestToSessionMachine"
Beim Start wird der Zugriffspfad zu RequestToSessionMachine wie in der 4. Zeile angezeigt angezeigt.
C:\selenium>java -cp lib/* org.openqa.grid.selenium.GridLauncherV3 -role hub -servlets "selenium.extend.hub.servlet.RequestToSessionMachine"
15:57:41.639 INFO [GridLauncherV3.parse] - Selenium server version: 3.141.59, revision: e82be7d358
15:57:41.764 INFO [GridLauncherV3.lambda$buildLaunchers$5] - Launching Selenium Grid hub on port XXXX
15:57:41.858 INFO [Hub.<init>] - binding selenium.extend.hub.servlet.RequestToSessionMachine to /grid/admin/RequestToSessionMachine/*
2019-05-31 15:57:42.242:INFO::main: Logging initialized @1617ms to org.seleniumhq.jetty9.util.log.StdErrLog
15:57:42.757 INFO [Hub.start] - Selenium Grid hub is up and running
15:57:42.773 INFO [Hub.start] - Nodes should register to http://XXX.XXX.XXX.XXX:XXXX/grid/register/
15:57:42.773 INFO [Hub.start] - Clients should connect to http://XXX.XXX.XXX.XXX:XXXX/wd/hub
C:.
│ chromedriver.exe
│ NodeConfigBrowser.json
│ start-node.bat
│
└─lib
commons-logging-1.2.jar
extend.jar
gson-2.8.5.jar
httpclient-4.5.8.jar
httpcore-4.4.11.jar
jna-4.5.2.jar
jna-platform-4.5.2.jar
selenium-server-standalone-3.141.59.jar
sikulix2tigervnc-2.0.0-SNAPSHOT.jar
sikulixapi-1.1.4-SNAPSHOT.jar
NodeConfigBrowser.json
{
"capabilities": [
{
"platform": "WINDOWS",
"browserName": "chrome",
"maxInstances": 1,
"seleniumProtocol": "WebDriver"
}
],
"hub": "http://XXXXXXXX:XXXX/grid/register",
"register": true
}
start-node.bat
java -Dwebdriver.chrome.driver=chromedriver.exe -cp lib/* org.openqa.grid.selenium.GridLauncherV3 -role node -servlets "selenium.extend.node.servlet.ImageSelector" -nodeConfig NodeConfigBrowser.json
Beim Start wird der Zugriffspfad zu ImageSelector wie in der 4. Zeile angezeigt angezeigt.
C:\selenium-node>java -Dwebdriver.chrome.driver=chromedriver.exe -cp lib/* org.openqa.grid.selenium.GridLauncherV3 -role node -servlets "selenium.extend.node.servlet.ImageSelector" -nodeConfig NodeConfigBrowser.json
16:01:08.578 INFO [GridLauncherV3.parse] - Selenium server version: 3.141.59, revision: e82be7d358
16:01:08.704 INFO [GridLauncherV3.lambda$buildLaunchers$7] - Launching a Selenium Grid node on port XXXX
16:01:09.126 INFO [SelfRegisteringRemote.addExtraServlets] - binding selenium.extend.node.servlet.ImageSelector to /extra/ImageSelector/*
2019-05-31 16:01:09.220:INFO::main: Logging initialized @981ms to org.seleniumhq.jetty9.util.log.StdErrLog
16:01:09.485 INFO [WebDriverServlet.<init>] - Initialising WebDriverServlet
16:01:09.594 INFO [SeleniumServer.boot] - Selenium Server is up and running on port 42345
16:01:09.594 INFO [GridLauncherV3.lambda$buildLaunchers$7] - Selenium Grid node is up and ready to register to the hub
16:01:09.750 INFO [SelfRegisteringRemote$1.run] - Starting auto registration thread. Will try to register every 5000 ms.
16:01:10.237 INFO [SelfRegisteringRemote.registerToHub] - Registering the node to the hub: http://XXX.XXX.XXX.XXX:XXXX/grid/register
16:01:10.549 INFO [SelfRegisteringRemote.registerToHub] - The node is registered to the hub and ready to use
Sie können Curl oder etwas anderes verwenden, aber da es schwierig ist, eine Sitzung zu generieren, verwenden wir die im vorherigen Artikel erstellte Umgebung.
Das Image des Operationsziels wird mit einem geeigneten Webdienst in base64 konvertiert, und die Informationen werden erneut ausgeführt.
Es könnte in Zukunft einfacher gewesen sein, dies zu bestätigen, wenn es in das base64-Konvertierungsprogramm aufgenommen wurde.
GoogleTest.java
package test;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.junit.Test;
import org.openqa.selenium.Point;
import com.google.gson.JsonObject;
import page.Google;
public class GoogleTest extends TestBase {
@Test
public void image() throws Exception {
driver.get(Google._url);
//Bewegen Sie den Browser an eine unsichtbare Position
driver.manage().window().setPosition(new Point(-2000, 0));
CloseableHttpClient client = null;
CloseableHttpResponse res = null;
JsonObject json = new JsonObject();
try {
//Generierung der Knotenverbindungs-URL
URL remoteRequestURL = new URL("http://localhost:4444/grid/admin/RequestToSessionMachine/session/" + driver.getSessionId() + "/extra/ImageSelector/doubleclick");
//Fordern Sie Json des Körpers an, wie er ist
client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(remoteRequestURL.toURI());
httpPost.setHeader("Content-type", "application/json; charset=UTF-8");
json.addProperty("imageBase64", "data:image/png;base64,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");
StringEntity entity = new StringEntity(json.toString(), StandardCharsets.UTF_8);
httpPost.setEntity(entity);
res = client.execute(httpPost);
System.out.println(res.getStatusLine().getStatusCode());
System.out.println(EntityUtils.toString(res.getEntity(), StandardCharsets.UTF_8));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (res != null) {
res.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (client != null) {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
Auf der Knotenseite funktioniert das tatsächlich so: kissing_heart:
Recommended Posts