From c17e8662519746c7ae84cde7c027467376ebaee7 Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Fri, 17 Feb 2023 18:03:27 +0200 Subject: [PATCH 001/101] general section work --- .../main/java/solutions/bellatrix/web/components/TextField.java | 1 + 1 file changed, 1 insertion(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/TextField.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/TextField.java index 9caea43d..1f190fa5 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/TextField.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/TextField.java @@ -13,6 +13,7 @@ package solutions.bellatrix.web.components; +import org.openqa.selenium.Keys; import solutions.bellatrix.core.plugins.EventListener; import solutions.bellatrix.web.components.contracts.*; From 86c2835a3dce006aee67e04121eb6e3a62e5b410 Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Thu, 2 Mar 2023 11:07:55 +0200 Subject: [PATCH 002/101] new changes, tests --- .../solutions/bellatrix/web/infrastructure/ProxyServer.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index 479cf2c7..013027eb 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -15,10 +15,12 @@ import lombok.SneakyThrows; import net.lightbody.bmp.BrowserMobProxyServer; +import net.lightbody.bmp.core.har.HarEntry; import org.testng.Assert; import java.io.IOException; import java.net.ServerSocket; +import java.util.List; public class ProxyServer { private static final ThreadLocal PROXY_SERVER = new ThreadLocal<>(); @@ -37,6 +39,10 @@ public static void close() { } } + public List getCapturedEntries() { + return PROXY_SERVER.get().getHar().getLog().getEntries(); + } + public void assertNoErrorCodes() { var harEntries = PROXY_SERVER.get().getHar().getLog().getEntries(); var areThereErrorCodes = harEntries.stream().anyMatch(r From 5bf899db9014f12691b402b6445538e53fb3afd9 Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Mon, 6 Mar 2023 15:13:17 +0200 Subject: [PATCH 003/101] some changes, fixes and new tests --- .../web/infrastructure/ProxyServer.java | 42 ++++++++++++++++++- .../web/services/BrowserService.java | 9 ++-- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index 456522f6..548b0d61 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -16,12 +16,28 @@ import com.google.gson.Gson; import lombok.SneakyThrows; import net.lightbody.bmp.BrowserMobProxyServer; +import net.lightbody.bmp.core.har.Har; import net.lightbody.bmp.core.har.HarEntry; +import net.lightbody.bmp.core.har.HarLog; import net.lightbody.bmp.proxy.CaptureType; +import org.openqa.selenium.NotFoundException; +import org.openqa.selenium.StaleElementReferenceException; +import org.openqa.selenium.TimeoutException; +import org.openqa.selenium.remote.http.HttpMethod; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.Assert; +import solutions.bellatrix.core.configuration.ConfigurationService; +import solutions.bellatrix.core.utilities.Log; +import solutions.bellatrix.core.utilities.Wait; +import solutions.bellatrix.web.configuration.WebSettings; +import solutions.bellatrix.web.services.App; +import solutions.bellatrix.web.waitstrategies.WaitStrategy; import java.io.IOException; import java.net.ServerSocket; +import java.time.Duration; import java.util.List; public class ProxyServer { @@ -78,6 +94,30 @@ public static void assertRequestMade(String url) { Assert.assertTrue(areRequestsMade); } + public static void clearHistory() { + var oldHarCount = PROXY_SERVER.get().getHar().getLog().getEntries().stream().count(); + + PROXY_SERVER.get().newHar(); + Log.info(String.format("The proxy history with %s entries is cleared!", oldHarCount)); + } + + public static void waitForRequest(App app, String requestPartialUrl, HttpMethod httpMethod, int additionalTimeoutInSeconds) { + long timeout = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitForAjaxTimeout(); + long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); + var webDriverWait = new WebDriverWait(app.browser().getWrappedDriver(), Duration.ofSeconds(timeout + additionalTimeoutInSeconds), Duration.ofSeconds(sleepInterval)); + + webDriverWait.until(d -> { + var harEntries = PROXY_SERVER.get().getHar().getLog().getEntries(); + var areRequestsMade = harEntries.stream().anyMatch(r -> r.getRequest().getUrl().contains(requestPartialUrl) && r.getRequest().getMethod().equals(httpMethod.toString())); + + return areRequestsMade; + +// String script = String.format("return performance.getEntriesByType('resource').filter(item => item.name.toLowerCase().includes('%s'))[0] !== undefined;", requestPartialUrl); +// boolean result = (boolean)javascriptExecutor.executeScript(script); +// return result; + }); + } + public static void assertNoLargeImagesRequested() { var harEntries = PROXY_SERVER.get().getHar().getLog().getEntries(); var areThereLargeImages = harEntries.stream().anyMatch(r @@ -149,7 +189,7 @@ public static T getRequestByUrl(String url, String httpMethod, Class requ public static T getResponseByUrl(String url, String httpMethod, Class responseModelClass) { var harEntries = getCapturedEntries(); var harEntry = harEntries.stream() - .filter(r -> r.getRequest().getUrl().equals(url) && r.getRequest().getMethod().equals(httpMethod)) + .filter(r -> r.getRequest().getUrl().contains(url) && r.getRequest().getMethod().equals(httpMethod)) .findFirst() .orElse(null); if (harEntry == null) { diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index 11a7cecf..0504d2fa 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -14,10 +14,7 @@ package solutions.bellatrix.web.services; import org.apache.commons.lang3.StringUtils; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.NotFoundException; -import org.openqa.selenium.StaleElementReferenceException; -import org.openqa.selenium.TimeoutException; +import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.edge.EdgeDriver; import org.openqa.selenium.firefox.FirefoxDriver; @@ -85,6 +82,10 @@ public void switchToLastTab() { getWrappedDriver().switchTo().window(handles.stream().reduce((first, second) -> second).orElse("")); } + public void switchToNewTab() { + getWrappedDriver().switchTo().newWindow(WindowType.TAB); + } + public void switchToTab(Runnable condition) throws InterruptedException { Wait.retry(() -> { var handles = getWrappedDriver().getWindowHandles(); From 03492aa2fa0d5e24f777ccba2d623ff1c6b2b5e7 Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Mon, 6 Mar 2023 20:37:30 +0200 Subject: [PATCH 004/101] new tests --- .../solutions/bellatrix/web/infrastructure/ProxyServer.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index 548b0d61..f1acf1bf 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -23,6 +23,7 @@ import org.openqa.selenium.NotFoundException; import org.openqa.selenium.StaleElementReferenceException; import org.openqa.selenium.TimeoutException; +import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.http.HttpMethod; import org.openqa.selenium.support.ui.ExpectedCondition; import org.openqa.selenium.support.ui.ExpectedConditions; @@ -101,10 +102,10 @@ public static void clearHistory() { Log.info(String.format("The proxy history with %s entries is cleared!", oldHarCount)); } - public static void waitForRequest(App app, String requestPartialUrl, HttpMethod httpMethod, int additionalTimeoutInSeconds) { + public static void waitForRequest(WebDriver driver, String requestPartialUrl, HttpMethod httpMethod, int additionalTimeoutInSeconds) { long timeout = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitForAjaxTimeout(); long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); - var webDriverWait = new WebDriverWait(app.browser().getWrappedDriver(), Duration.ofSeconds(timeout + additionalTimeoutInSeconds), Duration.ofSeconds(sleepInterval)); + var webDriverWait = new WebDriverWait(driver, Duration.ofSeconds(timeout + additionalTimeoutInSeconds), Duration.ofSeconds(sleepInterval)); webDriverWait.until(d -> { var harEntries = PROXY_SERVER.get().getHar().getLog().getEntries(); From 7f8d07a168f010d1838e80dfd6505562e6599d2a Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Fri, 10 Mar 2023 18:17:58 +0200 Subject: [PATCH 005/101] Some changes --- .../web/infrastructure/ProxyServer.java | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index f1acf1bf..928b6972 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -16,25 +16,15 @@ import com.google.gson.Gson; import lombok.SneakyThrows; import net.lightbody.bmp.BrowserMobProxyServer; -import net.lightbody.bmp.core.har.Har; import net.lightbody.bmp.core.har.HarEntry; -import net.lightbody.bmp.core.har.HarLog; import net.lightbody.bmp.proxy.CaptureType; -import org.openqa.selenium.NotFoundException; -import org.openqa.selenium.StaleElementReferenceException; -import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.http.HttpMethod; -import org.openqa.selenium.support.ui.ExpectedCondition; -import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.Assert; import solutions.bellatrix.core.configuration.ConfigurationService; import solutions.bellatrix.core.utilities.Log; -import solutions.bellatrix.core.utilities.Wait; import solutions.bellatrix.web.configuration.WebSettings; -import solutions.bellatrix.web.services.App; -import solutions.bellatrix.web.waitstrategies.WaitStrategy; import java.io.IOException; import java.net.ServerSocket; @@ -156,7 +146,7 @@ public static T getLastResponse(Class responseModelClass) { return getCapturedEntries().stream() .map(HarEntry::getResponse) .filter(response -> response.getContent() != null) - .map(response -> new Gson().fromJson(response.getContent().getText(), responseModelClass)) + .map(response -> new Gson().fromJson(checkDataObject(response.getContent().getText()), responseModelClass)) .reduce((first, second) -> second) .orElse(null); } @@ -171,7 +161,7 @@ public static T getRequestByIndex(int index, Class requestModelClass) { public static T getResponseByIndex(int index, Class responseModelClass) { var harEntry = getCapturedEntries().get(index); String json = harEntry.getResponse().getContent().getText(); - return new Gson().fromJson(json, responseModelClass); + return new Gson().fromJson(checkDataObject(json), responseModelClass); } public static T getRequestByUrl(String url, String httpMethod, Class requestModelClass) { @@ -197,6 +187,17 @@ public static T getResponseByUrl(String url, String httpMethod, Class res return null; } String json = harEntry.getResponse().getContent().getText(); - return new Gson().fromJson(json, responseModelClass); + return new Gson().fromJson(checkDataObject(json), responseModelClass); + } + + private static String checkDataObject(String jsonString) { + String formatedJson = ""; + if (jsonString.substring(0,7).contains("data")) { + var startIndex = jsonString.indexOf("\"data\":{") + 7; + var lastIndex = jsonString.lastIndexOf("}"); + formatedJson = jsonString.substring(startIndex, lastIndex); + } + + return formatedJson; } } From 73518fd39de34bd63a6c87a10a4745652393fd6a Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Mon, 27 Mar 2023 11:33:57 +0300 Subject: [PATCH 006/101] Update ProxyServer --- .../web/infrastructure/ProxyServer.java | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index 928b6972..a2eb6b87 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -14,6 +14,9 @@ package solutions.bellatrix.web.infrastructure; import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import lombok.SneakyThrows; import net.lightbody.bmp.BrowserMobProxyServer; import net.lightbody.bmp.core.har.HarEntry; @@ -26,6 +29,7 @@ import solutions.bellatrix.core.utilities.Log; import solutions.bellatrix.web.configuration.WebSettings; +import java.io.Console; import java.io.IOException; import java.net.ServerSocket; import java.time.Duration; @@ -146,7 +150,7 @@ public static T getLastResponse(Class responseModelClass) { return getCapturedEntries().stream() .map(HarEntry::getResponse) .filter(response -> response.getContent() != null) - .map(response -> new Gson().fromJson(checkDataObject(response.getContent().getText()), responseModelClass)) + .map(response -> new Gson().fromJson(getDataObject(response.getContent().getText()), responseModelClass)) .reduce((first, second) -> second) .orElse(null); } @@ -161,13 +165,13 @@ public static T getRequestByIndex(int index, Class requestModelClass) { public static T getResponseByIndex(int index, Class responseModelClass) { var harEntry = getCapturedEntries().get(index); String json = harEntry.getResponse().getContent().getText(); - return new Gson().fromJson(checkDataObject(json), responseModelClass); + return new Gson().fromJson(getDataObject(json), responseModelClass); } public static T getRequestByUrl(String url, String httpMethod, Class requestModelClass) { var harEntries = getCapturedEntries(); var harEntry = harEntries.stream() - .filter(r -> r.getRequest().getUrl().equals(url) && r.getRequest().getMethod().equals(httpMethod)) + .filter(r -> r.getRequest().getUrl().contains(url) && r.getRequest().getMethod().equals(httpMethod)) .findFirst() .orElse(null); if (harEntry == null) { @@ -184,20 +188,33 @@ public static T getResponseByUrl(String url, String httpMethod, Class res .findFirst() .orElse(null); if (harEntry == null) { + System.out.println("There is no match!"); return null; } String json = harEntry.getResponse().getContent().getText(); - return new Gson().fromJson(checkDataObject(json), responseModelClass); + return new Gson().fromJson(getDataObject(json), responseModelClass); } - private static String checkDataObject(String jsonString) { - String formatedJson = ""; - if (jsonString.substring(0,7).contains("data")) { - var startIndex = jsonString.indexOf("\"data\":{") + 7; - var lastIndex = jsonString.lastIndexOf("}"); - formatedJson = jsonString.substring(startIndex, lastIndex); + private static String getDataObject(String jsonString) { + JsonParser parser = new JsonParser(); + JsonObject jsonObject = (JsonObject) parser.parse(jsonString); + + JsonObject dataObject = null; + JsonArray dataArray = null; + + if (jsonObject.has("data")){ + if (jsonObject.get("data").isJsonObject()){ + dataObject = jsonObject.getAsJsonObject("data"); + } else { + dataArray = jsonObject.getAsJsonArray("data"); + } } - return formatedJson; + if (dataObject == null){ +// return dataArray.toString(); + return jsonString; + } else { + return dataObject.toString(); + } } } From 93c7b8f891fd685fa58ba64673069e66d146f469 Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Mon, 27 Mar 2023 11:50:31 +0300 Subject: [PATCH 007/101] Add ChromeOptions argument --- .../solutions/bellatrix/web/infrastructure/DriverService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index 929f26ef..3f4303bb 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -221,7 +221,7 @@ private static WebDriver initializeDriverRegularMode() { WebDriverManager.chromedriver().setup(); var chromeOptions = new ChromeOptions(); addDriverOptions(chromeOptions); - chromeOptions.addArguments("--log-level=3"); + chromeOptions.addArguments("--log-level=3", "--remote-allow-origins=*"); chromeOptions.setAcceptInsecureCerts(true); System.setProperty("webdriver.chrome.silentOutput", "true"); if (shouldCaptureHttpTraffic) chromeOptions.setProxy(proxyConfig); From 66438c85356acb5fecf9b9dde681a1ec8a333fe9 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Tue, 28 Mar 2023 13:17:43 +0300 Subject: [PATCH 008/101] Fix issues after upgrade to latest BELLATRIX --- .../bellatrix/core/plugins/PluginExecutionEngine.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/plugins/PluginExecutionEngine.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/plugins/PluginExecutionEngine.java index fd36427b..32f889e8 100644 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/plugins/PluginExecutionEngine.java +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/plugins/PluginExecutionEngine.java @@ -14,14 +14,13 @@ package solutions.bellatrix.core.plugins; import java.lang.reflect.Method; -import java.util.HashSet; -import java.util.Set; +import java.util.*; public final class PluginExecutionEngine { - private final static Set PLUGINS; + private final static LinkedHashSet PLUGINS; static { - PLUGINS = new HashSet<>(); + PLUGINS = new LinkedHashSet<>(); } public static void addPlugin(Plugin plugin) { From db5484e33abdc567a5212824504e8d8e7b37b5c4 Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Tue, 28 Mar 2023 18:55:23 +0300 Subject: [PATCH 009/101] Browser.WaitUntil() method added --- .../solutions/bellatrix/web/services/BrowserService.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index 0504d2fa..578437ed 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -32,6 +32,7 @@ import java.time.Duration; import java.util.Objects; +import java.util.function.Function; public class BrowserService extends WebService { private final JavascriptExecutor javascriptExecutor; @@ -208,6 +209,14 @@ public void waitUntilPageLoadsCompletely() { webDriverWait.until(d -> javascriptExecutor.executeScript("return document.readyState").toString().equals("complete")); } + // TODO Refactor the other methods to reuse this one + public void waitUntil(Function function) { + long waitUntilReadyTimeout = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitUntilReadyTimeout(); + long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); + var webDriverWait = new WebDriverWait(getWrappedDriver(), Duration.ofSeconds(waitUntilReadyTimeout), Duration.ofSeconds(sleepInterval)); + webDriverWait.until(function); + } + public void waitForJavaScriptAnimations() { long waitForJavaScriptAnimationsTimeout = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitForJavaScriptAnimationsTimeout(); long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); From b6e4129fb8631ae34fbb0f3cb10a89c491849034 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Thu, 30 Mar 2023 09:05:02 +0300 Subject: [PATCH 010/101] fix issues with configs and scroll to visible --- .../java/solutions/bellatrix/web/components/WebComponent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java index 72fbc086..54e1e9e5 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java @@ -1033,7 +1033,7 @@ private void scrollToMakeElementVisible(WebElement wrappedElement) { private void scrollToVisible(WebElement wrappedElement, boolean shouldWait) { SCROLLING_TO_VISIBLE.broadcast(new ComponentActionEventArgs(this)); try { - javaScriptService.execute("arguments[0].scrollIntoView(true);", wrappedElement); + javaScriptService.execute("arguments[0].scrollIntoView({ block: \"center\" });", wrappedElement); if (shouldWait) { Thread.sleep(500); toExist().waitToBe(); From df465924e9b60cb62ec50cc6978e71730cbd9002 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Thu, 30 Mar 2023 09:16:47 +0300 Subject: [PATCH 011/101] fix using --- .../solutions/bellatrix/web/services/BrowserService.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index 42295800..4abf27f9 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -15,10 +15,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.StringEscapeUtils; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.NotFoundException; -import org.openqa.selenium.StaleElementReferenceException; -import org.openqa.selenium.TimeoutException; +import org.openqa.selenium.*; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import solutions.bellatrix.core.configuration.ConfigurationService; From de47feac29b9b6cae53d06a75c978d3cb803fb20 Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Thu, 30 Mar 2023 16:40:10 +0300 Subject: [PATCH 012/101] Added new ProxyServer methods --- .../web/infrastructure/ProxyServer.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index a2eb6b87..533d3e7d 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -21,6 +21,7 @@ import net.lightbody.bmp.BrowserMobProxyServer; import net.lightbody.bmp.core.har.HarEntry; import net.lightbody.bmp.proxy.CaptureType; +import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.http.HttpMethod; import org.openqa.selenium.support.ui.WebDriverWait; @@ -89,6 +90,13 @@ public static void assertRequestMade(String url) { Assert.assertTrue(areRequestsMade); } + public static void assertRequestNotMade(String url, HttpMethod httpMethod) { + var harEntries = PROXY_SERVER.get().getHar().getLog().getEntries(); + var areRequestsMade = harEntries.stream().anyMatch(r -> r.getRequest().getUrl().contains(url) && r.getRequest().getMethod().equals(httpMethod.toString())); + + Assert.assertFalse(areRequestsMade); + } + public static void clearHistory() { var oldHarCount = PROXY_SERVER.get().getHar().getLog().getEntries().stream().count(); @@ -106,7 +114,7 @@ public static void waitForRequest(WebDriver driver, String requestPartialUrl, Ht var areRequestsMade = harEntries.stream().anyMatch(r -> r.getRequest().getUrl().contains(requestPartialUrl) && r.getRequest().getMethod().equals(httpMethod.toString())); return areRequestsMade; - +// var javascriptExecutor = (JavascriptExecutor)driver; // String script = String.format("return performance.getEntriesByType('resource').filter(item => item.name.toLowerCase().includes('%s'))[0] !== undefined;", requestPartialUrl); // boolean result = (boolean)javascriptExecutor.executeScript(script); // return result; @@ -195,6 +203,18 @@ public static T getResponseByUrl(String url, String httpMethod, Class res return new Gson().fromJson(getDataObject(json), responseModelClass); } + public static void blockRequestByUrl(String url, HttpMethod httpMethod) { + PROXY_SERVER.get().blacklistRequests(url,407, httpMethod.toString()); + } + + public static void blockRequestByUrl(String url) { + PROXY_SERVER.get().blacklistRequests(url,407); + } + + public static void clearblockRequestList() { + PROXY_SERVER.get().clearBlacklist(); + } + private static String getDataObject(String jsonString) { JsonParser parser = new JsonParser(); JsonObject jsonObject = (JsonObject) parser.parse(jsonString); From 8da6c991d60dc1a803f025a5c9ac1af9717ff20f Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Fri, 31 Mar 2023 12:55:05 +0300 Subject: [PATCH 013/101] Implement WaitForImagestToLoad method, enable toast notifications --- .../web/components/listeners/BddToastNotificationsLogging.java | 3 +-- .../solutions/bellatrix/web/infrastructure/junit/WebTest.java | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/listeners/BddToastNotificationsLogging.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/listeners/BddToastNotificationsLogging.java index 98aed066..01030df2 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/listeners/BddToastNotificationsLogging.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/listeners/BddToastNotificationsLogging.java @@ -15,7 +15,6 @@ import solutions.bellatrix.core.configuration.ConfigurationService; import solutions.bellatrix.core.plugins.Listener; -import solutions.bellatrix.core.utilities.Log; import solutions.bellatrix.web.components.*; import solutions.bellatrix.web.configuration.WebSettings; import solutions.bellatrix.web.services.BrowserService; @@ -53,7 +52,7 @@ public void addListener() { WeekInput.SETTING_WEEK.addListener((x) -> new BrowserService().injectInfoNotificationToast("setting '%s' in %s", x.getActionValue(), x.getComponent().getComponentName())); WebComponent.HOVERING.addListener((x) -> new BrowserService().injectInfoNotificationToast("hovering %s", x.getComponent().getComponentName())); WebComponent.FOCUSING.addListener((x) -> new BrowserService().injectInfoNotificationToast("focusing %s", x.getComponent().getComponentName())); - WebComponent.SCROLLING_TO_VISIBLE.addListener((x) -> new BrowserService().injectInfoNotificationToast("scrolling to %s", x.getComponent().getComponentName())); +// WebComponent.SCROLLING_TO_VISIBLE.addListener((x) -> new BrowserService().injectInfoNotificationToast("scrolling to %s", x.getComponent().getComponentName())); WebComponent.SETTING_ATTRIBUTE.addListener((x) -> new BrowserService().injectInfoNotificationToast("setting %s to '%s' in %s", x.getActionValue(), x.getMessage(), x.getComponent().getComponentName())); ComponentValidator.VALIDATING_ATTRIBUTE.addListener((x) -> new BrowserService().injectInfoNotificationToast(x.getMessage())); isBddLoggingTurnedOn = true; diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/junit/WebTest.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/junit/WebTest.java index 516d6c60..6e18a75e 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/junit/WebTest.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/junit/WebTest.java @@ -17,6 +17,7 @@ import solutions.bellatrix.core.plugins.junit.BaseTest; import solutions.bellatrix.core.plugins.junit.TestResultWatcher; import solutions.bellatrix.web.components.listeners.BddConsoleLogging; +import solutions.bellatrix.web.components.listeners.BddToastNotificationsLogging; import solutions.bellatrix.web.components.listeners.HighlightElements; import solutions.bellatrix.web.infrastructure.BrowserLifecyclePlugin; import solutions.bellatrix.web.infrastructure.WebScreenshotPlugin; @@ -37,5 +38,6 @@ protected void configure() { addPlugin(WebVideoPlugin.class); addListener(BddConsoleLogging.class); addListener(HighlightElements.class); + addListener(BddToastNotificationsLogging.class); } } \ No newline at end of file From 9116ec5c1ccf187597cffa69a70c9596bbb97b67 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Mon, 3 Apr 2023 14:45:04 +0300 Subject: [PATCH 014/101] Add capability for unexpected popups --- .../solutions/bellatrix/web/infrastructure/DriverService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index 4a252f8c..6c6f1b96 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -24,6 +24,7 @@ import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.ie.InternetExplorerDriver; import org.openqa.selenium.ie.InternetExplorerOptions; +import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import org.openqa.selenium.safari.SafariDriver; @@ -232,6 +233,7 @@ private static WebDriver initializeDriverRegularMode() { addDriverOptions(chromeOptions); chromeOptions.addArguments("--log-level=3","--remote-allow-origins=*"); chromeOptions.setAcceptInsecureCerts(true); + chromeOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); System.setProperty("webdriver.chrome.silentOutput", "true"); if (shouldCaptureHttpTraffic) chromeOptions.setProxy(proxyConfig); @@ -243,6 +245,7 @@ private static WebDriver initializeDriverRegularMode() { addDriverOptions(chromeHeadlessOptions); chromeHeadlessOptions.setAcceptInsecureCerts(true); chromeHeadlessOptions.addArguments("--log-level=3"); + chromeHeadlessOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); chromeHeadlessOptions.setHeadless(true); System.setProperty("webdriver.chrome.silentOutput", "true"); if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); From edaa7efb843ddaa45d8bec3da49dbdec667774f6 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Tue, 4 Apr 2023 22:26:11 +0300 Subject: [PATCH 015/101] fixed most of the tests and their structure --- .../java/solutions/bellatrix/web/components/Image.java | 7 +++++++ .../bellatrix/web/infrastructure/DriverService.java | 1 + 2 files changed, 8 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/Image.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/Image.java index 2a00f9f3..a2622696 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/Image.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/Image.java @@ -13,14 +13,21 @@ package solutions.bellatrix.web.components; +import solutions.bellatrix.core.plugins.EventListener; import solutions.bellatrix.web.components.contracts.*; public class Image extends WebComponent implements ComponentSrc, ComponentHeight, ComponentWidth, ComponentLongDesc, ComponentAlt, ComponentSrcSet, ComponentSizes { + public final static EventListener CLICKING = new EventListener<>(); + public final static EventListener CLICKED = new EventListener<>(); @Override public Class getComponentClass() { return getClass(); } + public void click() { + defaultClick(CLICKING, CLICKED); + } + @Override public String getAlt() { return defaultGetAltAttribute(); diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index 6c6f1b96..9ea83f93 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -223,6 +223,7 @@ private static WebDriver initializeDriverRegularMode() { if (shouldCaptureHttpTraffic) { ProxyServer.init(); proxyConfig = ClientUtil.createSeleniumProxy(ProxyServer.get()); + ProxyServer.newHar(); } From 9961aa1a029dc360e0bca94f368a7f05bb522978 Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Tue, 11 Apr 2023 15:55:37 +0300 Subject: [PATCH 016/101] ProxyServer().assertRequestNotMade() fix --- .../web/infrastructure/ProxyServer.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index 533d3e7d..bf63aac5 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -22,10 +22,12 @@ import net.lightbody.bmp.core.har.HarEntry; import net.lightbody.bmp.proxy.CaptureType; import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.http.HttpMethod; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.Assert; +import software.amazon.awssdk.services.secretsmanager.endpoints.internal.Value; import solutions.bellatrix.core.configuration.ConfigurationService; import solutions.bellatrix.core.utilities.Log; import solutions.bellatrix.web.configuration.WebSettings; @@ -87,7 +89,7 @@ public static void assertRequestMade(String url) { var harEntries = PROXY_SERVER.get().getHar().getLog().getEntries(); var areRequestsMade = harEntries.stream().anyMatch(r -> r.getRequest().getUrl().contains(url)); - Assert.assertTrue(areRequestsMade); + Assert.assertTrue(areRequestsMade, String.format("The expected url '%s' was not loaded!", url)); } public static void assertRequestNotMade(String url, HttpMethod httpMethod) { @@ -109,16 +111,17 @@ public static void waitForRequest(WebDriver driver, String requestPartialUrl, Ht long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); var webDriverWait = new WebDriverWait(driver, Duration.ofSeconds(timeout + additionalTimeoutInSeconds), Duration.ofSeconds(sleepInterval)); - webDriverWait.until(d -> { - var harEntries = PROXY_SERVER.get().getHar().getLog().getEntries(); - var areRequestsMade = harEntries.stream().anyMatch(r -> r.getRequest().getUrl().contains(requestPartialUrl) && r.getRequest().getMethod().equals(httpMethod.toString())); + try { + webDriverWait.until(d -> { + var harEntries = PROXY_SERVER.get().getHar().getLog().getEntries(); + var areRequestsMade = harEntries.stream().anyMatch(r -> r.getRequest().getUrl().contains(requestPartialUrl) && r.getRequest().getMethod().equals(httpMethod.toString())); - return areRequestsMade; -// var javascriptExecutor = (JavascriptExecutor)driver; -// String script = String.format("return performance.getEntriesByType('resource').filter(item => item.name.toLowerCase().includes('%s'))[0] !== undefined;", requestPartialUrl); -// boolean result = (boolean)javascriptExecutor.executeScript(script); -// return result; - }); + return areRequestsMade; + }); + } + catch (TimeoutException exception){ + throw new TimeoutException(String.format("The expected request with URL '%s' is not loaded!", requestPartialUrl)); + } } public static void assertNoLargeImagesRequested() { From f5ac2048766e0633c3a362233a3f98bbeaf0564c Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Tue, 11 Apr 2023 16:07:44 +0300 Subject: [PATCH 017/101] add logging --- .../bellatrix/web/infrastructure/WebScreenshotPlugin.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java index b9d2439e..d40e96c1 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java @@ -18,6 +18,7 @@ import ru.yandex.qatools.ashot.AShot; import ru.yandex.qatools.ashot.shooting.ShootingStrategies; import solutions.bellatrix.core.configuration.ConfigurationService; +import solutions.bellatrix.core.utilities.Log; import solutions.bellatrix.core.utilities.PathNormalizer; import solutions.bellatrix.web.configuration.WebSettings; @@ -38,6 +39,7 @@ protected void takeScreenshot(String screenshotSaveDir, String filename) { .shootingStrategy(ShootingStrategies.viewportPasting(100)) .takeScreenshot(DriverService.getWrappedDriver()); var destFile = new File(Paths.get(screenshotSaveDir, filename).toString()); + Log.info("Saving screenshot with path: " + destFile); ImageIO.write(screenshot.getImage(), "png", destFile); } From 6e649377469bc9dfdcf1eaf491adf78b113d11e7 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Wed, 12 Apr 2023 12:18:01 +0300 Subject: [PATCH 018/101] fix video plugin --- .../src/main/java/plugins/video/VideoPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.plugins.video/src/main/java/plugins/video/VideoPlugin.java b/bellatrix.plugins.video/src/main/java/plugins/video/VideoPlugin.java index 22e59812..654b1c77 100644 --- a/bellatrix.plugins.video/src/main/java/plugins/video/VideoPlugin.java +++ b/bellatrix.plugins.video/src/main/java/plugins/video/VideoPlugin.java @@ -50,7 +50,7 @@ public void preBeforeTest(TestResult testResult, Method memberInfo) { } } - public void preAfterTest(TestResult testResult, Method memberInfo) { + public void postAfterTest(TestResult testResult, Method memberInfo) { if (isEnabled) { var videoSaveDir = getOutputFolder(); var videoFileName = getUniqueFileName(memberInfo.getName()); From b26008366670ae279037894a395640c9cd97b1e5 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Wed, 12 Apr 2023 16:06:58 +0300 Subject: [PATCH 019/101] fix duplicate dependencies --- bellatrix.api/pom.xml | 12 ++++++------ bellatrix.core/pom.xml | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/bellatrix.api/pom.xml b/bellatrix.api/pom.xml index ad964ccd..fbcbbc4a 100644 --- a/bellatrix.api/pom.xml +++ b/bellatrix.api/pom.xml @@ -41,12 +41,12 @@ javafaker 1.0.2 - - com.github.javafaker - javafaker - 1.0.2 - compile - + + + + + + \ No newline at end of file diff --git a/bellatrix.core/pom.xml b/bellatrix.core/pom.xml index 2e6e46eb..eedb2977 100644 --- a/bellatrix.core/pom.xml +++ b/bellatrix.core/pom.xml @@ -160,11 +160,11 @@ testng ${testng.version} - - io.rest-assured - rest-assured - 5.3.0 - compile - + + + + + + \ No newline at end of file From 89f5e2764be2c18ebf75fa96b2f2d1a3fb379306 Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Thu, 13 Apr 2023 15:00:58 +0300 Subject: [PATCH 020/101] added waitForRequest() method to the BrowserService --- .../bellatrix/web/services/BrowserService.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index 77ad7c45..364620dd 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -313,6 +313,18 @@ public void waitNumberOfWindowsToBe(int numberOfWindows) { webDriverWait.until(ExpectedConditions.numberOfWindowsToBe(numberOfWindows)); } + public void waitForRequest(String partialUrl) { + var javascriptExecutor = (JavascriptExecutor)getWrappedDriver(); + String script = String.format("return performance.getEntriesByType('resource').filter(item => item.name.toLowerCase().includes('%s'))[0] !== undefined;", partialUrl); + + try { + waitUntil(e -> (boolean)javascriptExecutor.executeScript(script)); + } + catch (TimeoutException exception){ + throw new TimeoutException(String.format("The expected request with URL '%s' is not loaded!", partialUrl)); + } + } + public void waitForAngular() { long angularTimeout = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitForAngularTimeout(); long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); From 5d969df031c395aa383df3eb7e8a5fefea114166 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Tue, 18 Apr 2023 10:47:59 +0300 Subject: [PATCH 021/101] remove scroll logging as it floods the output --- .../bellatrix/web/components/listeners/BddConsoleLogging.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/listeners/BddConsoleLogging.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/listeners/BddConsoleLogging.java index 6b35fc04..493d1571 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/listeners/BddConsoleLogging.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/listeners/BddConsoleLogging.java @@ -49,7 +49,7 @@ public void addListener() { WeekInput.SETTING_WEEK.addListener((x) -> Log.info("setting '%s' in %s", x.getActionValue(), x.getComponent().getComponentName())); WebComponent.HOVERING.addListener((x) -> Log.info("hovering %s", x.getComponent().getComponentName())); WebComponent.FOCUSING.addListener((x) -> Log.info("focusing %s", x.getComponent().getComponentName())); - WebComponent.SCROLLING_TO_VISIBLE.addListener((x) -> Log.info("scrolling to %s", x.getComponent().getComponentName())); +// WebComponent.SCROLLING_TO_VISIBLE.addListener((x) -> Log.info("scrolling to %s", x.getComponent().getComponentName())); WebComponent.SETTING_ATTRIBUTE.addListener((x) -> Log.info("setting %s to '%s' in %s", x.getActionValue(), x.getMessage(), x.getComponent().getComponentName())); ComponentValidator.VALIDATING_ATTRIBUTE.addListener((x) -> Log.info(x.getMessage())); isBddLoggingTurnedOn = true; From cd9ecf11f6e6b9a5ede81de708c8f6692b35cb88 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Wed, 19 Apr 2023 10:41:04 +0300 Subject: [PATCH 022/101] remove scroll logging as it floods the output, add tun test filter --- .../src/main/java/plugins/video/VideoPlugin.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/bellatrix.plugins.video/src/main/java/plugins/video/VideoPlugin.java b/bellatrix.plugins.video/src/main/java/plugins/video/VideoPlugin.java index 654b1c77..2e8952f3 100644 --- a/bellatrix.plugins.video/src/main/java/plugins/video/VideoPlugin.java +++ b/bellatrix.plugins.video/src/main/java/plugins/video/VideoPlugin.java @@ -20,8 +20,6 @@ import java.io.File; import java.lang.reflect.Method; -import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.Paths; public abstract class VideoPlugin extends Plugin { @@ -61,7 +59,6 @@ public void postAfterTest(TestResult testResult, Method memberInfo) { } else { try { FileUtils.forceDeleteOnExit(new File(VIDEO_FULL_PATH.get())); - Files.delete(Path.of(VIDEO_FULL_PATH.get())); } catch (Exception ex) { ex.printStackTrace(); } From a790e9a7880086513b73d250a1cb70c0e0b34e7e Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Mon, 24 Apr 2023 23:12:26 +0300 Subject: [PATCH 023/101] added new tests --- .../web/infrastructure/ProxyServer.java | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index bf63aac5..b6557350 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -34,6 +34,7 @@ import java.io.Console; import java.io.IOException; +import java.lang.reflect.Type; import java.net.ServerSocket; import java.time.Duration; import java.util.List; @@ -206,6 +207,20 @@ public static T getResponseByUrl(String url, String httpMethod, Class res return new Gson().fromJson(getDataObject(json), responseModelClass); } + public static T getResponseByUrl(String url, String httpMethod, Type responseModelType) { + var harEntries = getCapturedEntries(); + var harEntry = harEntries.stream() + .filter(r -> r.getRequest().getUrl().contains(url) && r.getRequest().getMethod().equals(httpMethod)) + .findFirst() + .orElse(null); + if (harEntry == null) { + System.out.println("There is no match!"); + return null; + } + String json = harEntry.getResponse().getContent().getText(); + return new Gson().fromJson(getDataObject(json), responseModelType); + } + public static void blockRequestByUrl(String url, HttpMethod httpMethod) { PROXY_SERVER.get().blacklistRequests(url,407, httpMethod.toString()); } @@ -220,22 +235,33 @@ public static void clearblockRequestList() { private static String getDataObject(String jsonString) { JsonParser parser = new JsonParser(); - JsonObject jsonObject = (JsonObject) parser.parse(jsonString); + JsonObject jsonObject = null; + JsonArray jsonArray = null; + boolean isObject = false; + + try { + jsonObject = (JsonObject) parser.parse(jsonString); + isObject = true; + } catch (Exception exception) { + jsonArray = (JsonArray) parser.parse(jsonString); + } JsonObject dataObject = null; JsonArray dataArray = null; - if (jsonObject.has("data")){ + if (isObject == true && jsonObject.has("data")){ if (jsonObject.get("data").isJsonObject()){ dataObject = jsonObject.getAsJsonObject("data"); } else { dataArray = jsonObject.getAsJsonArray("data"); } + } else { + dataArray = jsonArray.getAsJsonArray(); } - if (dataObject == null){ -// return dataArray.toString(); - return jsonString; + if (isObject == false){ + return dataArray.toString(); +// return jsonString; } else { return dataObject.toString(); } From 7349cba6bbaeaecc53a4c34526fee70da51bf2db Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Tue, 25 Apr 2023 23:09:32 +0300 Subject: [PATCH 024/101] ProxyServer get request/response object fix --- .../web/infrastructure/ProxyServer.java | 42 +++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index b6557350..e91271ef 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -193,6 +193,19 @@ public static T getRequestByUrl(String url, String httpMethod, Class requ return new Gson().fromJson(json, requestModelClass); } + public static T getRequestByUrl(String url, String httpMethod, Type modelType) { + var harEntries = getCapturedEntries(); + var harEntry = harEntries.stream() + .filter(r -> r.getRequest().getUrl().contains(url) && r.getRequest().getMethod().equals(httpMethod)) + .findFirst() + .orElse(null); + if (harEntry == null) { + return null; + } + String json = harEntry.getRequest().getPostData().getText(); + return new Gson().fromJson(getDataObject(json), modelType); + } + public static T getResponseByUrl(String url, String httpMethod, Class responseModelClass) { var harEntries = getCapturedEntries(); var harEntry = harEntries.stream() @@ -248,20 +261,33 @@ private static String getDataObject(String jsonString) { JsonObject dataObject = null; JsonArray dataArray = null; - - if (isObject == true && jsonObject.has("data")){ - if (jsonObject.get("data").isJsonObject()){ - dataObject = jsonObject.getAsJsonObject("data"); + if (isObject == true) { + if (jsonObject.has("data")){ + if (jsonObject.get("data").isJsonObject()){ + dataObject = jsonObject.getAsJsonObject("data"); + } else { + dataArray = jsonObject.getAsJsonArray("data"); + } } else { - dataArray = jsonObject.getAsJsonArray("data"); + dataObject = jsonObject.getAsJsonObject(); } } else { dataArray = jsonArray.getAsJsonArray(); } - if (isObject == false){ - return dataArray.toString(); -// return jsonString; +// if (jsonObject.has("data")){ +// if (jsonObject.get("data").isJsonObject()){ +// dataObject = jsonObject.getAsJsonObject("data"); +// } else { +// dataArray = jsonObject.getAsJsonArray("data"); +// } +// } else { +// dataArray = jsonArray.getAsJsonArray(); +// } + + if (dataObject == null){ +// return dataArray.toString(); + return jsonString; } else { return dataObject.toString(); } From 19b54cb945650af947b56a332f9e1259c411806a Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Wed, 17 May 2023 12:34:25 +0300 Subject: [PATCH 025/101] New waitForResponse method added --- .../web/infrastructure/ProxyServer.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index e91271ef..cd6dfba6 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -125,6 +125,23 @@ public static void waitForRequest(WebDriver driver, String requestPartialUrl, Ht } } + public static void waitForResponse(WebDriver driver, String requestPartialUrl, HttpMethod httpMethod, int additionalTimeoutInSeconds) { + long timeout = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitForAjaxTimeout(); + long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); + var webDriverWait = new WebDriverWait(driver, Duration.ofSeconds(timeout + additionalTimeoutInSeconds), Duration.ofSeconds(sleepInterval)); + + try { + webDriverWait.until(d -> { + var harEntries = PROXY_SERVER.get().getHar().getLog().getEntries(); + var request = harEntries.stream().filter(r -> r.getRequest().getUrl().contains(requestPartialUrl) && r.getRequest().getMethod().equals(httpMethod.toString())).findFirst().get(); + return request.getResponse().getStatus() == 200 && !request.getResponse().getContent().getText().isEmpty(); + }); + } + catch (TimeoutException exception){ + throw new TimeoutException(String.format("The expected response with request URL '%s' is not loaded!", requestPartialUrl)); + } + } + public static void assertNoLargeImagesRequested() { var harEntries = PROXY_SERVER.get().getHar().getLog().getEntries(); var areThereLargeImages = harEntries.stream().anyMatch(r From dfdd153cdac7a3204d3e249181a149b27c19aeb4 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Wed, 17 May 2023 15:43:17 +0300 Subject: [PATCH 026/101] add validation method in checkbox component --- .../web/components/contracts/ComponentChecked.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentChecked.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentChecked.java index b3476657..5c2f3090 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentChecked.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentChecked.java @@ -35,6 +35,16 @@ default void validateIsChecked() { } } + @SneakyThrows + default void validateIsChecked(boolean value) { + if (value){ + validateIsChecked(); + } + else { + validateIsUnchecked(); + } + } + @SneakyThrows default void validateIsUnchecked() { try { From 1d5b0abaccbdbb350d39e0582f81f2ed3a8c82d4 Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Wed, 17 May 2023 17:41:32 +0300 Subject: [PATCH 027/101] ValidateIsDisabled method refactored --- .../bellatrix/web/components/contracts/ComponentDisabled.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentDisabled.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentDisabled.java index 03190e86..b9d09668 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentDisabled.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentDisabled.java @@ -26,7 +26,7 @@ public interface ComponentDisabled extends Component { boolean isDisabled(); @SneakyThrows - default void validateIsDisabled(String value) { + default void validateIsDisabled() { try { Method method = ComponentValidator.class.getDeclaredMethod("defaultValidateAttributeTrue", WebComponent.class, BooleanSupplier.class, String.class); method.invoke(SingletonFactory.getInstance(ComponentValidator.class), (WebComponent)this, (BooleanSupplier)this::isDisabled, "disabled"); From 0dacf5adc3181bc075e8a835bf39638fc7cd48c9 Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Thu, 18 May 2023 14:38:22 +0300 Subject: [PATCH 028/101] wait response method refactored --- .../bellatrix/web/infrastructure/ProxyServer.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index cd6dfba6..0dd23758 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -133,8 +133,14 @@ public static void waitForResponse(WebDriver driver, String requestPartialUrl, H try { webDriverWait.until(d -> { var harEntries = PROXY_SERVER.get().getHar().getLog().getEntries(); - var request = harEntries.stream().filter(r -> r.getRequest().getUrl().contains(requestPartialUrl) && r.getRequest().getMethod().equals(httpMethod.toString())).findFirst().get(); - return request.getResponse().getStatus() == 200 && !request.getResponse().getContent().getText().isEmpty(); + var isResponseReceived = harEntries.stream().anyMatch( + r -> r.getRequest().getUrl().contains(requestPartialUrl) + && r.getRequest().getMethod().equals(httpMethod.toString()) + && r.getResponse().getStatus() == 200 + && !r.getResponse().getContent().getText().isEmpty() + ); + + return isResponseReceived; }); } catch (TimeoutException exception){ From 522e290d3d15674e5eac4b84071860e5dbb6b64f Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Fri, 26 May 2023 15:05:28 +0300 Subject: [PATCH 029/101] apply wait for dashboard page on all tests --- .../main/java/solutions/bellatrix/web/pages/PageMap.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/pages/PageMap.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/pages/PageMap.java index 360163a9..8f65abfb 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/pages/PageMap.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/pages/PageMap.java @@ -13,10 +13,15 @@ package solutions.bellatrix.web.pages; +import solutions.bellatrix.web.services.App; import solutions.bellatrix.web.services.ComponentCreateService; public abstract class PageMap { public ComponentCreateService create() { - return new ComponentCreateService(); + return app().create(); + } + + public App app() { + return new App(); } } From eeee8d88f9c898c97f983d8abd4f4f5a560b5bee Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Tue, 30 May 2023 16:19:53 +0300 Subject: [PATCH 030/101] added list with HTTP successful statuses and edited validation for success response --- .../bellatrix/web/infrastructure/ProxyServer.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index 0dd23758..7f32786a 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -21,6 +21,7 @@ import net.lightbody.bmp.BrowserMobProxyServer; import net.lightbody.bmp.core.har.HarEntry; import net.lightbody.bmp.proxy.CaptureType; +import org.apache.http.HttpStatus; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebDriver; @@ -37,11 +38,21 @@ import java.lang.reflect.Type; import java.net.ServerSocket; import java.time.Duration; +import java.util.Arrays; import java.util.List; public class ProxyServer { private static final ThreadLocal PROXY_SERVER = ThreadLocal.withInitial(BrowserMobProxyServer::new); private static final ThreadLocal PORT = new ThreadLocal<>(); + private static final List successHttpStatusesList = Arrays.asList( + HttpStatus.SC_OK, + HttpStatus.SC_CREATED, + HttpStatus.SC_ACCEPTED, + HttpStatus.SC_NON_AUTHORITATIVE_INFORMATION, + HttpStatus.SC_NO_CONTENT, + HttpStatus.SC_RESET_CONTENT, + HttpStatus.SC_PARTIAL_CONTENT, + HttpStatus.SC_MULTI_STATUS); @SneakyThrows public static int init() { @@ -136,7 +147,7 @@ public static void waitForResponse(WebDriver driver, String requestPartialUrl, H var isResponseReceived = harEntries.stream().anyMatch( r -> r.getRequest().getUrl().contains(requestPartialUrl) && r.getRequest().getMethod().equals(httpMethod.toString()) - && r.getResponse().getStatus() == 200 + && successHttpStatusesList.contains(r.getResponse().getStatus()) && !r.getResponse().getContent().getText().isEmpty() ); From 0f69564116139234fc9947ebee644ddb3999ee82 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Tue, 27 Jun 2023 16:56:23 +0300 Subject: [PATCH 031/101] add style validations --- .../web/components/WebComponent.java | 3 +- .../contracts/ComponentBackgroundColor.java | 45 ++++++++++++++++ .../components/contracts/ComponentStyle.java | 51 ++++--------------- .../web/components/enums/CssStyle.java | 17 +++++++ 4 files changed, 73 insertions(+), 43 deletions(-) create mode 100644 bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentBackgroundColor.java create mode 100644 bellatrix.web/src/main/java/solutions/bellatrix/web/components/enums/CssStyle.java diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java index 54e1e9e5..bc6fbeab 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java @@ -29,6 +29,7 @@ import solutions.bellatrix.core.utilities.InstanceFactory; import solutions.bellatrix.core.utilities.Log; import solutions.bellatrix.web.components.contracts.Component; +import solutions.bellatrix.web.components.contracts.ComponentStyle; import solutions.bellatrix.web.components.contracts.ComponentVisible; import solutions.bellatrix.web.configuration.WebSettings; import solutions.bellatrix.web.findstrategies.*; @@ -50,7 +51,7 @@ import static org.apache.commons.text.StringEscapeUtils.unescapeHtml4; -public class WebComponent extends LayoutComponentValidationsBuilder implements Component, ComponentVisible { +public class WebComponent extends LayoutComponentValidationsBuilder implements Component, ComponentVisible, ComponentStyle { public final static EventListener HOVERING = new EventListener<>(); public final static EventListener HOVERED = new EventListener<>(); public final static EventListener FOCUSING = new EventListener<>(); diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentBackgroundColor.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentBackgroundColor.java new file mode 100644 index 00000000..442e1027 --- /dev/null +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentBackgroundColor.java @@ -0,0 +1,45 @@ +/* + * Copyright 2022 Automate The Planet Ltd. + * Author: Teodor Nikolov + * Licensed under the Apache License, Version 2.0 (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package solutions.bellatrix.web.components.contracts; + +import lombok.SneakyThrows; +import org.openqa.selenium.support.Colors; +import solutions.bellatrix.core.utilities.SingletonFactory; +import solutions.bellatrix.web.components.WebComponent; +import solutions.bellatrix.web.services.JavaScriptService; +import solutions.bellatrix.web.validations.ComponentValidator; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.function.Supplier; + +public interface ComponentBackgroundColor extends Component { + + default String getBackgroundColor(){ + var script = "return arguments[0].style.background"; + var result = new JavaScriptService().execute(script, (WebComponent) this); + + return result; + } + + @SneakyThrows + default void validateBackgroundColor(Colors expectedColor) { + try { + Method method = ComponentValidator.class.getDeclaredMethod("defaultValidateAttributeIs", WebComponent.class, Supplier.class, String.class, String.class); + method.invoke(SingletonFactory.getInstance(ComponentValidator.class), (WebComponent) this, (Supplier) () -> this.getBackgroundColor(), expectedColor.getColorValue().getColor().getRGB(), String.format("expected color should be \u001B[35m%s\u001B[0m", expectedColor)); + } catch (InvocationTargetException e) { + throw e.getCause(); + } + } +} diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentStyle.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentStyle.java index b90952a8..9a239107 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentStyle.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentStyle.java @@ -16,6 +16,8 @@ import lombok.SneakyThrows; import solutions.bellatrix.core.utilities.SingletonFactory; import solutions.bellatrix.web.components.WebComponent; +import solutions.bellatrix.web.components.enums.CssStyle; +import solutions.bellatrix.web.services.JavaScriptService; import solutions.bellatrix.web.validations.ComponentValidator; import java.lang.reflect.InvocationTargetException; @@ -23,53 +25,18 @@ import java.util.function.Supplier; public interface ComponentStyle extends Component { - String getStyle(); + default String getStyle(CssStyle style) { + var script = String.format("return window.getComputedStyle(arguments[0],null).getPropertyValue('%s');", style); + var result = new JavaScriptService().execute(script, (WebComponent) this); - @SneakyThrows - default void validateStyleIs(String value) { - try { - Method method = ComponentValidator.class.getDeclaredMethod("defaultValidateAttributeIs", WebComponent.class, Supplier.class, String.class, String.class); - method.invoke(SingletonFactory.getInstance(ComponentValidator.class), (WebComponent)this, (Supplier)this::getStyle, value, "style"); - } catch (InvocationTargetException e) { - throw e.getCause(); - } - } - - @SneakyThrows - default void validateStyleIsSet() { - try { - Method method = ComponentValidator.class.getDeclaredMethod("defaultValidateAttributeIsSet", WebComponent.class, Supplier.class, String.class); - method.invoke(SingletonFactory.getInstance(ComponentValidator.class), (WebComponent)this, (Supplier)this::getStyle, "style"); - } catch (InvocationTargetException e) { - throw e.getCause(); - } - } - - @SneakyThrows - default void validateStyleNotSet() { - try { - Method method = ComponentValidator.class.getDeclaredMethod("defaultValidateAttributeNotSet", WebComponent.class, Supplier.class, String.class); - method.invoke(SingletonFactory.getInstance(ComponentValidator.class), (WebComponent)this, (Supplier)this::getStyle, "style"); - } catch (InvocationTargetException e) { - throw e.getCause(); - } - } - - @SneakyThrows - default void validateStyleContains(String value) { - try { - Method method = ComponentValidator.class.getDeclaredMethod("defaultValidateAttributeContains", WebComponent.class, Supplier.class, String.class, String.class); - method.invoke(SingletonFactory.getInstance(ComponentValidator.class), (WebComponent)this, (Supplier)this::getStyle, value, "style"); - } catch (InvocationTargetException e) { - throw e.getCause(); - } + return result; } @SneakyThrows - default void validateStyleNotContains(String value) { + default void validateStyle(CssStyle style, String expectedValue) { try { - Method method = ComponentValidator.class.getDeclaredMethod("defaultValidateAttributeNotContains", WebComponent.class, Supplier.class, String.class, String.class); - method.invoke(SingletonFactory.getInstance(ComponentValidator.class), (WebComponent)this, (Supplier)this::getStyle, value, "style"); + Method method = ComponentValidator.class.getDeclaredMethod("defaultValidateAttributeIs", WebComponent.class, Supplier.class, java.lang.String.class, java.lang.String.class); + method.invoke(SingletonFactory.getInstance(ComponentValidator.class), (WebComponent) this, (Supplier) () -> this.getStyle(style), expectedValue, java.lang.String.format("expected color should be \u001B[35m%s\u001B[0m", expectedValue)); } catch (InvocationTargetException e) { throw e.getCause(); } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/enums/CssStyle.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/enums/CssStyle.java new file mode 100644 index 00000000..7f5cf8c9 --- /dev/null +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/enums/CssStyle.java @@ -0,0 +1,17 @@ +package solutions.bellatrix.web.components.enums; + +public enum CssStyle { + BACKGROUND_COLOR("background-color"), + COLOR("color"); + + private final String style; + + CssStyle(String style) { + this.style = style; + } + + @Override + public String toString() { + return this.style; + } +} From 40cbc84c6cf4ac1c49828b8d33d3f632f82ae59b Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Thu, 29 Jun 2023 11:29:06 +0300 Subject: [PATCH 032/101] add initial value for threadlocal values --- .../bellatrix/web/infrastructure/BrowserLifecyclePlugin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java index 8b6dd875..ae264bbc 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java @@ -31,8 +31,8 @@ public class BrowserLifecyclePlugin extends Plugin { static { CURRENT_BROWSER_CONFIGURATION = new ThreadLocal<>(); PREVIOUS_BROWSER_CONFIGURATION = new ThreadLocal<>(); - IS_BROWSER_STARTED_DURING_PRE_BEFORE_CLASS = new ThreadLocal<>(); - IS_BROWSER_STARTED_CORRECTLY = new ThreadLocal<>(); + IS_BROWSER_STARTED_DURING_PRE_BEFORE_CLASS = ThreadLocal.withInitial(() -> false); + IS_BROWSER_STARTED_CORRECTLY = ThreadLocal.withInitial(() -> false); } @Override From 0db26024207f6908244d8d2ee07d2f0d325dbf55 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Fri, 30 Jun 2023 15:17:14 +0300 Subject: [PATCH 033/101] revert console logs coloring --- .../web/validations/ComponentValidator.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/validations/ComponentValidator.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/validations/ComponentValidator.java index 76525134..298efe52 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/validations/ComponentValidator.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/validations/ComponentValidator.java @@ -112,13 +112,20 @@ private void waitUntil(BooleanSupplier condition, WebComponent component, St return condition.getAsBoolean(); }); } catch (TimeoutException ex) { - var error = String.format("\u001B[0mThe %s of \u001B[1m%s \u001B[2m(%s)\u001B[0m%n" + - " Should %s: \"\u001B[1m%s\u001B[0m\"%n" + - " %" + prefix.length() + "sBut was: \"\u001B[1m%s\u001B[0m\"%n" + - "Test failed on URL: \u001B[1m%s\u001B[0m", + var error = String.format("The %s of %s (%s)%n" + + " Should %s: \"%s\"%n" + + " %" + prefix.length() + "sBut was: \"%s\"%n" + + "Test failed on URL: %s", attributeName, component.getComponentClass().getSimpleName(), component.getFindStrategy(), prefix, value, "", supplier.get().toString().replaceAll("%n", "%n" + String.format("%" + (prefix.length() + 12) + "s", " ")), browserService.getUrl()); +// var colorFormattedError = String.format("\u001B[0mThe %s of \u001B[1m%s \u001B[2m(%s)\u001B[0m%n" + +// " Should %s: \"\u001B[1m%s\u001B[0m\"%n" + +// " %" + prefix.length() + "sBut was: \"\u001B[1m%s\u001B[0m\"%n" + +// "Test failed on URL: \u001B[1m%s\u001B[0m", +// attributeName, component.getComponentClass().getSimpleName(), component.getFindStrategy(), +// prefix, value, "", supplier.get().toString().replaceAll("%n", "%n" + String.format("%" + (prefix.length() + 12) + "s", " ")), +// browserService.getUrl()); Log.error("%n%n%s%n%n", error); throw new AssertionError(error, ex); } From 5da7f513edd9d54d7b875119219623f3fdd863bb Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Wed, 19 Jul 2023 12:38:07 +0300 Subject: [PATCH 034/101] add error handling --- .../solutions/bellatrix/core/utilities/SingletonFactory.java | 1 + 1 file changed, 1 insertion(+) diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/SingletonFactory.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/SingletonFactory.java index 396fdc9c..d9473c4a 100644 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/SingletonFactory.java +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/SingletonFactory.java @@ -37,6 +37,7 @@ public static T getInstance(Class classOf, Object... initargs) { return (T)SINGLETON_FACTORY.mapHolder.get(classOf.getName()); } catch (Exception e) { // not the best practice to return null. But probably we will never end here so it is OK. + Log.error("Failed to create instance of the page. Exception was: " + e); return null; } } From fc085aead5bfb3e34d3bc171e67faaab30c3f5d9 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Thu, 3 Aug 2023 11:23:56 +0300 Subject: [PATCH 035/101] add image data logging --- .../web/infrastructure/WebScreenshotPlugin.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java index d40e96c1..03b82009 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java @@ -14,6 +14,7 @@ package solutions.bellatrix.web.infrastructure; import lombok.SneakyThrows; +import org.apache.commons.codec.binary.Base64; import plugins.screenshots.ScreenshotPlugin; import ru.yandex.qatools.ashot.AShot; import ru.yandex.qatools.ashot.shooting.ShootingStrategies; @@ -23,6 +24,7 @@ import solutions.bellatrix.web.configuration.WebSettings; import javax.imageio.ImageIO; +import java.io.ByteArrayOutputStream; import java.io.File; import java.nio.file.Paths; import java.util.UUID; @@ -40,6 +42,14 @@ protected void takeScreenshot(String screenshotSaveDir, String filename) { .takeScreenshot(DriverService.getWrappedDriver()); var destFile = new File(Paths.get(screenshotSaveDir, filename).toString()); Log.info("Saving screenshot with path: " + destFile); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ImageIO.write(screenshot.getImage(), "jpg", baos); + baos.flush(); + byte[] encodeBase64 = Base64.encodeBase64(baos.toByteArray()); + var base64Encoded = new String(encodeBase64); + baos.close(); + Log.info("\"Red"); ImageIO.write(screenshot.getImage(), "png", destFile); } From 17408fb41cd946abd113af73b9d3de2e527158ef Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Thu, 3 Aug 2023 12:16:37 +0300 Subject: [PATCH 036/101] Added ClipboardManager --- .../core/utilities/ClipboardManager.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ClipboardManager.java diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ClipboardManager.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ClipboardManager.java new file mode 100644 index 00000000..f7f38576 --- /dev/null +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ClipboardManager.java @@ -0,0 +1,23 @@ +package solutions.bellatrix.core.utilities; + +import java.awt.*; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.io.IOException; + +public class ClipboardManager { + private static final Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + + public static String getLastEntity() { + var lastCopiedEntity = ""; + + try { + lastCopiedEntity = (String)systemClipboard.getData(DataFlavor.stringFlavor); + } catch (IOException | UnsupportedFlavorException e) { + throw new RuntimeException(e); + } + + return lastCopiedEntity; + } +} From 5b2a7b95a4c2d2df0486561ab518eba03e54c088 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Wed, 9 Aug 2023 12:02:32 +0300 Subject: [PATCH 037/101] add error logging, improve screenshot plugin to inject image to html report --- .../plugins/screenshots/ScreenshotPlugin.java | 2 +- .../web/infrastructure/ProxyServer.java | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPlugin.java b/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPlugin.java index c5b64dfa..3f0d0554 100644 --- a/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPlugin.java +++ b/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPlugin.java @@ -35,7 +35,7 @@ public ScreenshotPlugin(boolean isEnabled) { @Override @SneakyThrows - public void preAfterTest(TestResult testResult, Method memberInfo) { + public void postAfterTest(TestResult testResult, Method memberInfo) { if (!isEnabled || testResult == TestResult.SUCCESS) return; diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index 7f32786a..e1474eba 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -22,18 +22,15 @@ import net.lightbody.bmp.core.har.HarEntry; import net.lightbody.bmp.proxy.CaptureType; import org.apache.http.HttpStatus; -import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.http.HttpMethod; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.Assert; -import software.amazon.awssdk.services.secretsmanager.endpoints.internal.Value; import solutions.bellatrix.core.configuration.ConfigurationService; import solutions.bellatrix.core.utilities.Log; import solutions.bellatrix.web.configuration.WebSettings; -import java.io.Console; import java.io.IOException; import java.lang.reflect.Type; import java.net.ServerSocket; @@ -251,7 +248,12 @@ public static T getResponseByUrl(String url, String httpMethod, Class res return null; } String json = harEntry.getResponse().getContent().getText(); - return new Gson().fromJson(getDataObject(json), responseModelClass); + try { + return new Gson().fromJson(getDataObject(json), responseModelClass); + } + catch (Exception ex){ + throw new RuntimeException("Cannot get JSON body from the string: " + json + ". " + harEntry.getResponse().toString()); + } } public static T getResponseByUrl(String url, String httpMethod, Type responseModelType) { @@ -289,7 +291,11 @@ private static String getDataObject(String jsonString) { try { jsonObject = (JsonObject) parser.parse(jsonString); isObject = true; - } catch (Exception exception) { + } + catch (NullPointerException nullEx){ + throw new RuntimeException("JSON data is null. " + nullEx.getMessage()); + } + catch (Exception exception) { jsonArray = (JsonArray) parser.parse(jsonString); } From 7436ab21accdb55197490d5341c3fa5de3048413 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Wed, 9 Aug 2023 16:22:46 +0300 Subject: [PATCH 038/101] enhance logging --- .../web/infrastructure/ProxyServer.java | 37 +++++++++++++++---- .../infrastructure/WebScreenshotPlugin.java | 8 ---- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index e1474eba..9f924c47 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -22,10 +22,12 @@ import net.lightbody.bmp.core.har.HarEntry; import net.lightbody.bmp.proxy.CaptureType; import org.apache.http.HttpStatus; +import org.asynchttpclient.uri.Uri; import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.http.HttpMethod; import org.openqa.selenium.support.ui.WebDriverWait; +import org.opentest4j.AssertionFailedError; import org.testng.Assert; import solutions.bellatrix.core.configuration.ConfigurationService; import solutions.bellatrix.core.utilities.Log; @@ -35,6 +37,7 @@ import java.lang.reflect.Type; import java.net.ServerSocket; import java.time.Duration; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -97,8 +100,8 @@ public static void assertNoErrorCodes() { public static void assertRequestMade(String url) { var harEntries = PROXY_SERVER.get().getHar().getLog().getEntries(); var areRequestsMade = harEntries.stream().anyMatch(r -> r.getRequest().getUrl().contains(url)); - - Assert.assertTrue(areRequestsMade, String.format("The expected url '%s' was not loaded!", url)); + String simiarRequestsString = getSimilarRequestsString(url, harEntries); + Assert.assertTrue(areRequestsMade, String.format("The expected url '%s' was not loaded! Similar requests: %s", url, simiarRequestsString)); } public static void assertRequestNotMade(String url, HttpMethod httpMethod) { @@ -129,7 +132,7 @@ public static void waitForRequest(WebDriver driver, String requestPartialUrl, Ht }); } catch (TimeoutException exception){ - throw new TimeoutException(String.format("The expected request with URL '%s' is not loaded!", requestPartialUrl)); + throw new AssertionFailedError(String.format("The expected request with URL '%s' is not loaded!", requestPartialUrl)); } } @@ -137,7 +140,7 @@ public static void waitForResponse(WebDriver driver, String requestPartialUrl, H long timeout = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitForAjaxTimeout(); long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); var webDriverWait = new WebDriverWait(driver, Duration.ofSeconds(timeout + additionalTimeoutInSeconds), Duration.ofSeconds(sleepInterval)); - + List allHarEntries = new ArrayList<>(); try { webDriverWait.until(d -> { var harEntries = PROXY_SERVER.get().getHar().getLog().getEntries(); @@ -147,13 +150,33 @@ public static void waitForResponse(WebDriver driver, String requestPartialUrl, H && successHttpStatusesList.contains(r.getResponse().getStatus()) && !r.getResponse().getContent().getText().isEmpty() ); - + allHarEntries.clear(); + allHarEntries.addAll(harEntries); return isResponseReceived; }); } catch (TimeoutException exception){ - throw new TimeoutException(String.format("The expected response with request URL '%s' is not loaded!", requestPartialUrl)); + String allUrlsString = getSimilarRequestsString(requestPartialUrl, allHarEntries); + + throw new AssertionFailedError(String.format("The expected response with request URL '%s' is not loaded! \r\nSimilar requests: %s", requestPartialUrl, allUrlsString)); + } + } + + private static String getSimilarRequestsString(String requestPartialUrl, List allHarEntries) { + ArrayList allUrls = new ArrayList<>(); + allHarEntries.stream().forEach(e -> { + Uri uri = Uri.create(requestPartialUrl); + if(e.getRequest().getUrl().contains(uri.getHost())){ + allUrls.add(e.getRequest().getUrl()); + } + }); + String allUrlsString = ""; + for (String url: + allUrls) { + allUrlsString += url; + allUrlsString += "\r\n"; } + return allUrlsString; } public static void assertNoLargeImagesRequested() { @@ -252,7 +275,7 @@ public static T getResponseByUrl(String url, String httpMethod, Class res return new Gson().fromJson(getDataObject(json), responseModelClass); } catch (Exception ex){ - throw new RuntimeException("Cannot get JSON body from the string: " + json + ". " + harEntry.getResponse().toString()); + throw new AssertionFailedError("Cannot get JSON body from the string: " + json + ". " + harEntry.getResponse().toString()); } } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java index 03b82009..dd58b405 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java @@ -42,14 +42,6 @@ protected void takeScreenshot(String screenshotSaveDir, String filename) { .takeScreenshot(DriverService.getWrappedDriver()); var destFile = new File(Paths.get(screenshotSaveDir, filename).toString()); Log.info("Saving screenshot with path: " + destFile); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ImageIO.write(screenshot.getImage(), "jpg", baos); - baos.flush(); - byte[] encodeBase64 = Base64.encodeBase64(baos.toByteArray()); - var base64Encoded = new String(encodeBase64); - baos.close(); - Log.info("\"Red"); ImageIO.write(screenshot.getImage(), "png", destFile); } From 7ea6674fd75ea139734e631f44d0197c7c4863f9 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Mon, 14 Aug 2023 14:35:30 +0300 Subject: [PATCH 039/101] fix fetching of similar requests --- .../web/infrastructure/ProxyServer.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index 9f924c47..cd8ede0c 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -163,20 +163,27 @@ public static void waitForResponse(WebDriver driver, String requestPartialUrl, H } private static String getSimilarRequestsString(String requestPartialUrl, List allHarEntries) { - ArrayList allUrls = new ArrayList<>(); - allHarEntries.stream().forEach(e -> { - Uri uri = Uri.create(requestPartialUrl); - if(e.getRequest().getUrl().contains(uri.getHost())){ - allUrls.add(e.getRequest().getUrl()); + try{ + ArrayList allUrls = new ArrayList<>(); + allHarEntries.stream().forEach(e -> { + Uri uri = Uri.create(requestPartialUrl); + if(e.getRequest().getUrl().contains(uri.getHost()) || e.getRequest().getUrl().contains(requestPartialUrl)){ + allUrls.add(e.getRequest().getUrl()); + } + }); + String allUrlsString = ""; + for (String url: + allUrls) { + allUrlsString += url; + allUrlsString += "\r\n"; } - }); - String allUrlsString = ""; - for (String url: - allUrls) { - allUrlsString += url; - allUrlsString += "\r\n"; + return allUrlsString; + } + catch (Exception ex){ + ArrayList allUrls = new ArrayList<>(); + allHarEntries.forEach(e -> allUrls.add(e.getRequest().getUrl())); + return allUrls.toString(); } - return allUrlsString; } public static void assertNoLargeImagesRequested() { From a83e7850cb1103ab38a2314840eed820f0df9a6c Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Thu, 17 Aug 2023 15:57:58 +0300 Subject: [PATCH 040/101] webdrivermanager removed and selenium update --- bellatrix.core/pom.xml | 2 +- bellatrix.web/pom.xml | 5 ----- .../bellatrix/web/infrastructure/DriverService.java | 7 ------- 3 files changed, 1 insertion(+), 13 deletions(-) diff --git a/bellatrix.core/pom.xml b/bellatrix.core/pom.xml index eedb2977..233cd904 100644 --- a/bellatrix.core/pom.xml +++ b/bellatrix.core/pom.xml @@ -24,7 +24,7 @@ 1.0 - 4.8.0 + 4.11.0 8.3.0 7.7.0 5.9.0 diff --git a/bellatrix.web/pom.xml b/bellatrix.web/pom.xml index a0d91ace..97953a6b 100644 --- a/bellatrix.web/pom.xml +++ b/bellatrix.web/pom.xml @@ -60,11 +60,6 @@ 2.14.2 compile - - io.github.bonigarcia - webdrivermanager - 5.3.1 - com.fasterxml.jackson.core jackson-annotations diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index 9ea83f93..8163c74e 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -229,7 +229,6 @@ private static WebDriver initializeDriverRegularMode() { switch (BROWSER_CONFIGURATION.get().getBrowser()) { case CHROME -> { - WebDriverManager.chromedriver().setup(); var chromeOptions = new ChromeOptions(); addDriverOptions(chromeOptions); chromeOptions.addArguments("--log-level=3","--remote-allow-origins=*"); @@ -241,7 +240,6 @@ private static WebDriver initializeDriverRegularMode() { driver = new ChromeDriver(chromeOptions); } case CHROME_HEADLESS -> { - WebDriverManager.chromedriver().setup(); var chromeHeadlessOptions = new ChromeOptions(); addDriverOptions(chromeHeadlessOptions); chromeHeadlessOptions.setAcceptInsecureCerts(true); @@ -254,7 +252,6 @@ private static WebDriver initializeDriverRegularMode() { driver = new ChromeDriver(chromeHeadlessOptions); } case FIREFOX -> { - WebDriverManager.firefoxdriver().setup(); var firefoxOptions = new FirefoxOptions(); addDriverOptions(firefoxOptions); firefoxOptions.setAcceptInsecureCerts(true); @@ -262,7 +259,6 @@ private static WebDriver initializeDriverRegularMode() { driver = new FirefoxDriver(firefoxOptions); } case FIREFOX_HEADLESS -> { - WebDriverManager.firefoxdriver().setup(); var firefoxHeadlessOptions = new FirefoxOptions(); addDriverOptions(firefoxHeadlessOptions); firefoxHeadlessOptions.setAcceptInsecureCerts(true); @@ -271,8 +267,6 @@ private static WebDriver initializeDriverRegularMode() { driver = new FirefoxDriver(firefoxHeadlessOptions); } case EDGE -> { - - WebDriverManager.edgedriver().setup(); var edgeOptions = new EdgeOptions(); addDriverOptions(edgeOptions); if (shouldCaptureHttpTraffic) edgeOptions.setProxy(proxyConfig); @@ -286,7 +280,6 @@ private static WebDriver initializeDriverRegularMode() { driver = new SafariDriver(safariOptions); } case INTERNET_EXPLORER -> { - WebDriverManager.iedriver().setup(); var internetExplorerOptions = new InternetExplorerOptions(); addDriverOptions(internetExplorerOptions); internetExplorerOptions.introduceFlakinessByIgnoringSecurityDomains().ignoreZoomSettings(); From c44df51ae898e8678f79afdc56c304f30a7f2668 Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Thu, 17 Aug 2023 16:25:53 +0300 Subject: [PATCH 041/101] Package org.apache.hc.core5.net.URIBuilder update --- .../solutions/bellatrix/web/configuration/UrlDeterminer.java | 2 +- .../solutions/bellatrix/web/infrastructure/DriverService.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/UrlDeterminer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/UrlDeterminer.java index 010cab76..be675da0 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/UrlDeterminer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/UrlDeterminer.java @@ -13,7 +13,7 @@ package solutions.bellatrix.web.configuration; -import org.apache.hc.core5.net.URIBuilder; +import org.apache.http.client.utils.URIBuilder; import solutions.bellatrix.core.configuration.ConfigurationService; import java.net.URI; diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index 8163c74e..9bf2d9c6 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -13,7 +13,6 @@ package solutions.bellatrix.web.infrastructure; -import io.github.bonigarcia.wdm.WebDriverManager; import net.lightbody.bmp.client.ClientUtil; import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; From 833a10ab556e7b20dcbe6b561566b082f3b5797a Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Fri, 18 Aug 2023 09:42:38 +0300 Subject: [PATCH 042/101] Added browser version for test purposes --- .../solutions/bellatrix/web/infrastructure/DriverService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index 9bf2d9c6..e55d0ccd 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -230,6 +230,7 @@ private static WebDriver initializeDriverRegularMode() { case CHROME -> { var chromeOptions = new ChromeOptions(); addDriverOptions(chromeOptions); + chromeOptions.setBrowserVersion("114"); chromeOptions.addArguments("--log-level=3","--remote-allow-origins=*"); chromeOptions.setAcceptInsecureCerts(true); chromeOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); From 9df4aa1145b227e4a46800bb51734ecf36c5b0e7 Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Fri, 18 Aug 2023 10:15:04 +0300 Subject: [PATCH 043/101] Added Chrome & Chromedriver for testing --- .../solutions/bellatrix/web/infrastructure/DriverService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index e55d0ccd..59c65d62 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -229,8 +229,10 @@ private static WebDriver initializeDriverRegularMode() { switch (BROWSER_CONFIGURATION.get().getBrowser()) { case CHROME -> { var chromeOptions = new ChromeOptions(); + System.setProperty("webdriver.chrome.driver", "C:\\CfT\\chromedriver-win64\\chromedriver.exe"); + chromeOptions.setBinary("C:\\CfT\\chrome-win64\\chrome.exe"); addDriverOptions(chromeOptions); - chromeOptions.setBrowserVersion("114"); +// chromeOptions.setBrowserVersion("114"); chromeOptions.addArguments("--log-level=3","--remote-allow-origins=*"); chromeOptions.setAcceptInsecureCerts(true); chromeOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); From 11e1535fe16fc6969ef5162d8eae5ecb7ae657a5 Mon Sep 17 00:00:00 2001 From: Aleksi Zhelyazkov Date: Fri, 18 Aug 2023 13:53:41 +0300 Subject: [PATCH 044/101] Chrome_Headless mode configuration fixes --- .../solutions/bellatrix/web/infrastructure/Browser.java | 4 ++-- .../bellatrix/web/infrastructure/DriverService.java | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/Browser.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/Browser.java index 5cecd77a..46dea0f1 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/Browser.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/Browser.java @@ -17,9 +17,9 @@ public enum Browser { CHROME("chrome"), - CHROME_HEADLESS("chrome"), + CHROME_HEADLESS("chrome_headless"), FIREFOX("firefox"), - FIREFOX_HEADLESS("firefox"), + FIREFOX_HEADLESS("firefox_headless"), EDGE("edge"), // EDGE_HEADLESS("edge"), // Unsupported by Selenium 3, Selenium 4 has support OPERA("opera"), diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index 59c65d62..ffa5f0c3 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -244,10 +244,14 @@ private static WebDriver initializeDriverRegularMode() { case CHROME_HEADLESS -> { var chromeHeadlessOptions = new ChromeOptions(); addDriverOptions(chromeHeadlessOptions); + System.setProperty("webdriver.chrome.driver", "C:\\CfT\\chromedriver-win64\\chromedriver.exe"); + chromeHeadlessOptions.setBinary("C:\\CfT\\chrome-win64\\chrome.exe"); chromeHeadlessOptions.setAcceptInsecureCerts(true); - chromeHeadlessOptions.addArguments("--log-level=3"); +// chromeHeadlessOptions.addArguments("--log-level=3"); + chromeHeadlessOptions.addArguments("--log-level=3","--remote-allow-origins=*"); chromeHeadlessOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); - chromeHeadlessOptions.setHeadless(true); +// chromeHeadlessOptions.setHeadless(true); + chromeHeadlessOptions.addArguments("--headless=new"); System.setProperty("webdriver.chrome.silentOutput", "true"); if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); From e84b80b5df998654d13a681ff7238d50a2d98ad8 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Fri, 18 Aug 2023 14:50:47 +0300 Subject: [PATCH 045/101] fix set window size priorities --- .../web/configuration/WebSettings.java | 3 ++- .../infrastructure/BrowserConfiguration.java | 8 ++++++++ .../BrowserLifecyclePlugin.java | 20 ++++++++++++++----- .../web/infrastructure/DriverService.java | 2 +- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/WebSettings.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/WebSettings.java index 5e488967..29121ca2 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/WebSettings.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/WebSettings.java @@ -34,7 +34,8 @@ public class WebSettings { @Getter @Setter private String executionType; @Getter @Setter private String defaultLifeCycle; @Getter @Setter private String defaultBrowser; - + @Getter @Setter private Integer defaultBrowserWidth = 0; + @Getter @Setter private Integer defaultBrowserHeight = 0; @Getter @Setter private List gridSettings; @Getter @Setter private int artificialDelayBeforeAction; diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserConfiguration.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserConfiguration.java index ea2a4463..26252baf 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserConfiguration.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserConfiguration.java @@ -39,6 +39,14 @@ public BrowserConfiguration(Browser browser, Lifecycle browserBehavior) { driverOptions = new HashMap<>(); } + public BrowserConfiguration(Browser browser, Lifecycle browserBehavior, Integer browserWidth, Integer browserHeight) { + this.browser = browser; + this.lifecycle = browserBehavior; + this.width = browserWidth; + this.height = browserHeight; + driverOptions = new HashMap<>(); + } + public BrowserConfiguration(Browser browser, Lifecycle browserBehavior, String testName) { this.browser = browser; this.lifecycle = browserBehavior; diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java index ae264bbc..03be20d9 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java @@ -141,12 +141,22 @@ private BrowserConfiguration getExecutionBrowserMethodLevel(Method memberInfo) { private BrowserConfiguration getExecutionBrowserClassLevel(Class type) { var executionBrowserAnnotation = (ExecutionBrowser)type.getDeclaredAnnotation(ExecutionBrowser.class); + + var defaultBrowser = Browser.fromText(ConfigurationService.get(WebSettings.class).getDefaultBrowser()); + var defaultLifecycle = Lifecycle.fromText(ConfigurationService.get(WebSettings.class).getDefaultLifeCycle()); + var defaultWidth = ConfigurationService.get(WebSettings.class).getDefaultBrowserWidth(); + var defaultHeight = ConfigurationService.get(WebSettings.class).getDefaultBrowserHeight(); + + var finalBrowser = executionBrowserAnnotation.browser() != defaultBrowser ? executionBrowserAnnotation.browser() : defaultBrowser; + var finalLifecycle = executionBrowserAnnotation.lifecycle() != defaultLifecycle ? executionBrowserAnnotation.lifecycle() : defaultLifecycle; + var finalWidth = executionBrowserAnnotation.width() != 0 ? executionBrowserAnnotation.width() : defaultWidth; + var finalHeight = executionBrowserAnnotation.height() != 0 ? executionBrowserAnnotation.height() : defaultHeight; + if (executionBrowserAnnotation == null) { - var defaultBrowser = Browser.fromText(ConfigurationService.get(WebSettings.class).getDefaultBrowser()); - var defaultLifecycle = Lifecycle.fromText(ConfigurationService.get(WebSettings.class).getDefaultLifeCycle()); - return new BrowserConfiguration(defaultBrowser, defaultLifecycle); + return new BrowserConfiguration(defaultBrowser, defaultLifecycle, defaultWidth, defaultHeight); + } + else { + return new BrowserConfiguration(finalBrowser, finalLifecycle, finalWidth, finalHeight); } - - return new BrowserConfiguration(executionBrowserAnnotation.browser(), executionBrowserAnnotation.lifecycle()); } } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index 9ea83f93..e289a7f0 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -343,7 +343,7 @@ private static void addDriverOptions(TOpti private static void changeWindowSize(WebDriver wrappedDriver) { try { if (getBrowserConfiguration().getHeight() != 0 && getBrowserConfiguration().getWidth() != 0) { - wrappedDriver.manage().window().setSize(new Dimension(getBrowserConfiguration().getHeight(), getBrowserConfiguration().getWidth())); + wrappedDriver.manage().window().setSize(new Dimension(getBrowserConfiguration().getWidth(), getBrowserConfiguration().getHeight())); } } catch (Exception ignored) {} } From 23c5f389a256394b3844d5095cea59b5bec1f702 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Mon, 21 Aug 2023 17:38:25 +0300 Subject: [PATCH 046/101] fix browser defaults to be read from config --- .../solutions/bellatrix/web/infrastructure/Browser.java | 1 + .../web/infrastructure/BrowserLifecyclePlugin.java | 2 +- .../bellatrix/web/infrastructure/DriverService.java | 8 ++++---- .../bellatrix/web/infrastructure/ExecutionBrowser.java | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/Browser.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/Browser.java index 46dea0f1..8e78d121 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/Browser.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/Browser.java @@ -24,6 +24,7 @@ public enum Browser { // EDGE_HEADLESS("edge"), // Unsupported by Selenium 3, Selenium 4 has support OPERA("opera"), SAFARI("safari"), + NOT_SET("not_set"), INTERNET_EXPLORER("ie"); private final String value; diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java index 03be20d9..c8e1e5ee 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java @@ -147,7 +147,7 @@ private BrowserConfiguration getExecutionBrowserClassLevel(Class type) { var defaultWidth = ConfigurationService.get(WebSettings.class).getDefaultBrowserWidth(); var defaultHeight = ConfigurationService.get(WebSettings.class).getDefaultBrowserHeight(); - var finalBrowser = executionBrowserAnnotation.browser() != defaultBrowser ? executionBrowserAnnotation.browser() : defaultBrowser; + var finalBrowser = executionBrowserAnnotation.browser() != Browser.NOT_SET && executionBrowserAnnotation.browser() != defaultBrowser ? executionBrowserAnnotation.browser() : defaultBrowser; var finalLifecycle = executionBrowserAnnotation.lifecycle() != defaultLifecycle ? executionBrowserAnnotation.lifecycle() : defaultLifecycle; var finalWidth = executionBrowserAnnotation.width() != 0 ? executionBrowserAnnotation.width() : defaultWidth; var finalHeight = executionBrowserAnnotation.height() != 0 ? executionBrowserAnnotation.height() : defaultHeight; diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index 7d78646d..efc4e06b 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -229,8 +229,8 @@ private static WebDriver initializeDriverRegularMode() { switch (BROWSER_CONFIGURATION.get().getBrowser()) { case CHROME -> { var chromeOptions = new ChromeOptions(); - System.setProperty("webdriver.chrome.driver", "C:\\CfT\\chromedriver-win64\\chromedriver.exe"); - chromeOptions.setBinary("C:\\CfT\\chrome-win64\\chrome.exe"); +// System.setProperty("webdriver.chrome.driver", "C:\\CfT\\chromedriver-win64\\chromedriver.exe"); +// chromeOptions.setBinary("C:\\CfT\\chrome-win64\\chrome.exe"); addDriverOptions(chromeOptions); // chromeOptions.setBrowserVersion("114"); chromeOptions.addArguments("--log-level=3","--remote-allow-origins=*"); @@ -244,8 +244,8 @@ private static WebDriver initializeDriverRegularMode() { case CHROME_HEADLESS -> { var chromeHeadlessOptions = new ChromeOptions(); addDriverOptions(chromeHeadlessOptions); - System.setProperty("webdriver.chrome.driver", "C:\\CfT\\chromedriver-win64\\chromedriver.exe"); - chromeHeadlessOptions.setBinary("C:\\CfT\\chrome-win64\\chrome.exe"); +// System.setProperty("webdriver.chrome.driver", "C:\\CfT\\chromedriver-win64\\chromedriver.exe"); +// chromeHeadlessOptions.setBinary("C:\\CfT\\chrome-win64\\chrome.exe"); chromeHeadlessOptions.setAcceptInsecureCerts(true); // chromeHeadlessOptions.addArguments("--log-level=3"); chromeHeadlessOptions.addArguments("--log-level=3","--remote-allow-origins=*"); diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ExecutionBrowser.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ExecutionBrowser.java index 21466b86..0fd99c64 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ExecutionBrowser.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ExecutionBrowser.java @@ -23,8 +23,8 @@ @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface ExecutionBrowser { - Browser browser() default Browser.CHROME; - Lifecycle lifecycle() default Lifecycle.RESTART_EVERY_TIME; + Browser browser() default Browser.NOT_SET; + Lifecycle lifecycle(); int browserVersion() default 0; Platform platform() default Platform.ANY; int width() default 0; From da54efade9072d35b8550bee7af0c0e955a7067c Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Tue, 22 Aug 2023 12:05:59 +0300 Subject: [PATCH 047/101] add logging --- .../solutions/bellatrix/web/infrastructure/DriverService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index efc4e06b..a3c6dc0e 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -344,7 +344,7 @@ private static void changeWindowSize(WebDriver wrappedDriver) { if (getBrowserConfiguration().getHeight() != 0 && getBrowserConfiguration().getWidth() != 0) { wrappedDriver.manage().window().setSize(new Dimension(getBrowserConfiguration().getWidth(), getBrowserConfiguration().getHeight())); } - } catch (Exception ignored) {} + } catch (Exception ex) { System.out.println("Error while resizing browser window: " + ex.getMessage());} } private static String getBuildName() { From bdf4068efd22c1934fa01102c1744007a7b3fa37 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Tue, 22 Aug 2023 14:20:48 +0300 Subject: [PATCH 048/101] remove console coloring commands --- .../java/solutions/bellatrix/web/components/WebComponent.java | 4 ++-- .../web/components/contracts/ComponentBackgroundColor.java | 2 +- .../bellatrix/web/components/contracts/ComponentStyle.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java index bc6fbeab..93f58c41 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java @@ -646,8 +646,8 @@ public WebElement findElement() { waitStrategies.clear(); } catch (WebDriverException ex) { Log.error("%n%nThe component: %n" + - " Type: \"\u001B[1m%s\u001B[0m\"%n" + - " Locator: \"\u001B[1m%s\u001B[0m\"%n" + + " Type: \"%s\"%n" + + " Locator: \"%s\"%n" + "Was not found on the page or didn't fulfill the specified conditions.%n%n", getComponentClass().getSimpleName(), findStrategy.toString()); throw ex; diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentBackgroundColor.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentBackgroundColor.java index 442e1027..a46694ca 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentBackgroundColor.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentBackgroundColor.java @@ -37,7 +37,7 @@ default String getBackgroundColor(){ default void validateBackgroundColor(Colors expectedColor) { try { Method method = ComponentValidator.class.getDeclaredMethod("defaultValidateAttributeIs", WebComponent.class, Supplier.class, String.class, String.class); - method.invoke(SingletonFactory.getInstance(ComponentValidator.class), (WebComponent) this, (Supplier) () -> this.getBackgroundColor(), expectedColor.getColorValue().getColor().getRGB(), String.format("expected color should be \u001B[35m%s\u001B[0m", expectedColor)); + method.invoke(SingletonFactory.getInstance(ComponentValidator.class), (WebComponent) this, (Supplier) () -> this.getBackgroundColor(), expectedColor.getColorValue().getColor().getRGB(), String.format("expected color should be %s", expectedColor)); } catch (InvocationTargetException e) { throw e.getCause(); } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentStyle.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentStyle.java index 9a239107..93041907 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentStyle.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentStyle.java @@ -36,7 +36,7 @@ default String getStyle(CssStyle style) { default void validateStyle(CssStyle style, String expectedValue) { try { Method method = ComponentValidator.class.getDeclaredMethod("defaultValidateAttributeIs", WebComponent.class, Supplier.class, java.lang.String.class, java.lang.String.class); - method.invoke(SingletonFactory.getInstance(ComponentValidator.class), (WebComponent) this, (Supplier) () -> this.getStyle(style), expectedValue, java.lang.String.format("expected color should be \u001B[35m%s\u001B[0m", expectedValue)); + method.invoke(SingletonFactory.getInstance(ComponentValidator.class), (WebComponent) this, (Supplier) () -> this.getStyle(style), expectedValue, java.lang.String.format("expected color should be %s", expectedValue)); } catch (InvocationTargetException e) { throw e.getCause(); } From 412e8882527ca79ddf409a0dd13a7664fe8425c0 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Thu, 24 Aug 2023 16:19:56 +0300 Subject: [PATCH 049/101] change headless mode to old --- .../bellatrix/web/infrastructure/DriverService.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index a3c6dc0e..34467504 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -229,10 +229,7 @@ private static WebDriver initializeDriverRegularMode() { switch (BROWSER_CONFIGURATION.get().getBrowser()) { case CHROME -> { var chromeOptions = new ChromeOptions(); -// System.setProperty("webdriver.chrome.driver", "C:\\CfT\\chromedriver-win64\\chromedriver.exe"); -// chromeOptions.setBinary("C:\\CfT\\chrome-win64\\chrome.exe"); addDriverOptions(chromeOptions); -// chromeOptions.setBrowserVersion("114"); chromeOptions.addArguments("--log-level=3","--remote-allow-origins=*"); chromeOptions.setAcceptInsecureCerts(true); chromeOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); @@ -244,14 +241,10 @@ private static WebDriver initializeDriverRegularMode() { case CHROME_HEADLESS -> { var chromeHeadlessOptions = new ChromeOptions(); addDriverOptions(chromeHeadlessOptions); -// System.setProperty("webdriver.chrome.driver", "C:\\CfT\\chromedriver-win64\\chromedriver.exe"); -// chromeHeadlessOptions.setBinary("C:\\CfT\\chrome-win64\\chrome.exe"); chromeHeadlessOptions.setAcceptInsecureCerts(true); -// chromeHeadlessOptions.addArguments("--log-level=3"); chromeHeadlessOptions.addArguments("--log-level=3","--remote-allow-origins=*"); chromeHeadlessOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); -// chromeHeadlessOptions.setHeadless(true); - chromeHeadlessOptions.addArguments("--headless=new"); + chromeHeadlessOptions.addArguments("--headless=old"); System.setProperty("webdriver.chrome.silentOutput", "true"); if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); From afd8fdb7e561cdbd87790119abf0ff8123f4f750 Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Fri, 25 Aug 2023 16:34:54 +0300 Subject: [PATCH 050/101] update Entites asserter to ignore non-existanf properties --- .../core/assertions/EntitiesAsserter.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/assertions/EntitiesAsserter.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/assertions/EntitiesAsserter.java index b5b887ed..f9cebf76 100644 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/assertions/EntitiesAsserter.java +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/assertions/EntitiesAsserter.java @@ -61,7 +61,8 @@ private static List assertAreEqualsInternal(TEntity expecte try { currentExpectedProperty = expectedObject.getClass().getMethod(currentRealProperty.getName()); } catch (NoSuchMethodException e) { - failedAssertions.add(e); + System.out.println(String.format("Property %s not found.", currentRealProperty)); +// failedAssertions.add(e); } var exceptionMessage = "The property " + currentRealProperty.getName() + " of class " + realObject.getClass().getSimpleName() + " was not as expected."; @@ -69,8 +70,8 @@ private static List assertAreEqualsInternal(TEntity expecte try { if (currentRealProperty.getReturnType() == LocalDateTime.class) { LocalDateTimeAssert.areEqual( - (LocalDateTime) currentExpectedProperty.invoke(expectedObject), - (LocalDateTime) currentRealProperty.invoke(realObject), + (LocalDateTime)currentExpectedProperty.invoke(expectedObject), + (LocalDateTime)currentRealProperty.invoke(realObject), deltaType, deltaQuantity, exceptionMessage); } else { Assertions.assertEquals( @@ -78,8 +79,14 @@ private static List assertAreEqualsInternal(TEntity expecte currentRealProperty.invoke(realObject), exceptionMessage); } - - } catch (Exception ex) { + } + catch (NoSuchMethodException nsm){ + //ignore this case + } + catch (NullPointerException nsmex){ + //ignore this case + } + catch (Exception ex) { failedAssertions.add(ex); } } From d5af6116049eb1f7a5ff9e3986c20f47d68eb1bb Mon Sep 17 00:00:00 2001 From: Nikolay Avramov Date: Fri, 25 Aug 2023 17:08:22 +0300 Subject: [PATCH 051/101] change screenshot strategy to simple --- .../bellatrix/web/infrastructure/WebScreenshotPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java index dd58b405..b2b7caee 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java @@ -38,7 +38,7 @@ public WebScreenshotPlugin() { @SneakyThrows protected void takeScreenshot(String screenshotSaveDir, String filename) { var screenshot = new AShot() - .shootingStrategy(ShootingStrategies.viewportPasting(100)) + .shootingStrategy(ShootingStrategies.simple()) .takeScreenshot(DriverService.getWrappedDriver()); var destFile = new File(Paths.get(screenshotSaveDir, filename).toString()); Log.info("Saving screenshot with path: " + destFile); From 5ba8ffdae241cc378ca86d093214395bea4de7f2 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Mon, 25 Sep 2023 09:51:44 +0300 Subject: [PATCH 052/101] add clipboard retrieval via JS code --- .../bellatrix/web/services/BrowserService.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index 364620dd..497cb89f 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -343,4 +343,15 @@ public void waitForAngular() { } } } + + public String getLastClipboardEntry(){ + JavaScriptService jsService = new JavaScriptService(); + Object lastCopyObject = jsService.execute("return await window.navigator.clipboard.readText();"); + if (lastCopyObject != null){ + return lastCopyObject.toString(); + } + else { + return ""; + } + } } From 6eb4397b07cbd5fd1a217419dfac8549c2b60ffa Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Wed, 27 Sep 2023 08:36:50 +0300 Subject: [PATCH 053/101] update driver prompt disable via capabilities --- .../web/infrastructure/DriverService.java | 22 +++++++++++++++++++ .../infrastructure/WebScreenshotPlugin.java | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index 34467504..06514c0b 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -39,6 +39,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; +import java.util.Map; import java.util.Properties; import java.util.concurrent.TimeUnit; @@ -230,6 +231,7 @@ private static WebDriver initializeDriverRegularMode() { case CHROME -> { var chromeOptions = new ChromeOptions(); addDriverOptions(chromeOptions); + addDriverCapabilities(chromeOptions); chromeOptions.addArguments("--log-level=3","--remote-allow-origins=*"); chromeOptions.setAcceptInsecureCerts(true); chromeOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); @@ -241,6 +243,7 @@ private static WebDriver initializeDriverRegularMode() { case CHROME_HEADLESS -> { var chromeHeadlessOptions = new ChromeOptions(); addDriverOptions(chromeHeadlessOptions); + addDriverCapabilities(chromeHeadlessOptions); chromeHeadlessOptions.setAcceptInsecureCerts(true); chromeHeadlessOptions.addArguments("--log-level=3","--remote-allow-origins=*"); chromeHeadlessOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); @@ -290,6 +293,25 @@ private static WebDriver initializeDriverRegularMode() { return driver; } + private static DesiredCapabilities addDriverCapabilities(ChromeOptions chromeOptions) { + DesiredCapabilities caps = new DesiredCapabilities(); + // INIT CHROME OPTIONS + Map prefs = new HashMap(); + Map profile = new HashMap(); + Map contentSettings = new HashMap(); + + // SET CHROME OPTIONS + // 0 - Default, 1 - Allow, 2 - Block + contentSettings.put("notifications", 1); + profile.put("managed_default_content_settings", contentSettings); + prefs.put("profile", profile); + chromeOptions.setExperimentalOption("prefs", prefs); + + // SET CAPABILITY + caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); + return caps; + } + private static void addGridOptions(HashMap options, GridSettings gridSettings) { for (var entry : gridSettings.getArguments()) { for (var c : entry.entrySet()) { diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java index b2b7caee..dd58b405 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java @@ -38,7 +38,7 @@ public WebScreenshotPlugin() { @SneakyThrows protected void takeScreenshot(String screenshotSaveDir, String filename) { var screenshot = new AShot() - .shootingStrategy(ShootingStrategies.simple()) + .shootingStrategy(ShootingStrategies.viewportPasting(100)) .takeScreenshot(DriverService.getWrappedDriver()); var destFile = new File(Paths.get(screenshotSaveDir, filename).toString()); Log.info("Saving screenshot with path: " + destFile); From 5fc20bb868300f041e666bb69889d0c040351a4e Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Wed, 27 Sep 2023 08:40:56 +0300 Subject: [PATCH 054/101] remove unused usings --- .../bellatrix/web/infrastructure/WebScreenshotPlugin.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java index dd58b405..d40e96c1 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java @@ -14,7 +14,6 @@ package solutions.bellatrix.web.infrastructure; import lombok.SneakyThrows; -import org.apache.commons.codec.binary.Base64; import plugins.screenshots.ScreenshotPlugin; import ru.yandex.qatools.ashot.AShot; import ru.yandex.qatools.ashot.shooting.ShootingStrategies; @@ -24,7 +23,6 @@ import solutions.bellatrix.web.configuration.WebSettings; import javax.imageio.ImageIO; -import java.io.ByteArrayOutputStream; import java.io.File; import java.nio.file.Paths; import java.util.UUID; From 192ec57707852b7cdfb426b10c602d0cde5d67f1 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Tue, 17 Oct 2023 13:46:31 +0300 Subject: [PATCH 055/101] refactor resizing --- .../web/infrastructure/DriverService.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index 06514c0b..7ecbd463 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -30,6 +30,7 @@ import org.openqa.selenium.safari.SafariOptions; import solutions.bellatrix.core.configuration.ConfigurationService; import solutions.bellatrix.core.utilities.DebugInformation; +import solutions.bellatrix.core.utilities.Log; import solutions.bellatrix.core.utilities.TimestampBuilder; import solutions.bellatrix.web.configuration.GridSettings; import solutions.bellatrix.web.configuration.WebSettings; @@ -100,8 +101,16 @@ public static WebDriver start(BrowserConfiguration configuration) { driver.manage().timeouts().pageLoadTimeout(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getPageLoadTimeout(), TimeUnit.SECONDS); driver.manage().timeouts().setScriptTimeout(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getScriptTimeout(), TimeUnit.SECONDS); - driver.manage().window().maximize(); - changeWindowSize(driver); + + if(getBrowserConfiguration().getHeight() != 0 && getBrowserConfiguration().getWidth() != 0) { + changeWindowSize(driver); + } + else { + driver.manage().window().maximize(); + } + + Log.info(String.format("Window resized to dimensions: %s", driver.manage().window().getSize().toString())); + WRAPPED_DRIVER.set(driver); return driver; @@ -357,6 +366,7 @@ private static void addDriverOptions(TOpti private static void changeWindowSize(WebDriver wrappedDriver) { try { if (getBrowserConfiguration().getHeight() != 0 && getBrowserConfiguration().getWidth() != 0) { + Log.info(String.format("Setting window size to %sx%s",getBrowserConfiguration().getWidth(), getBrowserConfiguration().getHeight())); wrappedDriver.manage().window().setSize(new Dimension(getBrowserConfiguration().getWidth(), getBrowserConfiguration().getHeight())); } } catch (Exception ex) { System.out.println("Error while resizing browser window: " + ex.getMessage());} From 3f36be079b79bc03b7c6369b78428f7f1af029f3 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Thu, 19 Oct 2023 10:24:13 +0300 Subject: [PATCH 056/101] remove assert throw --- .../solutions/bellatrix/web/infrastructure/ProxyServer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index cd8ede0c..f93f763c 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -132,7 +132,7 @@ public static void waitForRequest(WebDriver driver, String requestPartialUrl, Ht }); } catch (TimeoutException exception){ - throw new AssertionFailedError(String.format("The expected request with URL '%s' is not loaded!", requestPartialUrl)); + Log.error(String.format("The expected request with URL '%s' is not loaded!", requestPartialUrl)); } } From 8c9107cd099253bbc1cf5bc279d3581d7ab13c08 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 20 Oct 2023 14:50:11 +0300 Subject: [PATCH 057/101] add getParent method to the web components --- .../solutions/bellatrix/web/components/WebComponent.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java index 93f58c41..07a07590 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java @@ -41,6 +41,7 @@ import solutions.bellatrix.web.services.JavaScriptService; import solutions.bellatrix.web.waitstrategies.*; +import java.lang.reflect.Type; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.time.Duration; @@ -149,6 +150,10 @@ public String getTitle() { return getAttribute("title"); } + public WebComponent getParent() { + return createByXPath(WebComponent.class, "./.."); + } + public String getTabIndex() { return getAttribute("tabindex"); } From b24cd0060bc4aec845b91987d0364685e7deb962 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Thu, 2 Nov 2023 14:32:44 +0200 Subject: [PATCH 058/101] add environment getter --- .../bellatrix/core/configuration/ConfigurationService.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/configuration/ConfigurationService.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/configuration/ConfigurationService.java index 95be9b2f..f6626baa 100644 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/configuration/ConfigurationService.java +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/configuration/ConfigurationService.java @@ -30,6 +30,10 @@ public final class ConfigurationService { private static String environment; + public static String getEnvironment() { + return environment; + } + public static T get(Class configSection) { T mappedObject = (T)new Object(); if (environment == null) { From 0a32ee13242b05a73fb94fcb909e254226d501e5 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 3 Nov 2023 10:42:51 +0200 Subject: [PATCH 059/101] add file name to screenshot generated event --- .../java/plugins/screenshots/ScreenshotPlugin.java | 2 +- .../screenshots/ScreenshotPluginEventArgs.java | 7 +++++-- .../web/infrastructure/WebScreenshotPlugin.java | 11 ++++++++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPlugin.java b/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPlugin.java index 3f0d0554..327cd0dd 100644 --- a/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPlugin.java +++ b/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPlugin.java @@ -42,6 +42,6 @@ public void postAfterTest(TestResult testResult, Method memberInfo) { var screenshotSaveDir = getOutputFolder(); var screenshotFileName = getUniqueFileName(memberInfo.getName()); takeScreenshot(screenshotSaveDir, screenshotFileName); - SCREENSHOT_GENERATED.broadcast(new ScreenshotPluginEventArgs(Paths.get(screenshotSaveDir, screenshotFileName).toString())); + SCREENSHOT_GENERATED.broadcast(new ScreenshotPluginEventArgs(Paths.get(screenshotSaveDir, screenshotFileName).toString(), screenshotFileName)); } } diff --git a/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPluginEventArgs.java b/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPluginEventArgs.java index 3a3a87e7..b0026cc5 100644 --- a/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPluginEventArgs.java +++ b/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPluginEventArgs.java @@ -15,10 +15,13 @@ import lombok.Getter; +@Getter public class ScreenshotPluginEventArgs { - @Getter private final String screenshotPath; + private final String screenshotPath; + private final String fileName; - public ScreenshotPluginEventArgs(String screenshotPath) { + public ScreenshotPluginEventArgs(String screenshotPath, String fileName) { this.screenshotPath = screenshotPath; + this.fileName = fileName; } } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java index d40e96c1..a3ba7c12 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java @@ -13,8 +13,8 @@ package solutions.bellatrix.web.infrastructure; -import lombok.SneakyThrows; import plugins.screenshots.ScreenshotPlugin; +import plugins.screenshots.ScreenshotPluginEventArgs; import ru.yandex.qatools.ashot.AShot; import ru.yandex.qatools.ashot.shooting.ShootingStrategies; import solutions.bellatrix.core.configuration.ConfigurationService; @@ -24,6 +24,7 @@ import javax.imageio.ImageIO; import java.io.File; +import java.io.IOException; import java.nio.file.Paths; import java.util.UUID; @@ -33,14 +34,18 @@ public WebScreenshotPlugin() { } @Override - @SneakyThrows protected void takeScreenshot(String screenshotSaveDir, String filename) { var screenshot = new AShot() .shootingStrategy(ShootingStrategies.viewportPasting(100)) .takeScreenshot(DriverService.getWrappedDriver()); var destFile = new File(Paths.get(screenshotSaveDir, filename).toString()); Log.info("Saving screenshot with path: " + destFile); - ImageIO.write(screenshot.getImage(), "png", destFile); + try { + ImageIO.write(screenshot.getImage(), "png", destFile); + } catch (IOException e) { + Log.error(e.toString()); + } + SCREENSHOT_GENERATED.broadcast(new ScreenshotPluginEventArgs(Paths.get(screenshotSaveDir, filename).toString(), filename)); } @Override From cf0d71abd04fd9ab3e0e0ce1e96a0a9c16ea494a Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 3 Nov 2023 12:23:59 +0200 Subject: [PATCH 060/101] fix double screenshot --- .../bellatrix/web/infrastructure/WebScreenshotPlugin.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java index a3ba7c12..b58a9ab0 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/WebScreenshotPlugin.java @@ -14,7 +14,6 @@ package solutions.bellatrix.web.infrastructure; import plugins.screenshots.ScreenshotPlugin; -import plugins.screenshots.ScreenshotPluginEventArgs; import ru.yandex.qatools.ashot.AShot; import ru.yandex.qatools.ashot.shooting.ShootingStrategies; import solutions.bellatrix.core.configuration.ConfigurationService; @@ -45,7 +44,6 @@ protected void takeScreenshot(String screenshotSaveDir, String filename) { } catch (IOException e) { Log.error(e.toString()); } - SCREENSHOT_GENERATED.broadcast(new ScreenshotPluginEventArgs(Paths.get(screenshotSaveDir, filename).toString(), filename)); } @Override From b55243a61d4ef4a32dc7b9f67ff781a6fd8084b5 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Wed, 8 Nov 2023 09:16:05 +0200 Subject: [PATCH 061/101] refactor retry logic --- .../bellatrix/core/utilities/Wait.java | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/Wait.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/Wait.java index 756f45c0..136a1d80 100644 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/Wait.java +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/Wait.java @@ -3,9 +3,12 @@ import java.time.Duration; public class Wait { - public static void retry(Runnable action, int timesToRetry, long sleepInterval, Class ... exceptionsToIgnore) throws InterruptedException { + public static void retry(Runnable action, int timesToRetry, long sleepInterval, Class ... exceptionsToIgnore) { + Wait.retry(action, timesToRetry, sleepInterval, true, exceptionsToIgnore); + } + + public static void retry(Runnable action, int timesToRetry, long sleepInterval,boolean shouldThrowException, Class ... exceptionsToIgnore) { int repeat = 0; - boolean shouldThrowException = true; while(repeat <= timesToRetry) { try { shouldThrowException = true; @@ -17,7 +20,11 @@ public static void retry(Runnable action, int timesToRetry, long sleepInterval, //exc.printStackTrace(); repeat++; shouldThrowException = false; - Thread.sleep(Duration.ofSeconds(sleepInterval).toMillis()); + try { + Thread.sleep(Duration.ofSeconds(sleepInterval).toMillis()); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } break; } } @@ -29,12 +36,11 @@ public static void retry(Runnable action, int timesToRetry, long sleepInterval, } } - public static void retry(Runnable action, Class ... exceptionsToIgnore) throws InterruptedException { + public static void retry(Runnable action, Class ... exceptionsToIgnore) { retry(action, Duration.ofSeconds(30), Duration.ofSeconds(1), exceptionsToIgnore); } - public static void retry(Runnable action, Duration timeout, Duration sleepInterval, Class ... exceptionsToIgnore) throws InterruptedException { - boolean shouldThrowException = true; + public static boolean retry(Runnable action, Duration timeout, Duration sleepInterval, Boolean shouldThrowException, Class ... exceptionsToIgnore) { long start = System.currentTimeMillis(); long end = start + timeout.toMillis(); while(System.currentTimeMillis() < end) { @@ -47,7 +53,11 @@ public static void retry(Runnable action, Duration timeout, Duration sleepInterv if (currentException.isInstance(exc)) { //exc.printStackTrace(); shouldThrowException = false; - Thread.sleep(sleepInterval.toMillis()); + try { + Thread.sleep(sleepInterval.toMillis()); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } break; } } @@ -55,7 +65,16 @@ public static void retry(Runnable action, Duration timeout, Duration sleepInterv if (shouldThrowException) { throw exc; } + else { + return false; + } } } + + return true; + } + + public static void retry(Runnable action, Duration timeout, Duration sleepInterval, Class ... exceptionsToIgnore) { + Wait.retry(action, timeout, sleepInterval, true, exceptionsToIgnore); } } From 68778d0418cae3d1dbc3eecfff70e377d0ce2736 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Wed, 8 Nov 2023 09:56:40 +0200 Subject: [PATCH 062/101] enhance Proxy server logging --- .../solutions/bellatrix/web/infrastructure/ProxyServer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index f93f763c..2dee24db 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -168,7 +168,7 @@ private static String getSimilarRequestsString(String requestPartialUrl, List { Uri uri = Uri.create(requestPartialUrl); if(e.getRequest().getUrl().contains(uri.getHost()) || e.getRequest().getUrl().contains(requestPartialUrl)){ - allUrls.add(e.getRequest().getUrl()); + allUrls.add(String.format("%s[%s]", e.getRequest().getUrl(), e.getResponse().getStatusText())); } }); String allUrlsString = ""; From 16a9b815f9f95a1d40affb19feedabe8a40e0f1e Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Wed, 8 Nov 2023 18:03:28 +0200 Subject: [PATCH 063/101] add console log methods in BrowserService --- .../web/configuration/WebSettings.java | 3 ++ .../web/services/BrowserService.java | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/WebSettings.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/WebSettings.java index 29121ca2..596561ee 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/WebSettings.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/WebSettings.java @@ -27,6 +27,7 @@ import lombok.Getter; import lombok.Setter; +import java.util.ArrayList; import java.util.List; public class WebSettings { @@ -49,6 +50,8 @@ public class WebSettings { @Getter @Setter private Boolean toastNotificationBddLogging; @Getter @Setter private long notificationToastTimeout; + @Getter @Setter private ArrayList consoleErrorsWhitelist; + @Getter @Setter private Boolean screenshotsOnFailEnabled; @Getter @Setter private String screenshotsSaveLocation; diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index 497cb89f..38719f75 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -15,7 +15,10 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.StringEscapeUtils; +import org.junit.jupiter.api.Assertions; import org.openqa.selenium.*; +import org.openqa.selenium.logging.LogEntry; +import org.openqa.selenium.logging.LogType; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import solutions.bellatrix.core.configuration.ConfigurationService; @@ -24,8 +27,11 @@ import solutions.bellatrix.web.configuration.WebSettings; import java.time.Duration; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; import java.util.function.Function; +import java.util.logging.Level; public class BrowserService extends WebService { private final JavascriptExecutor javascriptExecutor; @@ -137,6 +143,30 @@ public void clearLocalStorage() { ((JavascriptExecutor)getWrappedDriver()).executeScript("localStorage.clear()"); } + public List getBrowserLogs() { + return getLogsByType(LogType.BROWSER); + } + + public List getLogsByType(String type) { + return getWrappedDriver().manage().logs().get(type.toString()).toJson(); + } + + public void assertConsoleNoErrorsLogged() { + Assertions.assertEquals(new ArrayList(), + getSevereLogEntries(), + "Severe Errors found in console. If they are expected, add them to the whitelist."); + } + + public List getSevereLogEntries() { + ArrayList whiteList = ConfigurationService.get(WebSettings.class).getConsoleErrorsWhitelist(); + var logs = getBrowserLogs().stream().filter( + (logEntry -> + (logEntry.getLevel() == Level.SEVERE) && + !(whiteList.stream().anyMatch(listEntry -> logEntry.getMessage().contains(listEntry))) + )).toList(); + return logs; + } + public void waitForAjax() { long ajaxTimeout = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitForAjaxTimeout(); long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); From 3e8b3740535fe4e72e363f2cf3e204c0f2aa8541 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Thu, 9 Nov 2023 11:03:49 +0200 Subject: [PATCH 064/101] fix minor issues --- .../solutions/bellatrix/web/services/BrowserService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index 38719f75..471e8f78 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -148,10 +148,10 @@ public List getBrowserLogs() { } public List getLogsByType(String type) { - return getWrappedDriver().manage().logs().get(type.toString()).toJson(); + return getWrappedDriver().manage().logs().get(type).toJson(); } - public void assertConsoleNoErrorsLogged() { + public void assertNoConsoleErrorsLogged() { Assertions.assertEquals(new ArrayList(), getSevereLogEntries(), "Severe Errors found in console. If they are expected, add them to the whitelist."); @@ -159,6 +159,7 @@ public void assertConsoleNoErrorsLogged() { public List getSevereLogEntries() { ArrayList whiteList = ConfigurationService.get(WebSettings.class).getConsoleErrorsWhitelist(); + var logs = getBrowserLogs().stream().filter( (logEntry -> (logEntry.getLevel() == Level.SEVERE) && From 194d593f4cd178ac3b120747ef63e0339c954bf3 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Mon, 11 Dec 2023 16:36:22 +0200 Subject: [PATCH 065/101] add console logs assertion --- .../solutions/bellatrix/web/services/BrowserService.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index 471e8f78..9359009f 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -157,6 +157,15 @@ public void assertNoConsoleErrorsLogged() { "Severe Errors found in console. If they are expected, add them to the whitelist."); } + public void assertConsoleErrorLogged(String errorMessage, Level severity) { + var errorLogs = getLogsByType(LogType.BROWSER); + var filteredLog = errorLogs.stream().filter((log) -> log.getMessage().contains(errorMessage)).findFirst(); + Assertions.assertTrue(filteredLog.isPresent(), "Expected message '%s' not found in console. Actual Log: %s".formatted(errorMessage, errorLogs)); + Assertions.assertEquals(severity, + filteredLog.get().getLevel(), + "Log severity is not as expected for message '%s'.".formatted(errorMessage)); + } + public List getSevereLogEntries() { ArrayList whiteList = ConfigurationService.get(WebSettings.class).getConsoleErrorsWhitelist(); From f0ac1f0d12ef35b4a48edba559f87df00d617f62 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 15 Dec 2023 10:33:26 +0200 Subject: [PATCH 066/101] add javascript service to base page --- .../src/main/java/solutions/bellatrix/web/pages/WebPage.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/pages/WebPage.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/pages/WebPage.java index 1f209f21..97cd3b09 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/pages/WebPage.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/pages/WebPage.java @@ -15,6 +15,7 @@ import solutions.bellatrix.web.services.BrowserService; import solutions.bellatrix.web.services.ComponentCreateService; +import solutions.bellatrix.web.services.JavaScriptService; import solutions.bellatrix.web.services.NavigationService; import java.lang.reflect.ParameterizedType; @@ -24,6 +25,10 @@ public BrowserService browser() { return new BrowserService(); } + public JavaScriptService javaScript() { + return new JavaScriptService(); + } + public ComponentCreateService create() { return new ComponentCreateService(); } From 64c48eaa765c37479378ef8c1e339ab61323c25f Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Wed, 20 Dec 2023 17:00:16 +0200 Subject: [PATCH 067/101] add logging in proxy server --- .../bellatrix/web/infrastructure/ProxyServer.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index 2dee24db..e383de86 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -251,7 +251,12 @@ public static T getRequestByUrl(String url, String httpMethod, Class requ return null; } String json = harEntry.getRequest().getPostData().getText(); - return new Gson().fromJson(json, requestModelClass); + try { + return new Gson().fromJson(json, requestModelClass); + } + catch (Exception e) { + throw new RuntimeException("Error occurred while converting json to model. Json was: %s".formatted(json), e); + } } public static T getRequestByUrl(String url, String httpMethod, Type modelType) { @@ -264,7 +269,12 @@ public static T getRequestByUrl(String url, String httpMethod, Type modelTyp return null; } String json = harEntry.getRequest().getPostData().getText(); - return new Gson().fromJson(getDataObject(json), modelType); + try { + return new Gson().fromJson(json, modelType); + } + catch (Exception e) { + throw new RuntimeException("Error occurred while converting json to model. Json was: %s".formatted(json), e); + } } public static T getResponseByUrl(String url, String httpMethod, Class responseModelClass) { From 0f96f574441a94d9b463765107b61b41fc200770 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Mon, 8 Jan 2024 17:01:36 +0200 Subject: [PATCH 068/101] update logging in Proxy server --- .../solutions/bellatrix/web/infrastructure/ProxyServer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index e383de86..60d3fce0 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -158,7 +158,7 @@ public static void waitForResponse(WebDriver driver, String requestPartialUrl, H catch (TimeoutException exception){ String allUrlsString = getSimilarRequestsString(requestPartialUrl, allHarEntries); - throw new AssertionFailedError(String.format("The expected response with request URL '%s' is not loaded! \r\nSimilar requests: %s", requestPartialUrl, allUrlsString)); + throw new AssertionFailedError(String.format("The expected response with request URL '%s' with method %s is not loaded! \r\nSimilar requests: %s", requestPartialUrl, httpMethod, allUrlsString)); } } @@ -168,7 +168,7 @@ private static String getSimilarRequestsString(String requestPartialUrl, List { Uri uri = Uri.create(requestPartialUrl); if(e.getRequest().getUrl().contains(uri.getHost()) || e.getRequest().getUrl().contains(requestPartialUrl)){ - allUrls.add(String.format("%s[%s]", e.getRequest().getUrl(), e.getResponse().getStatusText())); + allUrls.add(String.format("[%s]%s[%s]", e.getRequest().getMethod(), e.getRequest().getUrl(), e.getResponse().getStatusText())); } }); String allUrlsString = ""; From a189e7c1968bfaf43ad8f28a74775c8f10fa8b18 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Tue, 9 Jan 2024 16:42:06 +0200 Subject: [PATCH 069/101] add experimental logic --- .../web/infrastructure/BrowserLifecyclePlugin.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java index c8e1e5ee..365bef9d 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java @@ -60,11 +60,11 @@ public void postAfterClass(Class type) { public void preBeforeTest(TestResult testResult, Method memberInfo) { CURRENT_BROWSER_CONFIGURATION.set(getBrowserConfiguration(memberInfo)); - if (!IS_BROWSER_STARTED_DURING_PRE_BEFORE_CLASS.get()) { - if (shouldRestartBrowser()) { - restartBrowser(); - } + if (shouldRestartBrowser()) { + restartBrowser(); } +// if (!IS_BROWSER_STARTED_DURING_PRE_BEFORE_CLASS.get()) { +// } IS_BROWSER_STARTED_DURING_PRE_BEFORE_CLASS.set(false); } From a9badfeb503d3c81d978bfad987ad67ac69737dd Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Wed, 10 Jan 2024 13:50:12 +0200 Subject: [PATCH 070/101] revert experiment --- .../web/infrastructure/BrowserLifecyclePlugin.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java index 365bef9d..c8e1e5ee 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java @@ -60,11 +60,11 @@ public void postAfterClass(Class type) { public void preBeforeTest(TestResult testResult, Method memberInfo) { CURRENT_BROWSER_CONFIGURATION.set(getBrowserConfiguration(memberInfo)); - if (shouldRestartBrowser()) { - restartBrowser(); + if (!IS_BROWSER_STARTED_DURING_PRE_BEFORE_CLASS.get()) { + if (shouldRestartBrowser()) { + restartBrowser(); + } } -// if (!IS_BROWSER_STARTED_DURING_PRE_BEFORE_CLASS.get()) { -// } IS_BROWSER_STARTED_DURING_PRE_BEFORE_CLASS.set(false); } From 6035d05c1e4a1b97d383f35919daecfc21d84213 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 12 Jan 2024 13:19:42 +0200 Subject: [PATCH 071/101] add scroll methods in BrowserService --- .../solutions/bellatrix/web/components/WebComponent.java | 2 +- .../solutions/bellatrix/web/services/BrowserService.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java index 07a07590..0bcf8f46 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java @@ -1044,7 +1044,7 @@ private void scrollToVisible(WebElement wrappedElement, boolean shouldWait) { Thread.sleep(500); toExist().waitToBe(); } - } catch (ElementNotInteractableException | InterruptedException ex) { + } catch (ElementNotInteractableException | InterruptedException | ScriptTimeoutException ex) { DebugInformation.printStackTrace(ex); } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index 9359009f..c1dbfd0b 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -126,6 +126,14 @@ public void removeItemFromLocalStorage(String item) { ((JavascriptExecutor)getWrappedDriver()).executeScript(String.format("window.localStorage.removeItem('%s');", item)); } + public void scrollToBottom() { + ((JavascriptExecutor)getWrappedDriver()).executeScript("window.scrollTo(0, document.body.scrollHeight)"); + } + + public void scrollToTop() { + ((JavascriptExecutor)getWrappedDriver()).executeScript("window.scrollTo(0, 0)"); + } + public boolean isItemPresentInLocalStorage(String item) { return !(((JavascriptExecutor)getWrappedDriver()).executeScript(String.format("return window.localStorage.getItem('%s');", item)) == null); } From b90a85413b0a1060cceb00bee5706f2f76d1c493 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Tue, 16 Jan 2024 11:04:19 +0200 Subject: [PATCH 072/101] add wait without exception throw --- .../bellatrix/web/services/BrowserService.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index c1dbfd0b..dd86b3a3 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -22,6 +22,7 @@ import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import solutions.bellatrix.core.configuration.ConfigurationService; +import solutions.bellatrix.core.utilities.Log; import solutions.bellatrix.core.utilities.Wait; import solutions.bellatrix.web.components.Frame; import solutions.bellatrix.web.configuration.WebSettings; @@ -373,6 +374,18 @@ public void waitForRequest(String partialUrl) { } } + public void tryWaitForRequest(String partialUrl) { + var javascriptExecutor = (JavascriptExecutor)getWrappedDriver(); + String script = String.format("return performance.getEntriesByType('resource').filter(item => item.name.toLowerCase().includes('%s'))[0] !== undefined;", partialUrl); + + try { + waitUntil(e -> (boolean)javascriptExecutor.executeScript(script)); + } + catch (TimeoutException exception){ + Log.error(String.format("The expected request with URL '%s' is not loaded!", partialUrl)); + } + } + public void waitForAngular() { long angularTimeout = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitForAngularTimeout(); long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); From 45adc359405ebfa1dc01f41de041b39cd0205390 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Tue, 16 Jan 2024 22:17:22 +0200 Subject: [PATCH 073/101] add supported response type --- .../java/solutions/bellatrix/web/infrastructure/ProxyServer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index 60d3fce0..55584d0c 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -51,6 +51,7 @@ public class ProxyServer { HttpStatus.SC_NON_AUTHORITATIVE_INFORMATION, HttpStatus.SC_NO_CONTENT, HttpStatus.SC_RESET_CONTENT, + HttpStatus.SC_UNPROCESSABLE_ENTITY, HttpStatus.SC_PARTIAL_CONTENT, HttpStatus.SC_MULTI_STATUS); From 5a7879ba05b1f57e8a879a914a16837f518a58a4 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Wed, 24 Jan 2024 14:50:07 +0200 Subject: [PATCH 074/101] add tryWait method to catch exception in case it happens --- .../bellatrix/web/services/BrowserService.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index dd86b3a3..72ea5056 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -341,6 +341,18 @@ public void waitUntil(Function function) { webDriverWait.until(function); } + public void tryWaitUntil(Function function) { + long waitUntilReadyTimeout = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitUntilReadyTimeout(); + long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); + var webDriverWait = new WebDriverWait(getWrappedDriver(), Duration.ofSeconds(waitUntilReadyTimeout), Duration.ofSeconds(sleepInterval)); + try { + webDriverWait.until(function); + } + catch (TimeoutException exception){ + Log.error(String.format("Timed out waiting for the condition! %s", function.toString())); + } + } + public void waitForJavaScriptAnimations() { long waitForJavaScriptAnimationsTimeout = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitForJavaScriptAnimationsTimeout(); long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); From abd5d781cd7d7a725a1804c8205895ee1f63ef88 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Thu, 25 Jan 2024 10:10:22 +0200 Subject: [PATCH 075/101] refactor waitForRequest --- .../solutions/bellatrix/web/services/BrowserService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index 72ea5056..dce118b6 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -388,13 +388,13 @@ public void waitForRequest(String partialUrl) { public void tryWaitForRequest(String partialUrl) { var javascriptExecutor = (JavascriptExecutor)getWrappedDriver(); - String script = String.format("return performance.getEntriesByType('resource').filter(item => item.name.toLowerCase().includes('%s'))[0] !== undefined;", partialUrl); + String script = "return performance.getEntriesByType('resource').filter(item => item.name.toLowerCase().includes('" + partialUrl + "'))[0] !== undefined;"; try { waitUntil(e -> (boolean)javascriptExecutor.executeScript(script)); } - catch (TimeoutException exception){ - Log.error(String.format("The expected request with URL '%s' is not loaded!", partialUrl)); + catch (Exception exception){ + Log.error("The expected request with URL '" + partialUrl + "' is not loaded!"); } } From 7b45350a170cfc9c73e79989ea6d1fd61a257b47 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Thu, 25 Jan 2024 16:33:28 +0200 Subject: [PATCH 076/101] refactor usage of logs --- .../java/solutions/bellatrix/web/services/BrowserService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index dce118b6..e312f79f 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -394,7 +394,7 @@ public void tryWaitForRequest(String partialUrl) { waitUntil(e -> (boolean)javascriptExecutor.executeScript(script)); } catch (Exception exception){ - Log.error("The expected request with URL '" + partialUrl + "' is not loaded!"); + Log.error("The expected request with URL '%s' is not loaded!", partialUrl); } } From 053f478a359d1f7e7859027e33773e4b93866bae Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Thu, 25 Jan 2024 18:43:56 +0200 Subject: [PATCH 077/101] apply fix in wait --- .../solutions/bellatrix/web/infrastructure/ProxyServer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index 55584d0c..2260ef25 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -149,7 +149,7 @@ public static void waitForResponse(WebDriver driver, String requestPartialUrl, H r -> r.getRequest().getUrl().contains(requestPartialUrl) && r.getRequest().getMethod().equals(httpMethod.toString()) && successHttpStatusesList.contains(r.getResponse().getStatus()) - && !r.getResponse().getContent().getText().isEmpty() + && (httpMethod.equals(HttpMethod.DELETE)? true : !r.getResponse().getContent().getText().isEmpty()) ); allHarEntries.clear(); allHarEntries.addAll(harEntries); @@ -293,7 +293,7 @@ public static T getResponseByUrl(String url, String httpMethod, Class res return new Gson().fromJson(getDataObject(json), responseModelClass); } catch (Exception ex){ - throw new AssertionFailedError("Cannot get JSON body from the string: " + json + ". " + harEntry.getResponse().toString()); + throw new AssertionFailedError("Cannot get JSON body from the string: " + json + ". Error was: " + ex.getMessage()); } } From 84420837b29e9d58022437fa46577edf3518ba9f Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 26 Jan 2024 10:25:15 +0200 Subject: [PATCH 078/101] add try catch in notification toasts --- .../solutions/bellatrix/web/services/BrowserService.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index e312f79f..17ba0c03 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -322,7 +322,12 @@ public void injectNotificationToast(String message, long timeoutMillis, ToastNot } window.$bellatrixToastContainer.appendChild($bellatrixToast); setTimeout($bellatrixToast.remove.bind($bellatrixToast), $timeout);"""; - ((JavascriptExecutor) getWrappedDriver()).executeScript(executionScript); + try { + ((JavascriptExecutor) getWrappedDriver()).executeScript(executionScript); + } + catch (Exception ex) { + Log.error("Failed to inject notification toast."); + } } public void waitForReactPageLoadsCompletely() { From 6ef22d4b30dcd27a614653eafbd99485f3a3b631 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 26 Jan 2024 10:43:33 +0200 Subject: [PATCH 079/101] add try catch in wait for page load --- .../solutions/bellatrix/web/services/BrowserService.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index 17ba0c03..8a813a17 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -248,7 +248,12 @@ public void waitUntilPageLoadsCompletely() { long waitUntilReadyTimeout = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitUntilReadyTimeout(); long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); var webDriverWait = new WebDriverWait(getWrappedDriver(), Duration.ofSeconds(waitUntilReadyTimeout), Duration.ofSeconds(sleepInterval)); - webDriverWait.until(webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete")); + try { + webDriverWait.until(webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete")); + } + catch (ScriptTimeoutException ex) { + Log.error("Script timeout while loading for page load."); + } } public void injectInfoNotificationToast(String message) { From a7bd1be6342d2430f77e10993e3261dd3649c1a6 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Mon, 29 Jan 2024 12:29:45 +0200 Subject: [PATCH 080/101] fix logic in wait for request in delete --- .../solutions/bellatrix/web/infrastructure/ProxyServer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index 2260ef25..9b527ab4 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -149,7 +149,7 @@ public static void waitForResponse(WebDriver driver, String requestPartialUrl, H r -> r.getRequest().getUrl().contains(requestPartialUrl) && r.getRequest().getMethod().equals(httpMethod.toString()) && successHttpStatusesList.contains(r.getResponse().getStatus()) - && (httpMethod.equals(HttpMethod.DELETE)? true : !r.getResponse().getContent().getText().isEmpty()) + && (httpMethod.equals(HttpMethod.DELETE)? true : (r.getResponse().getContent().getText() != null && !r.getResponse().getContent().getText().isEmpty())) ); allHarEntries.clear(); allHarEntries.addAll(harEntries); From 4592319f9a5b016f1beb2828314521a8ebc73491 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Thu, 1 Feb 2024 11:21:30 +0200 Subject: [PATCH 081/101] Fix After method execution when @ParametereziedTest annotaion is used --- .../java/solutions/bellatrix/core/plugins/junit/BaseTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/plugins/junit/BaseTest.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/plugins/junit/BaseTest.java index b8783688..9feb2a57 100644 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/plugins/junit/BaseTest.java +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/plugins/junit/BaseTest.java @@ -90,7 +90,7 @@ public void afterMethodCore(TestInfo testInfo) { try { var testClass = this.getClass(); assert testInfo.getTestMethod().isPresent(); - var methodInfo = testClass.getMethod(testInfo.getTestMethod().get().getName()); + var methodInfo = testClass.getMethod(testInfo.getTestMethod().get().getName(), testInfo.getTestMethod().get().getParameterTypes()); PluginExecutionEngine.preAfterTest(CURRENT_TEST_RESULT.get(), methodInfo); afterEach(); // PluginExecutionEngine.postAfterTest(CURRENT_TEST_RESULT.get(), methodInfo); From 79f8343e69d88dc9e83194183c3d1bb981998058 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 2 Feb 2024 14:34:11 +0200 Subject: [PATCH 082/101] add clipboard method --- .../bellatrix/core/utilities/ClipboardManager.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ClipboardManager.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ClipboardManager.java index f7f38576..4170f18d 100644 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ClipboardManager.java +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ClipboardManager.java @@ -1,9 +1,7 @@ package solutions.bellatrix.core.utilities; import java.awt.*; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.UnsupportedFlavorException; +import java.awt.datatransfer.*; import java.io.IOException; public class ClipboardManager { @@ -20,4 +18,10 @@ public static String getLastEntity() { return lastCopiedEntity; } + + public static void copyTextToClipboard(String text) { + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + Transferable transferable = new StringSelection(text); + clipboard.setContents(transferable, null); + } } From c31c17de41d9c73b75428867e14375b1aaf6a624 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 2 Feb 2024 14:34:59 +0200 Subject: [PATCH 083/101] add clipboard method --- .../solutions/bellatrix/core/utilities/ClipboardManager.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ClipboardManager.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ClipboardManager.java index 4170f18d..fe5c2be8 100644 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ClipboardManager.java +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ClipboardManager.java @@ -20,8 +20,7 @@ public static String getLastEntity() { } public static void copyTextToClipboard(String text) { - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); Transferable transferable = new StringSelection(text); - clipboard.setContents(transferable, null); + systemClipboard.setContents(transferable, null); } } From 8e8ab0af7440d1caf08519570e969bb8f43ee299 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 9 Feb 2024 09:09:36 +0200 Subject: [PATCH 084/101] format BrowserService --- .../web/services/BrowserService.java | 84 +++++++++---------- 1 file changed, 39 insertions(+), 45 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index 8a813a17..f9aca2a7 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -87,7 +87,7 @@ public void switchToNewTab() { getWrappedDriver().switchTo().newWindow(WindowType.TAB); } - public void switchToTab(Runnable condition) throws InterruptedException { + public void switchToTab(Runnable condition) { Wait.retry(() -> { var handles = getWrappedDriver().getWindowHandles(); Boolean shouldThrowException = true; @@ -140,7 +140,7 @@ public boolean isItemPresentInLocalStorage(String item) { } public String getItemFromLocalStorage(String key) { - return (String) ((JavascriptExecutor)getWrappedDriver()).executeScript(String.format("return window.localStorage.getItem('%s');", key)); + return (String)((JavascriptExecutor)getWrappedDriver()).executeScript(String.format("return window.localStorage.getItem('%s');", key)); } @@ -161,9 +161,9 @@ public List getLogsByType(String type) { } public void assertNoConsoleErrorsLogged() { - Assertions.assertEquals(new ArrayList(), - getSevereLogEntries(), - "Severe Errors found in console. If they are expected, add them to the whitelist."); + Assertions.assertEquals(new ArrayList(), + getSevereLogEntries(), + "Severe Errors found in console. If they are expected, add them to the whitelist."); } public void assertConsoleErrorLogged(String errorMessage, Level severity) { @@ -249,9 +249,8 @@ public void waitUntilPageLoadsCompletely() { long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); var webDriverWait = new WebDriverWait(getWrappedDriver(), Duration.ofSeconds(waitUntilReadyTimeout), Duration.ofSeconds(sleepInterval)); try { - webDriverWait.until(webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete")); - } - catch (ScriptTimeoutException ex) { + webDriverWait.until(webDriver -> ((JavascriptExecutor)webDriver).executeScript("return document.readyState").equals("complete")); + } catch (ScriptTimeoutException ex) { Log.error("Script timeout while loading for page load."); } } @@ -303,34 +302,33 @@ public void injectWarningNotificationToast(String format, Object... args) { public void injectNotificationToast(String message, long timeoutMillis, ToastNotificationType type) { String escapedMessage = StringEscapeUtils.escapeEcmaScript(message); String executionScript = """ - window.$bellatrixToastContainer = !window.$bellatrixToastContainer ? Object.assign(document.createElement('div'), {id: 'bellatrixToastContainer', style: 'position: fixed; top: 0; height: 100vh; padding-bottom: 20px; display: flex; pointer-events: none; z-index: 2147483646; justify-content: flex-end; flex-direction: column; overflow: hidden;'}) : window.$bellatrixToastContainer; - let $message = '""" + escapedMessage + """ - '; - let $timeout = """ + timeoutMillis + """ - ; - let $type = '""" + type.toString() + """ - '; - if (!document.querySelector('#bellatrixToastContainer')) document.body.appendChild(window.$bellatrixToastContainer); - let $bellatrixToast - switch ($type.toLowerCase()) { - case 'warning': - $bellatrixToast = Object.assign(document.createElement('div'), {textContent: $message.trim() ? $message : 'message not set', style: 'pointer-events: none; z-index: 2147483647; color: ' + ($message.trim() ? '#2e0f00' : '#2e0f0088') + '; width: fit-content; background-color: #fdefc9; margin: 5px 10px; border-radius: 10px; padding: 15px 10px 15px 52px; background-repeat: no-repeat; background-position: 5px center; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 15px; box-shadow: 0px 0.6px 0.7px rgba(0, 0, 0, 0.1), 0px 1.3px 1.7px rgba(0, 0, 0, 0.116), 0px 2.3px 3.5px rgba(0, 0, 0, 0.128), 0px 4.2px 7.3px rgba(0, 0, 0, 0.135), 0px 10px 20px rgba(0, 0, 0, 0.13); background-image: url(\\'data:image/svg+xml,\\');'}); - break; - case 'error': - $bellatrixToast = Object.assign(document.createElement('div'), {textContent: $message.trim() ? $message : 'message not set', style: 'pointer-events: none; z-index: 2147483647; color: ' + ($message.trim() ? '#2e0004' : '#2e000488') + '; width: fit-content; background-color: #fdc9d2; margin: 5px 10px; border-radius: 10px; padding: 15px 10px 15px 52px; background-repeat: no-repeat; background-position: 5px center; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 15px; box-shadow: 0px 0.6px 0.7px rgba(0, 0, 0, 0.1), 0px 1.3px 1.7px rgba(0, 0, 0, 0.116), 0px 2.3px 3.5px rgba(0, 0, 0, 0.128), 0px 4.2px 7.3px rgba(0, 0, 0, 0.135), 0px 10px 20px rgba(0, 0, 0, 0.13); background-image: url(\\'data:image/svg+xml,\\');'}); - break; - case 'success': - $bellatrixToast = Object.assign(document.createElement('div'), {textContent: $message.trim() ? $message : 'message not set', style: 'pointer-events: none; z-index: 2147483647; color: ' + ($message.trim() ? '#002e0a' : '#002e0a88') + '; width: fit-content; background-color: #c9fdd4; margin: 5px 10px; border-radius: 10px; padding: 15px 10px 15px 52px; background-repeat: no-repeat; background-position: 5px center; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 15px; box-shadow: 0px 0.6px 0.7px rgba(0, 0, 0, 0.1), 0px 1.3px 1.7px rgba(0, 0, 0, 0.116), 0px 2.3px 3.5px rgba(0, 0, 0, 0.128), 0px 4.2px 7.3px rgba(0, 0, 0, 0.135), 0px 10px 20px rgba(0, 0, 0, 0.13); background-image: url(\\'data:image/svg+xml,\\');'}); - break; - case 'information': - $bellatrixToast = Object.assign(document.createElement('div'), {textContent: $message.trim() ? $message : 'message not set', style: 'pointer-events: none; z-index: 2147483647; color: ' + ($message.trim() ? '#00122e' : '#00122e88') + '; width: fit-content; background-color: #c9ecfd; margin: 5px 10px; border-radius: 10px; padding: 15px 10px 15px 52px; background-repeat: no-repeat; background-position: 7.5px center; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 15px; background-size: 40px; box-shadow: 0px 0.6px 0.7px rgba(0, 0, 0, 0.1), 0px 1.3px 1.7px rgba(0, 0, 0, 0.116), 0px 2.3px 3.5px rgba(0, 0, 0, 0.128), 0px 4.2px 7.3px rgba(0, 0, 0, 0.135), 0px 10px 20px rgba(0, 0, 0, 0.13); background-image: url(\\'data:image/svg+xml,\\');'}); - } - window.$bellatrixToastContainer.appendChild($bellatrixToast); - setTimeout($bellatrixToast.remove.bind($bellatrixToast), $timeout);"""; + window.$bellatrixToastContainer = !window.$bellatrixToastContainer ? Object.assign(document.createElement('div'), {id: 'bellatrixToastContainer', style: 'position: fixed; top: 0; height: 100vh; padding-bottom: 20px; display: flex; pointer-events: none; z-index: 2147483646; justify-content: flex-end; flex-direction: column; overflow: hidden;'}) : window.$bellatrixToastContainer; + let $message = '""" + escapedMessage + """ + '; + let $timeout = """ + timeoutMillis + """ + ; + let $type = '""" + type.toString() + """ + '; + if (!document.querySelector('#bellatrixToastContainer')) document.body.appendChild(window.$bellatrixToastContainer); + let $bellatrixToast + switch ($type.toLowerCase()) { + case 'warning': + $bellatrixToast = Object.assign(document.createElement('div'), {textContent: $message.trim() ? $message : 'message not set', style: 'pointer-events: none; z-index: 2147483647; color: ' + ($message.trim() ? '#2e0f00' : '#2e0f0088') + '; width: fit-content; background-color: #fdefc9; margin: 5px 10px; border-radius: 10px; padding: 15px 10px 15px 52px; background-repeat: no-repeat; background-position: 5px center; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 15px; box-shadow: 0px 0.6px 0.7px rgba(0, 0, 0, 0.1), 0px 1.3px 1.7px rgba(0, 0, 0, 0.116), 0px 2.3px 3.5px rgba(0, 0, 0, 0.128), 0px 4.2px 7.3px rgba(0, 0, 0, 0.135), 0px 10px 20px rgba(0, 0, 0, 0.13); background-image: url(\\'data:image/svg+xml,\\');'}); + break; + case 'error': + $bellatrixToast = Object.assign(document.createElement('div'), {textContent: $message.trim() ? $message : 'message not set', style: 'pointer-events: none; z-index: 2147483647; color: ' + ($message.trim() ? '#2e0004' : '#2e000488') + '; width: fit-content; background-color: #fdc9d2; margin: 5px 10px; border-radius: 10px; padding: 15px 10px 15px 52px; background-repeat: no-repeat; background-position: 5px center; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 15px; box-shadow: 0px 0.6px 0.7px rgba(0, 0, 0, 0.1), 0px 1.3px 1.7px rgba(0, 0, 0, 0.116), 0px 2.3px 3.5px rgba(0, 0, 0, 0.128), 0px 4.2px 7.3px rgba(0, 0, 0, 0.135), 0px 10px 20px rgba(0, 0, 0, 0.13); background-image: url(\\'data:image/svg+xml,\\');'}); + break; + case 'success': + $bellatrixToast = Object.assign(document.createElement('div'), {textContent: $message.trim() ? $message : 'message not set', style: 'pointer-events: none; z-index: 2147483647; color: ' + ($message.trim() ? '#002e0a' : '#002e0a88') + '; width: fit-content; background-color: #c9fdd4; margin: 5px 10px; border-radius: 10px; padding: 15px 10px 15px 52px; background-repeat: no-repeat; background-position: 5px center; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 15px; box-shadow: 0px 0.6px 0.7px rgba(0, 0, 0, 0.1), 0px 1.3px 1.7px rgba(0, 0, 0, 0.116), 0px 2.3px 3.5px rgba(0, 0, 0, 0.128), 0px 4.2px 7.3px rgba(0, 0, 0, 0.135), 0px 10px 20px rgba(0, 0, 0, 0.13); background-image: url(\\'data:image/svg+xml,\\');'}); + break; + case 'information': + $bellatrixToast = Object.assign(document.createElement('div'), {textContent: $message.trim() ? $message : 'message not set', style: 'pointer-events: none; z-index: 2147483647; color: ' + ($message.trim() ? '#00122e' : '#00122e88') + '; width: fit-content; background-color: #c9ecfd; margin: 5px 10px; border-radius: 10px; padding: 15px 10px 15px 52px; background-repeat: no-repeat; background-position: 7.5px center; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 15px; background-size: 40px; box-shadow: 0px 0.6px 0.7px rgba(0, 0, 0, 0.1), 0px 1.3px 1.7px rgba(0, 0, 0, 0.116), 0px 2.3px 3.5px rgba(0, 0, 0, 0.128), 0px 4.2px 7.3px rgba(0, 0, 0, 0.135), 0px 10px 20px rgba(0, 0, 0, 0.13); background-image: url(\\'data:image/svg+xml,\\');'}); + } + window.$bellatrixToastContainer.appendChild($bellatrixToast); + setTimeout($bellatrixToast.remove.bind($bellatrixToast), $timeout);"""; try { - ((JavascriptExecutor) getWrappedDriver()).executeScript(executionScript); - } - catch (Exception ex) { + ((JavascriptExecutor)getWrappedDriver()).executeScript(executionScript); + } catch (Exception ex) { Log.error("Failed to inject notification toast."); } } @@ -357,8 +355,7 @@ public void tryWaitUntil(Function function) { var webDriverWait = new WebDriverWait(getWrappedDriver(), Duration.ofSeconds(waitUntilReadyTimeout), Duration.ofSeconds(sleepInterval)); try { webDriverWait.until(function); - } - catch (TimeoutException exception){ + } catch (TimeoutException exception) { Log.error(String.format("Timed out waiting for the condition! %s", function.toString())); } } @@ -390,8 +387,7 @@ public void waitForRequest(String partialUrl) { try { waitUntil(e -> (boolean)javascriptExecutor.executeScript(script)); - } - catch (TimeoutException exception){ + } catch (TimeoutException exception) { throw new TimeoutException(String.format("The expected request with URL '%s' is not loaded!", partialUrl)); } } @@ -402,8 +398,7 @@ public void tryWaitForRequest(String partialUrl) { try { waitUntil(e -> (boolean)javascriptExecutor.executeScript(script)); - } - catch (Exception exception){ + } catch (Exception exception) { Log.error("The expected request with URL '%s' is not loaded!", partialUrl); } } @@ -427,13 +422,12 @@ public void waitForAngular() { } } - public String getLastClipboardEntry(){ + public String getLastClipboardEntry() { JavaScriptService jsService = new JavaScriptService(); Object lastCopyObject = jsService.execute("return await window.navigator.clipboard.readText();"); - if (lastCopyObject != null){ + if (lastCopyObject != null) { return lastCopyObject.toString(); - } - else { + } else { return ""; } } From f1aecde501c3152047b12f03ab4a00d4d573397f Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 9 Feb 2024 17:10:35 +0200 Subject: [PATCH 085/101] fix whitespace --- .../solutions/bellatrix/web/services/ToastNotificationType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ToastNotificationType.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ToastNotificationType.java index b1b4cbc6..a966768a 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ToastNotificationType.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ToastNotificationType.java @@ -5,4 +5,4 @@ public enum ToastNotificationType { Success, Warning, Error, -} +} \ No newline at end of file From 0a058eecacd613d12e22405ff4fa2994d1cf45e0 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Tue, 13 Feb 2024 15:16:42 +0200 Subject: [PATCH 086/101] add methods for scroll to visible --- .../bellatrix/web/components/WebComponent.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java index 0bcf8f46..7f34e34f 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java @@ -107,7 +107,15 @@ public void waitToBe() { } public void scrollToVisible() { - scrollToVisible(getWrappedElement(), false); + scrollToVisible(getWrappedElement(), false, "center"); + } + + public void scrollToTop() { + scrollToVisible(getWrappedElement(), false, "start"); + } + + public void scrollToBottom() { + scrollToVisible(getWrappedElement(), false, "end"); } public void setAttribute(String name, String value) { @@ -1032,14 +1040,15 @@ private void addArtificialDelay() { private void scrollToMakeElementVisible(WebElement wrappedElement) { // createBy default scroll down to make the element visible. if (webSettings.getAutomaticallyScrollToVisible()) { - scrollToVisible(wrappedElement, false); + scrollToVisible(wrappedElement, false, "center"); } } - private void scrollToVisible(WebElement wrappedElement, boolean shouldWait) { + + private void scrollToVisible(WebElement wrappedElement, boolean shouldWait, String scrollPosition) { SCROLLING_TO_VISIBLE.broadcast(new ComponentActionEventArgs(this)); try { - javaScriptService.execute("arguments[0].scrollIntoView({ block: \"center\" });", wrappedElement); + javaScriptService.execute("arguments[0].scrollIntoView({ block: \"" + scrollPosition + "\", behavior: \"smooth\", inline: \"nearest\" });", wrappedElement); if (shouldWait) { Thread.sleep(500); toExist().waitToBe(); From acb264042dede5d4cd78f3a1068a34d0096820f2 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Thu, 15 Feb 2024 11:21:16 +0200 Subject: [PATCH 087/101] enable browser type set as env variable --- .../bellatrix/web/infrastructure/BrowserLifecyclePlugin.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java index c8e1e5ee..262abb79 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java @@ -17,6 +17,7 @@ import solutions.bellatrix.core.plugins.Plugin; import solutions.bellatrix.core.plugins.TestResult; import solutions.bellatrix.core.utilities.DebugInformation; +import solutions.bellatrix.core.utilities.SecretsResolver; import solutions.bellatrix.web.configuration.WebSettings; import java.lang.reflect.Method; @@ -142,7 +143,7 @@ private BrowserConfiguration getExecutionBrowserMethodLevel(Method memberInfo) { private BrowserConfiguration getExecutionBrowserClassLevel(Class type) { var executionBrowserAnnotation = (ExecutionBrowser)type.getDeclaredAnnotation(ExecutionBrowser.class); - var defaultBrowser = Browser.fromText(ConfigurationService.get(WebSettings.class).getDefaultBrowser()); + var defaultBrowser = Browser.fromText(SecretsResolver.getSecret(ConfigurationService.get(WebSettings.class).getDefaultBrowser())); var defaultLifecycle = Lifecycle.fromText(ConfigurationService.get(WebSettings.class).getDefaultLifeCycle()); var defaultWidth = ConfigurationService.get(WebSettings.class).getDefaultBrowserWidth(); var defaultHeight = ConfigurationService.get(WebSettings.class).getDefaultBrowserHeight(); From 12d2a023ce1ba7fb7c2e9d4f6adbc0d0f76cc374 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Thu, 15 Feb 2024 13:52:02 +0200 Subject: [PATCH 088/101] fix brwoserService issue with unsupported browsers --- .../solutions/bellatrix/web/services/BrowserService.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index f9aca2a7..3d2fcde8 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -157,7 +157,14 @@ public List getBrowserLogs() { } public List getLogsByType(String type) { - return getWrappedDriver().manage().logs().get(type).toJson(); + try { + return getWrappedDriver().manage().logs().get(type).toJson(); + } + + catch (UnsupportedCommandException ex) { + // Unsupported browser + return new ArrayList<>(); + } } public void assertNoConsoleErrorsLogged() { From f4dbe80c1fc9c8b78b5d83b3be3613aad1ef7efb Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 16 Feb 2024 09:04:38 +0200 Subject: [PATCH 089/101] revert scroll behavior to instant --- .../java/solutions/bellatrix/web/components/WebComponent.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java index 7f34e34f..4c9671a3 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java @@ -41,7 +41,6 @@ import solutions.bellatrix.web.services.JavaScriptService; import solutions.bellatrix.web.waitstrategies.*; -import java.lang.reflect.Type; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.time.Duration; @@ -1048,7 +1047,7 @@ private void scrollToMakeElementVisible(WebElement wrappedElement) { private void scrollToVisible(WebElement wrappedElement, boolean shouldWait, String scrollPosition) { SCROLLING_TO_VISIBLE.broadcast(new ComponentActionEventArgs(this)); try { - javaScriptService.execute("arguments[0].scrollIntoView({ block: \"" + scrollPosition + "\", behavior: \"smooth\", inline: \"nearest\" });", wrappedElement); + javaScriptService.execute("arguments[0].scrollIntoView({ block: \"" + scrollPosition + "\", behavior: \"instant\", inline: \"nearest\" });", wrappedElement); if (shouldWait) { Thread.sleep(500); toExist().waitToBe(); From d93b41e0eb35f56a483ef2e6b9c8d0c423d6a6d9 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 1 Mar 2024 17:01:25 +0200 Subject: [PATCH 090/101] Improved logging in Selenium wait --- .../java/solutions/bellatrix/web/services/BrowserService.java | 4 ++++ .../solutions/bellatrix/web/waitstrategies/WaitStrategy.java | 1 + 2 files changed, 5 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index 3d2fcde8..6c622b8c 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -353,6 +353,8 @@ public void waitUntil(Function function) { long waitUntilReadyTimeout = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitUntilReadyTimeout(); long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); var webDriverWait = new WebDriverWait(getWrappedDriver(), Duration.ofSeconds(waitUntilReadyTimeout), Duration.ofSeconds(sleepInterval)); + String message = Thread.currentThread().getStackTrace()[2].getMethodName(); + webDriverWait.withMessage("Timed out while executing method: %s".formatted(message)); webDriverWait.until(function); } @@ -361,6 +363,8 @@ public void tryWaitUntil(Function function) { long sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); var webDriverWait = new WebDriverWait(getWrappedDriver(), Duration.ofSeconds(waitUntilReadyTimeout), Duration.ofSeconds(sleepInterval)); try { + String message = Thread.currentThread().getStackTrace()[2].getMethodName(); + webDriverWait.withMessage("Timed out while executing method: %s".formatted(message)); webDriverWait.until(function); } catch (TimeoutException exception) { Log.error(String.format("Timed out waiting for the condition! %s", function.toString())); diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/waitstrategies/WaitStrategy.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/waitstrategies/WaitStrategy.java index f475c379..562942f3 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/waitstrategies/WaitStrategy.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/waitstrategies/WaitStrategy.java @@ -40,6 +40,7 @@ public WaitStrategy(long timeoutInterval, long sleepInterval) { protected void waitUntil(Function waitCondition) { webDriverWait = new WebDriverWait(DriverService.getWrappedDriver(), Duration.ofSeconds(timeoutInterval), Duration.ofSeconds(sleepInterval)); + webDriverWait.withMessage(Thread.currentThread().getStackTrace()[2].getMethodName()); webDriverWait.until(waitCondition); } From 5effd5b687c58cb2b9da62c16167e3f093601cca Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Mon, 11 Mar 2024 11:33:14 +0200 Subject: [PATCH 091/101] refactor getDataObject method in ProxyServer --- .../web/infrastructure/ProxyServer.java | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index 9b527ab4..5694595f 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -342,7 +342,7 @@ private static String getDataObject(String jsonString) { JsonObject dataObject = null; JsonArray dataArray = null; - if (isObject == true) { + if (isObject) { if (jsonObject.has("data")){ if (jsonObject.get("data").isJsonObject()){ dataObject = jsonObject.getAsJsonObject("data"); @@ -356,21 +356,14 @@ private static String getDataObject(String jsonString) { dataArray = jsonArray.getAsJsonArray(); } -// if (jsonObject.has("data")){ -// if (jsonObject.get("data").isJsonObject()){ -// dataObject = jsonObject.getAsJsonObject("data"); -// } else { -// dataArray = jsonObject.getAsJsonArray("data"); -// } -// } else { -// dataArray = jsonArray.getAsJsonArray(); -// } - - if (dataObject == null){ -// return dataArray.toString(); - return jsonString; - } else { + if (dataObject != null){ return dataObject.toString(); } + else if (dataArray != null) { + return dataArray.toString(); + } + else { + return jsonString; + } } } From 58d9cc73c98cbcc57121e014467b9290968b870b Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 22 Mar 2024 14:02:53 +0200 Subject: [PATCH 092/101] Merge with latest main --- .../android/infrastructure/DriverService.java | 6 +-- bellatrix.core/pom.xml | 15 +------ .../core/integrations/azure/KeyVault.java | 43 ------------------- .../integrations/azure/SecretsResolver.java | 7 --- .../desktop/infrastructure/DriverService.java | 9 ++-- .../plugins/screenshots/ScreenshotPlugin.java | 2 +- .../java/O12_page_objects/cart_page/Map.java | 4 +- .../O12_page_objects/checkoutpage/Map.java | 40 ++++++++--------- .../test/java/junit/ProductPurchaseTests.java | 16 +++---- .../java/testng/ProductPurchaseTests.java | 20 ++++----- .../components/contracts/ComponentStyle.java | 14 +++--- .../BrowserLifecyclePlugin.java | 2 +- .../web/infrastructure/DriverService.java | 17 +++----- .../web/infrastructure/ProxyServer.java | 7 ++- 14 files changed, 70 insertions(+), 132 deletions(-) delete mode 100644 bellatrix.core/src/main/java/solutions/bellatrix/core/integrations/azure/KeyVault.java diff --git a/bellatrix.android/src/main/java/solutions/bellatrix/android/infrastructure/DriverService.java b/bellatrix.android/src/main/java/solutions/bellatrix/android/infrastructure/DriverService.java index 44989fe4..87b173d7 100644 --- a/bellatrix.android/src/main/java/solutions/bellatrix/android/infrastructure/DriverService.java +++ b/bellatrix.android/src/main/java/solutions/bellatrix/android/infrastructure/DriverService.java @@ -19,7 +19,6 @@ import io.appium.java_client.remote.MobileCapabilityType; import lombok.SneakyThrows; import org.openqa.selenium.MutableCapabilities; -import org.openqa.selenium.Platform; import org.openqa.selenium.remote.DesiredCapabilities; import solutions.bellatrix.android.configuration.AndroidSettings; import solutions.bellatrix.android.configuration.GridSettings; @@ -30,11 +29,10 @@ import java.io.IOException; import java.io.InputStream; -import java.net.MalformedURLException; import java.net.URL; +import java.time.Duration; import java.util.HashMap; import java.util.Properties; -import java.util.concurrent.TimeUnit; public class DriverService { private static final ThreadLocal DISPOSED; @@ -84,7 +82,7 @@ public static AndroidDriver start(AppConfiguration configuration) { driver = initializeDriverGridMode(gridSettings.get(), testName); } - driver.manage().timeouts().implicitlyWait(androidSettings.getTimeoutSettings().getImplicitWaitTimeout(), TimeUnit.SECONDS); + driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(androidSettings.getTimeoutSettings().getImplicitWaitTimeout())); WRAPPED_ANDROID_DRIVER.set(driver); solutions.bellatrix.web.infrastructure.DriverService.setWrappedDriver(driver); return driver; diff --git a/bellatrix.core/pom.xml b/bellatrix.core/pom.xml index 4ac8bfc5..23e2f014 100644 --- a/bellatrix.core/pom.xml +++ b/bellatrix.core/pom.xml @@ -62,19 +62,16 @@ software.amazon.awssdk textract - com.opencsv opencsv 5.7.1 - com.mailslurp mailslurp-client-java 15.17.1 - commons-io commons-io @@ -83,7 +80,7 @@ com.google.guava guava - 31.1-jre + 33.0.0-jre com.google.code.gson @@ -156,15 +153,5 @@ ${rest.assured.version} compile - - com.azure - azure-security-keyvault-secrets - 4.2.3 - - - com.azure - azure-identity - 1.2.0 - \ No newline at end of file diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/integrations/azure/KeyVault.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/integrations/azure/KeyVault.java deleted file mode 100644 index dbf5a46f..00000000 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/integrations/azure/KeyVault.java +++ /dev/null @@ -1,43 +0,0 @@ -package solutions.bellatrix.core.integrations.azure; - -import com.azure.identity.DefaultAzureCredentialBuilder; -import com.azure.security.keyvault.secrets.SecretClient; -import com.azure.security.keyvault.secrets.SecretClientBuilder; -import com.azure.security.keyvault.secrets.models.KeyVaultSecret; -import solutions.bellatrix.core.configuration.ConfigurationService; - -public class KeyVault { - private static SecretClient secretClient; - - static { - initializeClient(); - } - - public static boolean isAvailable = secretClient != null; - - public static String getSecret(String name) { - if (secretClient == null) { - return null; - } - - KeyVaultSecret secret = secretClient.getSecret(name); - return secret.getValue(); - } - - private static void initializeClient() { - if (secretClient != null) { - return; - } - - KeyVaultSettings settings = ConfigurationService.get(KeyVaultSettings.class); - - if (!settings.isEnabled() || settings.getKeyVaultEndpoint().isEmpty()) { - return; - } - - secretClient = new SecretClientBuilder() - .vaultUrl(settings.getKeyVaultEndpoint()) - .credential(new DefaultAzureCredentialBuilder().build()) - .buildClient(); - } -} \ No newline at end of file diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/integrations/azure/SecretsResolver.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/integrations/azure/SecretsResolver.java index f7ed3893..b5a0077c 100644 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/integrations/azure/SecretsResolver.java +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/integrations/azure/SecretsResolver.java @@ -10,17 +10,10 @@ public static String getSecret(Supplier getConfigValue) { return System.getenv(configValue.replace("env_", "")); } - if (configValue.startsWith("vault_")) { - return KeyVault.getSecret(configValue.replace("vault_", "")); - } - return configValue; } public static String getSecret(String name) { - if (KeyVault.isAvailable) { - return KeyVault.getSecret(name); - } String environmentalVariable = System.getenv(name); diff --git a/bellatrix.desktop/src/main/java/solutions/bellatrix/desktop/infrastructure/DriverService.java b/bellatrix.desktop/src/main/java/solutions/bellatrix/desktop/infrastructure/DriverService.java index 83501321..bdcc3dd7 100644 --- a/bellatrix.desktop/src/main/java/solutions/bellatrix/desktop/infrastructure/DriverService.java +++ b/bellatrix.desktop/src/main/java/solutions/bellatrix/desktop/infrastructure/DriverService.java @@ -15,7 +15,10 @@ import io.appium.java_client.windows.WindowsDriver; import lombok.SneakyThrows; -import org.openqa.selenium.*; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.MutableCapabilities; +import org.openqa.selenium.Platform; +import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.DesiredCapabilities; import solutions.bellatrix.core.configuration.ConfigurationService; import solutions.bellatrix.core.utilities.DebugInformation; @@ -25,8 +28,8 @@ import java.io.File; import java.net.MalformedURLException; import java.net.URL; +import java.time.Duration; import java.util.HashMap; -import java.util.concurrent.TimeUnit; public class DriverService { private static final ThreadLocal DISPOSED; @@ -73,7 +76,7 @@ public static WindowsDriver start(AppConfiguration configuration) { driver = initializeDriverGridMode(gridSettings.get()); } - driver.manage().timeouts().implicitlyWait(desktopSettings.getTimeoutSettings().getImplicitWaitTimeout(), TimeUnit.SECONDS); + driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(desktopSettings.getTimeoutSettings().getImplicitWaitTimeout())); driver.manage().window().maximize(); changeWindowSize(driver); WRAPPED_DRIVER.set(driver); diff --git a/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPlugin.java b/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPlugin.java index 327cd0dd..b31e3805 100644 --- a/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPlugin.java +++ b/bellatrix.plugins.screenshots/src/main/java/plugins/screenshots/ScreenshotPlugin.java @@ -35,7 +35,7 @@ public ScreenshotPlugin(boolean isEnabled) { @Override @SneakyThrows - public void postAfterTest(TestResult testResult, Method memberInfo) { + public void postAfterTest(TestResult testResult, Method memberInfo, Throwable failedTestException) { if (!isEnabled || testResult == TestResult.SUCCESS) return; diff --git a/bellatrix.web.getting.started/src/test/java/O12_page_objects/cart_page/Map.java b/bellatrix.web.getting.started/src/test/java/O12_page_objects/cart_page/Map.java index 62186e7e..b558d994 100644 --- a/bellatrix.web.getting.started/src/test/java/O12_page_objects/cart_page/Map.java +++ b/bellatrix.web.getting.started/src/test/java/O12_page_objects/cart_page/Map.java @@ -6,8 +6,8 @@ import java.util.List; public class Map extends PageMap { - public TextField couponCodeTextField() { - return create().byId(TextField.class, "coupon_code"); + public TextInput couponCodeTextField() { + return create().byId(TextInput.class, "coupon_code"); } public Button applyCouponButton() { diff --git a/bellatrix.web.getting.started/src/test/java/O12_page_objects/checkoutpage/Map.java b/bellatrix.web.getting.started/src/test/java/O12_page_objects/checkoutpage/Map.java index 8229aa0f..3ae943a3 100644 --- a/bellatrix.web.getting.started/src/test/java/O12_page_objects/checkoutpage/Map.java +++ b/bellatrix.web.getting.started/src/test/java/O12_page_objects/checkoutpage/Map.java @@ -17,48 +17,48 @@ import solutions.bellatrix.web.pages.PageMap; public class Map extends PageMap { - public TextField billingFirstName() { - return create().byId(TextField.class, "billing_first_name"); + public TextInput billingFirstName() { + return create().byId(TextInput.class, "billing_first_name"); } - public TextField billingLastName() { - return create().byId(TextField.class, "billing_last_name"); + public TextInput billingLastName() { + return create().byId(TextInput.class, "billing_last_name"); } - public TextField billingCompany() { - return create().byId(TextField.class, "billing_company"); + public TextInput billingCompany() { + return create().byId(TextInput.class, "billing_company"); } public Button billingCountryWrapper() { return create().byId(Button.class, "select2-billing_country-container"); } - public TextField billingCountryFilter() { - return create().byClass(TextField.class, "select2-search__field"); + public TextInput billingCountryFilter() { + return create().byClass(TextInput.class, "select2-search__field"); } - public TextField billingAddress1() { - return create().byId(TextField.class, "billing_address_1"); + public TextInput billingAddress1() { + return create().byId(TextInput.class, "billing_address_1"); } - public TextField billingAddress2() { - return create().byId(TextField.class, "billing_address_2"); + public TextInput billingAddress2() { + return create().byId(TextInput.class, "billing_address_2"); } - public TextField billingCity() { - return create().byId(TextField.class, "billing_city"); + public TextInput billingCity() { + return create().byId(TextInput.class, "billing_city"); } - public TextField billingZip() { - return create().byId(TextField.class, "billing_postcode"); + public TextInput billingZip() { + return create().byId(TextInput.class, "billing_postcode"); } - public TextField billingPhone() { - return create().byId(TextField.class, "billing_phone"); + public TextInput billingPhone() { + return create().byId(TextInput.class, "billing_phone"); } - public TextField billingEmail() { - return create().byId(TextField.class, "billing_email"); + public TextInput billingEmail() { + return create().byId(TextInput.class, "billing_email"); } public CheckBox createAccountCheckBox() { diff --git a/bellatrix.web.tests/src/test/java/junit/ProductPurchaseTests.java b/bellatrix.web.tests/src/test/java/junit/ProductPurchaseTests.java index 0e6e40f5..57a2f152 100644 --- a/bellatrix.web.tests/src/test/java/junit/ProductPurchaseTests.java +++ b/bellatrix.web.tests/src/test/java/junit/ProductPurchaseTests.java @@ -37,12 +37,12 @@ public void completePurchaseSuccessfully_first() { var blogLink = app().create().byInnerTextContaining(Anchor.class, "Blog"); addToCartFalcon9.click(); blogLink.above(addToCartFalcon9).validate(); - new MainPage().asserts().productBoxLink("Falcon 9", "http://demos.bellatrix.solutions/product/falcon-9/"); + new MainPage().asserts().productBoxLink("Falcon 9", "https://demos.bellatrix.solutions/product/falcon-9/"); } @Test public void completePurchaseSuccessfully_second() { - app().navigate().to("http://demos.bellatrix.solutions/"); + app().navigate().to("https://demos.bellatrix.solutions/"); var addToCartFalcon9 = app().create().byCss(Anchor.class, "[data-product_id*='28']"); addToCartFalcon9.click(); } @@ -51,14 +51,14 @@ public void completePurchaseSuccessfully_second() { public void falcon9LinkAddsCorrectProduct() { var mainPage = app().goTo(MainPage.class); - mainPage.asserts().productBoxLink("Falcon 9", "http://demos.bellatrix.solutions/product/falcon-9/"); + mainPage.asserts().productBoxLink("Falcon 9", "https://demos.bellatrix.solutions/product/falcon-9/"); } @Test public void saturnVLinkAddsCorrectProduct() { var mainPage = app().goTo(MainPage.class); - mainPage.asserts().productBoxLink("Saturn V", "http://demos.bellatrix.solutions/product/saturn-v/"); + mainPage.asserts().productBoxLink("Saturn V", "https://demos.bellatrix.solutions/product/saturn-v/"); } @Test @@ -66,7 +66,7 @@ public void purchaseFalcon9WithoutFacade() { var mainPage = app().goTo(MainPage.class); mainPage.addRocketToShoppingCart("Falcon 9"); - var cartPage = app().create(CartPage.class); + var cartPage = app().createPage(CartPage.class); cartPage.applyCoupon("happybirthday"); cartPage.asserts().couponAppliedSuccessfully(); cartPage.increaseProductQuantity(2); @@ -85,7 +85,7 @@ public void purchaseFalcon9WithoutFacade() { // purchaseInfo.setZip("10115"); // purchaseInfo.setPhone("+498888999281"); - var checkoutPage = app().create(CheckoutPage.class); + var checkoutPage = app().createPage(CheckoutPage.class); checkoutPage.fillBillingInfo(purchaseInfo); checkoutPage.asserts().orderReceived(); } @@ -95,7 +95,7 @@ public void purchaseSaturnVWithoutFacade() { var mainPage = app().goTo(MainPage.class); mainPage.addRocketToShoppingCart("Saturn V"); - var cartPage = app().create(CartPage.class); + var cartPage = app().createPage(CartPage.class); cartPage.applyCoupon("happybirthday"); cartPage.asserts().couponAppliedSuccessfully(); cartPage.increaseProductQuantity(3); @@ -114,7 +114,7 @@ public void purchaseSaturnVWithoutFacade() { // purchaseInfo.setZip("10115"); // purchaseInfo.setPhone("+498888999281"); - var checkoutPage = app().create(CheckoutPage.class); + var checkoutPage = app().createPage(CheckoutPage.class); checkoutPage.fillBillingInfo(purchaseInfo); checkoutPage.asserts().orderReceived(); } diff --git a/bellatrix.web.tests/src/test/java/testng/ProductPurchaseTests.java b/bellatrix.web.tests/src/test/java/testng/ProductPurchaseTests.java index 948f3ec6..011d6cf9 100644 --- a/bellatrix.web.tests/src/test/java/testng/ProductPurchaseTests.java +++ b/bellatrix.web.tests/src/test/java/testng/ProductPurchaseTests.java @@ -3,7 +3,7 @@ * Author: Anton Angelov * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -33,17 +33,17 @@ protected void afterEach() { @Test public void completePurchaseSuccessfully_first() { - app().navigate().to("http://demos.bellatrix.solutions/"); + app().navigate().to("https://demos.bellatrix.solutions/"); var addToCartFalcon9 = app().create().byCss(Anchor.class, "[data-product_id*='28']"); var blogLink = app().create().byInnerTextContaining(Anchor.class, "Blog"); addToCartFalcon9.click(); blogLink.above(addToCartFalcon9); - new MainPage().asserts().productBoxLink("Falcon 9", "http://demos.bellatrix.solutions/product/falcon-9/"); + new MainPage().asserts().productBoxLink("Falcon 9", "https://demos.bellatrix.solutions/product/falcon-9/"); } @Test public void completePurchaseSuccessfully_second() { - app().navigate().to("http://demos.bellatrix.solutions/"); + app().navigate().to("https://demos.bellatrix.solutions/"); var addToCartFalcon9 = app().create().byCss(Anchor.class, "[data-product_id*='28']"); addToCartFalcon9.click(); } @@ -52,14 +52,14 @@ public void completePurchaseSuccessfully_second() { public void falcon9LinkAddsCorrectProduct() { var mainPage = app().goTo(MainPage.class); - mainPage.asserts().productBoxLink("Falcon 9", "http://demos.bellatrix.solutions/product/falcon-9/"); + mainPage.asserts().productBoxLink("Falcon 9", "https://demos.bellatrix.solutions/product/falcon-9/"); } @Test public void saturnVLinkAddsCorrectProduct() { var mainPage = app().goTo(MainPage.class); - mainPage.asserts().productBoxLink("Saturn V", "http://demos.bellatrix.solutions/product/saturn-v/"); + mainPage.asserts().productBoxLink("Saturn V", "https://demos.bellatrix.solutions/product/saturn-v/"); } @Test @@ -67,7 +67,7 @@ public void purchaseFalcon9WithoutFacade() { var mainPage = app().goTo(MainPage.class); mainPage.addRocketToShoppingCart("Falcon 9"); - var cartPage = app().create(CartPage.class); + var cartPage = app().createPage(CartPage.class); cartPage.applyCoupon("happybirthday"); cartPage.asserts().couponAppliedSuccessfully(); cartPage.increaseProductQuantity(2); @@ -86,7 +86,7 @@ public void purchaseFalcon9WithoutFacade() { purchaseInfo.setZip("10115"); purchaseInfo.setPhone("+498888999281"); - var checkoutPage = app().create(CheckoutPage.class); + var checkoutPage = app().createPage(CheckoutPage.class); checkoutPage.fillBillingInfo(purchaseInfo); checkoutPage.asserts().orderReceived(); } @@ -96,7 +96,7 @@ public void purchaseSaturnVWithoutFacade() { var mainPage = app().goTo(MainPage.class); mainPage.addRocketToShoppingCart("Saturn V"); - var cartPage = app().create(CartPage.class); + var cartPage = app().createPage(CartPage.class); cartPage.applyCoupon("happybirthday"); cartPage.asserts().couponAppliedSuccessfully(); cartPage.increaseProductQuantity(3); @@ -115,7 +115,7 @@ public void purchaseSaturnVWithoutFacade() { purchaseInfo.setZip("10115"); purchaseInfo.setPhone("+498888999281"); - var checkoutPage = app().create(CheckoutPage.class); + var checkoutPage = app().createPage(CheckoutPage.class); checkoutPage.fillBillingInfo(purchaseInfo); checkoutPage.asserts().orderReceived(); } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentStyle.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentStyle.java index e44eff39..f5280cf1 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentStyle.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentStyle.java @@ -25,12 +25,7 @@ import java.util.function.Supplier; public interface ComponentStyle extends Component { - default String getStyle(CssStyle style) { - var script = String.format("return window.getComputedStyle(arguments[0],null).getPropertyValue('%s');", style); - var result = new JavaScriptService().execute(script, (WebComponent) this); - - return result; - } + String getStyle(); @SneakyThrows default void validateStyleIs(String value) { @@ -57,6 +52,13 @@ default void validateStyleNotContains(String value) { ComponentValidator.defaultValidateAttributeNotContains((WebComponent)this, this::getStyle, value, "style"); } + default String getStyle(CssStyle style) { + var script = String.format("return window.getComputedStyle(arguments[0],null).getPropertyValue('%s');", style); + var result = new JavaScriptService().execute(script, (WebComponent) this); + + return result; + } + @SneakyThrows default void validateStyle(CssStyle style, String expectedValue) { try { diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java index bc5667f4..f7275f5f 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java @@ -38,7 +38,7 @@ public class BrowserLifecyclePlugin extends Plugin { @Override public void preBeforeClass(Class type) { - if (ConfigurationService.get(WebSettings.class).getExecutionType() == "regular") { + if (Objects.equals(ConfigurationService.get(WebSettings.class).getExecutionType(), "regular")) { CURRENT_BROWSER_CONFIGURATION.set(getExecutionBrowserClassLevel(type)); if (shouldRestartBrowser()) { shutdownBrowser(); diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index ce93d041..053b43aa 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -32,7 +32,6 @@ import solutions.bellatrix.core.utilities.DebugInformation; import solutions.bellatrix.core.utilities.Log; import solutions.bellatrix.core.utilities.SecretsResolver; -import solutions.bellatrix.core.utilities.Log; import solutions.bellatrix.core.utilities.TimestampBuilder; import solutions.bellatrix.web.configuration.GridSettings; import solutions.bellatrix.web.configuration.WebSettings; @@ -43,11 +42,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.time.Duration; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.List; -import java.util.Properties; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -108,7 +103,7 @@ public static WebDriver start(BrowserConfiguration configuration) { } driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getPageLoadTimeout())); - driver.manage().timeouts().setScriptTimeout(Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getScriptTimeout())); + driver.manage().timeouts().scriptTimeout(Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getScriptTimeout())); if(getBrowserConfiguration().getHeight() != 0 && getBrowserConfiguration().getWidth() != 0) { changeWindowSize(driver); @@ -246,26 +241,24 @@ private static WebDriver initializeDriverRegularMode() { ProxyServer.newHar(); } - switch (BROWSER_CONFIGURATION.get().getBrowser()) { case CHROME -> { - //WebDriverManager.chromedriver().setup(); var chromeOptions = new ChromeOptions(); addDriverOptions(chromeOptions); - chromeOptions.addArguments("--log-level=3", "--remote-allow-origins=*"); addDriverCapabilities(chromeOptions); chromeOptions.addArguments("--log-level=3","--remote-allow-origins=*"); chromeOptions.setAcceptInsecureCerts(true); chromeOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); System.setProperty("webdriver.chrome.silentOutput", "true"); - if (shouldCaptureHttpTraffic) chromeOptions.setProxy(proxyConfig); + if (shouldCaptureHttpTraffic) { + chromeOptions.setProxy(proxyConfig); + } driver = new ChromeDriver(chromeOptions); } case CHROME_HEADLESS -> { var chromeHeadlessOptions = new ChromeOptions(); addDriverOptions(chromeHeadlessOptions); - addDriverCapabilities(chromeHeadlessOptions); chromeHeadlessOptions.setAcceptInsecureCerts(true); chromeHeadlessOptions.addArguments("--log-level=3","--remote-allow-origins=*"); chromeHeadlessOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java index 5694595f..3cf46682 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ProxyServer.java @@ -57,10 +57,13 @@ public class ProxyServer { @SneakyThrows public static int init() { + Log.info("Starting Proxy Service..."); int port = findFreePort(); + PROXY_SERVER.get().setTrustAllServers(true); PROXY_SERVER.get().start(port); - PROXY_SERVER.get().enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT); + PROXY_SERVER.get().enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT, CaptureType.REQUEST_HEADERS); PORT.set(port); + Log.info("Proxy Service Started at Port %s".formatted(port)); return port; } @@ -77,11 +80,13 @@ public static void newHar() { } public static void close() { + Log.info("Stopping Proxy Service..."); BrowserMobProxyServer proxyServer = PROXY_SERVER.get(); if (proxyServer != null) { proxyServer.stop(); PROXY_SERVER.remove(); PORT.remove(); + Log.info("Proxy Service Stopped."); } } From 7f2b9854a84534dbe2519df7e39754dce85f8727 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Mon, 15 Apr 2024 11:08:34 +0300 Subject: [PATCH 093/101] Add afterClass method that is not static and can be overridden --- .../bellatrix/core/plugins/junit/BaseTest.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/plugins/junit/BaseTest.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/plugins/junit/BaseTest.java index df697792..25569f95 100644 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/plugins/junit/BaseTest.java +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/plugins/junit/BaseTest.java @@ -13,10 +13,7 @@ package solutions.bellatrix.core.plugins.junit; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.api.*; import org.junit.jupiter.api.extension.ExtendWith; import solutions.bellatrix.core.plugins.PluginExecutionEngine; import solutions.bellatrix.core.plugins.TestResult; @@ -28,6 +25,7 @@ import java.util.List; @ExtendWith(TestResultWatcher.class) +@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class BaseTest extends UsesPlugins { static final ThreadLocal CURRENT_TEST_RESULT = new ThreadLocal<>(); private static final ThreadLocal CONFIGURATION_EXECUTED = new ThreadLocal<>(); @@ -103,11 +101,12 @@ public void afterMethodCore(TestInfo testInfo) { } @AfterAll - public static void afterClassCore(TestInfo testInfo) { + public void afterClassCore(TestInfo testInfo) { try { var testClass = testInfo.getTestClass(); if (testClass.isPresent()) { PluginExecutionEngine.preAfterClass(testClass.get()); + afterClass(); PluginExecutionEngine.postAfterClass(testClass.get()); } } catch (Exception e) { @@ -134,4 +133,7 @@ protected void onBeforeEachFailure() { protected void afterEach() { } + + protected void afterClass() { + } } From d1b633ddb46e7388dd189a000a444057a0bdd03e Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Mon, 22 Apr 2024 10:22:19 +0300 Subject: [PATCH 094/101] add checkbox method overload --- .../solutions/bellatrix/web/components/CheckBox.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/CheckBox.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/CheckBox.java index 54d35aa1..0e3ba25c 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/CheckBox.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/CheckBox.java @@ -33,6 +33,15 @@ public void check() { defaultCheck(CHECKING, CHECKED); } + public void check(boolean shouldCheck) { + if (shouldCheck) { + check(); + } + else { + uncheck(); + } + } + public void uncheck() { defaultUncheck(UNCHECKING, UNCHECKED); } From e074463c52a1437102a6f5a211aa163a6bf91cbe Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Tue, 14 May 2024 09:52:56 +0300 Subject: [PATCH 095/101] fix issue is Browser wait --- .../java/solutions/bellatrix/web/services/BrowserService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index 4df20923..b4e72b6b 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -418,7 +418,7 @@ public void waitForRequest(String partialUrl) { public void tryWaitForRequest(String partialUrl) { var javascriptExecutor = (JavascriptExecutor)getWrappedDriver(); - String script = "return performance.getEntriesByType('resource').filter(item => item.name.toLowerCase().includes('" + partialUrl + "'))[0] !== undefined;"; + String script = "return performance.getEntriesByType('resource').filter(item => item.name.toLowerCase().includes('" + partialUrl.toLowerCase() + "'))[0] !== undefined;"; try { waitUntil(e -> (boolean)javascriptExecutor.executeScript(script)); From f49d707c63652930a421cf60f195de483b8fda84 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Mon, 27 May 2024 11:58:06 +0300 Subject: [PATCH 096/101] minor fix --- .../java/solutions/bellatrix/web/services/BrowserService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java index b4e72b6b..c4d9c675 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/BrowserService.java @@ -103,7 +103,7 @@ public void switchToNewTab() { public void switchToTab(Runnable condition) { Wait.retry(() -> { var handles = getWrappedDriver().getWindowHandles(); - Boolean shouldThrowException = true; + boolean shouldThrowException = true; for (var currentHandle : handles) { getWrappedDriver().switchTo().window(currentHandle); try { From 54c56f673ed75db1067a5fe156e2110162ec6145 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Fri, 31 May 2024 13:09:42 +0300 Subject: [PATCH 097/101] Enable Chrome Emulation mode with predefined devices --- .../bellatrix/web/infrastructure/Browser.java | 1 + .../infrastructure/BrowserConfiguration.java | 9 +++ .../BrowserLifecyclePlugin.java | 5 +- .../web/infrastructure/DeviceName.java | 54 +++++++++++++ .../web/infrastructure/DriverService.java | 17 ++++ .../web/infrastructure/ExecutionBrowser.java | 1 + .../infrastructure/TouchableWebDriver.java | 79 +++++++++++++++++++ 7 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DeviceName.java create mode 100644 bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/TouchableWebDriver.java diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/Browser.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/Browser.java index 8e78d121..2ff16eb7 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/Browser.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/Browser.java @@ -18,6 +18,7 @@ public enum Browser { CHROME("chrome"), CHROME_HEADLESS("chrome_headless"), + CHROME_MOBILE("chrome_mobile"), FIREFOX("firefox"), FIREFOX_HEADLESS("firefox_headless"), EDGE("edge"), diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserConfiguration.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserConfiguration.java index 2662af77..7e3922b4 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserConfiguration.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserConfiguration.java @@ -21,6 +21,7 @@ public class BrowserConfiguration { @Setter @Getter private Browser browser; + @Setter @Getter private DeviceName deviceName; @Setter @Getter private Lifecycle lifecycle; @Setter @Getter private int height; @Setter @Getter private int width; @@ -54,6 +55,14 @@ public BrowserConfiguration(Browser browser, Lifecycle browserBehavior, String t driverOptions = new HashMap<>(); } + public BrowserConfiguration(DeviceName deviceName, Lifecycle browserBehavior, String testName) { + this.browser = Browser.CHROME_MOBILE; + this.lifecycle = browserBehavior; + this.testName = testName; + this.deviceName = deviceName; + driverOptions = new HashMap<>(); + } + @Override public boolean equals(Object obj) { if (!(obj instanceof BrowserConfiguration)) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java index f7275f5f..81fcfbb2 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java @@ -164,9 +164,12 @@ private BrowserConfiguration getExecutionBrowserClassLevel(Class type) { var finalWidth = executionBrowserAnnotation.width() != 0 ? executionBrowserAnnotation.width() : defaultWidth; var finalHeight = executionBrowserAnnotation.height() != 0 ? executionBrowserAnnotation.height() : defaultHeight; - if (executionBrowserAnnotation == null) { + if (executionBrowserAnnotation.browser() == Browser.NOT_SET) { return new BrowserConfiguration(defaultBrowser, defaultLifecycle, defaultWidth, defaultHeight); } + if (executionBrowserAnnotation.browser() == Browser.CHROME_MOBILE) { + return new BrowserConfiguration(executionBrowserAnnotation.deviceName(), finalLifecycle, type.getName()); + } else { return new BrowserConfiguration(finalBrowser, finalLifecycle, finalWidth, finalHeight); } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DeviceName.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DeviceName.java new file mode 100644 index 00000000..20f4cd2d --- /dev/null +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DeviceName.java @@ -0,0 +1,54 @@ +/* + * Copyright 2022 Automate The Planet Ltd. + * Author: Anton Angelov + * Licensed under the Apache License, Version 2.0 (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package solutions.bellatrix.web.infrastructure; + +import lombok.Getter; + +@Getter +public enum DeviceName { + NOT_SET(), + IPHONE_13_PRO_MOBILE("iPhone 13 Pro", 375, 667, true, 2, true, true, "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A366 Safari/600.1.4"), + IPHONE_SE_MOBILE("iPhone SE", 750, 1334, true, 2, true, true, "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A366 Safari/600.1.4"), + IPHONE_X_MOBILE("iPhone X", 375, 667, true, 3, true, true, "Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Version/10.0 Mobile/14D27 Safari/602.1"), + NEXUS_7_TABLET("Nexus 7", 600, 960, true, 2, true, true, "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 7 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Safari/537.36"), + IPAD("Apple iPad", 768, 1024, true, 2, true, true, "Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3"); + + private final String name; + private final int width; + private final int height; + private final boolean isMobile; + private final int scaleFactor; + private final boolean supportsConsoleLogs; + private final boolean supportsFullPage; + private final String userAgent; + + DeviceName(String name, int width, int height, boolean isMobile, int scaleFactor, boolean supportsConsoleLogs, boolean supportsFullPage) { + this(name, width, height, isMobile, scaleFactor, supportsConsoleLogs, supportsFullPage, null); + } + + DeviceName() { + this(null, 0, 0, false, 0, false, false, null); + } + + DeviceName(String name, int width, int height, boolean isMobile, int scaleFactor, boolean supportsConsoleLogs, boolean supportsFullPage, String userAgent) { + this.name = name; + this.width = width; + this.height = height; + this.isMobile = isMobile; + this.scaleFactor = scaleFactor; + this.supportsConsoleLogs = supportsConsoleLogs; + this.supportsFullPage = supportsFullPage; + this.userAgent = userAgent; + } +} diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java index 053b43aa..d21ebea1 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/DriverService.java @@ -268,6 +268,23 @@ private static WebDriver initializeDriverRegularMode() { driver = new ChromeDriver(chromeHeadlessOptions); } + case CHROME_MOBILE -> { + var chromeHeadlessOptions = new ChromeOptions(); + addDriverOptions(chromeHeadlessOptions); + chromeHeadlessOptions.setAcceptInsecureCerts(true); + chromeHeadlessOptions.addArguments("--log-level=3","--remote-allow-origins=*"); + chromeHeadlessOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); + + var deviceNameOption = new HashMap(); + deviceNameOption.put("deviceName", BROWSER_CONFIGURATION.get().getDeviceName().getName()); + + chromeHeadlessOptions.setExperimentalOption("mobileEmulation", deviceNameOption); + System.setProperty("webdriver.chrome.silentOutput", "true"); + if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); + + driver = new TouchableWebDriver(chromeHeadlessOptions); + } + case FIREFOX -> { var firefoxOptions = new FirefoxOptions(); addDriverOptions(firefoxOptions); diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ExecutionBrowser.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ExecutionBrowser.java index 0fd99c64..f5e93e48 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ExecutionBrowser.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/ExecutionBrowser.java @@ -29,4 +29,5 @@ Platform platform() default Platform.ANY; int width() default 0; int height() default 0; + DeviceName deviceName() default DeviceName.NOT_SET; } \ No newline at end of file diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/TouchableWebDriver.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/TouchableWebDriver.java new file mode 100644 index 00000000..403d6580 --- /dev/null +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/TouchableWebDriver.java @@ -0,0 +1,79 @@ +package solutions.bellatrix.web.infrastructure; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.interactions.PointerInput; +import org.openqa.selenium.interactions.Sequence; + +import java.time.Duration; +import java.util.Arrays; + +public class TouchableWebDriver extends ChromeDriver implements WebDriver { + + public TouchableWebDriver(ChromeOptions options) { + super(options); + } + + public void triggerSwipeEvent(WebElement swipeFromElement) + { + PointerInput finger = new PointerInput(PointerInput.Kind.TOUCH, "finger"); + Sequence tap = new Sequence(finger, 1); + + // trigger swipe event from the middle of the right edge if the element + tap.addAction(finger.createPointerMove(Duration.ofMillis(0), PointerInput.Origin.viewport(), swipeFromElement.getLocation().x + swipeFromElement.getSize().getWidth(), swipeFromElement.getLocation().y + (swipeFromElement.getSize().getHeight()/ 2 ))); + tap.addAction(finger.createPointerDown(PointerInput.MouseButton.LEFT.asArg())); + tap.addAction(finger.createPointerMove(Duration.ofMillis(100), PointerInput.Origin.viewport(), swipeFromElement.getLocation().x, swipeFromElement.getLocation().y + (swipeFromElement.getSize().getHeight()/ 2 ))); + tap.addAction(finger.createPointerUp(PointerInput.MouseButton.LEFT.asArg())); + this.perform(Arrays.asList(tap)); + } + + public void triggerTapEvent(WebElement swipeFromElement) + { + PointerInput finger = new PointerInput(PointerInput.Kind.TOUCH, "finger"); + Sequence tap = new Sequence(finger, 1); + + int centerX = swipeFromElement.getLocation().x + swipeFromElement.getSize().getWidth() / 2; + int centerY = swipeFromElement.getLocation().y + swipeFromElement.getSize().getHeight() / 2; + + // Move to the center of the element and perform a tap + tap.addAction(finger.createPointerMove(Duration.ofMillis(0), PointerInput.Origin.viewport(), centerX, centerY)); + tap.addAction(finger.createPointerDown(PointerInput.MouseButton.LEFT.asArg())); + tap.addAction(finger.createPointerUp(PointerInput.MouseButton.LEFT.asArg())); + this.perform(Arrays.asList(tap)); + } +// +// public void triggerTapEvent(WebElement tapElement) +// { +// var builder = new TouchActions(this); +// IAction builtAction = builder.SingleTap(tapElement).Build(); +// builtAction.Perform(); +// } +// +// public void triggerDoubleTapEvent(WebElement tapElement) +// { +// var builder = new TouchAction(this); +// IAction builtAction = builder.DoubleTap(tapElement).Build(); +// builtAction.Perform(); +// } +// +// private void TriggerScrollEvent(WebElement tapElement, int xOffset, int yOffset) +// { +// var builder = new TouchActions(this); +// IAction builtAction = builder.Scroll(tapElement, xOffset, yOffset).Build(); +// builtAction.Perform(); +// } +// +// private void TriggerScrollEvent(int xOffset, int yOffset) +// { +// var builder = new TouchActions(this); +// IAction builtAction = builder.Scroll(xOffset, yOffset).Build(); +// builtAction.Perform(); +// } +// +// public void scrollPage(WebElement fromElement, WebElement toElement) +// { +// TriggerScrollEvent(fromElement, 0, toElement.Location.Y - fromElement.Location.Y); +// } +} From 563539f69b4df0ae0d4ad61c30a5441f97795956 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Tue, 4 Jun 2024 14:46:14 +0300 Subject: [PATCH 098/101] fix browserLifecycle attribute readings --- .../bellatrix/web/infrastructure/BrowserLifecyclePlugin.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java index 81fcfbb2..ffe66d1c 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java @@ -97,7 +97,7 @@ public void postAfterTest(TestResult testResult, Method memberInfo, Throwable fa private void shutdownBrowser() { DriverService.close(); - PREVIOUS_BROWSER_CONFIGURATION.set(null); + PREVIOUS_BROWSER_CONFIGURATION.remove(); } private void startBrowser() { @@ -164,9 +164,6 @@ private BrowserConfiguration getExecutionBrowserClassLevel(Class type) { var finalWidth = executionBrowserAnnotation.width() != 0 ? executionBrowserAnnotation.width() : defaultWidth; var finalHeight = executionBrowserAnnotation.height() != 0 ? executionBrowserAnnotation.height() : defaultHeight; - if (executionBrowserAnnotation.browser() == Browser.NOT_SET) { - return new BrowserConfiguration(defaultBrowser, defaultLifecycle, defaultWidth, defaultHeight); - } if (executionBrowserAnnotation.browser() == Browser.CHROME_MOBILE) { return new BrowserConfiguration(executionBrowserAnnotation.deviceName(), finalLifecycle, type.getName()); } From 2271e8c99aaf670f2b97875f29283c1261a51ba7 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Tue, 4 Jun 2024 17:35:05 +0300 Subject: [PATCH 099/101] support method-level browser change --- .../web/infrastructure/BrowserConfiguration.java | 7 +++++++ .../web/infrastructure/BrowserLifecyclePlugin.java | 12 ++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserConfiguration.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserConfiguration.java index 7e3922b4..80205ff9 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserConfiguration.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserConfiguration.java @@ -40,6 +40,13 @@ public BrowserConfiguration(Browser browser, Lifecycle browserBehavior) { driverOptions = new HashMap<>(); } + public BrowserConfiguration(Browser browser, DeviceName deviceName, Lifecycle browserBehavior) { + this.deviceName = deviceName; + this.browser = browser; + this.lifecycle = browserBehavior; + driverOptions = new HashMap<>(); + } + public BrowserConfiguration(Browser browser, Lifecycle browserBehavior, Integer browserWidth, Integer browserHeight) { this.browser = browser; this.lifecycle = browserBehavior; diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java index ffe66d1c..e36a2211 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/BrowserLifecyclePlugin.java @@ -65,14 +65,10 @@ public void postAfterClass(Class type) { @Override public void preBeforeTest(TestResult testResult, Method memberInfo) { CURRENT_BROWSER_CONFIGURATION.set(getBrowserConfiguration(memberInfo)); - - if (!IS_BROWSER_STARTED_DURING_PRE_BEFORE_CLASS.get()) { - if (shouldRestartBrowser()) { - startBrowser(); - } + if (shouldRestartBrowser()) { + shutdownBrowser(); + startBrowser(); } - - IS_BROWSER_STARTED_DURING_PRE_BEFORE_CLASS.set(false); } @Override @@ -148,7 +144,7 @@ private BrowserConfiguration getExecutionBrowserMethodLevel(Method memberInfo) { return null; } - return new BrowserConfiguration(executionBrowserAnnotation.browser(), executionBrowserAnnotation.lifecycle()); + return new BrowserConfiguration(executionBrowserAnnotation.browser(), executionBrowserAnnotation.deviceName(), executionBrowserAnnotation.lifecycle()); } private BrowserConfiguration getExecutionBrowserClassLevel(Class type) { From b7a90d1861453dec0ef26800d51bf9b2a49e5216 Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Wed, 5 Jun 2024 16:49:16 +0300 Subject: [PATCH 100/101] fix pr comments --- .../core/utilities/SingletonFactory.java | 3 +-- .../web/components/WebComponent.java | 17 +++++++-------- .../contracts/ComponentBackgroundColor.java | 12 ++++------- .../contracts/ComponentChecked.java | 9 -------- .../web/components/enums/ScrollPosition.java | 21 +++++++++++++++++++ 5 files changed, 33 insertions(+), 29 deletions(-) create mode 100644 bellatrix.web/src/main/java/solutions/bellatrix/web/components/enums/ScrollPosition.java diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/SingletonFactory.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/SingletonFactory.java index d9473c4a..1988bff3 100644 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/SingletonFactory.java +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/SingletonFactory.java @@ -36,8 +36,7 @@ public static T getInstance(Class classOf, Object... initargs) { return (T)SINGLETON_FACTORY.mapHolder.get(classOf.getName()); } catch (Exception e) { - // not the best practice to return null. But probably we will never end here so it is OK. - Log.error("Failed to create instance of the page. Exception was: " + e); + Log.error("Failed to create instance of the object. Exception was: " + e); return null; } } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java index 819060e5..86c8eae6 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/WebComponent.java @@ -31,6 +31,7 @@ import solutions.bellatrix.web.components.contracts.Component; import solutions.bellatrix.web.components.contracts.ComponentStyle; import solutions.bellatrix.web.components.contracts.ComponentVisible; +import solutions.bellatrix.web.components.enums.ScrollPosition; import solutions.bellatrix.web.configuration.WebSettings; import solutions.bellatrix.web.findstrategies.*; import solutions.bellatrix.web.infrastructure.Browser; @@ -106,15 +107,15 @@ public void waitToBe() { } public void scrollToVisible() { - scrollToVisible(getWrappedElement(), false, "center"); + scrollToVisible(getWrappedElement(), false, ScrollPosition.CENTER); } public void scrollToTop() { - scrollToVisible(getWrappedElement(), false, "start"); + scrollToVisible(getWrappedElement(), false, ScrollPosition.START); } public void scrollToBottom() { - scrollToVisible(getWrappedElement(), false, "end"); + scrollToVisible(getWrappedElement(), false, ScrollPosition.END); } public void setAttribute(String name, String value) { @@ -157,10 +158,6 @@ public String getTitle() { return getAttribute("title"); } - public WebComponent getParent() { - return createByXPath(WebComponent.class, "./.."); - } - public String getTabIndex() { return getAttribute("tabindex"); } @@ -1046,15 +1043,15 @@ private void addArtificialDelay() { private void scrollToMakeElementVisible(WebElement wrappedElement) { // createBy default scroll down to make the element visible. if (webSettings.getAutomaticallyScrollToVisible()) { - scrollToVisible(wrappedElement, false, "center"); + scrollToVisible(wrappedElement, false, ScrollPosition.CENTER); } } - private void scrollToVisible(WebElement wrappedElement, boolean shouldWait, String scrollPosition) { + private void scrollToVisible(WebElement wrappedElement, boolean shouldWait, ScrollPosition scrollPosition) { SCROLLING_TO_VISIBLE.broadcast(new ComponentActionEventArgs(this)); try { - javaScriptService.execute("arguments[0].scrollIntoView({ block: \"" + scrollPosition + "\", behavior: \"instant\", inline: \"nearest\" });", wrappedElement); + javaScriptService.execute("arguments[0].scrollIntoView({ block: \"" + scrollPosition.getValue() + "\", behavior: \"instant\", inline: \"nearest\" });", wrappedElement); if (shouldWait) { Thread.sleep(500); toExist().waitToBe(); diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentBackgroundColor.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentBackgroundColor.java index a46694ca..7d6b06aa 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentBackgroundColor.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentBackgroundColor.java @@ -13,14 +13,12 @@ package solutions.bellatrix.web.components.contracts; -import lombok.SneakyThrows; import org.openqa.selenium.support.Colors; import solutions.bellatrix.core.utilities.SingletonFactory; import solutions.bellatrix.web.components.WebComponent; import solutions.bellatrix.web.services.JavaScriptService; import solutions.bellatrix.web.validations.ComponentValidator; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.function.Supplier; @@ -28,18 +26,16 @@ public interface ComponentBackgroundColor extends Component { default String getBackgroundColor(){ var script = "return arguments[0].style.background"; - var result = new JavaScriptService().execute(script, (WebComponent) this); - return result; + return new JavaScriptService().execute(script, (WebComponent)this); } - @SneakyThrows default void validateBackgroundColor(Colors expectedColor) { try { Method method = ComponentValidator.class.getDeclaredMethod("defaultValidateAttributeIs", WebComponent.class, Supplier.class, String.class, String.class); - method.invoke(SingletonFactory.getInstance(ComponentValidator.class), (WebComponent) this, (Supplier) () -> this.getBackgroundColor(), expectedColor.getColorValue().getColor().getRGB(), String.format("expected color should be %s", expectedColor)); - } catch (InvocationTargetException e) { - throw e.getCause(); + method.invoke(SingletonFactory.getInstance(ComponentValidator.class), (WebComponent) this, (Supplier)this::getBackgroundColor, expectedColor.getColorValue().getColor().getRGB(), String.format("expected color should be %s", expectedColor)); + } catch (Exception e) { + throw new RuntimeException(e.getCause()); } } } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentChecked.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentChecked.java index 5a478fe1..b196a074 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentChecked.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/contracts/ComponentChecked.java @@ -13,24 +13,16 @@ package solutions.bellatrix.web.components.contracts; -import lombok.SneakyThrows; -import solutions.bellatrix.core.utilities.SingletonFactory; import solutions.bellatrix.web.components.WebComponent; import solutions.bellatrix.web.validations.ComponentValidator; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.function.BooleanSupplier; - public interface ComponentChecked extends Component { boolean isChecked(); - @SneakyThrows default void validateIsChecked() { ComponentValidator.defaultValidateAttributeTrue((WebComponent)this, this::isChecked, "checked"); } - @SneakyThrows default void validateIsChecked(boolean value) { if (value){ validateIsChecked(); @@ -40,7 +32,6 @@ default void validateIsChecked(boolean value) { } } - @SneakyThrows default void validateIsUnchecked() { ComponentValidator.defaultValidateAttributeTrue((WebComponent)this, () -> !isChecked(), "unchecked"); } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/enums/ScrollPosition.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/enums/ScrollPosition.java new file mode 100644 index 00000000..bf8722fc --- /dev/null +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/enums/ScrollPosition.java @@ -0,0 +1,21 @@ +package solutions.bellatrix.web.components.enums; + +import lombok.Getter; + +@Getter +public enum ScrollPosition { + CENTER("center"), + START("start"), + END("end"); + + private final String value; + + ScrollPosition(String value) { + this.value = value; + } + + @Override + public String toString() { + return this.value; + } +} From d2bc948ed302d17aa87c6396ff360cc9e9f2688e Mon Sep 17 00:00:00 2001 From: NikolayAvramov Date: Wed, 5 Jun 2024 16:58:06 +0300 Subject: [PATCH 101/101] fix warning --- bellatrix.playwright.getting.started/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/bellatrix.playwright.getting.started/pom.xml b/bellatrix.playwright.getting.started/pom.xml index 3bac9e40..db4f3b0e 100644 --- a/bellatrix.playwright.getting.started/pom.xml +++ b/bellatrix.playwright.getting.started/pom.xml @@ -9,7 +9,6 @@ 1.0-SNAPSHOT - bellatrix bellatrix.playwright.getting.started