From 0975f7bfec01ebe09d0444f4bafc57019eded14b Mon Sep 17 00:00:00 2001 From: "N. Dimer" Date: Thu, 27 Feb 2025 12:35:38 +0100 Subject: [PATCH 1/4] Allow to send load test metrics at the runtime. --- .../common/client/api/GatewayApi.java | 9 +- .../common/client/api/GatewayApiRetro.java | 9 +- .../common/client/api/RuntimeApi.java | 8 + .../common/client/api/RuntimeApiRetro.java | 4 + .../client/dto/CaseMetricsUpdateDto.java | 96 ++++++++++++ .../dto/LoadTestMetricsUpdateRequest.java | 60 +++++++ .../io/cloudbeat/common/config/CbConfig.java | 148 +++++++++++++++--- .../common/config/JsonConfigLoader.java | 36 ++++- pom.xml | 2 +- 9 files changed, 339 insertions(+), 33 deletions(-) create mode 100644 cb-kit-common/src/main/java/io/cloudbeat/common/client/dto/CaseMetricsUpdateDto.java create mode 100644 cb-kit-common/src/main/java/io/cloudbeat/common/client/dto/LoadTestMetricsUpdateRequest.java diff --git a/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/GatewayApi.java b/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/GatewayApi.java index a06ced9..7499a76 100644 --- a/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/GatewayApi.java +++ b/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/GatewayApi.java @@ -3,6 +3,7 @@ import io.cloudbeat.common.client.CbClientException; import io.cloudbeat.common.client.RetrofitApiBase; import io.cloudbeat.common.client.dto.CaseStatusInfoDto; +import io.cloudbeat.common.client.dto.LoadTestMetricsUpdateRequest; import io.cloudbeat.common.client.dto.TestStatusRequest; import io.cloudbeat.common.model.runtime.NewInstanceOptions; import io.cloudbeat.common.model.runtime.NewRunOptions; @@ -20,7 +21,13 @@ public class GatewayApi extends RetrofitApiBase { public GatewayApi(GatewayApiRetro retroApi) { this.retroApi = retroApi; } - + public void updateLoadTestMetrics( + String runId, + String instanceId, + LoadTestMetricsUpdateRequest request + ) throws CbClientException { + executeAsync(retroApi.updateLoadTestMetrics(runId, instanceId, request)); + } public void updateTestCaseStatus( String runId, String instanceId, diff --git a/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/GatewayApiRetro.java b/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/GatewayApiRetro.java index da12fd8..7fe6f34 100644 --- a/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/GatewayApiRetro.java +++ b/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/GatewayApiRetro.java @@ -1,18 +1,15 @@ package io.cloudbeat.common.client.api; -import io.cloudbeat.common.client.CbApiResponse; +import io.cloudbeat.common.client.dto.LoadTestMetricsUpdateRequest; import io.cloudbeat.common.client.dto.TestStatusRequest; -import io.cloudbeat.common.model.runtime.NewInstanceOptions; -import io.cloudbeat.common.model.runtime.NewRunOptions; -import io.cloudbeat.common.reporter.model.RunStatus; -import io.cloudbeat.common.reporter.model.TestResult; import retrofit2.Call; import retrofit2.http.Body; import retrofit2.http.POST; -import retrofit2.http.PUT; import retrofit2.http.Path; public interface GatewayApiRetro { @POST("testresult/Status") Call updateTestCaseStatus(@Body TestStatusRequest statusRequest); + @POST("testresult/load/run/{runId}/instance/{instanceId}/metrics") + Call updateLoadTestMetrics(@Path("runId") String runId, @Path("instanceId") String instanceId, @Body LoadTestMetricsUpdateRequest request); } diff --git a/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/RuntimeApi.java b/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/RuntimeApi.java index 175c62f..630a3e5 100644 --- a/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/RuntimeApi.java +++ b/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/RuntimeApi.java @@ -3,6 +3,7 @@ import io.cloudbeat.common.client.CbClientException; import io.cloudbeat.common.client.RetrofitApiBase; import io.cloudbeat.common.client.dto.CaseStatusInfoDto; +import io.cloudbeat.common.client.dto.LoadTestMetricsUpdateRequest; import io.cloudbeat.common.client.dto.TestStatusRequest; import io.cloudbeat.common.model.runtime.NewInstanceOptions; import io.cloudbeat.common.model.runtime.NewRunOptions; @@ -34,6 +35,13 @@ public void updateRunStatus(String runId, RunStatus status) throws CbClientExcep public void updateInstanceStatus(String runId, String instanceId, RunStatus status) throws CbClientException { execute(retroApi.updateInstanceStatus(runId, instanceId, status)); } + public void updateLoadTestMetrics( + String runId, + String instanceId, + LoadTestMetricsUpdateRequest request + ) throws CbClientException { + executeAsync(retroApi.updateLoadTestMetrics(runId, instanceId, request)); + } public void updateTestCaseStatus( String runId, String instanceId, diff --git a/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/RuntimeApiRetro.java b/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/RuntimeApiRetro.java index e0ad7ed..b85eb2b 100644 --- a/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/RuntimeApiRetro.java +++ b/cb-kit-common/src/main/java/io/cloudbeat/common/client/api/RuntimeApiRetro.java @@ -1,6 +1,8 @@ package io.cloudbeat.common.client.api; import io.cloudbeat.common.client.CbApiResponse; +import io.cloudbeat.common.client.dto.CaseMetricsUpdateDto; +import io.cloudbeat.common.client.dto.LoadTestMetricsUpdateRequest; import io.cloudbeat.common.client.dto.TestStatusRequest; import io.cloudbeat.common.model.runtime.NewInstanceOptions; import io.cloudbeat.common.model.runtime.NewRunOptions; @@ -25,6 +27,8 @@ public interface RuntimeApiRetro { Call updateInstanceStatus(@Path("runId") String runId, @Path("instanceId") String instanceId, @Body RunStatus status); @POST("api/run/{runId}/instance/{instanceId}/case") Call updateTestCaseStatus(@Path("runId") String runId, @Path("instanceId") String instanceId, @Body TestStatusRequest status); + @POST("load/api/run/{runId}/instance/{instanceId}/metrics") + Call updateLoadTestMetrics(@Path("runId") String runId, @Path("instanceId") String instanceId, @Body LoadTestMetricsUpdateRequest request); @POST("api/run/{runId}/instance/{instanceId}/end") Call endInstance(@Path("runId") String runId, @Path("instanceId") String instanceId); @PUT("runs/api/run/{runId}/instance/{instanceId}/result") diff --git a/cb-kit-common/src/main/java/io/cloudbeat/common/client/dto/CaseMetricsUpdateDto.java b/cb-kit-common/src/main/java/io/cloudbeat/common/client/dto/CaseMetricsUpdateDto.java new file mode 100644 index 0000000..43fc3e2 --- /dev/null +++ b/cb-kit-common/src/main/java/io/cloudbeat/common/client/dto/CaseMetricsUpdateDto.java @@ -0,0 +1,96 @@ +package io.cloudbeat.common.client.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.cloudbeat.common.reporter.model.StepType; +import io.cloudbeat.common.reporter.model.extra.IStepExtra; +import io.cloudbeat.common.reporter.serializer.EpochTimeSerializer; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class CaseMetricsUpdateDto { + @JsonSerialize(using = EpochTimeSerializer.class) + long timestamp; + String name; + String fqn; + final Map metrics = new HashMap<>(); + final ArrayList stepList = new ArrayList<>(); + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getFqn() { + return fqn; + } + + public void setFqn(String fqn) { + this.fqn = fqn; + } + + public Map getMetrics() { + return metrics; + } + + public ArrayList getStepList() { + return stepList; + } + + public static class StepMetricsUpdateDto { + String name; + String fqn; + StepType type; + final Map metrics = new HashMap<>(); + final Map extra = new HashMap<>(); + final ArrayList stepList = new ArrayList<>(); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getFqn() { + return fqn; + } + + public void setFqn(String fqn) { + this.fqn = fqn; + } + + public void setType(StepType type) { + this.type = type; + } + + public StepType getType() { + return type; + } + + public Map getMetrics() { + return metrics; + } + + public Map getExtra() { + return extra; + } + + public ArrayList getStepList() { + return stepList; + } + } +} diff --git a/cb-kit-common/src/main/java/io/cloudbeat/common/client/dto/LoadTestMetricsUpdateRequest.java b/cb-kit-common/src/main/java/io/cloudbeat/common/client/dto/LoadTestMetricsUpdateRequest.java new file mode 100644 index 0000000..d8ae9d1 --- /dev/null +++ b/cb-kit-common/src/main/java/io/cloudbeat/common/client/dto/LoadTestMetricsUpdateRequest.java @@ -0,0 +1,60 @@ +package io.cloudbeat.common.client.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.cloudbeat.common.reporter.serializer.EpochTimeSerializer; + +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class LoadTestMetricsUpdateRequest { + @Nonnull + String runId; + @Nonnull + String instanceId; + @Nonnull + @JsonSerialize(using = EpochTimeSerializer.class) + long timestamp; + @Nonnull + final ArrayList caseList = new ArrayList<>(); + + @Nonnull + final Map metrics = new HashMap<>(); + + public ArrayList getCaseList() { + return caseList; + } + + public Map getMetrics() { + return metrics; + } + + public String getRunId() { + return runId; + } + + public String getInstanceId() { + return instanceId; + } + + public long getTimestamp() { + return timestamp; + } + + public void setRunId(@Nonnull String runId) { + this.runId = runId; + } + + public void setInstanceId(@Nonnull String instanceId) { + this.instanceId = instanceId; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + public void addCaseMetrics(CaseMetricsUpdateDto caseMetrics) { + caseList.add(caseMetrics); + } +} diff --git a/cb-kit-common/src/main/java/io/cloudbeat/common/config/CbConfig.java b/cb-kit-common/src/main/java/io/cloudbeat/common/config/CbConfig.java index 19f21ac..27b86c4 100755 --- a/cb-kit-common/src/main/java/io/cloudbeat/common/config/CbConfig.java +++ b/cb-kit-common/src/main/java/io/cloudbeat/common/config/CbConfig.java @@ -1,15 +1,12 @@ package io.cloudbeat.common.config; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; +import java.util.*; + import org.apache.commons.lang3.StringUtils; public class CbConfig { public static final String DEFAULT_WEBDRIVER_URL = "http://localhost:4444/wd/hub"; - //public static final String DEFAULT_API_URL = "https://api.cloudbeat.io"; - public final static String DEFAULT_API_URL = "http://212.80.207.119:8887"; + public static final String DEFAULT_API_URL = "https://api.cloudbeat.io"; public static final String CB_API_KEY = "CB_API_KEY"; public static final String CB_API_URL = "CB_API_URL"; public static final String CB_PROJECT_ID = "CB_PROJECT_ID"; @@ -22,8 +19,10 @@ public class CbConfig { public static final String CB_OPT_PREFIX = "CB_OPT."; public static final String CB_SELENIUM_URL = "CB_SELENIUM_URL"; public static final String CB_APPIUM_URL = "CB_APPIUM_URL"; - public static final String CB_RUNNER_GATEWAY_TOKEN = "testmonitortoken"; - public static final String CB_RUNNER_GATEWAY_URL = "testmonitorurl"; + public static final String CB_GATEWAY_TOKEN_PROP_NAME = "testmonitortoken"; + public static final String CB_GATEWAY_URL_PROP_NAME = "testmonitorurl"; + public static final String CB_GATEWAY_TOKEN = "CB_GATEWAY_TOKEN"; + public static final String CB_GATEWAY_URL = "CB_GATEWAY_URL"; final Properties props; String runId; @@ -41,7 +40,7 @@ public class CbConfig { Map envVars; Map options; List tags; - List cases; + List cases; public CbConfig() { this.props = null; @@ -71,10 +70,10 @@ public CbConfig(Properties props) { } private void loadGatewaySettingsFromProps() { - if (StringUtils.isNotEmpty(System.getProperty(CB_RUNNER_GATEWAY_TOKEN))) - gatewayToken = System.getProperty(CB_RUNNER_GATEWAY_TOKEN); - if (StringUtils.isNotEmpty(System.getProperty(CB_RUNNER_GATEWAY_URL))) - gatewayUrl = System.getProperty(CB_RUNNER_GATEWAY_URL); + if (StringUtils.isNotEmpty(System.getProperty(CB_GATEWAY_TOKEN_PROP_NAME))) + gatewayToken = System.getProperty(CB_GATEWAY_TOKEN_PROP_NAME); + if (StringUtils.isNotEmpty(System.getProperty(CB_GATEWAY_URL_PROP_NAME))) + gatewayUrl = System.getProperty(CB_GATEWAY_URL_PROP_NAME); } private void loadConfigFromProps() { apiToken = getProperty(CB_API_KEY); @@ -95,14 +94,17 @@ private void loadConfigFromProps() { loadMapFromPrefixedProps(CB_ENV_PREFIX, envVars); } + private String getEnv(final String name, final String defaultValue) { + final String possibleValFromEnv = System.getenv(name); + if (StringUtils.isNotEmpty(possibleValFromEnv)) + return possibleValFromEnv; + return defaultValue; + } private String getProperty(final String key, final String defaultValue) { final String propertyName = getPropertyNameFromConfigKey(key); if (props.containsKey(propertyName)) return props.getProperty(propertyName); - final String possibleValFromEnv = System.getenv(key); - if (StringUtils.isNotEmpty(possibleValFromEnv)) - return possibleValFromEnv; - return defaultValue; + return getEnv(key, defaultValue); } private String getProperty(final String key) { @@ -145,11 +147,27 @@ public Properties getProperties() { public Map getEnvironmentVariables() { return envVars; } - public String getGatewayToken() { return gatewayToken; } - public String getGatewayUrl() { return gatewayUrl; } - public String getApiToken() { return apiToken; } + public String getGatewayToken() { + if (gatewayToken == null) + return getEnv(CB_GATEWAY_TOKEN, null); + return gatewayToken; + } + public String getGatewayUrl() { + if (gatewayUrl == null) + return getEnv(CB_GATEWAY_URL, null); + return gatewayUrl; + } + public String getApiToken() { + if (apiToken == null) + return getEnv(CB_API_KEY, null); + return apiToken; + } - public String getApiEndpointUrl() { return apiEndpointUrl; } + public String getApiEndpointUrl() { + if (apiEndpointUrl == null) + return getEnv(CB_API_URL, DEFAULT_API_URL); + return apiEndpointUrl; + } public String getProjectId() { return projectId; } @@ -166,4 +184,92 @@ public boolean isRunningInCb() { public String getAppiumUrl() { return seleniumUrl; } public String getSeleniumOrAppiumUrl() { return seleniumUrl != null && seleniumUrl.length() > 0 ? seleniumUrl : appiumUrl; } + + public List getCases() { + return cases; + } + + public static class CaseDef { + Optional id; + String name; + String fqn; + short scriptType; + String parameterData; + short parameterMode; + int iterationCount; + short iterationMode; + Map details = new HashMap<>(); + + public Optional getId() { + return id; + } + + public void setId(Optional id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getFqn() { + return fqn; + } + + public void setFqn(String fqn) { + this.fqn = fqn; + } + + public String getParameterData() { + return parameterData; + } + + public void setParameterData(String parameterData) { + this.parameterData = parameterData; + } + + public short getParameterMode() { + return parameterMode; + } + + public void setParameterMode(short parameterMode) { + this.parameterMode = parameterMode; + } + + public int getIterationCount() { + return iterationCount; + } + + public void setIterationCount(int iterationCount) { + this.iterationCount = iterationCount; + } + + public short getIterationMode() { + return iterationMode; + } + + public void setIterationMode(short iterationMode) { + this.iterationMode = iterationMode; + } + + public Map getDetails() { + return details; + } + + public void setDetails(Map details) { + this.details = details; + } + + public short getScriptType() { + return scriptType; + } + + public void setScriptType(short scriptType) { + this.scriptType = scriptType; + } + } } diff --git a/cb-kit-common/src/main/java/io/cloudbeat/common/config/JsonConfigLoader.java b/cb-kit-common/src/main/java/io/cloudbeat/common/config/JsonConfigLoader.java index 0cdf91c..8f6f988 100755 --- a/cb-kit-common/src/main/java/io/cloudbeat/common/config/JsonConfigLoader.java +++ b/cb-kit-common/src/main/java/io/cloudbeat/common/config/JsonConfigLoader.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Optional; public final class JsonConfigLoader { private static final String SELENIUM_URL_KEY = "seleniumUrl"; @@ -51,11 +52,38 @@ public static CbConfig load(String path) throws IOException { if (rootNode.has("Cases")) { config.cases = new ArrayList<>(); for (JsonNode caseNode : rootNode.get("Cases")) { - if (caseNode.get("Fqn") != null) - config.cases.add(caseNode.get("Fqn").asText()); - else if (caseNode.get("Details") != null) { + CbConfig.CaseDef caseDef = new CbConfig.CaseDef(); + config.cases.add(caseDef); + caseDef.setId(Optional.ofNullable( + caseNode.get("Id") != null ? caseNode.get("Id").asLong() : null) + ); + caseDef.setFqn(caseNode.get("Fqn") != null ? caseNode.get("Fqn").asText() : null); + caseDef.setName(caseNode.get("Name") != null ? caseNode.get("Name").asText() : null); + caseDef.setIterationCount( + caseNode.get("IterationCount") != null ? + caseNode.get("IterationCount").asInt(0) : 0); + caseDef.setParameterData( + caseNode.get("ParameterData") != null ? + caseNode.get("ParameterData").asText() : null); + caseDef.setScriptType( + (short) (caseNode.get("ScriptType") != null ? + caseNode.get("ScriptType").asInt(0) : 0)); + + if (caseNode.get("Details") != null) { if (caseNode.get("Details").get("FullyQualifiedName") != null) - config.cases.add(caseNode.get("Details").get("FullyQualifiedName").asText()); + caseDef.setFqn(caseNode.get("Details").get("FullyQualifiedName").asText()); + caseNode.get("Details").fields().forEachRemaining(f -> { + if (f.getKey().equals("FullyQualifiedName")) + return; + if (f.getValue() != null && f.getValue().canConvertToInt()) + caseDef.details.put(f.getKey(), f.getValue().asInt()); + else if (f.getValue() != null && f.getValue().canConvertToLong()) + caseDef.details.put(f.getKey(), f.getValue().asLong()); + else if (f.getValue() != null && f.getValue().isBoolean()) + caseDef.details.put(f.getKey(), f.getValue().asBoolean()); + else if (f.getValue() != null && !f.getValue().isNull()) + caseDef.details.put(f.getKey(), f.getValue().asText()); + }); } } } diff --git a/pom.xml b/pom.xml index d9e6006..26015d8 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 - 1.0.11-SNAPSHOT + 1.0.12-SNAPSHOT UTF-8 1.9.7 From a669dbadb71c6176977227f670863ad473201e68 Mon Sep 17 00:00:00 2001 From: "N. Dimer" Date: Fri, 6 Jun 2025 10:31:47 +0200 Subject: [PATCH 2/4] Bump DevTools version + prepare the main pom file for Maven Central deployment. --- .../io/cloudbeat/common/config/CbConfig.java | 19 ++++++++-- .../common/config/JsonConfigLoader.java | 5 ++- cb-kit-selenium4/pom.xml | 6 +-- .../io/cloudbeat/selenium/DevToolsHelper.java | 4 +- .../io/cloudbeat/selenium/SE4Element.java | 1 + .../selenium/Selenium4WebDriver.java | 13 ++++--- pom.xml | 37 ++++++++++++++++--- 7 files changed, 63 insertions(+), 22 deletions(-) diff --git a/cb-kit-common/src/main/java/io/cloudbeat/common/config/CbConfig.java b/cb-kit-common/src/main/java/io/cloudbeat/common/config/CbConfig.java index 27b86c4..65098d9 100755 --- a/cb-kit-common/src/main/java/io/cloudbeat/common/config/CbConfig.java +++ b/cb-kit-common/src/main/java/io/cloudbeat/common/config/CbConfig.java @@ -28,6 +28,8 @@ public class CbConfig { String runId; String runGroup; String instanceId; + Optional instanceIndex; + Optional instanceCount; String projectId; String gatewayToken; String gatewayUrl; @@ -102,8 +104,10 @@ private String getEnv(final String name, final String defaultValue) { } private String getProperty(final String key, final String defaultValue) { final String propertyName = getPropertyNameFromConfigKey(key); - if (props.containsKey(propertyName)) + if (props != null && props.containsKey(propertyName)) return props.getProperty(propertyName); + else if (props == null && System.getProperties().containsKey(key)) + return System.getProperties().getProperty(key, defaultValue); return getEnv(key, defaultValue); } @@ -149,12 +153,12 @@ public Properties getProperties() { public String getGatewayToken() { if (gatewayToken == null) - return getEnv(CB_GATEWAY_TOKEN, null); + return getProperty(CB_GATEWAY_TOKEN); return gatewayToken; } public String getGatewayUrl() { if (gatewayUrl == null) - return getEnv(CB_GATEWAY_URL, null); + return getProperty(CB_GATEWAY_URL); return gatewayUrl; } public String getApiToken() { @@ -172,7 +176,14 @@ public String getApiEndpointUrl() { public String getProjectId() { return projectId; } public String getInstanceId() { return instanceId; } - + public Optional getInstanceIndex() { return instanceIndex; } + public void setInstanceCount(Optional instanceCount) { + this.instanceCount = instanceCount; + } + public void setInstanceIndex(Optional instanceIndex) { + this.instanceIndex = instanceIndex; + } + public Optional getInstanceCount() { return instanceCount; } public String getRunId() { return runId; } public String getRunGroup() { return runGroup; } diff --git a/cb-kit-common/src/main/java/io/cloudbeat/common/config/JsonConfigLoader.java b/cb-kit-common/src/main/java/io/cloudbeat/common/config/JsonConfigLoader.java index 8f6f988..6f44dee 100755 --- a/cb-kit-common/src/main/java/io/cloudbeat/common/config/JsonConfigLoader.java +++ b/cb-kit-common/src/main/java/io/cloudbeat/common/config/JsonConfigLoader.java @@ -36,7 +36,8 @@ public static CbConfig load(String path) throws IOException { config.instanceId = rootNode.get("InstanceId").textValue(); config.instanceId = rootNode.get("InstanceId").textValue(); config.capabilities = mapper.readValue(rootNode.get("Capabilities").toString(), mapTypeRef); - mapFoldedCapabilities(config.capabilities, mapper); + if (config.capabilities != null) + mapFoldedCapabilities(config.capabilities, mapper); // remove technologyName capability, if presented (a left-over from legacy CB) if (config.capabilities != null && config.capabilities.containsKey("technologyName")) config.capabilities.remove("technologyName"); @@ -109,6 +110,8 @@ else if (System.getProperties().containsKey(APPIUM_URL_PROPERTY_KEY)) } private static void mapFoldedCapabilities(Map caps, ObjectMapper mapper) { + if (caps == null) + return; caps.forEach((key, value) -> { if (key.endsWith(":options") && value != null && value instanceof String && value.toString().startsWith("{")) { try { diff --git a/cb-kit-selenium4/pom.xml b/cb-kit-selenium4/pom.xml index 0c02c2a..55aeee9 100755 --- a/cb-kit-selenium4/pom.xml +++ b/cb-kit-selenium4/pom.xml @@ -16,9 +16,9 @@ - 4.14.1 - v117 - 8.1.1 + 4.27.0 + v131 + 9.2.2 diff --git a/cb-kit-selenium4/src/main/java/io/cloudbeat/selenium/DevToolsHelper.java b/cb-kit-selenium4/src/main/java/io/cloudbeat/selenium/DevToolsHelper.java index 349a8ec..3c274a6 100644 --- a/cb-kit-selenium4/src/main/java/io/cloudbeat/selenium/DevToolsHelper.java +++ b/cb-kit-selenium4/src/main/java/io/cloudbeat/selenium/DevToolsHelper.java @@ -2,8 +2,8 @@ import io.cloudbeat.common.reporter.model.LogLevel; import org.openqa.selenium.devtools.events.ConsoleEvent; -import org.openqa.selenium.devtools.v117.runtime.model.PropertyPreview; -import org.openqa.selenium.devtools.v117.runtime.model.RemoteObject; +import org.openqa.selenium.devtools.v131.runtime.model.PropertyPreview; +import org.openqa.selenium.devtools.v131.runtime.model.RemoteObject; import java.util.List; import java.util.logging.Level; diff --git a/cb-kit-selenium4/src/main/java/io/cloudbeat/selenium/SE4Element.java b/cb-kit-selenium4/src/main/java/io/cloudbeat/selenium/SE4Element.java index b457137..cede2fc 100644 --- a/cb-kit-selenium4/src/main/java/io/cloudbeat/selenium/SE4Element.java +++ b/cb-kit-selenium4/src/main/java/io/cloudbeat/selenium/SE4Element.java @@ -3,6 +3,7 @@ import io.cloudbeat.common.wrapper.webdriver.AbstractWebElement; import org.openqa.selenium.WebElement; +@SuppressWarnings({"deprecation"}) public class SE4Element implements AbstractWebElement { private final WebElement seElm; public SE4Element(WebElement element) { diff --git a/cb-kit-selenium4/src/main/java/io/cloudbeat/selenium/Selenium4WebDriver.java b/cb-kit-selenium4/src/main/java/io/cloudbeat/selenium/Selenium4WebDriver.java index 38cab89..5cc1c30 100755 --- a/cb-kit-selenium4/src/main/java/io/cloudbeat/selenium/Selenium4WebDriver.java +++ b/cb-kit-selenium4/src/main/java/io/cloudbeat/selenium/Selenium4WebDriver.java @@ -12,12 +12,12 @@ import org.openqa.selenium.devtools.Command; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.HasDevTools; -import org.openqa.selenium.devtools.v117.network.Network; -import org.openqa.selenium.devtools.v117.network.model.RequestId; -import org.openqa.selenium.devtools.v117.network.model.ResourceTiming; -import org.openqa.selenium.devtools.v117.performance.Performance; -import org.openqa.selenium.devtools.v117.performance.model.Metric; -import org.openqa.selenium.devtools.v117.runtime.Runtime; +import org.openqa.selenium.devtools.v131.network.Network; +import org.openqa.selenium.devtools.v131.network.model.RequestId; +import org.openqa.selenium.devtools.v131.network.model.ResourceTiming; +import org.openqa.selenium.devtools.v131.performance.Performance; +import org.openqa.selenium.devtools.v131.performance.model.Metric; +import org.openqa.selenium.devtools.v131.runtime.Runtime; import org.openqa.selenium.logging.LogEntries; import org.openqa.selenium.logging.LogType; @@ -27,6 +27,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +@SuppressWarnings({"deprecation"}) public class Selenium4WebDriver implements AbstractWebDriver { private final WebDriver driver; private final DevTools devTools; diff --git a/pom.xml b/pom.xml index 26015d8..08ec7dd 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 - 1.0.12-SNAPSHOT + 1.0.14 UTF-8 1.9.7 @@ -70,7 +70,7 @@ https://s01.oss.sonatype.org/content/repositories/snapshots - ossrh + ossrh-staging https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ @@ -117,9 +117,16 @@ org.apache.maven.plugins maven-gpg-plugin - 3.0.1 + 3.2.7 - true + + gpg + 29D22544178D45A730E0CD116AEDC2E2457C1163 + gpg.passphrase + + --pinentry-mode + loopback + @@ -131,7 +138,7 @@ - + + + org.sonatype.central + central-publishing-maven-plugin + 0.7.0 + true + + central + true + published + org.codehaus.mojo @@ -148,11 +166,18 @@ 1.5.0 true + ossrh + + flatten + flatten + flatten + flatten - process-resources + + package flatten From d7a2c9af5b3570bba85fb7e9c6eb39e1b397f235 Mon Sep 17 00:00:00 2001 From: romovs Date: Fri, 6 Jun 2025 12:54:02 +0300 Subject: [PATCH 3/4] Update pom.xml --- .gitignore | 3 +++ pom.xml | 6 ++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index c681709..a09b2bd 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,6 @@ target/ # VS Code Files # .vscode + +.flattened-pom.xml +.idea/* \ No newline at end of file diff --git a/pom.xml b/pom.xml index 08ec7dd..6a0c437 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 - 1.0.14 + 1.0.15 UTF-8 1.9.7 @@ -119,9 +119,7 @@ maven-gpg-plugin 3.2.7 - - gpg - 29D22544178D45A730E0CD116AEDC2E2457C1163 + ${gpg.keyname} gpg.passphrase --pinentry-mode From 63b062bf39471ee5b68afe759901829d43711fa9 Mon Sep 17 00:00:00 2001 From: "N. Dimer" Date: Fri, 6 Jun 2025 16:05:49 +0200 Subject: [PATCH 4/4] Add url and description in pom.xml files of selenium4 and junit5 sub modules. --- cb-kit-junit5/pom.xml | 3 +++ cb-kit-selenium4/pom.xml | 3 +++ 2 files changed, 6 insertions(+) diff --git a/cb-kit-junit5/pom.xml b/cb-kit-junit5/pom.xml index 7166da6..537224d 100644 --- a/cb-kit-junit5/pom.xml +++ b/cb-kit-junit5/pom.xml @@ -11,6 +11,9 @@ CloudBeat Kit for JUnit 5 + JUnit 5 integration library for CloudBeat + https://github.com/cloudbeat-io/cb-kit-java/tree/main/cb-kit-junit5 + cb-kit-junit5 jar diff --git a/cb-kit-selenium4/pom.xml b/cb-kit-selenium4/pom.xml index 55aeee9..22c6ba6 100755 --- a/cb-kit-selenium4/pom.xml +++ b/cb-kit-selenium4/pom.xml @@ -11,6 +11,9 @@ CloudBeat Kit for Selenium 4 + Selenium 4 integration library for CloudBeat + https://github.com/cloudbeat-io/cb-kit-java/tree/main/cb-kit-selenium4 + cb-kit-selenium4 jar