From a72e70673cca850b5f4ebebd2019d54eefe57d1a Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Mon, 15 Jul 2024 18:00:54 +0300 Subject: [PATCH 01/19] Created ShutdownManager Its purpose is to register Runnable script to be performed after shutdown is initiated. Notable uses would be to register for closure resources that should be closed. --- .../core/utilities/ShutdownManager.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java new file mode 100644 index 00000000..cb2bad6b --- /dev/null +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java @@ -0,0 +1,28 @@ +package solutions.bellatrix.core.utilities; + +import lombok.experimental.UtilityClass; + +import java.util.ArrayList; +import java.util.List; + +@UtilityClass +public class ShutdownManager { + private static final List resources = new ArrayList<>(); + private static final List instructions = new ArrayList<>(); + + static { + Runtime.getRuntime().addShutdownHook(new Thread(ShutdownManager::runAllInstructions)); + } + + public static void register(Runnable runnable) { + instructions.add(runnable); + } + + private static void runAllInstructions() { + if (instructions.isEmpty()) return; + + for (var instruction : instructions) { + instruction.run(); + } + } +} \ No newline at end of file From 8a72fbff2f3a64f6da66c93bc0ccde0a6b40cfe5 Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Mon, 15 Jul 2024 18:01:08 +0300 Subject: [PATCH 02/19] Added containsKey and containsValue methods to SingletonFactory --- .../bellatrix/core/utilities/SingletonFactory.java | 8 ++++++++ 1 file changed, 8 insertions(+) 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 4676393a..81d6ca13 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 @@ -48,4 +48,12 @@ public static void register(T instance) { public static void register(Class classKey, T instance) { mapHolder.get().put(classKey, instance); } + + public static boolean containsKey(Class classOf) { + return mapHolder.get().containsKey(classOf); + } + + public static boolean containsValue(Object object) { + return mapHolder.get().containsValue(object); + } } From 7c022441d7e3ca3e3663380144c051ae451ae544 Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Mon, 15 Jul 2024 18:02:33 +0300 Subject: [PATCH 03/19] DriverService and PlaywrightService changes They are no longer static and register themselves for automatic closure after shutdown. --- .../android/infrastructure/DriverService.java | 6 +- .../ios/infrastructure/DriverService.java | 6 +- .../playwright/components/Screen.java | 2 +- .../playwright/components/WebComponent.java | 4 +- .../playwright/configuration/WebSettings.java | 1 + .../BrowserLifecyclePlugin.java | 6 +- .../FullPageScreenshotEngine.java | 2 +- .../infrastructure/PlaywrightService.java | 151 ++++++++-------- .../infrastructure/WebScreenshotPlugin.java | 4 +- .../bellatrix/playwright/services/App.java | 2 +- .../playwright/services/WebService.java | 2 +- .../web/components/WebComponent.java | 4 +- .../web/configuration/WebSettings.java | 1 + .../BrowserLifecyclePlugin.java | 4 +- .../web/infrastructure/DriverService.java | 162 ++++++++---------- .../FullPageScreenshotEngine.java | 2 +- .../infrastructure/WebScreenshotPlugin.java | 4 +- .../solutions/bellatrix/web/services/App.java | 6 +- .../web/services/ComponentCreateService.java | 2 +- .../web/services/ComponentWaitService.java | 2 +- .../bellatrix/web/services/WebService.java | 2 +- .../web/validations/ComponentValidator.java | 2 +- .../web/waitstrategies/WaitStrategy.java | 2 +- .../resources/testFrameworkSettings.dev.json | 1 + .../resources/testFrameworkSettings.qa.json | 1 + .../resources/testFrameworkSettings.dev.json | 1 + .../resources/testFrameworkSettings.qa.json | 1 + .../resources/testFrameworkSettings.dev.json | 3 +- .../resources/testFrameworkSettings.qa.json | 1 + .../resources/testFrameworkSettings.dev.json | 3 +- .../resources/testFrameworkSettings.qa.json | 1 + 31 files changed, 195 insertions(+), 196 deletions(-) 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 87b173d7..d5bb7415 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 @@ -84,7 +84,7 @@ public static AndroidDriver start(AppConfiguration configuration) { driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(androidSettings.getTimeoutSettings().getImplicitWaitTimeout())); WRAPPED_ANDROID_DRIVER.set(driver); - solutions.bellatrix.web.infrastructure.DriverService.setWrappedDriver(driver); + solutions.bellatrix.web.infrastructure.DriverService.current().setWrappedDriver(driver); return driver; } @@ -110,7 +110,7 @@ private static AndroidDriver initializeDriverGridMode(GridSettings gridSettings, AndroidDriver driver = null; try { driver = new AndroidDriver(new URL(gridSettings.getUrl()), caps); - solutions.bellatrix.web.infrastructure.DriverService.setWrappedDriver(driver); + solutions.bellatrix.web.infrastructure.DriverService.current().setWrappedDriver(driver); } catch (Exception e) { DebugInformation.printStackTrace(e); } @@ -136,7 +136,7 @@ private static AndroidDriver initializeDriverRegularMode(String serviceUrl) { addDriverConfigOptions(caps); addCustomDriverOptions(caps); var driver = new AndroidDriver(new URL(serviceUrl), caps); - solutions.bellatrix.web.infrastructure.DriverService.setWrappedDriver(driver); + solutions.bellatrix.web.infrastructure.DriverService.current().setWrappedDriver(driver); return driver; } diff --git a/bellatrix.ios/src/main/java/solutions/bellatrix/ios/infrastructure/DriverService.java b/bellatrix.ios/src/main/java/solutions/bellatrix/ios/infrastructure/DriverService.java index be17cc97..4389c4b4 100644 --- a/bellatrix.ios/src/main/java/solutions/bellatrix/ios/infrastructure/DriverService.java +++ b/bellatrix.ios/src/main/java/solutions/bellatrix/ios/infrastructure/DriverService.java @@ -78,7 +78,7 @@ public static IOSDriver start(AppConfiguration configuration) { driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(IOSSettings.getTimeoutSettings().getImplicitWaitTimeout())); WRAPPED_IOS_DRIVER.set(driver); - solutions.bellatrix.web.infrastructure.DriverService.setWrappedDriver(driver); + solutions.bellatrix.web.infrastructure.DriverService.current().setWrappedDriver(driver); return driver; } @@ -91,7 +91,7 @@ private static IOSDriver initializeDriverGridMode(GridSettings gridSettings) { IOSDriver driver = null; try { driver = new IOSDriver(new URL(gridSettings.getUrl()), caps); - solutions.bellatrix.web.infrastructure.DriverService.setWrappedDriver(driver); + solutions.bellatrix.web.infrastructure.DriverService.current().setWrappedDriver(driver); } catch (MalformedURLException e) { DebugInformation.printStackTrace(e); } @@ -114,7 +114,7 @@ private static IOSDriver initializeDriverRegularMode(String serviceUrl) { addDriverOptions(caps); var driver = new IOSDriver(new URL(serviceUrl), caps); - solutions.bellatrix.web.infrastructure.DriverService.setWrappedDriver(driver); + solutions.bellatrix.web.infrastructure.DriverService.current().setWrappedDriver(driver); return driver; } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/Screen.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/Screen.java index 9931a268..27717053 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/Screen.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/Screen.java @@ -43,7 +43,7 @@ public java.awt.Dimension getSize() { } private java.awt.Dimension convertDimension() { - var playwrightSize = PlaywrightService.wrappedBrowser().getCurrentPage().viewportSize(); + var playwrightSize = PlaywrightService.current().wrappedBrowser().getCurrentPage().viewportSize(); return new Dimension(playwrightSize.width, playwrightSize.height); } } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java index 7fa92546..12e84a44 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java @@ -137,7 +137,7 @@ public RelativeCreateService create() { } protected static WrappedBrowser wrappedBrowser() { - return PlaywrightService.wrappedBrowser(); + return PlaywrightService.current().wrappedBrowser(); } public void scrollToVisible() { @@ -230,7 +230,7 @@ public boolean isVisible() { // Update: We should use js, native playwright highlight() method's function is unknown. // Update: the js script seems to work, but not for TextField elements public void highlight() { - if (PlaywrightService.browserConfiguration().getBrowserTypes() == BrowserTypes.CHROME_HEADLESS) { + if (PlaywrightService.current().browserConfiguration().getBrowserTypes() == BrowserTypes.CHROME_HEADLESS) { return; } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/configuration/WebSettings.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/configuration/WebSettings.java index fd24ad7f..ce289618 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/configuration/WebSettings.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/configuration/WebSettings.java @@ -20,6 +20,7 @@ @Getter @Setter public class WebSettings { + private boolean forceCloseBrowser; private String baseUrl; private String executionType; private String defaultLifeCycle; diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java index d100ec53..513e44ca 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java @@ -82,7 +82,7 @@ public void beforeTestFailed(Exception ex) throws Exception { public void postAfterTest(TestResult testResult, Method memberInfo, Throwable failedTestException) { if (currentConfiguration().getLifecycle() == Lifecycle.REUSE_IF_STARTED) { - PlaywrightService.restartBrowserContext(); + PlaywrightService.current().restartBrowserContext(); return; } @@ -95,14 +95,14 @@ public void postAfterTest(TestResult testResult, Method memberInfo, Throwable fa } private void shutdownBrowser() { - PlaywrightService.close(); + PlaywrightService.current().close(); PREVIOUS_BROWSER_CONFIGURATION.remove(); } private void startBrowser() { // shutdownBrowser(); try { - PlaywrightService.start(currentConfiguration()); + PlaywrightService.current().start(currentConfiguration()); isBrowserStartedCorrectly(true); } catch (Exception ex) { DebugInformation.printStackTrace(ex); diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/FullPageScreenshotEngine.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/FullPageScreenshotEngine.java index f5ba7edd..34ad3d52 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/FullPageScreenshotEngine.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/FullPageScreenshotEngine.java @@ -24,7 +24,7 @@ @UtilityClass public class FullPageScreenshotEngine { public static File takeScreenshot() { - var screenshot = PlaywrightService.wrappedBrowser().getCurrentPage() + var screenshot = PlaywrightService.current().wrappedBrowser().getCurrentPage() .screenshot(new Page.ScreenshotOptions() .setFullPage(true) .setType(ScreenshotType.PNG) diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java index 5bc13405..62b8e3ef 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java @@ -13,6 +13,7 @@ package solutions.bellatrix.playwright.infrastructure; +import com.azure.core.annotation.Get; import com.google.gson.Gson; import com.microsoft.playwright.Browser; import com.microsoft.playwright.BrowserContext; @@ -20,10 +21,15 @@ import com.microsoft.playwright.Playwright; import io.restassured.RestAssured; import io.restassured.http.ContentType; +import lombok.Getter; +import lombok.Setter; import lombok.experimental.UtilityClass; import org.apache.commons.lang3.NotImplementedException; +import org.openqa.selenium.WebDriver; import solutions.bellatrix.core.configuration.ConfigurationService; import solutions.bellatrix.core.utilities.DebugInformation; +import solutions.bellatrix.core.utilities.ShutdownManager; +import solutions.bellatrix.core.utilities.SingletonFactory; import solutions.bellatrix.core.utilities.TimestampBuilder; import solutions.bellatrix.playwright.configuration.GridSettings; import solutions.bellatrix.playwright.configuration.WebSettings; @@ -42,27 +48,41 @@ import java.util.Properties; @SuppressWarnings("ALL") -@UtilityClass public class PlaywrightService { - private static final ThreadLocal DISPOSED; - private static final ThreadLocal BROWSER_CONFIGURATION_THREAD_LOCAL; - private static final ThreadLocal PLAYWRIGHT_THREAD_LOCAL; - private static final ThreadLocal BROWSER_WRAPPER_THREAD_LOCAL; - private static boolean isBuildNameSet = false; - private static String buildName; - - static { - DISPOSED = ThreadLocal.withInitial(() -> true); - BROWSER_CONFIGURATION_THREAD_LOCAL = new ThreadLocal<>(); - PLAYWRIGHT_THREAD_LOCAL = new ThreadLocal<>(); - BROWSER_WRAPPER_THREAD_LOCAL = new ThreadLocal<>(); + private PlaywrightService() { } - public static WrappedBrowser start(BrowserConfiguration configuration) { - if (DISPOSED.get()) { + public static PlaywrightService current() { + PlaywrightService service; + if (SingletonFactory.containsKey(PlaywrightService.class)) { + service = SingletonFactory.getInstance(PlaywrightService.class); + } else { + service = new PlaywrightService(); + } + + SingletonFactory.register(service); + if (ConfigurationService.get(WebSettings.class).isForceCloseBrowser()) { + assert service != null; + ShutdownManager.register(service::close); + } + + + return service; + } + + private boolean disposed = true; + @Getter private BrowserConfiguration browserConfiguration; + private Playwright playwright; + private WrappedBrowser wrappedBrowser; + private boolean isBuildNameSet = false; + private String buildName; + + public WrappedBrowser start(BrowserConfiguration configuration) { + if (disposed) { browserConfiguration(configuration); - playwright(Playwright.create()); - DISPOSED.set(false); + playwright = Playwright.create(); + disposed = false; + var executionType = Settings.web().getExecutionType(); if (executionType.equals("regular")) { @@ -77,19 +97,19 @@ public static WrappedBrowser start(BrowserConfiguration configuration) { else return wrappedBrowser(); } - public static void close() { - if (DISPOSED.get()) { + public void close() { + if (disposed) { return; } - if (playwright() != null) { + if (playwright != null) { DebugInformation.debugInfo("SHUTTING DOWN PLAYWRIGHT"); if (wrappedBrowser() != null) { wrappedBrowser().close(); } - PLAYWRIGHT_THREAD_LOCAL.remove(); + playwright = null; if (wrappedBrowser().getGridSessionId() != null) { RestAssured.baseURI = ConfigurationService.get(WebSettings.class).getGridSettings().stream().filter(g -> g.getProviderName().equals(Settings.web().getExecutionType().toLowerCase())).findFirst().orElse(null).getUrl(); @@ -99,16 +119,16 @@ public static void close() { } } - DISPOSED.set(true); + disposed = true; } - public static void restartBrowserContext() { + public void restartBrowserContext() { DebugInformation.debugInfo("RESTARTING CONTEXT"); wrappedBrowser().changeContext(intializeBrowserContext()); } - private static WrappedBrowser initializeBrowserWrapperRegularMode() { - wrappedBrowser(new WrappedBrowser(playwright())); + private WrappedBrowser initializeBrowserWrapperRegularMode() { + wrappedBrowser(new WrappedBrowser(playwright)); wrappedBrowser().setBrowser(initializeBrowserRegularMode()); wrappedBrowser().setCurrentContext(intializeBrowserContext()); @@ -117,8 +137,8 @@ private static WrappedBrowser initializeBrowserWrapperRegularMode() { return wrappedBrowser(); } - private static WrappedBrowser initializeBrowserWrapperGridMode(GridSettings gridSettings) { - wrappedBrowser(new WrappedBrowser(playwright())); + private WrappedBrowser initializeBrowserWrapperGridMode(GridSettings gridSettings) { + wrappedBrowser(new WrappedBrowser(playwright)); wrappedBrowser().setBrowser(initializeBrowserGridMode(gridSettings)); wrappedBrowser().setCurrentContext(intializeBrowserContext()); @@ -127,12 +147,12 @@ private static WrappedBrowser initializeBrowserWrapperGridMode(GridSettings grid return wrappedBrowser(); } - private static Browser initializeBrowserRegularMode() { + private Browser initializeBrowserRegularMode() { BrowserTypes browserTypes = browserConfiguration().getBrowserTypes(); switch (browserTypes) { case CHROMIUM -> { - var browserType = playwright().chromium(); + var browserType = playwright.chromium(); BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); launchOptions.setHeadless(false); launchOptions.setArgs(List.of("--log-level=3", "--remote-allow-origins=*")); @@ -142,7 +162,7 @@ private static Browser initializeBrowserRegularMode() { return browser(browserType.launch(launchOptions)); } case CHROMIUM_HEADLESS -> { - var browserType = playwright().chromium(); + var browserType = playwright.chromium(); BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); launchOptions.setHeadless(true); launchOptions.setArgs(List.of("--log-level=3")); @@ -151,7 +171,7 @@ private static Browser initializeBrowserRegularMode() { return browser(browserType.launch(launchOptions)); } case CHROME -> { - var browserType = playwright().chromium(); + var browserType = playwright.chromium(); BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); launchOptions.setChannel("chrome"); launchOptions.setHeadless(false); @@ -162,7 +182,7 @@ private static Browser initializeBrowserRegularMode() { return browser(browserType.launch(launchOptions)); } case CHROME_HEADLESS -> { - var browserType = playwright().chromium(); + var browserType = playwright.chromium(); BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); launchOptions.setChannel("chrome"); launchOptions.setHeadless(true); @@ -172,7 +192,7 @@ private static Browser initializeBrowserRegularMode() { return browser(browserType.launch(launchOptions)); } case FIREFOX -> { - var browserType = playwright().firefox(); + var browserType = playwright.firefox(); BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); launchOptions.setHeadless(false); launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); @@ -180,14 +200,14 @@ private static Browser initializeBrowserRegularMode() { return browser(browserType.launch(launchOptions)); } case FIREFOX_HEADLESS -> { - var browserType = playwright().firefox(); + var browserType = playwright.firefox(); BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); launchOptions.setHeadless(true); return browser(browserType.launch(launchOptions)); } case EDGE -> { - var browserType = playwright().chromium(); + var browserType = playwright.chromium(); BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); launchOptions.setChannel("msedge"); launchOptions.setHeadless(false); @@ -197,7 +217,7 @@ private static Browser initializeBrowserRegularMode() { return browser(browserType.launch(launchOptions)); } case EDGE_HEADLESS -> { - var browserType = playwright().chromium(); + var browserType = playwright.chromium(); BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); launchOptions.setChannel("msedge"); launchOptions.setHeadless(true); @@ -207,7 +227,7 @@ private static Browser initializeBrowserRegularMode() { return browser(browserType.launch(launchOptions)); } case WEBKIT -> { - var browserType = playwright().webkit(); + var browserType = playwright.webkit(); BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); launchOptions.setHeadless(false); launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); @@ -215,7 +235,7 @@ private static Browser initializeBrowserRegularMode() { return browser(browserType.launch(launchOptions)); } case WEBKIT_HEADLESS -> { - var browserType = playwright().webkit(); + var browserType = playwright.webkit(); BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); launchOptions.setHeadless(true); @@ -225,7 +245,7 @@ private static Browser initializeBrowserRegularMode() { } } - private static BrowserContext intializeBrowserContext() { + private BrowserContext intializeBrowserContext() { Browser.NewContextOptions options = getContextOptions(); var context = browser().newContext(options); @@ -237,7 +257,7 @@ private static BrowserContext intializeBrowserContext() { } // ToDo Browser Context options - private static Browser.NewContextOptions getContextOptions() { + private Browser.NewContextOptions getContextOptions() { Browser.NewContextOptions options = new Browser.NewContextOptions(); // if (Settings.context().isShouldSetContextSettings()) { @@ -260,7 +280,7 @@ private static Browser.NewContextOptions getContextOptions() { return options; } - private static void startRecordingHttpTraffic(BrowserContext context) { + private void startRecordingHttpTraffic(BrowserContext context) { Traffic.getRequestContainers().add(new Requests(context)); context.onRequest(x -> Traffic.getContextSpecificRequests(context).add(x)); @@ -268,7 +288,7 @@ private static void startRecordingHttpTraffic(BrowserContext context) { context.onResponse(x -> Traffic.getContextSpecificResponses(context).add(x)); } - private static Browser initializeBrowserGridMode(GridSettings gridSettings) { + private Browser initializeBrowserGridMode(GridSettings gridSettings) { var timeout = Settings.timeout().inMilliseconds().getConnectToRemoteGridTimeout(); var gridUrl = gridSettings.getUrl(); @@ -281,7 +301,7 @@ private static Browser initializeBrowserGridMode(GridSettings gridSettings) { String serializedSettings = URLEncoder.encode(gson.toJson(gridSettings.getArguments().get(0)), "UTF-8"); if (gridSettings.getProviderName().equals("grid") || gridSettings.getProviderName().equals("selenoid")) { - var browserType = BROWSER_CONFIGURATION_THREAD_LOCAL.get().getBrowserTypes(); + var browserType = browserConfiguration.getBrowserTypes(); if (browserType == BrowserTypes.FIREFOX || browserType == BrowserTypes.FIREFOX_HEADLESS || browserType == BrowserTypes.WEBKIT || browserType == BrowserTypes.WEBKIT_HEADLESS) { throw new NotImplementedException("Playwright supports running in Selenium Grid only Chromium browsers."); } @@ -308,11 +328,11 @@ private static Browser initializeBrowserGridMode(GridSettings gridSettings) { var cdpUrl = new URI(response.jsonPath().get("value.capabilities['se:cdp']")); cdpUrl = new URI(cdpUrl.getScheme(), cdpUrl.getUserInfo(), new URI(gridUrl).getHost(), new URI(gridUrl).getPort(), cdpUrl.getPath(), cdpUrl.getQuery(), cdpUrl.getFragment()); - return playwright().chromium().connectOverCDP(cdpUrl.toString(), new BrowserType.ConnectOverCDPOptions().setTimeout(timeout)); + return playwright.chromium().connectOverCDP(cdpUrl.toString(), new BrowserType.ConnectOverCDPOptions().setTimeout(timeout)); } else if (gridSettings.getProviderName().equals("lambdatest")) { - return playwright().chromium().connect(String.format("%s?capabilities=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); + return playwright.chromium().connect(String.format("%s?capabilities=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); } else if (gridSettings.getProviderName().equals("browserstack")) { - return playwright().chromium().connect(String.format("%s?caps=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); + return playwright.chromium().connect(String.format("%s?caps=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); } else { throw new NotImplementedException("Unsupported grid provider. Supported are: selenium grid, selenoid, lambdatest, and browserstack."); } @@ -322,7 +342,7 @@ private static Browser initializeBrowserGridMode(GridSettings gridSettings) { } } - private static void changeWindowSize() { + private void changeWindowSize() { try { if (browserConfiguration().getHeight() != 0 && browserConfiguration().getWidth() != 0) { wrappedBrowser().getCurrentPage().setViewportSize(browserConfiguration().getWidth(), browserConfiguration().getHeight()); @@ -330,7 +350,7 @@ private static void changeWindowSize() { } catch (Exception ignored) {} } - private static String getBuildName() { + private String getBuildName() { if (!isBuildNameSet) { buildName = System.getProperty("buildName"); } @@ -357,47 +377,38 @@ private static String getBuildName() { return buildName; } - public static BrowserConfiguration browserConfiguration() { - return BROWSER_CONFIGURATION_THREAD_LOCAL.get(); + public BrowserConfiguration browserConfiguration() { + return browserConfiguration; } - public static BrowserConfiguration browserConfiguration(BrowserConfiguration configuration) { - BROWSER_CONFIGURATION_THREAD_LOCAL.set(configuration); + public BrowserConfiguration browserConfiguration(BrowserConfiguration configuration) { + browserConfiguration = configuration; return browserConfiguration(); } - private static Playwright playwright() { - return PLAYWRIGHT_THREAD_LOCAL.get(); - } - - private static Playwright playwright(Playwright playwright) { - PLAYWRIGHT_THREAD_LOCAL.set(playwright); - return playwright(); - } - - public static WrappedBrowser wrappedBrowser() { - return BROWSER_WRAPPER_THREAD_LOCAL.get(); + public WrappedBrowser wrappedBrowser() { + return wrappedBrowser; } - public static WrappedBrowser wrappedBrowser(WrappedBrowser wrappedBrowser) { - BROWSER_WRAPPER_THREAD_LOCAL.set(wrappedBrowser); - return BROWSER_WRAPPER_THREAD_LOCAL.get(); + public WrappedBrowser wrappedBrowser(WrappedBrowser wrappedBrowser) { + this.wrappedBrowser = wrappedBrowser; + return this.wrappedBrowser; } - private static Browser browser() { + private Browser browser() { return wrappedBrowser().getBrowser(); } - private static Browser browser(Browser browser) { + private Browser browser(Browser browser) { wrappedBrowser().setBrowser(browser); return browser(); } - private static BrowserContext context() { + private BrowserContext context() { return wrappedBrowser().getCurrentContext(); } - private static BrowserContext context(BrowserContext browserContext) { + private BrowserContext context(BrowserContext browserContext) { wrappedBrowser().setCurrentContext(browserContext); return context(); } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/WebScreenshotPlugin.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/WebScreenshotPlugin.java index e8c1ab98..d4012feb 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/WebScreenshotPlugin.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/WebScreenshotPlugin.java @@ -36,7 +36,7 @@ public String takeScreenshot(String name) { var filename = getUniqueFileName(name); var path = Paths.get(screenshotSaveDir, filename); - var screenshot = PlaywrightService.wrappedBrowser().getCurrentPage() + var screenshot = PlaywrightService.current().wrappedBrowser().getCurrentPage() .screenshot(new Page.ScreenshotOptions() .setPath(path) .setType(ScreenshotType.PNG) @@ -51,7 +51,7 @@ public String takeScreenshot(String name) { @Override public String takeScreenshot(String screenshotSaveDir, String filename) { var path = Paths.get(screenshotSaveDir, filename); - var screenshot = PlaywrightService.wrappedBrowser().getCurrentPage() + var screenshot = PlaywrightService.current().wrappedBrowser().getCurrentPage() .screenshot(new Page.ScreenshotOptions() .setPath(path) .setType(ScreenshotType.PNG) diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/App.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/App.java index 8783ac31..24b6aa25 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/App.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/App.java @@ -80,7 +80,7 @@ public void close() { return; } - PlaywrightService.close(); + PlaywrightService.current().close(); disposed = true; } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/WebService.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/WebService.java index b45fb62c..43514525 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/WebService.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/WebService.java @@ -18,6 +18,6 @@ public abstract class WebService { protected static WrappedBrowser wrappedBrowser() { - return PlaywrightService.wrappedBrowser(); + return PlaywrightService.current().wrappedBrowser(); } } 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 4b17d3f4..1f411247 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 @@ -91,7 +91,7 @@ public WebComponent() { browserService = new BrowserService(); componentCreateService = new ComponentCreateService(); componentWaitService = new ComponentWaitService(); - wrappedDriver = DriverService.getWrappedDriver(); + wrappedDriver = DriverService.current().getWrappedDriver(); } /** @@ -720,7 +720,7 @@ public List shadowRootCreateAllByI public void highlight() { if (this.getWrappedElement() instanceof ShadowHost) return; - var currentBrowser = DriverService.getBrowserConfiguration().getBrowser(); + var currentBrowser = DriverService.current().getBrowserConfiguration().getBrowser(); if (currentBrowser == Browser.CHROME_HEADLESS) return; try { 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 596561ee..67f4a0c3 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 @@ -31,6 +31,7 @@ import java.util.List; public class WebSettings { + @Getter @Setter private boolean forceCloseBrowser; @Getter @Setter private String baseUrl; @Getter @Setter private String executionType; @Getter @Setter private String defaultLifeCycle; 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 550273ab..51bc5ecc 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 @@ -92,14 +92,14 @@ public void postAfterTest(TestResult testResult, Method memberInfo, Throwable fa } private void shutdownBrowser() { - DriverService.close(); + DriverService.current().close(); PREVIOUS_BROWSER_CONFIGURATION.remove(); } private void startBrowser() { // shutdownBrowser(); try { - DriverService.start(CURRENT_BROWSER_CONFIGURATION.get()); + DriverService.current().start(CURRENT_BROWSER_CONFIGURATION.get()); IS_BROWSER_STARTED_CORRECTLY.set(true); } catch (Exception ex) { DebugInformation.printStackTrace(ex); 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 0dcb56dd..7cd21544 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,6 +13,8 @@ package solutions.bellatrix.web.infrastructure; +import lombok.Getter; +import lombok.Setter; import net.lightbody.bmp.client.ClientUtil; import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; @@ -29,10 +31,7 @@ import org.openqa.selenium.safari.SafariDriver; 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.SecretsResolver; -import solutions.bellatrix.core.utilities.TimestampBuilder; +import solutions.bellatrix.core.utilities.*; import solutions.bellatrix.web.configuration.GridSettings; import solutions.bellatrix.web.configuration.WebSettings; @@ -49,57 +48,49 @@ import static io.restassured.RestAssured.given; public class DriverService { - private static final ThreadLocal DISPOSED = ThreadLocal.withInitial(() -> true); - private static final ThreadLocal BROWSER_CONFIGURATION; - private static final ThreadLocal> CUSTOM_DRIVER_OPTIONS; - private static final ThreadLocal WRAPPED_DRIVER; - private static boolean isBuildNameSet = false; - private static String buildName; - - static { - CUSTOM_DRIVER_OPTIONS = new ThreadLocal<>(); - CUSTOM_DRIVER_OPTIONS.set(new HashMap<>()); - BROWSER_CONFIGURATION = new ThreadLocal<>(); - WRAPPED_DRIVER = new ThreadLocal<>(); + private DriverService() { } - public static HashMap getCustomDriverOptions() { - return CUSTOM_DRIVER_OPTIONS.get(); - } + public static DriverService current() { + DriverService service; + if (SingletonFactory.containsKey(DriverService.class)) { + service = SingletonFactory.getInstance(DriverService.class); + } else { + service = new DriverService(); + } - public static void addDriverOptions(String key, String value) { - CUSTOM_DRIVER_OPTIONS.get().put(key, value); - } + SingletonFactory.register(service); + if (ConfigurationService.get(WebSettings.class).isForceCloseBrowser()) { + assert service != null; + ShutdownManager.register(service::close); + } - public static WebDriver getWrappedDriver() { - return WRAPPED_DRIVER.get(); - } - public static void setWrappedDriver(WebDriver driver) { - WRAPPED_DRIVER.set(driver); + return service; } - public static BrowserConfiguration getBrowserConfiguration() { - return BROWSER_CONFIGURATION.get(); + private boolean disposed = true; + @Getter private BrowserConfiguration browserConfiguration; + @Getter private final Map customDriverOptions = new HashMap<>(); + @Getter @Setter private WebDriver wrappedDriver; + private boolean isBuildNameSet = false; + private String buildName; + + public void addDriverOptions(String key, String value) { + customDriverOptions.put(key, value); } - public static WebDriver start(BrowserConfiguration configuration) { - if (DISPOSED.get()) { - BROWSER_CONFIGURATION.set(configuration); - DISPOSED.set(false); + public WebDriver start(BrowserConfiguration configuration) { + if (disposed) { + browserConfiguration = configuration; + disposed = false; + WebDriver driver; var webSettings = ConfigurationService.get(WebSettings.class); var executionType = webSettings.getExecutionType(); + if (executionType.equals("regular")) { driver = initializeDriverRegularMode(); - } else if (executionType.equals("grid") || executionType.equals("selenoid")) { - var gridSettings = webSettings.getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst(); - assert gridSettings.isPresent() : String.format("The specified execution type '%s' is not declared in the configuration", executionType); - driver = initializeDriverGridMode(gridSettings.get()); - } else if (executionType.equals("healenium")) { - var gridSettings = webSettings.getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst(); - assert gridSettings.isPresent() : String.format("The specified execution type '%s' is not declared in the configuration", executionType); - driver = initializeDriverGridMode(gridSettings.get()); } else { var gridSettings = webSettings.getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst(); assert gridSettings.isPresent() : String.format("The specified execution type '%s' is not declared in the configuration", executionType); @@ -117,38 +108,31 @@ public static WebDriver start(BrowserConfiguration configuration) { } Log.info(String.format("Window resized to dimensions: %s", driver.manage().window().getSize().toString())); - WRAPPED_DRIVER.set(driver); + wrappedDriver = driver; return driver; - } else return WRAPPED_DRIVER.get(); + } else return wrappedDriver; } - private static WebDriver initializeDriverCloudGridMode(GridSettings gridSettings) { + private WebDriver initializeDriverCloudGridMode(GridSettings gridSettings) { MutableCapabilities caps = new MutableCapabilities(); - switch (BROWSER_CONFIGURATION.get().getBrowser()) { - case CHROME_HEADLESS: - case CHROME: { + switch (browserConfiguration.getBrowser()) { + case CHROME_HEADLESS, CHROME -> { var chromeOptions = new ChromeOptions(); caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); - break; } - case FIREFOX_HEADLESS: - case FIREFOX: { + case FIREFOX_HEADLESS, FIREFOX -> { var firefoxOptions = new FirefoxOptions(); caps.setCapability(ChromeOptions.CAPABILITY, firefoxOptions); - break; } - case EDGE_HEADLESS: - case EDGE: { + case EDGE_HEADLESS, EDGE -> { var edgeOptions = new EdgeOptions(); caps.setCapability(ChromeOptions.CAPABILITY, edgeOptions); - break; } - case SAFARI: { + case SAFARI -> { var safariOptions = new SafariOptions(); caps.setCapability(ChromeOptions.CAPABILITY, safariOptions); - break; } } @@ -175,51 +159,43 @@ private static WebDriver initializeDriverCloudGridMode(GridSettings gridSettings return driver; } - private static WebDriver initializeDriverGridMode(GridSettings gridSettings) { + private WebDriver initializeDriverGridMode(GridSettings gridSettings) { var caps = new DesiredCapabilities(); - if (BROWSER_CONFIGURATION.get().getPlatform() != Platform.ANY) { - caps.setCapability("platform", BROWSER_CONFIGURATION.get().getPlatform()); + if (browserConfiguration.getPlatform() != Platform.ANY) { + caps.setCapability("platform", browserConfiguration.getPlatform()); } - if (BROWSER_CONFIGURATION.get().getVersion() != 0) { - caps.setCapability("version", BROWSER_CONFIGURATION.get().getVersion()); + if (browserConfiguration.getVersion() != 0) { + caps.setCapability("version", browserConfiguration.getVersion()); } else { caps.setCapability("version", "latest"); } - switch (BROWSER_CONFIGURATION.get().getBrowser()) { - case CHROME_HEADLESS: - case CHROME: { + switch (browserConfiguration.getBrowser()) { + case CHROME_HEADLESS, CHROME -> { var chromeOptions = new ChromeOptions(); addGridOptions(chromeOptions, gridSettings); caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); - break; } - case FIREFOX_HEADLESS: - case FIREFOX: { + case FIREFOX_HEADLESS, FIREFOX -> { var firefoxOptions = new FirefoxOptions(); addGridOptions(firefoxOptions, gridSettings); caps.setCapability(ChromeOptions.CAPABILITY, firefoxOptions); - break; } - case EDGE_HEADLESS: - case EDGE: { + case EDGE_HEADLESS, EDGE -> { var edgeOptions = new EdgeOptions(); addGridOptions(edgeOptions, gridSettings); caps.setCapability(ChromeOptions.CAPABILITY, edgeOptions); - break; } - case SAFARI: { + case SAFARI -> { var safariOptions = new SafariOptions(); addGridOptions(safariOptions, gridSettings); caps.setCapability(ChromeOptions.CAPABILITY, safariOptions); - break; } - case INTERNET_EXPLORER: { + case INTERNET_EXPLORER -> { var ieOptions = new InternetExplorerOptions(); addGridOptions(ieOptions, gridSettings); caps.setCapability(ChromeOptions.CAPABILITY, ieOptions); - break; } } @@ -236,7 +212,7 @@ private static WebDriver initializeDriverGridMode(GridSettings gridSettings) { return driver; } - private static WebDriver initializeDriverRegularMode() { + private WebDriver initializeDriverRegularMode() { WebDriver driver = null; boolean shouldCaptureHttpTraffic = ConfigurationService.get(WebSettings.class).getShouldCaptureHttpTraffic(); @@ -247,7 +223,7 @@ private static WebDriver initializeDriverRegularMode() { ProxyServer.newHar(); } - switch (BROWSER_CONFIGURATION.get().getBrowser()) { + switch (browserConfiguration.getBrowser()) { case CHROME -> { var chromeOptions = new ChromeOptions(); addDriverOptions(chromeOptions); @@ -282,7 +258,7 @@ private static WebDriver initializeDriverRegularMode() { chromeHeadlessOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); var deviceNameOption = new HashMap(); - deviceNameOption.put("deviceName", BROWSER_CONFIGURATION.get().getDeviceName().getName()); + deviceNameOption.put("deviceName", browserConfiguration.getDeviceName().getName()); chromeHeadlessOptions.setExperimentalOption("mobileEmulation", deviceNameOption); System.setProperty("webdriver.chrome.silentOutput", "true"); @@ -339,7 +315,7 @@ private static WebDriver initializeDriverRegularMode() { return driver; } - private static DesiredCapabilities addDriverCapabilities(ChromeOptions chromeOptions) { + private DesiredCapabilities addDriverCapabilities(ChromeOptions chromeOptions) { DesiredCapabilities caps = new DesiredCapabilities(); // INIT CHROME OPTIONS Map prefs = new HashMap(); @@ -358,7 +334,7 @@ private static DesiredCapabilities addDriverCapabilities(ChromeOptions chromeOpt return caps; } - private static void addGridOptions(HashMap options, GridSettings gridSettings) { + private void addGridOptions(HashMap options, GridSettings gridSettings) { Log.info("Add WebDriver Options:"); Log.info(""); for (var entry : gridSettings.getArguments()) { @@ -424,13 +400,13 @@ private static void addGridOptions(TOption } } - private static void addDriverOptions(TOption chromeOptions) { - for (var optionKey : BROWSER_CONFIGURATION.get().driverOptions.keySet()) { - chromeOptions.setCapability(optionKey, BROWSER_CONFIGURATION.get().driverOptions.get(optionKey)); + private void addDriverOptions(TOption chromeOptions) { + for (var optionKey : browserConfiguration.driverOptions.keySet()) { + chromeOptions.setCapability(optionKey, browserConfiguration.driverOptions.get(optionKey)); } } - private static void changeWindowSize(WebDriver wrappedDriver) { + private 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())); @@ -439,7 +415,7 @@ private static void changeWindowSize(WebDriver wrappedDriver) { } catch (Exception ex) { System.out.println("Error while resizing browser window: " + ex.getMessage());} } - private static String getBuildName() { + private String getBuildName() { if (!isBuildNameSet) { buildName = System.getProperty("buildName"); } @@ -466,7 +442,7 @@ private static String getBuildName() { return buildName; } - private static String getUrl(String url) { + private String getUrl(String url) { String result = url; if (url.startsWith("{env_")) { result = SecretsResolver.getSecret(url); @@ -488,16 +464,16 @@ private static String getUrl(String url) { return result; } - public static void close() { - if (DISPOSED.get()) { + public void close() { + if (disposed) { return; } - if (WRAPPED_DRIVER.get() != null) { + if (wrappedDriver != null) { DebugInformation.debugInfo("SHUTTING DOWN WRAPPED_DRIVER"); - WRAPPED_DRIVER.get().quit(); - if (CUSTOM_DRIVER_OPTIONS.get() != null) { - CUSTOM_DRIVER_OPTIONS.get().clear(); + wrappedDriver.quit(); + if (!customDriverOptions.isEmpty()) { + customDriverOptions.clear(); } } @@ -506,6 +482,6 @@ public static void close() { ProxyServer.close(); } - DISPOSED.set(true); + disposed = true; } } \ No newline at end of file diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/FullPageScreenshotEngine.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/FullPageScreenshotEngine.java index 813f4f50..b039f93e 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/FullPageScreenshotEngine.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/FullPageScreenshotEngine.java @@ -32,7 +32,7 @@ public static File takeScreenshot() { var javaScriptService = new JavaScriptService(); var timeoutInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitForAjaxTimeout(); var sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); - var webDriverWait = new WebDriverWait(DriverService.getWrappedDriver(), Duration.ofSeconds(timeoutInterval), Duration.ofSeconds(sleepInterval)); + var webDriverWait = new WebDriverWait(DriverService.current().getWrappedDriver(), Duration.ofSeconds(timeoutInterval), Duration.ofSeconds(sleepInterval)); webDriverWait.ignoring(IllegalArgumentException.class); javaScriptService.execute(html2CanvasContent); javaScriptService.execute(GENERATE_SCREENSHOT_JS); 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 bc58145e..feaf1ec1 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 @@ -43,7 +43,7 @@ public String takeScreenshot(String name) { var screenshot = new AShot() .shootingStrategy(ShootingStrategies.viewportPasting(100)) - .takeScreenshot(DriverService.getWrappedDriver()); + .takeScreenshot(DriverService.current().getWrappedDriver()); var path = Paths.get(screenshotSaveDir, filename).toString(); var destFile = new File(path); @@ -64,7 +64,7 @@ public String takeScreenshot(String name) { public String takeScreenshot(String screenshotSaveDir, String filename) { var screenshot = new AShot() .shootingStrategy(ShootingStrategies.viewportPasting(100)) - .takeScreenshot(DriverService.getWrappedDriver()); + .takeScreenshot(DriverService.current().getWrappedDriver()); var path = Paths.get(screenshotSaveDir, filename).toString(); var destFile = new File(path); diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/App.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/App.java index 5eb6a63a..d1bf2714 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/App.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/App.java @@ -13,6 +13,8 @@ package solutions.bellatrix.web.services; +import solutions.bellatrix.core.utilities.DebugInformation; +import solutions.bellatrix.core.utilities.ShutdownManager; import solutions.bellatrix.core.utilities.SingletonFactory; import solutions.bellatrix.web.infrastructure.DriverService; import solutions.bellatrix.web.pages.WebPage; @@ -50,7 +52,7 @@ public ComponentWaitService waitFor() { } public void addDriverOptions(String key, String value) { - DriverService.addDriverOptions(key, value); + DriverService.current().addDriverOptions(key, value); } public TPage goTo(Class pageOf, Object... args) { @@ -85,7 +87,7 @@ public void close() { return; } - DriverService.close(); + DriverService.current().close(); disposed = true; } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ComponentCreateService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ComponentCreateService.java index 211755eb..214e1ab4 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ComponentCreateService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ComponentCreateService.java @@ -159,7 +159,7 @@ public TCo } public List allBy(Class componentClass, TFindStrategy findStrategy) { - var nativeElements = DriverService.getWrappedDriver().findElements(findStrategy.convert()); + var nativeElements = getWrappedDriver().findElements(findStrategy.convert()); List componentList = new ArrayList<>(); for (int i = 0; i < nativeElements.size(); i++) { var component = InstanceFactory.create(componentClass); diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ComponentWaitService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ComponentWaitService.java index bf906969..12e73fc4 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ComponentWaitService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ComponentWaitService.java @@ -20,7 +20,7 @@ public class ComponentWaitService extends WebService { public void wait(WebComponent component, WaitStrategy waitStrategy) { if (component.getParentWrappedElement() == null) { - waitStrategy.waitUntil(DriverService.getWrappedDriver(), component.getFindStrategy().convert()); + waitStrategy.waitUntil(DriverService.current().getWrappedDriver(), component.getFindStrategy().convert()); } else { waitStrategy.waitUntil(component.getParentWrappedElement(), component.getFindStrategy().convert()); } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/WebService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/WebService.java index 25cb2cb7..c97daa82 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/WebService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/WebService.java @@ -18,6 +18,6 @@ public abstract class WebService { public WebDriver getWrappedDriver() { - return DriverService.getWrappedDriver(); + return DriverService.current().getWrappedDriver(); } } 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 fdc54287..fc66494e 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 @@ -108,7 +108,7 @@ private static void waitUntil(BooleanSupplier condition, WebComponent com var validationTimeout = timeoutSettings.getValidationsTimeout(); var sleepInterval = timeoutSettings.getSleepInterval(); - FluentWait wait = new FluentWait<>(DriverService.getWrappedDriver()) + FluentWait wait = new FluentWait<>(DriverService.current().getWrappedDriver()) .withTimeout(Duration.ofSeconds(validationTimeout)) .pollingEvery(Duration.ofSeconds(sleepInterval > 0 ? sleepInterval : 1)); 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 562942f3..f99b46ae 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 @@ -39,7 +39,7 @@ public WaitStrategy(long timeoutInterval, long sleepInterval) { public abstract void waitUntil(SearchContext searchContext, By by); protected void waitUntil(Function waitCondition) { - webDriverWait = new WebDriverWait(DriverService.getWrappedDriver(), Duration.ofSeconds(timeoutInterval), Duration.ofSeconds(sleepInterval)); + webDriverWait = new WebDriverWait(DriverService.current().getWrappedDriver(), Duration.ofSeconds(timeoutInterval), Duration.ofSeconds(sleepInterval)); webDriverWait.withMessage(Thread.currentThread().getStackTrace()[2].getMethodName()); webDriverWait.until(waitCondition); } diff --git a/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.dev.json b/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.dev.json index 1ab43a8b..78f39605 100644 --- a/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.dev.json +++ b/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.dev.json @@ -3,6 +3,7 @@ "debugInformationEnabled": "true" }, "webSettings": { + "forceCloseBrowser": "true", "baseUrl": "http://demos.bellatrix.solutions/", "executionType": "regular", "defaultBrowser": "chrome", diff --git a/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.qa.json b/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.qa.json index 2c46b262..cd0a8ff6 100644 --- a/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.qa.json +++ b/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.qa.json @@ -3,6 +3,7 @@ "debugInformationEnabled": "true" }, "webSettings": { + "forceCloseBrowser": "true", "baseUrl": "http://demos.bellatrix.solutions/", "executionType": "regular", "defaultBrowser": "chrome", diff --git a/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.dev.json b/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.dev.json index 1ab43a8b..78f39605 100644 --- a/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.dev.json +++ b/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.dev.json @@ -3,6 +3,7 @@ "debugInformationEnabled": "true" }, "webSettings": { + "forceCloseBrowser": "true", "baseUrl": "http://demos.bellatrix.solutions/", "executionType": "regular", "defaultBrowser": "chrome", diff --git a/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.qa.json b/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.qa.json index 2c46b262..cd0a8ff6 100644 --- a/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.qa.json +++ b/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.qa.json @@ -3,6 +3,7 @@ "debugInformationEnabled": "true" }, "webSettings": { + "forceCloseBrowser": "true", "baseUrl": "http://demos.bellatrix.solutions/", "executionType": "regular", "defaultBrowser": "chrome", diff --git a/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.dev.json b/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.dev.json index 023d0c91..d5b7d18f 100644 --- a/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.dev.json +++ b/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.dev.json @@ -3,8 +3,9 @@ "debugInformationEnabled": "true" }, "webSettings": { + "forceCloseBrowser": "true", "baseUrl": "http://demos.bellatrix.solutions/", - "executionType":"regular", + "executionType":"regular", "defaultBrowser": "chrome", "defaultLifeCycle": "restart everytime time", "artificialDelayBeforeAction": "0", diff --git a/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.qa.json b/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.qa.json index f8ef6130..e94e0d38 100644 --- a/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.qa.json +++ b/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.qa.json @@ -3,6 +3,7 @@ "debugInformationEnabled": "true" }, "webSettings": { + "forceCloseBrowser": "true", "baseUrl": "https://ecommerce-playground.lambdatest.io", "executionType": "regular", "defaultBrowser": "chrome", diff --git a/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.dev.json b/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.dev.json index 589ce73d..0a66ba57 100644 --- a/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.dev.json +++ b/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.dev.json @@ -3,8 +3,9 @@ "debugInformationEnabled": "true" }, "webSettings": { + "forceCloseBrowser": "true", "baseUrl": "http://demos.bellatrix.solutions/", - "executionType":"regular", + "executionType":"regular", "defaultBrowser": "chrome", "defaultLifeCycle": "restart everytime time", "artificialDelayBeforeAction": "0", diff --git a/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.qa.json b/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.qa.json index f8ef6130..e94e0d38 100644 --- a/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.qa.json +++ b/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.qa.json @@ -3,6 +3,7 @@ "debugInformationEnabled": "true" }, "webSettings": { + "forceCloseBrowser": "true", "baseUrl": "https://ecommerce-playground.lambdatest.io", "executionType": "regular", "defaultBrowser": "chrome", From 94174a14771f4c05854fa8905e5c74ee0825efa6 Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Mon, 15 Jul 2024 18:11:02 +0300 Subject: [PATCH 04/19] Update ShutdownManager.java --- .../bellatrix/core/utilities/ShutdownManager.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java index cb2bad6b..82caa991 100644 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java @@ -1,3 +1,16 @@ +/* + * Copyright 2024 Automate The Planet Ltd. + * Author: Miriam Kyoseva + * 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.core.utilities; import lombok.experimental.UtilityClass; @@ -7,7 +20,6 @@ @UtilityClass public class ShutdownManager { - private static final List resources = new ArrayList<>(); private static final List instructions = new ArrayList<>(); static { From efff03562b753d379d5226b68e12d9fc9054eeac Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Tue, 16 Jul 2024 07:37:12 +0300 Subject: [PATCH 05/19] Changes to DriverService and PlaywrightService --- .../android/infrastructure/DriverService.java | 6 +- .../core/utilities/ShutdownManager.java | 5 +- .../ios/infrastructure/DriverService.java | 6 +- .../playwright/components/Screen.java | 2 +- .../playwright/components/WebComponent.java | 4 +- .../BrowserLifecyclePlugin.java | 6 +- .../FullPageScreenshotEngine.java | 2 +- .../infrastructure/PlaywrightService.java | 566 +++++++------- .../infrastructure/WebScreenshotPlugin.java | 4 +- .../infrastructure/WrappedBrowser.java | 4 - .../bellatrix/playwright/services/App.java | 2 +- .../playwright/services/WebService.java | 2 +- .../web/components/WebComponent.java | 4 +- .../BrowserLifecyclePlugin.java | 4 +- .../web/infrastructure/DriverService.java | 723 +++++++++--------- .../FullPageScreenshotEngine.java | 2 +- .../infrastructure/WebScreenshotPlugin.java | 4 +- .../solutions/bellatrix/web/services/App.java | 4 +- .../web/services/ComponentWaitService.java | 2 +- .../bellatrix/web/services/WebService.java | 2 +- .../web/validations/ComponentValidator.java | 2 +- .../web/waitstrategies/WaitStrategy.java | 2 +- .../test/java/shadowdom/ShadowDomTests.java | 2 +- 23 files changed, 696 insertions(+), 664 deletions(-) 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 d5bb7415..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 @@ -84,7 +84,7 @@ public static AndroidDriver start(AppConfiguration configuration) { driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(androidSettings.getTimeoutSettings().getImplicitWaitTimeout())); WRAPPED_ANDROID_DRIVER.set(driver); - solutions.bellatrix.web.infrastructure.DriverService.current().setWrappedDriver(driver); + solutions.bellatrix.web.infrastructure.DriverService.setWrappedDriver(driver); return driver; } @@ -110,7 +110,7 @@ private static AndroidDriver initializeDriverGridMode(GridSettings gridSettings, AndroidDriver driver = null; try { driver = new AndroidDriver(new URL(gridSettings.getUrl()), caps); - solutions.bellatrix.web.infrastructure.DriverService.current().setWrappedDriver(driver); + solutions.bellatrix.web.infrastructure.DriverService.setWrappedDriver(driver); } catch (Exception e) { DebugInformation.printStackTrace(e); } @@ -136,7 +136,7 @@ private static AndroidDriver initializeDriverRegularMode(String serviceUrl) { addDriverConfigOptions(caps); addCustomDriverOptions(caps); var driver = new AndroidDriver(new URL(serviceUrl), caps); - solutions.bellatrix.web.infrastructure.DriverService.current().setWrappedDriver(driver); + solutions.bellatrix.web.infrastructure.DriverService.setWrappedDriver(driver); return driver; } diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java index 82caa991..2ce64a87 100644 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java @@ -34,7 +34,10 @@ private static void runAllInstructions() { if (instructions.isEmpty()) return; for (var instruction : instructions) { - instruction.run(); + try { + instruction.run(); + } catch (Exception ignored) { + } } } } \ No newline at end of file diff --git a/bellatrix.ios/src/main/java/solutions/bellatrix/ios/infrastructure/DriverService.java b/bellatrix.ios/src/main/java/solutions/bellatrix/ios/infrastructure/DriverService.java index 4389c4b4..be17cc97 100644 --- a/bellatrix.ios/src/main/java/solutions/bellatrix/ios/infrastructure/DriverService.java +++ b/bellatrix.ios/src/main/java/solutions/bellatrix/ios/infrastructure/DriverService.java @@ -78,7 +78,7 @@ public static IOSDriver start(AppConfiguration configuration) { driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(IOSSettings.getTimeoutSettings().getImplicitWaitTimeout())); WRAPPED_IOS_DRIVER.set(driver); - solutions.bellatrix.web.infrastructure.DriverService.current().setWrappedDriver(driver); + solutions.bellatrix.web.infrastructure.DriverService.setWrappedDriver(driver); return driver; } @@ -91,7 +91,7 @@ private static IOSDriver initializeDriverGridMode(GridSettings gridSettings) { IOSDriver driver = null; try { driver = new IOSDriver(new URL(gridSettings.getUrl()), caps); - solutions.bellatrix.web.infrastructure.DriverService.current().setWrappedDriver(driver); + solutions.bellatrix.web.infrastructure.DriverService.setWrappedDriver(driver); } catch (MalformedURLException e) { DebugInformation.printStackTrace(e); } @@ -114,7 +114,7 @@ private static IOSDriver initializeDriverRegularMode(String serviceUrl) { addDriverOptions(caps); var driver = new IOSDriver(new URL(serviceUrl), caps); - solutions.bellatrix.web.infrastructure.DriverService.current().setWrappedDriver(driver); + solutions.bellatrix.web.infrastructure.DriverService.setWrappedDriver(driver); return driver; } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/Screen.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/Screen.java index 27717053..9931a268 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/Screen.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/Screen.java @@ -43,7 +43,7 @@ public java.awt.Dimension getSize() { } private java.awt.Dimension convertDimension() { - var playwrightSize = PlaywrightService.current().wrappedBrowser().getCurrentPage().viewportSize(); + var playwrightSize = PlaywrightService.wrappedBrowser().getCurrentPage().viewportSize(); return new Dimension(playwrightSize.width, playwrightSize.height); } } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java index 12e84a44..7fa92546 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java @@ -137,7 +137,7 @@ public RelativeCreateService create() { } protected static WrappedBrowser wrappedBrowser() { - return PlaywrightService.current().wrappedBrowser(); + return PlaywrightService.wrappedBrowser(); } public void scrollToVisible() { @@ -230,7 +230,7 @@ public boolean isVisible() { // Update: We should use js, native playwright highlight() method's function is unknown. // Update: the js script seems to work, but not for TextField elements public void highlight() { - if (PlaywrightService.current().browserConfiguration().getBrowserTypes() == BrowserTypes.CHROME_HEADLESS) { + if (PlaywrightService.browserConfiguration().getBrowserTypes() == BrowserTypes.CHROME_HEADLESS) { return; } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java index 513e44ca..d100ec53 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java @@ -82,7 +82,7 @@ public void beforeTestFailed(Exception ex) throws Exception { public void postAfterTest(TestResult testResult, Method memberInfo, Throwable failedTestException) { if (currentConfiguration().getLifecycle() == Lifecycle.REUSE_IF_STARTED) { - PlaywrightService.current().restartBrowserContext(); + PlaywrightService.restartBrowserContext(); return; } @@ -95,14 +95,14 @@ public void postAfterTest(TestResult testResult, Method memberInfo, Throwable fa } private void shutdownBrowser() { - PlaywrightService.current().close(); + PlaywrightService.close(); PREVIOUS_BROWSER_CONFIGURATION.remove(); } private void startBrowser() { // shutdownBrowser(); try { - PlaywrightService.current().start(currentConfiguration()); + PlaywrightService.start(currentConfiguration()); isBrowserStartedCorrectly(true); } catch (Exception ex) { DebugInformation.printStackTrace(ex); diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/FullPageScreenshotEngine.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/FullPageScreenshotEngine.java index 34ad3d52..f5ba7edd 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/FullPageScreenshotEngine.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/FullPageScreenshotEngine.java @@ -24,7 +24,7 @@ @UtilityClass public class FullPageScreenshotEngine { public static File takeScreenshot() { - var screenshot = PlaywrightService.current().wrappedBrowser().getCurrentPage() + var screenshot = PlaywrightService.wrappedBrowser().getCurrentPage() .screenshot(new Page.ScreenshotOptions() .setFullPage(true) .setType(ScreenshotType.PNG) diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java index 62b8e3ef..e0e3bcca 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java @@ -13,7 +13,6 @@ package solutions.bellatrix.playwright.infrastructure; -import com.azure.core.annotation.Get; import com.google.gson.Gson; import com.microsoft.playwright.Browser; import com.microsoft.playwright.BrowserContext; @@ -22,10 +21,7 @@ import io.restassured.RestAssured; import io.restassured.http.ContentType; import lombok.Getter; -import lombok.Setter; -import lombok.experimental.UtilityClass; import org.apache.commons.lang3.NotImplementedException; -import org.openqa.selenium.WebDriver; import solutions.bellatrix.core.configuration.ConfigurationService; import solutions.bellatrix.core.utilities.DebugInformation; import solutions.bellatrix.core.utilities.ShutdownManager; @@ -49,216 +45,231 @@ @SuppressWarnings("ALL") public class PlaywrightService { - private PlaywrightService() { + private static ThreadLocal PLAYWRIGHT_MANAGER = new ThreadLocal<>(); + + static { + var driverManager = new PlaywrightManager(); + SingletonFactory.register(driverManager); + ShutdownManager.register(driverManager::close); + PLAYWRIGHT_MANAGER.set(driverManager); } - public static PlaywrightService current() { - PlaywrightService service; - if (SingletonFactory.containsKey(PlaywrightService.class)) { - service = SingletonFactory.getInstance(PlaywrightService.class); - } else { - service = new PlaywrightService(); - } + public static WrappedBrowser start(BrowserConfiguration configuration) { + return PLAYWRIGHT_MANAGER.get().start(configuration); + } - SingletonFactory.register(service); - if (ConfigurationService.get(WebSettings.class).isForceCloseBrowser()) { - assert service != null; - ShutdownManager.register(service::close); - } + public static void restartBrowserContext() { + PLAYWRIGHT_MANAGER.get().restartBrowserContext(); + } + public static void close() { + PLAYWRIGHT_MANAGER.get().close(); + } + public static WrappedBrowser wrappedBrowser() { + return PLAYWRIGHT_MANAGER.get().wrappedBrowser; + } + + public static void wrappedBrowser(WrappedBrowser driver) { + PLAYWRIGHT_MANAGER.get().wrappedBrowser = driver; + } - return service; + public static BrowserConfiguration browserConfiguration() { + return PLAYWRIGHT_MANAGER.get().browserConfiguration; } - private boolean disposed = true; - @Getter private BrowserConfiguration browserConfiguration; - private Playwright playwright; - private WrappedBrowser wrappedBrowser; - private boolean isBuildNameSet = false; - private String buildName; + private static class PlaywrightManager { + private PlaywrightManager() { + } + + private boolean disposed = true; + @Getter private BrowserConfiguration browserConfiguration; + private Playwright playwright; + private WrappedBrowser wrappedBrowser; + private boolean isBuildNameSet = false; + private String buildName; - public WrappedBrowser start(BrowserConfiguration configuration) { - if (disposed) { - browserConfiguration(configuration); - playwright = Playwright.create(); - disposed = false; + public WrappedBrowser start(BrowserConfiguration configuration) { + if (disposed) { + browserConfiguration(configuration); + playwright = Playwright.create(); + disposed = false; - var executionType = Settings.web().getExecutionType(); + var executionType = Settings.web().getExecutionType(); - if (executionType.equals("regular")) { - return initializeBrowserWrapperRegularMode(); - } else { - var gridSettings = ConfigurationService.get(WebSettings.class).getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst().orElse(null); - assert gridSettings != null : String.format("The specified execution type '%s' is not declared in the configuration", executionType); + if (executionType.equals("regular")) { + return initializeBrowserWrapperRegularMode(); + } else { + var gridSettings = ConfigurationService.get(WebSettings.class).getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst().orElse(null); + assert gridSettings != null : String.format("The specified execution type '%s' is not declared in the configuration", executionType); - return initializeBrowserWrapperGridMode(gridSettings); + return initializeBrowserWrapperGridMode(gridSettings); + } } + else return wrappedBrowser(); } - else return wrappedBrowser(); - } - public void close() { - if (disposed) { - return; - } + public void close() { + if (disposed) { + return; + } - if (playwright != null) { - DebugInformation.debugInfo("SHUTTING DOWN PLAYWRIGHT"); + if (playwright != null) { + DebugInformation.debugInfo("SHUTTING DOWN PLAYWRIGHT"); - if (wrappedBrowser() != null) { - wrappedBrowser().close(); - } + if (wrappedBrowser() != null) { + wrappedBrowser().close(); + } - playwright = null; + playwright = null; - if (wrappedBrowser().getGridSessionId() != null) { - RestAssured.baseURI = ConfigurationService.get(WebSettings.class).getGridSettings().stream().filter(g -> g.getProviderName().equals(Settings.web().getExecutionType().toLowerCase())).findFirst().orElse(null).getUrl(); + if (wrappedBrowser().getGridSessionId() != null) { + RestAssured.baseURI = ConfigurationService.get(WebSettings.class).getGridSettings().stream().filter(g -> g.getProviderName().equals(Settings.web().getExecutionType().toLowerCase())).findFirst().orElse(null).getUrl(); - var response = RestAssured.given() - .delete(String.format("/session/%s", wrappedBrowser().getGridSessionId())); + var response = RestAssured.given() + .delete(String.format("/session/%s", wrappedBrowser().getGridSessionId())); + } } - } - disposed = true; - } + disposed = true; + } - public void restartBrowserContext() { - DebugInformation.debugInfo("RESTARTING CONTEXT"); - wrappedBrowser().changeContext(intializeBrowserContext()); - } + public void restartBrowserContext() { + DebugInformation.debugInfo("RESTARTING CONTEXT"); + wrappedBrowser().changeContext(intializeBrowserContext()); + } - private WrappedBrowser initializeBrowserWrapperRegularMode() { - wrappedBrowser(new WrappedBrowser(playwright)); + private WrappedBrowser initializeBrowserWrapperRegularMode() { + wrappedBrowser(new WrappedBrowser(playwright)); - wrappedBrowser().setBrowser(initializeBrowserRegularMode()); - wrappedBrowser().setCurrentContext(intializeBrowserContext()); - wrappedBrowser().setCurrentPage(wrappedBrowser().getCurrentContext().newPage()); + wrappedBrowser().setBrowser(initializeBrowserRegularMode()); + wrappedBrowser().setCurrentContext(intializeBrowserContext()); + wrappedBrowser().setCurrentPage(wrappedBrowser().getCurrentContext().newPage()); - return wrappedBrowser(); - } + return wrappedBrowser(); + } - private WrappedBrowser initializeBrowserWrapperGridMode(GridSettings gridSettings) { - wrappedBrowser(new WrappedBrowser(playwright)); + private WrappedBrowser initializeBrowserWrapperGridMode(GridSettings gridSettings) { + wrappedBrowser(new WrappedBrowser(playwright)); - wrappedBrowser().setBrowser(initializeBrowserGridMode(gridSettings)); - wrappedBrowser().setCurrentContext(intializeBrowserContext()); - wrappedBrowser().setCurrentPage(wrappedBrowser().getCurrentContext().newPage()); + wrappedBrowser().setBrowser(initializeBrowserGridMode(gridSettings)); + wrappedBrowser().setCurrentContext(intializeBrowserContext()); + wrappedBrowser().setCurrentPage(wrappedBrowser().getCurrentContext().newPage()); - return wrappedBrowser(); - } + return wrappedBrowser(); + } - private Browser initializeBrowserRegularMode() { - BrowserTypes browserTypes = browserConfiguration().getBrowserTypes(); + private Browser initializeBrowserRegularMode() { + BrowserTypes browserTypes = browserConfiguration().getBrowserTypes(); - switch (browserTypes) { - case CHROMIUM -> { - var browserType = playwright.chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(false); - launchOptions.setArgs(List.of("--log-level=3", "--remote-allow-origins=*")); - launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? + switch (browserTypes) { + case CHROMIUM -> { + var browserType = playwright.chromium(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setHeadless(false); + launchOptions.setArgs(List.of("--log-level=3", "--remote-allow-origins=*")); + launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); + // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - return browser(browserType.launch(launchOptions)); - } - case CHROMIUM_HEADLESS -> { - var browserType = playwright.chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(true); - launchOptions.setArgs(List.of("--log-level=3")); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case CHROME -> { - var browserType = playwright.chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setChannel("chrome"); - launchOptions.setHeadless(false); - launchOptions.setArgs(List.of("--log-level=3", "--remote-allow-origins=*")); - launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case CHROME_HEADLESS -> { - var browserType = playwright.chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setChannel("chrome"); - launchOptions.setHeadless(true); - launchOptions.setArgs(List.of("--log-level=3")); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case FIREFOX -> { - var browserType = playwright.firefox(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(false); - launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); + return browser(browserType.launch(launchOptions)); + } + case CHROMIUM_HEADLESS -> { + var browserType = playwright.chromium(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setHeadless(true); + launchOptions.setArgs(List.of("--log-level=3")); + // System.setProperty("webdriver.chrome.silentOutput", "true"); ? + + return browser(browserType.launch(launchOptions)); + } + case CHROME -> { + var browserType = playwright.chromium(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setChannel("chrome"); + launchOptions.setHeadless(false); + launchOptions.setArgs(List.of("--log-level=3", "--remote-allow-origins=*")); + launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); + // System.setProperty("webdriver.chrome.silentOutput", "true"); ? + + return browser(browserType.launch(launchOptions)); + } + case CHROME_HEADLESS -> { + var browserType = playwright.chromium(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setChannel("chrome"); + launchOptions.setHeadless(true); + launchOptions.setArgs(List.of("--log-level=3")); + // System.setProperty("webdriver.chrome.silentOutput", "true"); ? + + return browser(browserType.launch(launchOptions)); + } + case FIREFOX -> { + var browserType = playwright.firefox(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setHeadless(false); + launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); - return browser(browserType.launch(launchOptions)); - } - case FIREFOX_HEADLESS -> { - var browserType = playwright.firefox(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(true); + return browser(browserType.launch(launchOptions)); + } + case FIREFOX_HEADLESS -> { + var browserType = playwright.firefox(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setHeadless(true); - return browser(browserType.launch(launchOptions)); - } - case EDGE -> { - var browserType = playwright.chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setChannel("msedge"); - launchOptions.setHeadless(false); - // launchOptions.setArgs(List.of("--log-level=3")); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case EDGE_HEADLESS -> { - var browserType = playwright.chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setChannel("msedge"); - launchOptions.setHeadless(true); - // launchOptions.setArgs(List.of("--log-level=3")); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case WEBKIT -> { - var browserType = playwright.webkit(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(false); - launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); + return browser(browserType.launch(launchOptions)); + } + case EDGE -> { + var browserType = playwright.chromium(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setChannel("msedge"); + launchOptions.setHeadless(false); + // launchOptions.setArgs(List.of("--log-level=3")); + // System.setProperty("webdriver.chrome.silentOutput", "true"); ? + + return browser(browserType.launch(launchOptions)); + } + case EDGE_HEADLESS -> { + var browserType = playwright.chromium(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setChannel("msedge"); + launchOptions.setHeadless(true); + // launchOptions.setArgs(List.of("--log-level=3")); + // System.setProperty("webdriver.chrome.silentOutput", "true"); ? + + return browser(browserType.launch(launchOptions)); + } + case WEBKIT -> { + var browserType = playwright.webkit(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setHeadless(false); + launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); - return browser(browserType.launch(launchOptions)); - } - case WEBKIT_HEADLESS -> { - var browserType = playwright.webkit(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(true); + return browser(browserType.launch(launchOptions)); + } + case WEBKIT_HEADLESS -> { + var browserType = playwright.webkit(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setHeadless(true); - return browser(browserType.launch(launchOptions)); + return browser(browserType.launch(launchOptions)); + } + default -> throw new IllegalArgumentException("Unsupported."); } - default -> throw new IllegalArgumentException("Unsupported."); } - } - private BrowserContext intializeBrowserContext() { - Browser.NewContextOptions options = getContextOptions(); - var context = browser().newContext(options); + private BrowserContext intializeBrowserContext() { + Browser.NewContextOptions options = getContextOptions(); + var context = browser().newContext(options); - if (Settings.web().getShouldCaptureHttpTraffic()) { - startRecordingHttpTraffic(context); - } + if (Settings.web().getShouldCaptureHttpTraffic()) { + startRecordingHttpTraffic(context); + } - return context; - } + return context; + } - // ToDo Browser Context options - private Browser.NewContextOptions getContextOptions() { - Browser.NewContextOptions options = new Browser.NewContextOptions(); + // ToDo Browser Context options + private Browser.NewContextOptions getContextOptions() { + Browser.NewContextOptions options = new Browser.NewContextOptions(); // if (Settings.context().isShouldSetContextSettings()) { // options.setIgnoreHTTPSErrors(Settings.context().isIgnoreHTTPSErrors()); @@ -273,143 +284,144 @@ private Browser.NewContextOptions getContextOptions() { // options.setUserAgent(Settings.context().getUserAgent()); // } - options.setIgnoreHTTPSErrors(true); - - // ToDo setProxy - - return options; - } + options.setIgnoreHTTPSErrors(true); - private void startRecordingHttpTraffic(BrowserContext context) { - Traffic.getRequestContainers().add(new Requests(context)); - context.onRequest(x -> Traffic.getContextSpecificRequests(context).add(x)); + // ToDo setProxy - Traffic.getResponseContainers().add(new Responses(context)); - context.onResponse(x -> Traffic.getContextSpecificResponses(context).add(x)); - } + return options; + } - private Browser initializeBrowserGridMode(GridSettings gridSettings) { - var timeout = Settings.timeout().inMilliseconds().getConnectToRemoteGridTimeout(); + private void startRecordingHttpTraffic(BrowserContext context) { + Traffic.getRequestContainers().add(new Requests(context)); + context.onRequest(x -> Traffic.getContextSpecificRequests(context).add(x)); - var gridUrl = gridSettings.getUrl(); - if (gridUrl.startsWith("env_")) { - gridUrl = System.getProperty(gridSettings.getUrl()).replace("env_", ""); + Traffic.getResponseContainers().add(new Responses(context)); + context.onResponse(x -> Traffic.getContextSpecificResponses(context).add(x)); } - try { - Gson gson = new Gson(); - String serializedSettings = URLEncoder.encode(gson.toJson(gridSettings.getArguments().get(0)), "UTF-8"); + private Browser initializeBrowserGridMode(GridSettings gridSettings) { + var timeout = Settings.timeout().inMilliseconds().getConnectToRemoteGridTimeout(); - if (gridSettings.getProviderName().equals("grid") || gridSettings.getProviderName().equals("selenoid")) { - var browserType = browserConfiguration.getBrowserTypes(); - if (browserType == BrowserTypes.FIREFOX || browserType == BrowserTypes.FIREFOX_HEADLESS || browserType == BrowserTypes.WEBKIT || browserType == BrowserTypes.WEBKIT_HEADLESS) { - throw new NotImplementedException("Playwright supports running in Selenium Grid only Chromium browsers."); - } + var gridUrl = gridSettings.getUrl(); + if (gridUrl.startsWith("env_")) { + gridUrl = System.getProperty(gridSettings.getUrl()).replace("env_", ""); + } + + try { + Gson gson = new Gson(); + String serializedSettings = URLEncoder.encode(gson.toJson(gridSettings.getArguments().get(0)), "UTF-8"); - RestAssured.baseURI = gridUrl; - Map capabilitiesMap = new HashMap<>(); - capabilitiesMap.put("alwaysMatch", gridSettings.getArguments().get(0)); + if (gridSettings.getProviderName().equals("grid") || gridSettings.getProviderName().equals("selenoid")) { + var browserType = browserConfiguration.getBrowserTypes(); + if (browserType == BrowserTypes.FIREFOX || browserType == BrowserTypes.FIREFOX_HEADLESS || browserType == BrowserTypes.WEBKIT || browserType == BrowserTypes.WEBKIT_HEADLESS) { + throw new NotImplementedException("Playwright supports running in Selenium Grid only Chromium browsers."); + } - Map body = new HashMap<>(); - body.put("capabilities", capabilitiesMap); + RestAssured.baseURI = gridUrl; + Map capabilitiesMap = new HashMap<>(); + capabilitiesMap.put("alwaysMatch", gridSettings.getArguments().get(0)); - var serializedBody = gson.toJson(body); + Map body = new HashMap<>(); + body.put("capabilities", capabilitiesMap); - var response = RestAssured.given() - .contentType(ContentType.JSON) - .body(serializedBody) - .post("/session"); + var serializedBody = gson.toJson(body); - wrappedBrowser().setGridSessionId(response.body().jsonPath().get("value.sessionId")); + var response = RestAssured.given() + .contentType(ContentType.JSON) + .body(serializedBody) + .post("/session"); - var responseBody = response.body(); - var responseJson = response.jsonPath(); + wrappedBrowser().setGridSessionId(response.body().jsonPath().get("value.sessionId")); - var cdpUrl = new URI(response.jsonPath().get("value.capabilities['se:cdp']")); - cdpUrl = new URI(cdpUrl.getScheme(), cdpUrl.getUserInfo(), new URI(gridUrl).getHost(), new URI(gridUrl).getPort(), cdpUrl.getPath(), cdpUrl.getQuery(), cdpUrl.getFragment()); + var responseBody = response.body(); + var responseJson = response.jsonPath(); - return playwright.chromium().connectOverCDP(cdpUrl.toString(), new BrowserType.ConnectOverCDPOptions().setTimeout(timeout)); - } else if (gridSettings.getProviderName().equals("lambdatest")) { - return playwright.chromium().connect(String.format("%s?capabilities=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); - } else if (gridSettings.getProviderName().equals("browserstack")) { - return playwright.chromium().connect(String.format("%s?caps=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); - } else { - throw new NotImplementedException("Unsupported grid provider. Supported are: selenium grid, selenoid, lambdatest, and browserstack."); - } - } catch (Exception e) { - DebugInformation.printStackTrace(e); - return null; - } - } + var cdpUrl = new URI(response.jsonPath().get("value.capabilities['se:cdp']")); + cdpUrl = new URI(cdpUrl.getScheme(), cdpUrl.getUserInfo(), new URI(gridUrl).getHost(), new URI(gridUrl).getPort(), cdpUrl.getPath(), cdpUrl.getQuery(), cdpUrl.getFragment()); - private void changeWindowSize() { - try { - if (browserConfiguration().getHeight() != 0 && browserConfiguration().getWidth() != 0) { - wrappedBrowser().getCurrentPage().setViewportSize(browserConfiguration().getWidth(), browserConfiguration().getHeight()); + return playwright.chromium().connectOverCDP(cdpUrl.toString(), new BrowserType.ConnectOverCDPOptions().setTimeout(timeout)); + } else if (gridSettings.getProviderName().equals("lambdatest")) { + return playwright.chromium().connect(String.format("%s?capabilities=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); + } else if (gridSettings.getProviderName().equals("browserstack")) { + return playwright.chromium().connect(String.format("%s?caps=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); + } else { + throw new NotImplementedException("Unsupported grid provider. Supported are: selenium grid, selenoid, lambdatest, and browserstack."); + } + } catch (Exception e) { + DebugInformation.printStackTrace(e); + return null; } - } catch (Exception ignored) {} - } - - private String getBuildName() { - if (!isBuildNameSet) { - buildName = System.getProperty("buildName"); } - if (buildName == null) { - InputStream input = ConfigurationService.class.getResourceAsStream("/application.properties"); - var p = new Properties(); + private void changeWindowSize() { try { - p.load(input); - } catch (IOException e) { - return null; - } + if (browserConfiguration().getHeight() != 0 && browserConfiguration().getWidth() != 0) { + wrappedBrowser().getCurrentPage().setViewportSize(browserConfiguration().getWidth(), browserConfiguration().getHeight()); + } + } catch (Exception ignored) {} + } + private String getBuildName() { if (!isBuildNameSet) { - buildName = p.getProperty("buildName"); + buildName = System.getProperty("buildName"); } - if (buildName.equals("{randomNumber}") && !isBuildNameSet) { - buildName = TimestampBuilder.buildUniqueTextByPrefix("LE_"); - isBuildNameSet = true; + if (buildName == null) { + InputStream input = ConfigurationService.class.getResourceAsStream("/application.properties"); + var p = new Properties(); + try { + p.load(input); + } catch (IOException e) { + return null; + } + + if (!isBuildNameSet) { + buildName = p.getProperty("buildName"); + } + + if (buildName.equals("{randomNumber}") && !isBuildNameSet) { + buildName = TimestampBuilder.buildUniqueTextByPrefix("LE_"); + isBuildNameSet = true; + } } - } - return buildName; - } + return buildName; + } - public BrowserConfiguration browserConfiguration() { - return browserConfiguration; - } + public BrowserConfiguration browserConfiguration() { + return browserConfiguration; + } - public BrowserConfiguration browserConfiguration(BrowserConfiguration configuration) { - browserConfiguration = configuration; - return browserConfiguration(); - } + public BrowserConfiguration browserConfiguration(BrowserConfiguration configuration) { + browserConfiguration = configuration; + return browserConfiguration(); + } - public WrappedBrowser wrappedBrowser() { - return wrappedBrowser; - } + public WrappedBrowser wrappedBrowser() { + return wrappedBrowser; + } - public WrappedBrowser wrappedBrowser(WrappedBrowser wrappedBrowser) { - this.wrappedBrowser = wrappedBrowser; - return this.wrappedBrowser; - } + public WrappedBrowser wrappedBrowser(WrappedBrowser wrappedBrowser) { + this.wrappedBrowser = wrappedBrowser; + return this.wrappedBrowser; + } - private Browser browser() { - return wrappedBrowser().getBrowser(); - } + private Browser browser() { + return wrappedBrowser().getBrowser(); + } - private Browser browser(Browser browser) { - wrappedBrowser().setBrowser(browser); - return browser(); - } + private Browser browser(Browser browser) { + wrappedBrowser().setBrowser(browser); + return browser(); + } - private BrowserContext context() { - return wrappedBrowser().getCurrentContext(); - } + private BrowserContext context() { + return wrappedBrowser().getCurrentContext(); + } - private BrowserContext context(BrowserContext browserContext) { - wrappedBrowser().setCurrentContext(browserContext); - return context(); + private BrowserContext context(BrowserContext browserContext) { + wrappedBrowser().setCurrentContext(browserContext); + return context(); + } } } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/WebScreenshotPlugin.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/WebScreenshotPlugin.java index d4012feb..e8c1ab98 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/WebScreenshotPlugin.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/WebScreenshotPlugin.java @@ -36,7 +36,7 @@ public String takeScreenshot(String name) { var filename = getUniqueFileName(name); var path = Paths.get(screenshotSaveDir, filename); - var screenshot = PlaywrightService.current().wrappedBrowser().getCurrentPage() + var screenshot = PlaywrightService.wrappedBrowser().getCurrentPage() .screenshot(new Page.ScreenshotOptions() .setPath(path) .setType(ScreenshotType.PNG) @@ -51,7 +51,7 @@ public String takeScreenshot(String name) { @Override public String takeScreenshot(String screenshotSaveDir, String filename) { var path = Paths.get(screenshotSaveDir, filename); - var screenshot = PlaywrightService.current().wrappedBrowser().getCurrentPage() + var screenshot = PlaywrightService.wrappedBrowser().getCurrentPage() .screenshot(new Page.ScreenshotOptions() .setPath(path) .setType(ScreenshotType.PNG) diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/WrappedBrowser.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/WrappedBrowser.java index bbfa7877..05368fb4 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/WrappedBrowser.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/WrappedBrowser.java @@ -45,10 +45,6 @@ public WrappedBrowser(Playwright playwright, Browser browser, BrowserContext con private String gridSessionId; public void close() { - // Close everything manually - for (var page : currentContext.pages()) page.close(); - for (var context : browser.contexts()) context.close(); - browser.close(); playwright.close(); } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/App.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/App.java index 24b6aa25..8783ac31 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/App.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/App.java @@ -80,7 +80,7 @@ public void close() { return; } - PlaywrightService.current().close(); + PlaywrightService.close(); disposed = true; } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/WebService.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/WebService.java index 43514525..b45fb62c 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/WebService.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/services/WebService.java @@ -18,6 +18,6 @@ public abstract class WebService { protected static WrappedBrowser wrappedBrowser() { - return PlaywrightService.current().wrappedBrowser(); + return PlaywrightService.wrappedBrowser(); } } 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 1f411247..4b17d3f4 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 @@ -91,7 +91,7 @@ public WebComponent() { browserService = new BrowserService(); componentCreateService = new ComponentCreateService(); componentWaitService = new ComponentWaitService(); - wrappedDriver = DriverService.current().getWrappedDriver(); + wrappedDriver = DriverService.getWrappedDriver(); } /** @@ -720,7 +720,7 @@ public List shadowRootCreateAllByI public void highlight() { if (this.getWrappedElement() instanceof ShadowHost) return; - var currentBrowser = DriverService.current().getBrowserConfiguration().getBrowser(); + var currentBrowser = DriverService.getBrowserConfiguration().getBrowser(); if (currentBrowser == Browser.CHROME_HEADLESS) return; 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 51bc5ecc..550273ab 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 @@ -92,14 +92,14 @@ public void postAfterTest(TestResult testResult, Method memberInfo, Throwable fa } private void shutdownBrowser() { - DriverService.current().close(); + DriverService.close(); PREVIOUS_BROWSER_CONFIGURATION.remove(); } private void startBrowser() { // shutdownBrowser(); try { - DriverService.current().start(CURRENT_BROWSER_CONFIGURATION.get()); + DriverService.start(CURRENT_BROWSER_CONFIGURATION.get()); IS_BROWSER_STARTED_CORRECTLY.set(true); } catch (Exception ex) { DebugInformation.printStackTrace(ex); 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 7cd21544..3a77360a 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,8 +13,7 @@ package solutions.bellatrix.web.infrastructure; -import lombok.Getter; -import lombok.Setter; +import lombok.experimental.UtilityClass; import net.lightbody.bmp.client.ClientUtil; import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; @@ -47,441 +46,463 @@ import static io.restassured.RestAssured.given; +@UtilityClass public class DriverService { - private DriverService() { + private static ThreadLocal DRIVER_MANAGER = new ThreadLocal<>(); + + static { + var driverManager = new DriverManager(); + SingletonFactory.register(driverManager); + ShutdownManager.register(driverManager::close); + DRIVER_MANAGER.set(driverManager); } - public static DriverService current() { - DriverService service; - if (SingletonFactory.containsKey(DriverService.class)) { - service = SingletonFactory.getInstance(DriverService.class); - } else { - service = new DriverService(); - } + public static WebDriver start(BrowserConfiguration configuration) { + return DRIVER_MANAGER.get().start(configuration); + } - SingletonFactory.register(service); - if (ConfigurationService.get(WebSettings.class).isForceCloseBrowser()) { - assert service != null; - ShutdownManager.register(service::close); - } + public static void close() { + DRIVER_MANAGER.get().close(); + } + public static WebDriver getWrappedDriver() { + return DRIVER_MANAGER.get().wrappedDriver; + } - return service; + public static void setWrappedDriver(WebDriver driver) { + DRIVER_MANAGER.get().wrappedDriver = driver; } - private boolean disposed = true; - @Getter private BrowserConfiguration browserConfiguration; - @Getter private final Map customDriverOptions = new HashMap<>(); - @Getter @Setter private WebDriver wrappedDriver; - private boolean isBuildNameSet = false; - private String buildName; + public static BrowserConfiguration getBrowserConfiguration() { + return DRIVER_MANAGER.get().browserConfiguration; + } - public void addDriverOptions(String key, String value) { - customDriverOptions.put(key, value); + public static Map getCustomDriverOptions() { + return DRIVER_MANAGER.get().customDriverOptions; } - public WebDriver start(BrowserConfiguration configuration) { - if (disposed) { - browserConfiguration = configuration; - disposed = false; + public static void addDriverOptions(String key, String value) { + DRIVER_MANAGER.get().addDriverOptions(key, value); + } - WebDriver driver; - var webSettings = ConfigurationService.get(WebSettings.class); - var executionType = webSettings.getExecutionType(); + private static class DriverManager { + private DriverManager() { + } - if (executionType.equals("regular")) { - driver = initializeDriverRegularMode(); - } else { - var gridSettings = webSettings.getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst(); - assert gridSettings.isPresent() : String.format("The specified execution type '%s' is not declared in the configuration", executionType); - driver = initializeDriverCloudGridMode(gridSettings.get()); - } + private boolean disposed = true; + private BrowserConfiguration browserConfiguration; + private final Map customDriverOptions = new HashMap<>(); + private WebDriver wrappedDriver; + private boolean isBuildNameSet = false; + private String buildName; - driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getPageLoadTimeout())); - driver.manage().timeouts().scriptTimeout(Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getScriptTimeout())); + private void addDriverOptions(String key, String value) { + customDriverOptions.put(key, value); + } - if(getBrowserConfiguration().getHeight() != 0 && getBrowserConfiguration().getWidth() != 0) { - changeWindowSize(driver); - } - else { - driver.manage().window().maximize(); - } + private WebDriver start(BrowserConfiguration configuration) { + if (disposed) { + browserConfiguration = configuration; + disposed = false; - Log.info(String.format("Window resized to dimensions: %s", driver.manage().window().getSize().toString())); - wrappedDriver = driver; + WebDriver driver; + var webSettings = ConfigurationService.get(WebSettings.class); + var executionType = webSettings.getExecutionType(); - return driver; - } else return wrappedDriver; - } + if (executionType.equals("regular")) { + driver = initializeDriverRegularMode(); + } else { + var gridSettings = webSettings.getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst(); + assert gridSettings.isPresent() : String.format("The specified execution type '%s' is not declared in the configuration", executionType); + driver = initializeDriverCloudGridMode(gridSettings.get()); + } - private WebDriver initializeDriverCloudGridMode(GridSettings gridSettings) { - MutableCapabilities caps = new MutableCapabilities(); + driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getPageLoadTimeout())); + driver.manage().timeouts().scriptTimeout(Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getScriptTimeout())); - switch (browserConfiguration.getBrowser()) { - case CHROME_HEADLESS, CHROME -> { - var chromeOptions = new ChromeOptions(); - caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); - } - case FIREFOX_HEADLESS, FIREFOX -> { - var firefoxOptions = new FirefoxOptions(); - caps.setCapability(ChromeOptions.CAPABILITY, firefoxOptions); - } - case EDGE_HEADLESS, EDGE -> { - var edgeOptions = new EdgeOptions(); - caps.setCapability(ChromeOptions.CAPABILITY, edgeOptions); - } - case SAFARI -> { - var safariOptions = new SafariOptions(); - caps.setCapability(ChromeOptions.CAPABILITY, safariOptions); - } + 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())); + wrappedDriver = driver; + + return driver; + } else return wrappedDriver; } - HashMap options = new HashMap(); + private WebDriver initializeDriverCloudGridMode(GridSettings gridSettings) { + MutableCapabilities caps = new MutableCapabilities(); - // Anton: maybe this is something else for other clouds, should be tested. - // If this is the case, we need to have branching per provider name. - options.put("sessionName", getBrowserConfiguration().getTestName()); - // if (gridSettings.getProviderName() == "browserstack") { - // options.put("sessionName", getBrowserConfiguration().getTestName()); - // } + switch (browserConfiguration.getBrowser()) { + case CHROME_HEADLESS, CHROME -> { + var chromeOptions = new ChromeOptions(); + caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); + } + case FIREFOX_HEADLESS, FIREFOX -> { + var firefoxOptions = new FirefoxOptions(); + caps.setCapability(ChromeOptions.CAPABILITY, firefoxOptions); + } + case EDGE_HEADLESS, EDGE -> { + var edgeOptions = new EdgeOptions(); + caps.setCapability(ChromeOptions.CAPABILITY, edgeOptions); + } + case SAFARI -> { + var safariOptions = new SafariOptions(); + caps.setCapability(ChromeOptions.CAPABILITY, safariOptions); + } + } - addGridOptions(options, gridSettings); + HashMap options = new HashMap(); - caps.setCapability(gridSettings.getOptionsName(), options); - WebDriver driver = null; - try { - var url = getUrl(gridSettings.getUrl()); - driver = new RemoteWebDriver(new URI(url).toURL(), caps); - } catch (Exception e) { - DebugInformation.printStackTrace(e); - } + // Anton: maybe this is something else for other clouds, should be tested. + // If this is the case, we need to have branching per provider name. + options.put("sessionName", getBrowserConfiguration().getTestName()); + // if (gridSettings.getProviderName() == "browserstack") { + // options.put("sessionName", getBrowserConfiguration().getTestName()); + // } - return driver; - } + addGridOptions(options, gridSettings); - private WebDriver initializeDriverGridMode(GridSettings gridSettings) { - var caps = new DesiredCapabilities(); - if (browserConfiguration.getPlatform() != Platform.ANY) { - caps.setCapability("platform", browserConfiguration.getPlatform()); - } + caps.setCapability(gridSettings.getOptionsName(), options); + WebDriver driver = null; + try { + var url = getUrl(gridSettings.getUrl()); + driver = new RemoteWebDriver(new URI(url).toURL(), caps); + } catch (Exception e) { + DebugInformation.printStackTrace(e); + } - if (browserConfiguration.getVersion() != 0) { - caps.setCapability("version", browserConfiguration.getVersion()); - } else { - caps.setCapability("version", "latest"); + return driver; } - switch (browserConfiguration.getBrowser()) { - case CHROME_HEADLESS, CHROME -> { - var chromeOptions = new ChromeOptions(); - addGridOptions(chromeOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); - } - case FIREFOX_HEADLESS, FIREFOX -> { - var firefoxOptions = new FirefoxOptions(); - addGridOptions(firefoxOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, firefoxOptions); + private WebDriver initializeDriverGridMode(GridSettings gridSettings) { + var caps = new DesiredCapabilities(); + if (browserConfiguration.getPlatform() != Platform.ANY) { + caps.setCapability("platform", browserConfiguration.getPlatform()); } - case EDGE_HEADLESS, EDGE -> { - var edgeOptions = new EdgeOptions(); - addGridOptions(edgeOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, edgeOptions); - } - case SAFARI -> { - var safariOptions = new SafariOptions(); - addGridOptions(safariOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, safariOptions); + + if (browserConfiguration.getVersion() != 0) { + caps.setCapability("version", browserConfiguration.getVersion()); + } else { + caps.setCapability("version", "latest"); } - case INTERNET_EXPLORER -> { - var ieOptions = new InternetExplorerOptions(); - addGridOptions(ieOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, ieOptions); + + switch (browserConfiguration.getBrowser()) { + case CHROME_HEADLESS, CHROME -> { + var chromeOptions = new ChromeOptions(); + addGridOptions(chromeOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); + } + case FIREFOX_HEADLESS, FIREFOX -> { + var firefoxOptions = new FirefoxOptions(); + addGridOptions(firefoxOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, firefoxOptions); + } + case EDGE_HEADLESS, EDGE -> { + var edgeOptions = new EdgeOptions(); + addGridOptions(edgeOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, edgeOptions); + } + case SAFARI -> { + var safariOptions = new SafariOptions(); + addGridOptions(safariOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, safariOptions); + } + case INTERNET_EXPLORER -> { + var ieOptions = new InternetExplorerOptions(); + addGridOptions(ieOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, ieOptions); + } } - } - WebDriver driver = null; - try { - var gridUrl = gridSettings.getUrl(); - var url = getUrl(gridUrl); + WebDriver driver = null; + try { + var gridUrl = gridSettings.getUrl(); + var url = getUrl(gridUrl); + + driver = new RemoteWebDriver(new URI(url).toURL(), caps); + } catch (MalformedURLException | URISyntaxException e) { + DebugInformation.printStackTrace(e); + } - driver = new RemoteWebDriver(new URI(url).toURL(), caps); - } catch (MalformedURLException | URISyntaxException e) { - DebugInformation.printStackTrace(e); + return driver; } - return driver; - } + private WebDriver initializeDriverRegularMode() { + WebDriver driver = null; + boolean shouldCaptureHttpTraffic = ConfigurationService.get(WebSettings.class).getShouldCaptureHttpTraffic(); - private WebDriver initializeDriverRegularMode() { - WebDriver driver = null; - boolean shouldCaptureHttpTraffic = ConfigurationService.get(WebSettings.class).getShouldCaptureHttpTraffic(); + Proxy proxyConfig = null; + if (shouldCaptureHttpTraffic) { + ProxyServer.init(); + proxyConfig = ClientUtil.createSeleniumProxy(ProxyServer.get()); + ProxyServer.newHar(); + } - Proxy proxyConfig = null; - if (shouldCaptureHttpTraffic) { - ProxyServer.init(); - proxyConfig = ClientUtil.createSeleniumProxy(ProxyServer.get()); - ProxyServer.newHar(); - } + switch (browserConfiguration.getBrowser()) { + 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); + System.setProperty("webdriver.chrome.silentOutput", "true"); + if (shouldCaptureHttpTraffic) { + chromeOptions.setProxy(proxyConfig); + } - switch (browserConfiguration.getBrowser()) { - 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); - System.setProperty("webdriver.chrome.silentOutput", "true"); - if (shouldCaptureHttpTraffic) { - chromeOptions.setProxy(proxyConfig); + driver = new ChromeDriver(chromeOptions); } + case CHROME_HEADLESS -> { + 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); + chromeHeadlessOptions.addArguments("--headless=old"); + System.setProperty("webdriver.chrome.silentOutput", "true"); + if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); + + 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); - driver = new ChromeDriver(chromeOptions); - } - case CHROME_HEADLESS -> { - 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); - chromeHeadlessOptions.addArguments("--headless=old"); - System.setProperty("webdriver.chrome.silentOutput", "true"); - if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); - - 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", browserConfiguration.getDeviceName().getName()); - var deviceNameOption = new HashMap(); - deviceNameOption.put("deviceName", browserConfiguration.getDeviceName().getName()); + chromeHeadlessOptions.setExperimentalOption("mobileEmulation", deviceNameOption); + System.setProperty("webdriver.chrome.silentOutput", "true"); + if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); - chromeHeadlessOptions.setExperimentalOption("mobileEmulation", deviceNameOption); - System.setProperty("webdriver.chrome.silentOutput", "true"); - if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); + driver = new TouchableWebDriver(chromeHeadlessOptions); + } - driver = new TouchableWebDriver(chromeHeadlessOptions); + case FIREFOX -> { + var firefoxOptions = new FirefoxOptions(); + addDriverOptions(firefoxOptions); + firefoxOptions.setAcceptInsecureCerts(true); + if (shouldCaptureHttpTraffic) firefoxOptions.setProxy(proxyConfig); + driver = new FirefoxDriver(firefoxOptions); + } + case FIREFOX_HEADLESS -> { + var firefoxHeadlessOptions = new FirefoxOptions(); + addDriverOptions(firefoxHeadlessOptions); + firefoxHeadlessOptions.setAcceptInsecureCerts(true); + firefoxHeadlessOptions.addArguments("--headless"); + if (shouldCaptureHttpTraffic) firefoxHeadlessOptions.setProxy(proxyConfig); + driver = new FirefoxDriver(firefoxHeadlessOptions); + } + case EDGE -> { + var edgeOptions = new EdgeOptions(); + addDriverOptions(edgeOptions); + if (shouldCaptureHttpTraffic) edgeOptions.setProxy(proxyConfig); + driver = new EdgeDriver(edgeOptions); + } + case EDGE_HEADLESS -> { + var edgeOptions = new EdgeOptions(); + edgeOptions.addArguments("--headless"); + edgeOptions.addArguments("--disable-gpu"); + addDriverOptions(edgeOptions); + if (shouldCaptureHttpTraffic) edgeOptions.setProxy(proxyConfig); + driver = new EdgeDriver(edgeOptions); + } + case SAFARI -> { + System.setProperty("webdriver.safari.driver", "/usr/bin/safaridriver"); + var safariOptions = new SafariOptions(); + addDriverOptions(safariOptions); + if (shouldCaptureHttpTraffic) safariOptions.setProxy(proxyConfig); + driver = new SafariDriver(safariOptions); + } + case INTERNET_EXPLORER -> { + var internetExplorerOptions = new InternetExplorerOptions(); + addDriverOptions(internetExplorerOptions); + internetExplorerOptions.introduceFlakinessByIgnoringSecurityDomains().ignoreZoomSettings(); + if (shouldCaptureHttpTraffic) internetExplorerOptions.setProxy(proxyConfig); + driver = new InternetExplorerDriver(internetExplorerOptions); + } } - case FIREFOX -> { - var firefoxOptions = new FirefoxOptions(); - addDriverOptions(firefoxOptions); - firefoxOptions.setAcceptInsecureCerts(true); - if (shouldCaptureHttpTraffic) firefoxOptions.setProxy(proxyConfig); - driver = new FirefoxDriver(firefoxOptions); - } - case FIREFOX_HEADLESS -> { - var firefoxHeadlessOptions = new FirefoxOptions(); - addDriverOptions(firefoxHeadlessOptions); - firefoxHeadlessOptions.setAcceptInsecureCerts(true); - firefoxHeadlessOptions.addArguments("--headless"); - if (shouldCaptureHttpTraffic) firefoxHeadlessOptions.setProxy(proxyConfig); - driver = new FirefoxDriver(firefoxHeadlessOptions); - } - case EDGE -> { - var edgeOptions = new EdgeOptions(); - addDriverOptions(edgeOptions); - if (shouldCaptureHttpTraffic) edgeOptions.setProxy(proxyConfig); - driver = new EdgeDriver(edgeOptions); - } - case EDGE_HEADLESS -> { - var edgeOptions = new EdgeOptions(); - edgeOptions.addArguments("--headless"); - edgeOptions.addArguments("--disable-gpu"); - addDriverOptions(edgeOptions); - if (shouldCaptureHttpTraffic) edgeOptions.setProxy(proxyConfig); - driver = new EdgeDriver(edgeOptions); - } - case SAFARI -> { - System.setProperty("webdriver.safari.driver", "/usr/bin/safaridriver"); - var safariOptions = new SafariOptions(); - addDriverOptions(safariOptions); - if (shouldCaptureHttpTraffic) safariOptions.setProxy(proxyConfig); - driver = new SafariDriver(safariOptions); - } - case INTERNET_EXPLORER -> { - var internetExplorerOptions = new InternetExplorerOptions(); - addDriverOptions(internetExplorerOptions); - internetExplorerOptions.introduceFlakinessByIgnoringSecurityDomains().ignoreZoomSettings(); - if (shouldCaptureHttpTraffic) internetExplorerOptions.setProxy(proxyConfig); - driver = new InternetExplorerDriver(internetExplorerOptions); - } + return driver; } - return driver; - } - - private 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 void addGridOptions(HashMap options, GridSettings gridSettings) { - Log.info("Add WebDriver Options:"); - Log.info(""); - for (var entry : gridSettings.getArguments()) { - for (var c : entry.entrySet()) { - if (c.getKey().toLowerCase().contains("build")) { - var buildName = getBuildName(); - if (buildName == null) { - buildName = c.getValue().toString(); - } + private 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; + } - options.put(c.getKey(), buildName); - Log.info(c.getKey() + " = " + buildName); - } else { - if (c.getValue() instanceof String && c.getValue().toString().startsWith("{env_")) { - var envValue = SecretsResolver.getSecret(c.getValue().toString()); - options.put(c.getKey(), envValue); - Log.info(c.getKey() + " = " + envValue); + private void addGridOptions(HashMap options, GridSettings gridSettings) { + Log.info("Add WebDriver Options:"); + Log.info(""); + for (var entry : gridSettings.getArguments()) { + for (var c : entry.entrySet()) { + if (c.getKey().toLowerCase().contains("build")) { + var buildName = getBuildName(); + if (buildName == null) { + buildName = c.getValue().toString(); + } + + options.put(c.getKey(), buildName); + Log.info(c.getKey() + " = " + buildName); } else { - options.put(c.getKey(), c.getValue()); - Log.info(c.getKey() + " = " + c.getValue()); + if (c.getValue() instanceof String && c.getValue().toString().startsWith("{env_")) { + var envValue = SecretsResolver.getSecret(c.getValue().toString()); + options.put(c.getKey(), envValue); + Log.info(c.getKey() + " = " + envValue); + } else { + options.put(c.getKey(), c.getValue()); + Log.info(c.getKey() + " = " + c.getValue()); + } } } - } - if ("lambdatest".equalsIgnoreCase(gridSettings.getProviderName())) { - options.put("lambdaMaskCommands", new String[]{"setValues", "setCookies", "getCookies"}); + if ("lambdatest".equalsIgnoreCase(gridSettings.getProviderName())) { + options.put("lambdaMaskCommands", new String[]{"setValues", "setCookies", "getCookies"}); - try { - var usernameSecret = gridSettings.getArguments().get(0).get("username").toString(); - var accessKeySecret = gridSettings.getArguments().get(0).get("accessKey").toString(); - var usernameValue = SecretsResolver.getSecret(usernameSecret); - var accessKeyValue = SecretsResolver.getSecret(accessKeySecret); + try { + var usernameSecret = gridSettings.getArguments().get(0).get("username").toString(); + var accessKeySecret = gridSettings.getArguments().get(0).get("accessKey").toString(); + var usernameValue = SecretsResolver.getSecret(usernameSecret); + var accessKeyValue = SecretsResolver.getSecret(accessKeySecret); - var res = given().auth().preemptive().basic(usernameValue, accessKeyValue) - .get("https://api.lambdatest.com/automation/api/v1/user-files"); + var res = given().auth().preemptive().basic(usernameValue, accessKeyValue) + .get("https://api.lambdatest.com/automation/api/v1/user-files"); - options.put("lambda:userFiles", res.body().jsonPath().getList("data.key")); - } catch (Exception e) { - DebugInformation.printStackTrace(e); - } + options.put("lambda:userFiles", res.body().jsonPath().getList("data.key")); + } catch (Exception e) { + DebugInformation.printStackTrace(e); + } - } + } - Log.info(""); + Log.info(""); + } } - } - private static void addGridOptions(TOption options, GridSettings gridSettings) { - for (var entry : gridSettings.getArguments()) { - for (var c : entry.entrySet()) { - if (c.getValue() instanceof String && c.getValue().toString().startsWith("{env_")) { - var envValue = SecretsResolver.getSecret(c.getValue().toString()); - options.setCapability(c.getKey(), envValue); - } else { - options.setCapability(c.getKey(), c.getValue()); + private void addGridOptions(TOption options, GridSettings gridSettings) { + for (var entry : gridSettings.getArguments()) { + for (var c : entry.entrySet()) { + if (c.getValue() instanceof String && c.getValue().toString().startsWith("{env_")) { + var envValue = SecretsResolver.getSecret(c.getValue().toString()); + options.setCapability(c.getKey(), envValue); + } else { + options.setCapability(c.getKey(), c.getValue()); + } } } - } - - if ("lambdatest".equalsIgnoreCase(gridSettings.getProviderName())) { - options.setCapability("lambdaMaskCommands", new String[]{"setValues", "setCookies", "getCookies"}); - } - } - private void addDriverOptions(TOption chromeOptions) { - for (var optionKey : browserConfiguration.driverOptions.keySet()) { - chromeOptions.setCapability(optionKey, browserConfiguration.driverOptions.get(optionKey)); + if ("lambdatest".equalsIgnoreCase(gridSettings.getProviderName())) { + options.setCapability("lambdaMaskCommands", new String[]{"setValues", "setCookies", "getCookies"}); + } } - } - private 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())); + private void addDriverOptions(TOption chromeOptions) { + for (var optionKey : browserConfiguration.driverOptions.keySet()) { + chromeOptions.setCapability(optionKey, browserConfiguration.driverOptions.get(optionKey)); } - } catch (Exception ex) { System.out.println("Error while resizing browser window: " + ex.getMessage());} - } - - private String getBuildName() { - if (!isBuildNameSet) { - buildName = System.getProperty("buildName"); } - if (buildName == null) { - InputStream input = ConfigurationService.class.getResourceAsStream("/application.properties"); - var p = new Properties(); + private void changeWindowSize(WebDriver wrappedDriver) { try { - p.load(input); - } catch (IOException e) { - return null; - } + 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());} + } + private String getBuildName() { if (!isBuildNameSet) { - buildName = p.getProperty("buildName"); + buildName = System.getProperty("buildName"); } - if (buildName.equals("{randomNumber}") && !isBuildNameSet) { - buildName = TimestampBuilder.buildUniqueTextByPrefix("LE_"); - isBuildNameSet = true; + if (buildName == null) { + InputStream input = ConfigurationService.class.getResourceAsStream("/application.properties"); + var p = new Properties(); + try { + p.load(input); + } catch (IOException e) { + return null; + } + + if (!isBuildNameSet) { + buildName = p.getProperty("buildName"); + } + + if (buildName.equals("{randomNumber}") && !isBuildNameSet) { + buildName = TimestampBuilder.buildUniqueTextByPrefix("LE_"); + isBuildNameSet = true; + } } + + return buildName; } - return buildName; - } + private String getUrl(String url) { + String result = url; + if (url.startsWith("{env_")) { + result = SecretsResolver.getSecret(url); + } else if (url.contains("{env_")) { + String pattern = "\\{env_.*?\\}"; + Pattern compiledPattern = Pattern.compile(pattern); + Matcher matcher = compiledPattern.matcher(url); + List allMatches = new ArrayList(); + + while (matcher.find()) { + allMatches.add(matcher.group()); + } - private String getUrl(String url) { - String result = url; - if (url.startsWith("{env_")) { - result = SecretsResolver.getSecret(url); - } else if (url.contains("{env_")) { - String pattern = "\\{env_.*?\\}"; - Pattern compiledPattern = Pattern.compile(pattern); - Matcher matcher = compiledPattern.matcher(url); - List allMatches = new ArrayList(); - - while (matcher.find()) { - allMatches.add(matcher.group()); + for (String match : allMatches) { + result = result.replace(match, SecretsResolver.getSecret(match)); + } } - for (String match : allMatches) { - result = result.replace(match, SecretsResolver.getSecret(match)); - } + return result; } - return result; - } + private void close() { + if (disposed) { + return; + } - public void close() { - if (disposed) { - return; - } + if (wrappedDriver != null) { + DebugInformation.debugInfo("SHUTTING DOWN WRAPPED_DRIVER"); + wrappedDriver.quit(); + if (!customDriverOptions.isEmpty()) { + customDriverOptions.clear(); + } + } - if (wrappedDriver != null) { - DebugInformation.debugInfo("SHUTTING DOWN WRAPPED_DRIVER"); - wrappedDriver.quit(); - if (!customDriverOptions.isEmpty()) { - customDriverOptions.clear(); + boolean shouldCaptureHttpTraffic = ConfigurationService.get(WebSettings.class).getShouldCaptureHttpTraffic(); + if (shouldCaptureHttpTraffic) { + ProxyServer.close(); } - } - boolean shouldCaptureHttpTraffic = ConfigurationService.get(WebSettings.class).getShouldCaptureHttpTraffic(); - if (shouldCaptureHttpTraffic) { - ProxyServer.close(); + disposed = true; } - - disposed = true; } } \ No newline at end of file diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/FullPageScreenshotEngine.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/FullPageScreenshotEngine.java index b039f93e..813f4f50 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/FullPageScreenshotEngine.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/infrastructure/FullPageScreenshotEngine.java @@ -32,7 +32,7 @@ public static File takeScreenshot() { var javaScriptService = new JavaScriptService(); var timeoutInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getWaitForAjaxTimeout(); var sleepInterval = ConfigurationService.get(WebSettings.class).getTimeoutSettings().getSleepInterval(); - var webDriverWait = new WebDriverWait(DriverService.current().getWrappedDriver(), Duration.ofSeconds(timeoutInterval), Duration.ofSeconds(sleepInterval)); + var webDriverWait = new WebDriverWait(DriverService.getWrappedDriver(), Duration.ofSeconds(timeoutInterval), Duration.ofSeconds(sleepInterval)); webDriverWait.ignoring(IllegalArgumentException.class); javaScriptService.execute(html2CanvasContent); javaScriptService.execute(GENERATE_SCREENSHOT_JS); 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 feaf1ec1..bc58145e 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 @@ -43,7 +43,7 @@ public String takeScreenshot(String name) { var screenshot = new AShot() .shootingStrategy(ShootingStrategies.viewportPasting(100)) - .takeScreenshot(DriverService.current().getWrappedDriver()); + .takeScreenshot(DriverService.getWrappedDriver()); var path = Paths.get(screenshotSaveDir, filename).toString(); var destFile = new File(path); @@ -64,7 +64,7 @@ public String takeScreenshot(String name) { public String takeScreenshot(String screenshotSaveDir, String filename) { var screenshot = new AShot() .shootingStrategy(ShootingStrategies.viewportPasting(100)) - .takeScreenshot(DriverService.current().getWrappedDriver()); + .takeScreenshot(DriverService.getWrappedDriver()); var path = Paths.get(screenshotSaveDir, filename).toString(); var destFile = new File(path); diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/App.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/App.java index d1bf2714..b7e95917 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/App.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/App.java @@ -52,7 +52,7 @@ public ComponentWaitService waitFor() { } public void addDriverOptions(String key, String value) { - DriverService.current().addDriverOptions(key, value); + DriverService.addDriverOptions(key, value); } public TPage goTo(Class pageOf, Object... args) { @@ -87,7 +87,7 @@ public void close() { return; } - DriverService.current().close(); + DriverService.close(); disposed = true; } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ComponentWaitService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ComponentWaitService.java index 12e73fc4..bf906969 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ComponentWaitService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/ComponentWaitService.java @@ -20,7 +20,7 @@ public class ComponentWaitService extends WebService { public void wait(WebComponent component, WaitStrategy waitStrategy) { if (component.getParentWrappedElement() == null) { - waitStrategy.waitUntil(DriverService.current().getWrappedDriver(), component.getFindStrategy().convert()); + waitStrategy.waitUntil(DriverService.getWrappedDriver(), component.getFindStrategy().convert()); } else { waitStrategy.waitUntil(component.getParentWrappedElement(), component.getFindStrategy().convert()); } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/WebService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/WebService.java index c97daa82..25cb2cb7 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/WebService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/WebService.java @@ -18,6 +18,6 @@ public abstract class WebService { public WebDriver getWrappedDriver() { - return DriverService.current().getWrappedDriver(); + return DriverService.getWrappedDriver(); } } 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 fc66494e..fdc54287 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 @@ -108,7 +108,7 @@ private static void waitUntil(BooleanSupplier condition, WebComponent com var validationTimeout = timeoutSettings.getValidationsTimeout(); var sleepInterval = timeoutSettings.getSleepInterval(); - FluentWait wait = new FluentWait<>(DriverService.current().getWrappedDriver()) + FluentWait wait = new FluentWait<>(DriverService.getWrappedDriver()) .withTimeout(Duration.ofSeconds(validationTimeout)) .pollingEvery(Duration.ofSeconds(sleepInterval > 0 ? sleepInterval : 1)); 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 f99b46ae..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 @@ -39,7 +39,7 @@ public WaitStrategy(long timeoutInterval, long sleepInterval) { public abstract void waitUntil(SearchContext searchContext, By by); protected void waitUntil(Function waitCondition) { - webDriverWait = new WebDriverWait(DriverService.current().getWrappedDriver(), Duration.ofSeconds(timeoutInterval), Duration.ofSeconds(sleepInterval)); + webDriverWait = new WebDriverWait(DriverService.getWrappedDriver(), Duration.ofSeconds(timeoutInterval), Duration.ofSeconds(sleepInterval)); webDriverWait.withMessage(Thread.currentThread().getStackTrace()[2].getMethodName()); webDriverWait.until(waitCondition); } diff --git a/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java b/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java index a0901ca6..db6258fb 100644 --- a/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java +++ b/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java @@ -16,7 +16,7 @@ import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; -@ExecutionBrowser(browser = BrowserTypes.CHROME, lifecycle = Lifecycle.REUSE_IF_STARTED) +@ExecutionBrowser(browser = BrowserTypes.FIREFOX, lifecycle = Lifecycle.REUSE_IF_STARTED) public class ShadowDomTests extends WebTest { @BeforeEach public void init() { From 9a82266167abe013cd2f815d46e979a4762308ff Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Tue, 16 Jul 2024 07:40:33 +0300 Subject: [PATCH 06/19] minor fixes --- .../src/main/java/solutions/bellatrix/web/services/App.java | 2 -- .../src/test/java/shadowdom/ShadowDomTests.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/App.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/App.java index b7e95917..5eb6a63a 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/services/App.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/services/App.java @@ -13,8 +13,6 @@ package solutions.bellatrix.web.services; -import solutions.bellatrix.core.utilities.DebugInformation; -import solutions.bellatrix.core.utilities.ShutdownManager; import solutions.bellatrix.core.utilities.SingletonFactory; import solutions.bellatrix.web.infrastructure.DriverService; import solutions.bellatrix.web.pages.WebPage; diff --git a/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java b/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java index db6258fb..a0901ca6 100644 --- a/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java +++ b/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java @@ -16,7 +16,7 @@ import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; -@ExecutionBrowser(browser = BrowserTypes.FIREFOX, lifecycle = Lifecycle.REUSE_IF_STARTED) +@ExecutionBrowser(browser = BrowserTypes.CHROME, lifecycle = Lifecycle.REUSE_IF_STARTED) public class ShadowDomTests extends WebTest { @BeforeEach public void init() { From 21006b2554f31ca3e8e7541aa6d9c5c55773269b Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Tue, 16 Jul 2024 07:42:06 +0300 Subject: [PATCH 07/19] Renamed BrowserTypes enum to Browsers in Playwright module --- .../playwright/components/WebComponent.java | 5 ++--- .../infrastructure/BrowserConfiguration.java | 12 ++++++------ .../infrastructure/BrowserLifecyclePlugin.java | 2 +- .../{BrowserTypes.java => Browsers.java} | 8 ++++---- .../playwright/infrastructure/ExecutionBrowser.java | 2 +- .../playwright/infrastructure/PlaywrightService.java | 8 ++++---- .../test/java/controls/grid/GridControlTests.java | 4 ++-- .../test/java/controls/table/TableControlTests.java | 4 ++-- .../src/test/java/junit/ProductPurchaseTests.java | 4 ++-- .../src/test/java/shadowdom/ShadowDomTests.java | 4 ++-- .../src/test/java/testng/ProductPurchaseTests.java | 4 ++-- .../java/O13_layout_testing/LayoutTestingTests.java | 4 ++-- .../selenium_grid_01/SeleniumGridTests.java | 2 +- .../src/test/java/O17_logging/LoggingTests.java | 4 ++-- .../BellatrixBrowserBehaviourTests.java | 4 ++-- 15 files changed, 35 insertions(+), 36 deletions(-) rename bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/{BrowserTypes.java => Browsers.java} (88%) diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java index 7fa92546..b39c7abf 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java @@ -32,7 +32,6 @@ import solutions.bellatrix.playwright.components.common.ComponentActionEventArgs; import solutions.bellatrix.playwright.components.common.create.RelativeCreateService; import solutions.bellatrix.playwright.components.common.validate.Validator; -import solutions.bellatrix.playwright.components.common.webelement.FrameElement; import solutions.bellatrix.playwright.components.common.webelement.WebElement; import solutions.bellatrix.playwright.components.contracts.Component; import solutions.bellatrix.playwright.components.contracts.ComponentStyle; @@ -46,7 +45,7 @@ import solutions.bellatrix.playwright.configuration.WebSettings; import solutions.bellatrix.playwright.findstrategies.*; import solutions.bellatrix.playwright.findstrategies.options.*; -import solutions.bellatrix.playwright.infrastructure.BrowserTypes; +import solutions.bellatrix.playwright.infrastructure.Browsers; import solutions.bellatrix.playwright.infrastructure.PlaywrightService; import solutions.bellatrix.playwright.infrastructure.WrappedBrowser; import solutions.bellatrix.playwright.utilities.Settings; @@ -230,7 +229,7 @@ public boolean isVisible() { // Update: We should use js, native playwright highlight() method's function is unknown. // Update: the js script seems to work, but not for TextField elements public void highlight() { - if (PlaywrightService.browserConfiguration().getBrowserTypes() == BrowserTypes.CHROME_HEADLESS) { + if (PlaywrightService.browserConfiguration().getBrowsers() == Browsers.CHROME_HEADLESS) { return; } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserConfiguration.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserConfiguration.java index ee5ce3ae..4aab96e6 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserConfiguration.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserConfiguration.java @@ -20,7 +20,7 @@ @Getter @Setter public class BrowserConfiguration { - private BrowserTypes browserTypes; + private Browsers browsers; private Lifecycle lifecycle; private int height; private int width; @@ -28,14 +28,14 @@ public class BrowserConfiguration { private String testName; private final HashMap playwrightOptions; - public BrowserConfiguration(BrowserTypes browserTypes, Lifecycle browserBehavior) { - this.browserTypes = browserTypes; + public BrowserConfiguration(Browsers browsers, Lifecycle browserBehavior) { + this.browsers = browsers; this.lifecycle = browserBehavior; playwrightOptions = new HashMap<>(); } - public BrowserConfiguration(BrowserTypes browserTypes, Lifecycle browserBehavior, String testName) { - this.browserTypes = browserTypes; + public BrowserConfiguration(Browsers browsers, Lifecycle browserBehavior, String testName) { + this.browsers = browsers; this.lifecycle = browserBehavior; this.testName = testName; playwrightOptions = new HashMap<>(); @@ -45,7 +45,7 @@ public BrowserConfiguration(BrowserTypes browserTypes, Lifecycle browserBehavior public boolean equals(Object obj) { if (!(obj instanceof BrowserConfiguration that)) return false; - if (!(this.getBrowserTypes() == null ? that.getBrowserTypes() == null : this.getBrowserTypes().equals(that.getBrowserTypes()))) + if (!(this.getBrowsers() == null ? that.getBrowsers() == null : this.getBrowsers().equals(that.getBrowsers()))) return false; if (!(this.getLifecycle() == null ? that.getLifecycle() == null : this.getLifecycle().equals(that.getLifecycle()))) return false; diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java index d100ec53..f4a4aaaa 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java @@ -154,7 +154,7 @@ private BrowserConfiguration getExecutionBrowserMethodLevel(Method memberInfo) { private BrowserConfiguration getExecutionBrowserClassLevel(Class type) { var executionBrowserAnnotation = (ExecutionBrowser)type.getDeclaredAnnotation(ExecutionBrowser.class); if (executionBrowserAnnotation == null) { - var defaultBrowser = BrowserTypes.fromText(Settings.web().getDefaultBrowser()); + var defaultBrowser = Browsers.fromText(Settings.web().getDefaultBrowser()); var defaultLifecycle = Lifecycle.fromText(Settings.web().getDefaultLifeCycle()); return new BrowserConfiguration(defaultBrowser, defaultLifecycle); } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserTypes.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/Browsers.java similarity index 88% rename from bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserTypes.java rename to bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/Browsers.java index f46b591c..7f4acc6a 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserTypes.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/Browsers.java @@ -18,7 +18,7 @@ import java.util.Arrays; @Getter -public enum BrowserTypes { +public enum Browsers { CHROMIUM("chromium"), CHROMIUM_HEADLESS("chromium_headless"), CHROME("chrome"), @@ -31,7 +31,7 @@ public enum BrowserTypes { WEBKIT_HEADLESS("webkit_headless"); private final String value; - BrowserTypes(String value) { + Browsers(String value) { this.value = value; } @@ -40,9 +40,9 @@ public String toString() { return value; } - public static BrowserTypes fromText(String text) { + public static Browsers fromText(String text) { return Arrays.stream(values()) .filter(l -> l.value.equalsIgnoreCase(text)) - .findFirst().orElse(BrowserTypes.CHROME); + .findFirst().orElse(Browsers.CHROME); } } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/ExecutionBrowser.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/ExecutionBrowser.java index 8cc5e5c1..ba2c4625 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/ExecutionBrowser.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/ExecutionBrowser.java @@ -21,7 +21,7 @@ @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface ExecutionBrowser { - BrowserTypes browser() default BrowserTypes.CHROME; + Browsers browser() default Browsers.CHROME; Lifecycle lifecycle() default Lifecycle.RESTART_EVERY_TIME; int browserVersion() default 0; String platform() default "any"; diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java index e0e3bcca..21f1e197 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java @@ -159,9 +159,9 @@ private WrappedBrowser initializeBrowserWrapperGridMode(GridSettings gridSetting } private Browser initializeBrowserRegularMode() { - BrowserTypes browserTypes = browserConfiguration().getBrowserTypes(); + Browsers browsers = browserConfiguration().getBrowsers(); - switch (browserTypes) { + switch (browsers) { case CHROMIUM -> { var browserType = playwright.chromium(); BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); @@ -312,8 +312,8 @@ private Browser initializeBrowserGridMode(GridSettings gridSettings) { String serializedSettings = URLEncoder.encode(gson.toJson(gridSettings.getArguments().get(0)), "UTF-8"); if (gridSettings.getProviderName().equals("grid") || gridSettings.getProviderName().equals("selenoid")) { - var browserType = browserConfiguration.getBrowserTypes(); - if (browserType == BrowserTypes.FIREFOX || browserType == BrowserTypes.FIREFOX_HEADLESS || browserType == BrowserTypes.WEBKIT || browserType == BrowserTypes.WEBKIT_HEADLESS) { + var browserType = browserConfiguration.getBrowsers(); + if (browserType == Browsers.FIREFOX || browserType == Browsers.FIREFOX_HEADLESS || browserType == Browsers.WEBKIT || browserType == Browsers.WEBKIT_HEADLESS) { throw new NotImplementedException("Playwright supports running in Selenium Grid only Chromium browsers."); } diff --git a/framework-tests/bellatrix.playwright.tests/src/test/java/controls/grid/GridControlTests.java b/framework-tests/bellatrix.playwright.tests/src/test/java/controls/grid/GridControlTests.java index e1fd9e02..0bcfc323 100644 --- a/framework-tests/bellatrix.playwright.tests/src/test/java/controls/grid/GridControlTests.java +++ b/framework-tests/bellatrix.playwright.tests/src/test/java/controls/grid/GridControlTests.java @@ -13,7 +13,7 @@ import solutions.bellatrix.playwright.components.advanced.table.TableCell; import solutions.bellatrix.playwright.findstrategies.TagFindStrategy; import solutions.bellatrix.playwright.findstrategies.XpathFindStrategy; -import solutions.bellatrix.playwright.infrastructure.BrowserTypes; +import solutions.bellatrix.playwright.infrastructure.Browsers; import solutions.bellatrix.playwright.infrastructure.ExecutionBrowser; import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; @@ -21,7 +21,7 @@ import java.util.ArrayList; import java.util.List; -@ExecutionBrowser(browser = BrowserTypes.CHROME, lifecycle = Lifecycle.REUSE_IF_STARTED) +@ExecutionBrowser(browser = Browsers.CHROME, lifecycle = Lifecycle.REUSE_IF_STARTED) public class GridControlTests extends WebTest { private Grid testGrid; private List expectedItems; diff --git a/framework-tests/bellatrix.playwright.tests/src/test/java/controls/table/TableControlTests.java b/framework-tests/bellatrix.playwright.tests/src/test/java/controls/table/TableControlTests.java index bbf4c2a9..d52d99fa 100644 --- a/framework-tests/bellatrix.playwright.tests/src/test/java/controls/table/TableControlTests.java +++ b/framework-tests/bellatrix.playwright.tests/src/test/java/controls/table/TableControlTests.java @@ -6,12 +6,12 @@ import org.junit.jupiter.api.Test; import solutions.bellatrix.core.configuration.ConfigurationService; import solutions.bellatrix.playwright.components.advanced.table.Table; -import solutions.bellatrix.playwright.infrastructure.BrowserTypes; +import solutions.bellatrix.playwright.infrastructure.Browsers; import solutions.bellatrix.playwright.infrastructure.ExecutionBrowser; import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; -@ExecutionBrowser(browser = BrowserTypes.CHROME, lifecycle = Lifecycle.REUSE_IF_STARTED) +@ExecutionBrowser(browser = Browsers.CHROME, lifecycle = Lifecycle.REUSE_IF_STARTED) public class TableControlTests extends WebTest { @BeforeEach public void testInit() { diff --git a/framework-tests/bellatrix.playwright.tests/src/test/java/junit/ProductPurchaseTests.java b/framework-tests/bellatrix.playwright.tests/src/test/java/junit/ProductPurchaseTests.java index 75494dcf..7cb67b45 100644 --- a/framework-tests/bellatrix.playwright.tests/src/test/java/junit/ProductPurchaseTests.java +++ b/framework-tests/bellatrix.playwright.tests/src/test/java/junit/ProductPurchaseTests.java @@ -19,12 +19,12 @@ import mainpage.MainPage; import org.junit.jupiter.api.Test; import solutions.bellatrix.playwright.components.Anchor; -import solutions.bellatrix.playwright.infrastructure.BrowserTypes; +import solutions.bellatrix.playwright.infrastructure.Browsers; import solutions.bellatrix.playwright.infrastructure.ExecutionBrowser; import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; -@ExecutionBrowser(browser = BrowserTypes.CHROME, lifecycle = Lifecycle.RESTART_EVERY_TIME) +@ExecutionBrowser(browser = Browsers.CHROME, lifecycle = Lifecycle.RESTART_EVERY_TIME) public class ProductPurchaseTests extends WebTest { @Override protected void afterEach() { diff --git a/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java b/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java index a0901ca6..0e91dffe 100644 --- a/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java +++ b/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java @@ -11,12 +11,12 @@ import solutions.bellatrix.playwright.components.advanced.grid.Grid; import solutions.bellatrix.playwright.components.advanced.grid.GridCell; import solutions.bellatrix.playwright.components.shadowdom.ShadowRoot; -import solutions.bellatrix.playwright.infrastructure.BrowserTypes; +import solutions.bellatrix.playwright.infrastructure.Browsers; import solutions.bellatrix.playwright.infrastructure.ExecutionBrowser; import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; -@ExecutionBrowser(browser = BrowserTypes.CHROME, lifecycle = Lifecycle.REUSE_IF_STARTED) +@ExecutionBrowser(browser = Browsers.CHROME, lifecycle = Lifecycle.REUSE_IF_STARTED) public class ShadowDomTests extends WebTest { @BeforeEach public void init() { diff --git a/framework-tests/bellatrix.playwright.tests/src/test/java/testng/ProductPurchaseTests.java b/framework-tests/bellatrix.playwright.tests/src/test/java/testng/ProductPurchaseTests.java index 311b0a9b..55223750 100644 --- a/framework-tests/bellatrix.playwright.tests/src/test/java/testng/ProductPurchaseTests.java +++ b/framework-tests/bellatrix.playwright.tests/src/test/java/testng/ProductPurchaseTests.java @@ -19,12 +19,12 @@ import mainpage.MainPage; import org.testng.annotations.Test; import solutions.bellatrix.playwright.components.Anchor; -import solutions.bellatrix.playwright.infrastructure.BrowserTypes; +import solutions.bellatrix.playwright.infrastructure.Browsers; import solutions.bellatrix.playwright.infrastructure.ExecutionBrowser; import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.testng.WebTest; -@ExecutionBrowser(browser = BrowserTypes.CHROME, lifecycle = Lifecycle.RESTART_ON_FAIL) +@ExecutionBrowser(browser = Browsers.CHROME, lifecycle = Lifecycle.RESTART_ON_FAIL) public class ProductPurchaseTests extends WebTest { @Override protected void afterEach() { diff --git a/getting-started/bellatrix.playwright.getting.started/src/test/java/O13_layout_testing/LayoutTestingTests.java b/getting-started/bellatrix.playwright.getting.started/src/test/java/O13_layout_testing/LayoutTestingTests.java index 0643ad9d..3f083b97 100644 --- a/getting-started/bellatrix.playwright.getting.started/src/test/java/O13_layout_testing/LayoutTestingTests.java +++ b/getting-started/bellatrix.playwright.getting.started/src/test/java/O13_layout_testing/LayoutTestingTests.java @@ -2,13 +2,13 @@ import org.junit.jupiter.api.Test; import solutions.bellatrix.playwright.components.*; -import solutions.bellatrix.playwright.infrastructure.BrowserTypes; +import solutions.bellatrix.playwright.infrastructure.Browsers; import solutions.bellatrix.playwright.infrastructure.ExecutionBrowser; import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; // Layout testing is a module from BELLATRIX that allows you to test the responsiveness of your website. -@ExecutionBrowser (browser = BrowserTypes.CHROME, width = 1280, height = 1024, lifecycle = Lifecycle.RESTART_EVERY_TIME) +@ExecutionBrowser (browser = Browsers.CHROME, width = 1280, height = 1024, lifecycle = Lifecycle.RESTART_EVERY_TIME) public class LayoutTestingTests extends WebTest { @Test public void testPageLayout() { diff --git a/getting-started/bellatrix.playwright.getting.started/src/test/java/O16_grid_and_cloud_integration/selenium_grid_01/SeleniumGridTests.java b/getting-started/bellatrix.playwright.getting.started/src/test/java/O16_grid_and_cloud_integration/selenium_grid_01/SeleniumGridTests.java index 5f93216d..8c0645f1 100644 --- a/getting-started/bellatrix.playwright.getting.started/src/test/java/O16_grid_and_cloud_integration/selenium_grid_01/SeleniumGridTests.java +++ b/getting-started/bellatrix.playwright.getting.started/src/test/java/O16_grid_and_cloud_integration/selenium_grid_01/SeleniumGridTests.java @@ -5,7 +5,7 @@ import solutions.bellatrix.playwright.infrastructure.*; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; -@ExecutionBrowser (browser = BrowserTypes.CHROME, browserVersion = 89, lifecycle = Lifecycle.REUSE_IF_STARTED) +@ExecutionBrowser (browser = Browsers.CHROME, browserVersion = 89, lifecycle = Lifecycle.REUSE_IF_STARTED) public class SeleniumGridTests extends WebTest { @Test public void promotionsPageOpened_When_PromotionsButtonClicked() { diff --git a/getting-started/bellatrix.playwright.getting.started/src/test/java/O17_logging/LoggingTests.java b/getting-started/bellatrix.playwright.getting.started/src/test/java/O17_logging/LoggingTests.java index 64a1d420..836336e0 100644 --- a/getting-started/bellatrix.playwright.getting.started/src/test/java/O17_logging/LoggingTests.java +++ b/getting-started/bellatrix.playwright.getting.started/src/test/java/O17_logging/LoggingTests.java @@ -3,11 +3,11 @@ import org.junit.jupiter.api.Test; import solutions.bellatrix.core.utilities.Log; import solutions.bellatrix.playwright.components.*; -import solutions.bellatrix.playwright.infrastructure.BrowserTypes; +import solutions.bellatrix.playwright.infrastructure.Browsers; import solutions.bellatrix.playwright.infrastructure.ExecutionBrowser; import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; -@ExecutionBrowser (browser = BrowserTypes.CHROME, lifecycle = Lifecycle.RESTART_EVERY_TIME) +@ExecutionBrowser (browser = Browsers.CHROME, lifecycle = Lifecycle.RESTART_EVERY_TIME) public class LoggingTests extends WebTest { @Test public void addCustomMessagesToLog() { diff --git a/getting-started/bellatrix.playwright.getting.started/src/test/java/O2_control_browser/BellatrixBrowserBehaviourTests.java b/getting-started/bellatrix.playwright.getting.started/src/test/java/O2_control_browser/BellatrixBrowserBehaviourTests.java index 8e5e6d50..32033f1f 100644 --- a/getting-started/bellatrix.playwright.getting.started/src/test/java/O2_control_browser/BellatrixBrowserBehaviourTests.java +++ b/getting-started/bellatrix.playwright.getting.started/src/test/java/O2_control_browser/BellatrixBrowserBehaviourTests.java @@ -25,7 +25,7 @@ // the browser is reused if possible. // Note: However, use this option with caution since in some rare cases if you have not properly set up your tests // you may need to restart the browser if the test fails otherwise all other tests may fail too. -@ExecutionBrowser (browser = BrowserTypes.FIREFOX, lifecycle = Lifecycle.RESTART_EVERY_TIME) +@ExecutionBrowser (browser = Browsers.FIREFOX, lifecycle = Lifecycle.RESTART_EVERY_TIME) public class BellatrixBrowserBehaviourTests extends WebTest { // 1.3 All playwright BELLATRIX test classes should inherit from the WebTest base class. This way you can use all built-in // BELLATRIX tools and functionalities. If you place attribute over the class all tests inherit the Lifecycle. @@ -48,7 +48,7 @@ public void promotionsPageOpened_When_PromotionsButtonClicked() { // 1.5 As mentioned above you can override the browser Lifecycle for a particular test. The global Lifecycle for all // tests in the class is to reuse an instance of Firefox browser. Only for this particular test, BELLATRIX opens // Chrome and restarts it only on fail. - @ExecutionBrowser (browser = BrowserTypes.CHROME, lifecycle = Lifecycle.RESTART_ON_FAIL) + @ExecutionBrowser (browser = Browsers.CHROME, lifecycle = Lifecycle.RESTART_ON_FAIL) @Test public void blogPageOpened_When_PromotionsButtonClicked() { app().navigate().to("http://demos.bellatrix.solutions/"); From 4183ed76a33c5a5ef4ef56516fbabbbfae3b130b Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Tue, 16 Jul 2024 07:44:37 +0300 Subject: [PATCH 08/19] Removed "forceCloseBrowser" setting --- .../playwright/configuration/WebSettings.java | 1 - .../web/configuration/GridSettings.java | 10 ++-- .../web/configuration/TimeoutSettings.java | 34 ++++++------ .../web/configuration/UrlSettings.java | 6 +- .../web/configuration/WebSettings.java | 55 +++++++++---------- .../resources/testFrameworkSettings.dev.json | 1 - .../resources/testFrameworkSettings.qa.json | 1 - .../resources/testFrameworkSettings.dev.json | 1 - .../resources/testFrameworkSettings.qa.json | 1 - .../resources/testFrameworkSettings.dev.json | 1 - .../resources/testFrameworkSettings.qa.json | 1 - .../resources/testFrameworkSettings.dev.json | 1 - .../resources/testFrameworkSettings.qa.json | 1 - 13 files changed, 52 insertions(+), 62 deletions(-) diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/configuration/WebSettings.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/configuration/WebSettings.java index ce289618..fd24ad7f 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/configuration/WebSettings.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/configuration/WebSettings.java @@ -20,7 +20,6 @@ @Getter @Setter public class WebSettings { - private boolean forceCloseBrowser; private String baseUrl; private String executionType; private String defaultLifeCycle; diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/GridSettings.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/GridSettings.java index 0760a3e3..2e03480a 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/GridSettings.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/GridSettings.java @@ -18,10 +18,10 @@ import java.util.HashMap; import java.util.List; - +@Getter @Setter public class GridSettings { - @Getter @Setter private String providerName; - @Getter @Setter private String optionsName; - @Getter @Setter private String url; - @Getter @Setter private List> arguments; + private String providerName; + private String optionsName; + private String url; + private List> arguments; } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/TimeoutSettings.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/TimeoutSettings.java index a57676fc..a54d1fae 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/TimeoutSettings.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/TimeoutSettings.java @@ -15,22 +15,22 @@ import lombok.Getter; import lombok.Setter; - +@Getter @Setter public class TimeoutSettings { - @Getter @Setter private long pageLoadTimeout; - @Getter @Setter private long scriptTimeout; - @Getter @Setter private long elementWaitTimeout; - @Getter @Setter private long waitForAjaxTimeout; - @Getter @Setter private long waitUntilReadyTimeout; - @Getter @Setter private long waitForJavaScriptAnimationsTimeout; - @Getter @Setter private long waitForAngularTimeout; - @Getter @Setter private long waitForPartialUrl; - @Getter @Setter private long sleepInterval; - @Getter @Setter private long validationsTimeout; - @Getter @Setter private long elementToBeVisibleTimeout; - @Getter @Setter private long elementToExistTimeout; - @Getter @Setter private long elementToNotExistTimeout; - @Getter @Setter private long elementToBeClickableTimeout; - @Getter @Setter private long elementNotToBeVisibleTimeout; - @Getter @Setter private long elementToHaveContentTimeout; + private long pageLoadTimeout; + private long scriptTimeout; + private long elementWaitTimeout; + private long waitForAjaxTimeout; + private long waitUntilReadyTimeout; + private long waitForJavaScriptAnimationsTimeout; + private long waitForAngularTimeout; + private long waitForPartialUrl; + private long sleepInterval; + private long validationsTimeout; + private long elementToBeVisibleTimeout; + private long elementToExistTimeout; + private long elementToNotExistTimeout; + private long elementToBeClickableTimeout; + private long elementNotToBeVisibleTimeout; + private long elementToHaveContentTimeout; } diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/UrlSettings.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/UrlSettings.java index 852068c0..4add1c54 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/UrlSettings.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/configuration/UrlSettings.java @@ -15,8 +15,8 @@ import lombok.Getter; import lombok.Setter; - +@Getter @Setter public class UrlSettings { - @Getter @Setter private String shopUrl; - @Getter @Setter private String accountUrl; + private String shopUrl; + private String accountUrl; } 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 67f4a0c3..d4ec8f5d 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 @@ -29,33 +29,32 @@ import java.util.ArrayList; import java.util.List; - +@Getter @Setter public class WebSettings { - @Getter @Setter private boolean forceCloseBrowser; - @Getter @Setter private String baseUrl; - @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; - @Getter @Setter private TimeoutSettings timeoutSettings; - - @Getter @Setter private Boolean automaticallyScrollToVisible; - @Getter @Setter private Boolean waitUntilReadyOnElementFound; - @Getter @Setter private Boolean waitForAngular; - @Getter @Setter private Boolean shouldHighlightElements; - @Getter @Setter private Boolean shouldCaptureHttpTraffic; - @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; - - @Getter @Setter private Boolean videosOnFailEnabled; - @Getter @Setter private String videosSaveLocation; + private String baseUrl; + private String executionType; + private String defaultLifeCycle; + private String defaultBrowser; + private Integer defaultBrowserWidth = 0; + private Integer defaultBrowserHeight = 0; + private List gridSettings; + + private int artificialDelayBeforeAction; + private TimeoutSettings timeoutSettings; + + private Boolean automaticallyScrollToVisible; + private Boolean waitUntilReadyOnElementFound; + private Boolean waitForAngular; + private Boolean shouldHighlightElements; + private Boolean shouldCaptureHttpTraffic; + private Boolean toastNotificationBddLogging; + private long notificationToastTimeout; + + private ArrayList consoleErrorsWhitelist; + + private Boolean screenshotsOnFailEnabled; + private String screenshotsSaveLocation; + + private Boolean videosOnFailEnabled; + private String videosSaveLocation; } diff --git a/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.dev.json b/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.dev.json index 78f39605..1ab43a8b 100644 --- a/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.dev.json +++ b/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.dev.json @@ -3,7 +3,6 @@ "debugInformationEnabled": "true" }, "webSettings": { - "forceCloseBrowser": "true", "baseUrl": "http://demos.bellatrix.solutions/", "executionType": "regular", "defaultBrowser": "chrome", diff --git a/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.qa.json b/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.qa.json index cd0a8ff6..2c46b262 100644 --- a/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.qa.json +++ b/framework-tests/bellatrix.playwright.tests/src/main/resources/testFrameworkSettings.qa.json @@ -3,7 +3,6 @@ "debugInformationEnabled": "true" }, "webSettings": { - "forceCloseBrowser": "true", "baseUrl": "http://demos.bellatrix.solutions/", "executionType": "regular", "defaultBrowser": "chrome", diff --git a/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.dev.json b/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.dev.json index 78f39605..1ab43a8b 100644 --- a/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.dev.json +++ b/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.dev.json @@ -3,7 +3,6 @@ "debugInformationEnabled": "true" }, "webSettings": { - "forceCloseBrowser": "true", "baseUrl": "http://demos.bellatrix.solutions/", "executionType": "regular", "defaultBrowser": "chrome", diff --git a/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.qa.json b/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.qa.json index cd0a8ff6..2c46b262 100644 --- a/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.qa.json +++ b/framework-tests/bellatrix.web.tests/src/main/resources/testFrameworkSettings.qa.json @@ -3,7 +3,6 @@ "debugInformationEnabled": "true" }, "webSettings": { - "forceCloseBrowser": "true", "baseUrl": "http://demos.bellatrix.solutions/", "executionType": "regular", "defaultBrowser": "chrome", diff --git a/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.dev.json b/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.dev.json index d5b7d18f..83c268dd 100644 --- a/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.dev.json +++ b/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.dev.json @@ -3,7 +3,6 @@ "debugInformationEnabled": "true" }, "webSettings": { - "forceCloseBrowser": "true", "baseUrl": "http://demos.bellatrix.solutions/", "executionType":"regular", "defaultBrowser": "chrome", diff --git a/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.qa.json b/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.qa.json index e94e0d38..f8ef6130 100644 --- a/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.qa.json +++ b/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.qa.json @@ -3,7 +3,6 @@ "debugInformationEnabled": "true" }, "webSettings": { - "forceCloseBrowser": "true", "baseUrl": "https://ecommerce-playground.lambdatest.io", "executionType": "regular", "defaultBrowser": "chrome", diff --git a/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.dev.json b/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.dev.json index 0a66ba57..0f43ccc7 100644 --- a/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.dev.json +++ b/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.dev.json @@ -3,7 +3,6 @@ "debugInformationEnabled": "true" }, "webSettings": { - "forceCloseBrowser": "true", "baseUrl": "http://demos.bellatrix.solutions/", "executionType":"regular", "defaultBrowser": "chrome", diff --git a/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.qa.json b/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.qa.json index e94e0d38..f8ef6130 100644 --- a/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.qa.json +++ b/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.qa.json @@ -3,7 +3,6 @@ "debugInformationEnabled": "true" }, "webSettings": { - "forceCloseBrowser": "true", "baseUrl": "https://ecommerce-playground.lambdatest.io", "executionType": "regular", "defaultBrowser": "chrome", From e294604e0eefb37fa3b9413e3bb4a2a8fd6dd0c2 Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Tue, 16 Jul 2024 10:47:29 +0300 Subject: [PATCH 09/19] Revert "Renamed BrowserTypes enum to Browsers in Playwright module" This reverts commit 21006b2554f31ca3e8e7541aa6d9c5c55773269b. --- .../playwright/components/WebComponent.java | 5 +++-- .../infrastructure/BrowserConfiguration.java | 12 ++++++------ .../infrastructure/BrowserLifecyclePlugin.java | 2 +- .../{Browsers.java => BrowserTypes.java} | 8 ++++---- .../playwright/infrastructure/ExecutionBrowser.java | 2 +- .../playwright/infrastructure/PlaywrightService.java | 8 ++++---- .../test/java/controls/grid/GridControlTests.java | 4 ++-- .../test/java/controls/table/TableControlTests.java | 4 ++-- .../src/test/java/junit/ProductPurchaseTests.java | 4 ++-- .../src/test/java/shadowdom/ShadowDomTests.java | 4 ++-- .../src/test/java/testng/ProductPurchaseTests.java | 4 ++-- .../java/O13_layout_testing/LayoutTestingTests.java | 4 ++-- .../selenium_grid_01/SeleniumGridTests.java | 2 +- .../src/test/java/O17_logging/LoggingTests.java | 4 ++-- .../BellatrixBrowserBehaviourTests.java | 4 ++-- 15 files changed, 36 insertions(+), 35 deletions(-) rename bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/{Browsers.java => BrowserTypes.java} (88%) diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java index b39c7abf..7fa92546 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/WebComponent.java @@ -32,6 +32,7 @@ import solutions.bellatrix.playwright.components.common.ComponentActionEventArgs; import solutions.bellatrix.playwright.components.common.create.RelativeCreateService; import solutions.bellatrix.playwright.components.common.validate.Validator; +import solutions.bellatrix.playwright.components.common.webelement.FrameElement; import solutions.bellatrix.playwright.components.common.webelement.WebElement; import solutions.bellatrix.playwright.components.contracts.Component; import solutions.bellatrix.playwright.components.contracts.ComponentStyle; @@ -45,7 +46,7 @@ import solutions.bellatrix.playwright.configuration.WebSettings; import solutions.bellatrix.playwright.findstrategies.*; import solutions.bellatrix.playwright.findstrategies.options.*; -import solutions.bellatrix.playwright.infrastructure.Browsers; +import solutions.bellatrix.playwright.infrastructure.BrowserTypes; import solutions.bellatrix.playwright.infrastructure.PlaywrightService; import solutions.bellatrix.playwright.infrastructure.WrappedBrowser; import solutions.bellatrix.playwright.utilities.Settings; @@ -229,7 +230,7 @@ public boolean isVisible() { // Update: We should use js, native playwright highlight() method's function is unknown. // Update: the js script seems to work, but not for TextField elements public void highlight() { - if (PlaywrightService.browserConfiguration().getBrowsers() == Browsers.CHROME_HEADLESS) { + if (PlaywrightService.browserConfiguration().getBrowserTypes() == BrowserTypes.CHROME_HEADLESS) { return; } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserConfiguration.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserConfiguration.java index 4aab96e6..ee5ce3ae 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserConfiguration.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserConfiguration.java @@ -20,7 +20,7 @@ @Getter @Setter public class BrowserConfiguration { - private Browsers browsers; + private BrowserTypes browserTypes; private Lifecycle lifecycle; private int height; private int width; @@ -28,14 +28,14 @@ public class BrowserConfiguration { private String testName; private final HashMap playwrightOptions; - public BrowserConfiguration(Browsers browsers, Lifecycle browserBehavior) { - this.browsers = browsers; + public BrowserConfiguration(BrowserTypes browserTypes, Lifecycle browserBehavior) { + this.browserTypes = browserTypes; this.lifecycle = browserBehavior; playwrightOptions = new HashMap<>(); } - public BrowserConfiguration(Browsers browsers, Lifecycle browserBehavior, String testName) { - this.browsers = browsers; + public BrowserConfiguration(BrowserTypes browserTypes, Lifecycle browserBehavior, String testName) { + this.browserTypes = browserTypes; this.lifecycle = browserBehavior; this.testName = testName; playwrightOptions = new HashMap<>(); @@ -45,7 +45,7 @@ public BrowserConfiguration(Browsers browsers, Lifecycle browserBehavior, String public boolean equals(Object obj) { if (!(obj instanceof BrowserConfiguration that)) return false; - if (!(this.getBrowsers() == null ? that.getBrowsers() == null : this.getBrowsers().equals(that.getBrowsers()))) + if (!(this.getBrowserTypes() == null ? that.getBrowserTypes() == null : this.getBrowserTypes().equals(that.getBrowserTypes()))) return false; if (!(this.getLifecycle() == null ? that.getLifecycle() == null : this.getLifecycle().equals(that.getLifecycle()))) return false; diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java index f4a4aaaa..d100ec53 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserLifecyclePlugin.java @@ -154,7 +154,7 @@ private BrowserConfiguration getExecutionBrowserMethodLevel(Method memberInfo) { private BrowserConfiguration getExecutionBrowserClassLevel(Class type) { var executionBrowserAnnotation = (ExecutionBrowser)type.getDeclaredAnnotation(ExecutionBrowser.class); if (executionBrowserAnnotation == null) { - var defaultBrowser = Browsers.fromText(Settings.web().getDefaultBrowser()); + var defaultBrowser = BrowserTypes.fromText(Settings.web().getDefaultBrowser()); var defaultLifecycle = Lifecycle.fromText(Settings.web().getDefaultLifeCycle()); return new BrowserConfiguration(defaultBrowser, defaultLifecycle); } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/Browsers.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserTypes.java similarity index 88% rename from bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/Browsers.java rename to bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserTypes.java index 7f4acc6a..f46b591c 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/Browsers.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/BrowserTypes.java @@ -18,7 +18,7 @@ import java.util.Arrays; @Getter -public enum Browsers { +public enum BrowserTypes { CHROMIUM("chromium"), CHROMIUM_HEADLESS("chromium_headless"), CHROME("chrome"), @@ -31,7 +31,7 @@ public enum Browsers { WEBKIT_HEADLESS("webkit_headless"); private final String value; - Browsers(String value) { + BrowserTypes(String value) { this.value = value; } @@ -40,9 +40,9 @@ public String toString() { return value; } - public static Browsers fromText(String text) { + public static BrowserTypes fromText(String text) { return Arrays.stream(values()) .filter(l -> l.value.equalsIgnoreCase(text)) - .findFirst().orElse(Browsers.CHROME); + .findFirst().orElse(BrowserTypes.CHROME); } } diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/ExecutionBrowser.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/ExecutionBrowser.java index ba2c4625..8cc5e5c1 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/ExecutionBrowser.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/ExecutionBrowser.java @@ -21,7 +21,7 @@ @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface ExecutionBrowser { - Browsers browser() default Browsers.CHROME; + BrowserTypes browser() default BrowserTypes.CHROME; Lifecycle lifecycle() default Lifecycle.RESTART_EVERY_TIME; int browserVersion() default 0; String platform() default "any"; diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java index 21f1e197..e0e3bcca 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java @@ -159,9 +159,9 @@ private WrappedBrowser initializeBrowserWrapperGridMode(GridSettings gridSetting } private Browser initializeBrowserRegularMode() { - Browsers browsers = browserConfiguration().getBrowsers(); + BrowserTypes browserTypes = browserConfiguration().getBrowserTypes(); - switch (browsers) { + switch (browserTypes) { case CHROMIUM -> { var browserType = playwright.chromium(); BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); @@ -312,8 +312,8 @@ private Browser initializeBrowserGridMode(GridSettings gridSettings) { String serializedSettings = URLEncoder.encode(gson.toJson(gridSettings.getArguments().get(0)), "UTF-8"); if (gridSettings.getProviderName().equals("grid") || gridSettings.getProviderName().equals("selenoid")) { - var browserType = browserConfiguration.getBrowsers(); - if (browserType == Browsers.FIREFOX || browserType == Browsers.FIREFOX_HEADLESS || browserType == Browsers.WEBKIT || browserType == Browsers.WEBKIT_HEADLESS) { + var browserType = browserConfiguration.getBrowserTypes(); + if (browserType == BrowserTypes.FIREFOX || browserType == BrowserTypes.FIREFOX_HEADLESS || browserType == BrowserTypes.WEBKIT || browserType == BrowserTypes.WEBKIT_HEADLESS) { throw new NotImplementedException("Playwright supports running in Selenium Grid only Chromium browsers."); } diff --git a/framework-tests/bellatrix.playwright.tests/src/test/java/controls/grid/GridControlTests.java b/framework-tests/bellatrix.playwright.tests/src/test/java/controls/grid/GridControlTests.java index 0bcfc323..e1fd9e02 100644 --- a/framework-tests/bellatrix.playwright.tests/src/test/java/controls/grid/GridControlTests.java +++ b/framework-tests/bellatrix.playwright.tests/src/test/java/controls/grid/GridControlTests.java @@ -13,7 +13,7 @@ import solutions.bellatrix.playwright.components.advanced.table.TableCell; import solutions.bellatrix.playwright.findstrategies.TagFindStrategy; import solutions.bellatrix.playwright.findstrategies.XpathFindStrategy; -import solutions.bellatrix.playwright.infrastructure.Browsers; +import solutions.bellatrix.playwright.infrastructure.BrowserTypes; import solutions.bellatrix.playwright.infrastructure.ExecutionBrowser; import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; @@ -21,7 +21,7 @@ import java.util.ArrayList; import java.util.List; -@ExecutionBrowser(browser = Browsers.CHROME, lifecycle = Lifecycle.REUSE_IF_STARTED) +@ExecutionBrowser(browser = BrowserTypes.CHROME, lifecycle = Lifecycle.REUSE_IF_STARTED) public class GridControlTests extends WebTest { private Grid testGrid; private List expectedItems; diff --git a/framework-tests/bellatrix.playwright.tests/src/test/java/controls/table/TableControlTests.java b/framework-tests/bellatrix.playwright.tests/src/test/java/controls/table/TableControlTests.java index d52d99fa..bbf4c2a9 100644 --- a/framework-tests/bellatrix.playwright.tests/src/test/java/controls/table/TableControlTests.java +++ b/framework-tests/bellatrix.playwright.tests/src/test/java/controls/table/TableControlTests.java @@ -6,12 +6,12 @@ import org.junit.jupiter.api.Test; import solutions.bellatrix.core.configuration.ConfigurationService; import solutions.bellatrix.playwright.components.advanced.table.Table; -import solutions.bellatrix.playwright.infrastructure.Browsers; +import solutions.bellatrix.playwright.infrastructure.BrowserTypes; import solutions.bellatrix.playwright.infrastructure.ExecutionBrowser; import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; -@ExecutionBrowser(browser = Browsers.CHROME, lifecycle = Lifecycle.REUSE_IF_STARTED) +@ExecutionBrowser(browser = BrowserTypes.CHROME, lifecycle = Lifecycle.REUSE_IF_STARTED) public class TableControlTests extends WebTest { @BeforeEach public void testInit() { diff --git a/framework-tests/bellatrix.playwright.tests/src/test/java/junit/ProductPurchaseTests.java b/framework-tests/bellatrix.playwright.tests/src/test/java/junit/ProductPurchaseTests.java index 7cb67b45..75494dcf 100644 --- a/framework-tests/bellatrix.playwright.tests/src/test/java/junit/ProductPurchaseTests.java +++ b/framework-tests/bellatrix.playwright.tests/src/test/java/junit/ProductPurchaseTests.java @@ -19,12 +19,12 @@ import mainpage.MainPage; import org.junit.jupiter.api.Test; import solutions.bellatrix.playwright.components.Anchor; -import solutions.bellatrix.playwright.infrastructure.Browsers; +import solutions.bellatrix.playwright.infrastructure.BrowserTypes; import solutions.bellatrix.playwright.infrastructure.ExecutionBrowser; import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; -@ExecutionBrowser(browser = Browsers.CHROME, lifecycle = Lifecycle.RESTART_EVERY_TIME) +@ExecutionBrowser(browser = BrowserTypes.CHROME, lifecycle = Lifecycle.RESTART_EVERY_TIME) public class ProductPurchaseTests extends WebTest { @Override protected void afterEach() { diff --git a/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java b/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java index 0e91dffe..a0901ca6 100644 --- a/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java +++ b/framework-tests/bellatrix.playwright.tests/src/test/java/shadowdom/ShadowDomTests.java @@ -11,12 +11,12 @@ import solutions.bellatrix.playwright.components.advanced.grid.Grid; import solutions.bellatrix.playwright.components.advanced.grid.GridCell; import solutions.bellatrix.playwright.components.shadowdom.ShadowRoot; -import solutions.bellatrix.playwright.infrastructure.Browsers; +import solutions.bellatrix.playwright.infrastructure.BrowserTypes; import solutions.bellatrix.playwright.infrastructure.ExecutionBrowser; import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; -@ExecutionBrowser(browser = Browsers.CHROME, lifecycle = Lifecycle.REUSE_IF_STARTED) +@ExecutionBrowser(browser = BrowserTypes.CHROME, lifecycle = Lifecycle.REUSE_IF_STARTED) public class ShadowDomTests extends WebTest { @BeforeEach public void init() { diff --git a/framework-tests/bellatrix.playwright.tests/src/test/java/testng/ProductPurchaseTests.java b/framework-tests/bellatrix.playwright.tests/src/test/java/testng/ProductPurchaseTests.java index 55223750..311b0a9b 100644 --- a/framework-tests/bellatrix.playwright.tests/src/test/java/testng/ProductPurchaseTests.java +++ b/framework-tests/bellatrix.playwright.tests/src/test/java/testng/ProductPurchaseTests.java @@ -19,12 +19,12 @@ import mainpage.MainPage; import org.testng.annotations.Test; import solutions.bellatrix.playwright.components.Anchor; -import solutions.bellatrix.playwright.infrastructure.Browsers; +import solutions.bellatrix.playwright.infrastructure.BrowserTypes; import solutions.bellatrix.playwright.infrastructure.ExecutionBrowser; import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.testng.WebTest; -@ExecutionBrowser(browser = Browsers.CHROME, lifecycle = Lifecycle.RESTART_ON_FAIL) +@ExecutionBrowser(browser = BrowserTypes.CHROME, lifecycle = Lifecycle.RESTART_ON_FAIL) public class ProductPurchaseTests extends WebTest { @Override protected void afterEach() { diff --git a/getting-started/bellatrix.playwright.getting.started/src/test/java/O13_layout_testing/LayoutTestingTests.java b/getting-started/bellatrix.playwright.getting.started/src/test/java/O13_layout_testing/LayoutTestingTests.java index 3f083b97..0643ad9d 100644 --- a/getting-started/bellatrix.playwright.getting.started/src/test/java/O13_layout_testing/LayoutTestingTests.java +++ b/getting-started/bellatrix.playwright.getting.started/src/test/java/O13_layout_testing/LayoutTestingTests.java @@ -2,13 +2,13 @@ import org.junit.jupiter.api.Test; import solutions.bellatrix.playwright.components.*; -import solutions.bellatrix.playwright.infrastructure.Browsers; +import solutions.bellatrix.playwright.infrastructure.BrowserTypes; import solutions.bellatrix.playwright.infrastructure.ExecutionBrowser; import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; // Layout testing is a module from BELLATRIX that allows you to test the responsiveness of your website. -@ExecutionBrowser (browser = Browsers.CHROME, width = 1280, height = 1024, lifecycle = Lifecycle.RESTART_EVERY_TIME) +@ExecutionBrowser (browser = BrowserTypes.CHROME, width = 1280, height = 1024, lifecycle = Lifecycle.RESTART_EVERY_TIME) public class LayoutTestingTests extends WebTest { @Test public void testPageLayout() { diff --git a/getting-started/bellatrix.playwright.getting.started/src/test/java/O16_grid_and_cloud_integration/selenium_grid_01/SeleniumGridTests.java b/getting-started/bellatrix.playwright.getting.started/src/test/java/O16_grid_and_cloud_integration/selenium_grid_01/SeleniumGridTests.java index 8c0645f1..5f93216d 100644 --- a/getting-started/bellatrix.playwright.getting.started/src/test/java/O16_grid_and_cloud_integration/selenium_grid_01/SeleniumGridTests.java +++ b/getting-started/bellatrix.playwright.getting.started/src/test/java/O16_grid_and_cloud_integration/selenium_grid_01/SeleniumGridTests.java @@ -5,7 +5,7 @@ import solutions.bellatrix.playwright.infrastructure.*; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; -@ExecutionBrowser (browser = Browsers.CHROME, browserVersion = 89, lifecycle = Lifecycle.REUSE_IF_STARTED) +@ExecutionBrowser (browser = BrowserTypes.CHROME, browserVersion = 89, lifecycle = Lifecycle.REUSE_IF_STARTED) public class SeleniumGridTests extends WebTest { @Test public void promotionsPageOpened_When_PromotionsButtonClicked() { diff --git a/getting-started/bellatrix.playwright.getting.started/src/test/java/O17_logging/LoggingTests.java b/getting-started/bellatrix.playwright.getting.started/src/test/java/O17_logging/LoggingTests.java index 836336e0..64a1d420 100644 --- a/getting-started/bellatrix.playwright.getting.started/src/test/java/O17_logging/LoggingTests.java +++ b/getting-started/bellatrix.playwright.getting.started/src/test/java/O17_logging/LoggingTests.java @@ -3,11 +3,11 @@ import org.junit.jupiter.api.Test; import solutions.bellatrix.core.utilities.Log; import solutions.bellatrix.playwright.components.*; -import solutions.bellatrix.playwright.infrastructure.Browsers; +import solutions.bellatrix.playwright.infrastructure.BrowserTypes; import solutions.bellatrix.playwright.infrastructure.ExecutionBrowser; import solutions.bellatrix.playwright.infrastructure.Lifecycle; import solutions.bellatrix.playwright.infrastructure.junit.WebTest; -@ExecutionBrowser (browser = Browsers.CHROME, lifecycle = Lifecycle.RESTART_EVERY_TIME) +@ExecutionBrowser (browser = BrowserTypes.CHROME, lifecycle = Lifecycle.RESTART_EVERY_TIME) public class LoggingTests extends WebTest { @Test public void addCustomMessagesToLog() { diff --git a/getting-started/bellatrix.playwright.getting.started/src/test/java/O2_control_browser/BellatrixBrowserBehaviourTests.java b/getting-started/bellatrix.playwright.getting.started/src/test/java/O2_control_browser/BellatrixBrowserBehaviourTests.java index 32033f1f..8e5e6d50 100644 --- a/getting-started/bellatrix.playwright.getting.started/src/test/java/O2_control_browser/BellatrixBrowserBehaviourTests.java +++ b/getting-started/bellatrix.playwright.getting.started/src/test/java/O2_control_browser/BellatrixBrowserBehaviourTests.java @@ -25,7 +25,7 @@ // the browser is reused if possible. // Note: However, use this option with caution since in some rare cases if you have not properly set up your tests // you may need to restart the browser if the test fails otherwise all other tests may fail too. -@ExecutionBrowser (browser = Browsers.FIREFOX, lifecycle = Lifecycle.RESTART_EVERY_TIME) +@ExecutionBrowser (browser = BrowserTypes.FIREFOX, lifecycle = Lifecycle.RESTART_EVERY_TIME) public class BellatrixBrowserBehaviourTests extends WebTest { // 1.3 All playwright BELLATRIX test classes should inherit from the WebTest base class. This way you can use all built-in // BELLATRIX tools and functionalities. If you place attribute over the class all tests inherit the Lifecycle. @@ -48,7 +48,7 @@ public void promotionsPageOpened_When_PromotionsButtonClicked() { // 1.5 As mentioned above you can override the browser Lifecycle for a particular test. The global Lifecycle for all // tests in the class is to reuse an instance of Firefox browser. Only for this particular test, BELLATRIX opens // Chrome and restarts it only on fail. - @ExecutionBrowser (browser = Browsers.CHROME, lifecycle = Lifecycle.RESTART_ON_FAIL) + @ExecutionBrowser (browser = BrowserTypes.CHROME, lifecycle = Lifecycle.RESTART_ON_FAIL) @Test public void blogPageOpened_When_PromotionsButtonClicked() { app().navigate().to("http://demos.bellatrix.solutions/"); From e6aa3d6be424cd9937907b4619b54363197f9abb Mon Sep 17 00:00:00 2001 From: MiriamKyoseva <133047546+MiriamKyoseva@users.noreply.github.com> Date: Tue, 6 Aug 2024 16:15:17 +0300 Subject: [PATCH 10/19] Update BaseTest.java Made one of the threadlocal variables with initial instead of initializing them in the constructor of BaseTest, as problems occur during parallel execution otherwise --- .../bellatrix/core/plugins/junit/BaseTest.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 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 a4526c6c..7f313285 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 @@ -31,23 +31,10 @@ public class BaseTest extends UsesPlugins { static final ThreadLocal CURRENT_TEST_RESULT = new ThreadLocal<>(); static final ThreadLocal CURRENT_TEST_TIME_RECORD = ThreadLocal.withInitial(TimeRecord::new); - private static final ThreadLocal CONFIGURATION_EXECUTED = new ThreadLocal<>(); + private static final ThreadLocal CONFIGURATION_EXECUTED = ThreadLocal.withInitial(() -> false); private static final List ALREADY_EXECUTED_BEFORE_CLASSES = Collections.synchronizedList(new ArrayList<>()); private TestInfo testInfo; - public BaseTest() { -// try { -// Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); -// theUnsafe.setAccessible(true); -// Unsafe u = (Unsafe)theUnsafe.get(null); -// -// Class cls = Class.forName("jdk.internal.module.IllegalAccessLogger"); -// Field logger = cls.getDeclaredField("logger"); -// u.putObjectVolatile(cls, u.staticFieldOffset(logger), null); -// } catch (Exception ignored) {} - CONFIGURATION_EXECUTED.set(false); - } - @BeforeEach public void beforeMethodCore(TestInfo testInfo) throws Exception { try { From c57e4b385046f3fd9eedc773d5c9ed066efa5466 Mon Sep 17 00:00:00 2001 From: MiriamKyoseva <133047546+MiriamKyoseva@users.noreply.github.com> Date: Tue, 6 Aug 2024 18:59:41 +0300 Subject: [PATCH 11/19] Update ShutdownManager.java --- .../core/utilities/ShutdownManager.java | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java index 2ce64a87..24d159ba 100644 --- a/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java +++ b/bellatrix.core/src/main/java/solutions/bellatrix/core/utilities/ShutdownManager.java @@ -17,10 +17,15 @@ import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @UtilityClass public class ShutdownManager { - private static final List instructions = new ArrayList<>(); + private static final List instructions = new CopyOnWriteArrayList<>(); + private static final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); static { Runtime.getRuntime().addShutdownHook(new Thread(ShutdownManager::runAllInstructions)); @@ -33,11 +38,38 @@ public static void register(Runnable runnable) { private static void runAllInstructions() { if (instructions.isEmpty()) return; - for (var instruction : instructions) { - try { - instruction.run(); - } catch (Exception ignored) { + try { + // Submit all instructions for parallel execution + for (var instruction : instructions) { + executor.submit(() -> { + try { + instruction.run(); + } catch (Exception ex) { + DebugInformation.debugInfo(ex.getMessage()); + } + }); } + } finally { + shutdownAndAwaitTermination(executor); + } + } + + private static void shutdownAndAwaitTermination(ExecutorService executor) { + executor.shutdown(); // Disable new tasks from being submitted + try { + // Wait a while for existing tasks to terminate + if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { + executor.shutdownNow(); // Cancel currently executing tasks + // Wait a while for tasks to respond to being cancelled + if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { + System.err.println("Executor did not terminate."); + } + } + } catch (InterruptedException ie) { + // (Re-)Cancel if current thread also interrupted + executor.shutdownNow(); + // Preserve interrupt status + Thread.currentThread().interrupt(); } } } \ No newline at end of file From d20caa77e4e14009dd9635e381a8fd5c1db7aff9 Mon Sep 17 00:00:00 2001 From: MiriamKyoseva <133047546+MiriamKyoseva@users.noreply.github.com> Date: Tue, 6 Aug 2024 18:59:45 +0300 Subject: [PATCH 12/19] Update PlaywrightService.java --- .../playwright/infrastructure/PlaywrightService.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java index e0e3bcca..802994c1 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java @@ -45,14 +45,12 @@ @SuppressWarnings("ALL") public class PlaywrightService { - private static ThreadLocal PLAYWRIGHT_MANAGER = new ThreadLocal<>(); - - static { + private static ThreadLocal PLAYWRIGHT_MANAGER = ThreadLocal.withInitial(() -> { var driverManager = new PlaywrightManager(); SingletonFactory.register(driverManager); ShutdownManager.register(driverManager::close); - PLAYWRIGHT_MANAGER.set(driverManager); - } + return driverManager; + }); public static WrappedBrowser start(BrowserConfiguration configuration) { return PLAYWRIGHT_MANAGER.get().start(configuration); From f97b57b0200dacfc2f247747262944de642db86d Mon Sep 17 00:00:00 2001 From: MiriamKyoseva <133047546+MiriamKyoseva@users.noreply.github.com> Date: Tue, 6 Aug 2024 18:59:48 +0300 Subject: [PATCH 13/19] Update DriverService.java --- .../bellatrix/web/infrastructure/DriverService.java | 8 +++----- 1 file changed, 3 insertions(+), 5 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 3a77360a..a3846375 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 @@ -48,14 +48,12 @@ @UtilityClass public class DriverService { - private static ThreadLocal DRIVER_MANAGER = new ThreadLocal<>(); - - static { + private static final ThreadLocal DRIVER_MANAGER = ThreadLocal.withInitial(() -> { var driverManager = new DriverManager(); SingletonFactory.register(driverManager); ShutdownManager.register(driverManager::close); - DRIVER_MANAGER.set(driverManager); - } + return driverManager; + }); public static WebDriver start(BrowserConfiguration configuration) { return DRIVER_MANAGER.get().start(configuration); From 6861fb45fc5d0cf06b93402b8600b89da35c6a4f Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Thu, 9 Jan 2025 15:15:03 +0200 Subject: [PATCH 14/19] Merging conflict resolved --- .../infrastructure/PlaywrightService.java | 509 ++++++-------- .../web/infrastructure/DriverService.java | 658 +++++++++--------- 2 files changed, 517 insertions(+), 650 deletions(-) diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java index c7df873b..227dcfe7 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java @@ -20,12 +20,10 @@ import com.microsoft.playwright.Playwright; import io.restassured.RestAssured; import io.restassured.http.ContentType; -import lombok.Getter; +import lombok.experimental.UtilityClass; import org.apache.commons.lang3.NotImplementedException; import solutions.bellatrix.core.configuration.ConfigurationService; import solutions.bellatrix.core.utilities.DebugInformation; -import solutions.bellatrix.core.utilities.ShutdownManager; -import solutions.bellatrix.core.utilities.SingletonFactory; import solutions.bellatrix.core.utilities.TimestampBuilder; import solutions.bellatrix.playwright.configuration.GridSettings; import solutions.bellatrix.playwright.configuration.WebSettings; @@ -44,31 +42,89 @@ import java.util.Properties; @SuppressWarnings("ALL") +@UtilityClass public class PlaywrightService { - private static ThreadLocal PLAYWRIGHT_MANAGER = ThreadLocal.withInitial(() -> { - var driverManager = new PlaywrightManager(); - SingletonFactory.register(driverManager); - ShutdownManager.register(driverManager::close); - return driverManager; - }); + private static final ThreadLocal DISPOSED; + private static final ThreadLocal BROWSER_CONFIGURATION_THREAD_LOCAL; + private static final ThreadLocal PLAYWRIGHT_THREAD_LOCAL; + private static final ThreadLocal BROWSER_WRAPPER_THREAD_LOCAL; + private static boolean isBuildNameSet = false; + private static String buildName; + + static { + DISPOSED = ThreadLocal.withInitial(() -> true); + BROWSER_CONFIGURATION_THREAD_LOCAL = new ThreadLocal<>(); + PLAYWRIGHT_THREAD_LOCAL = new ThreadLocal<>(); + BROWSER_WRAPPER_THREAD_LOCAL = new ThreadLocal<>(); + } public static WrappedBrowser start(BrowserConfiguration configuration) { - return PLAYWRIGHT_MANAGER.get().start(configuration); + if (DISPOSED.get()) { + browserConfiguration(configuration); + playwright(Playwright.create()); + DISPOSED.set(false); + var executionType = Settings.web().getExecutionType(); + + if (executionType.equals("regular")) { + return initializeBrowserWrapperRegularMode(); + } else { + var gridSettings = ConfigurationService.get(WebSettings.class).getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst().orElse(null); + assert gridSettings != null : String.format("The specified execution type '%s' is not declared in the configuration", executionType); + + return initializeBrowserWrapperGridMode(gridSettings); + } + } + else return wrappedBrowser(); } - public static void restartBrowserContext() { - PLAYWRIGHT_MANAGER.get().restartBrowserContext(); - } public static void close() { - PLAYWRIGHT_MANAGER.get().close(); + if (DISPOSED.get()) { + return; + } + + if (playwright() != null) { + DebugInformation.debugInfo("SHUTTING DOWN PLAYWRIGHT"); + + if (wrappedBrowser() != null) { + wrappedBrowser().close(); + } + + PLAYWRIGHT_THREAD_LOCAL.remove(); + + if (wrappedBrowser().getGridSessionId() != null) { + RestAssured.baseURI = ConfigurationService.get(WebSettings.class).getGridSettings().stream().filter(g -> g.getProviderName().equals(Settings.web().getExecutionType().toLowerCase())).findFirst().orElse(null).getUrl(); + + var response = RestAssured.given() + .delete(String.format("/session/%s", wrappedBrowser().getGridSessionId())); + } + } + + DISPOSED.set(true); } - public static WrappedBrowser wrappedBrowser() { - return PLAYWRIGHT_MANAGER.get().wrappedBrowser; + public static void restartBrowserContext() { + DebugInformation.debugInfo("RESTARTING CONTEXT"); + wrappedBrowser().changeContext(intializeBrowserContext()); + } + + private static WrappedBrowser initializeBrowserWrapperRegularMode() { + wrappedBrowser(new WrappedBrowser(playwright())); + + wrappedBrowser().setBrowser(initializeBrowserRegularMode()); + wrappedBrowser().setCurrentContext(intializeBrowserContext()); + wrappedBrowser().setCurrentPage(wrappedBrowser().getCurrentContext().newPage()); + + return wrappedBrowser(); } - public static void wrappedBrowser(WrappedBrowser driver) { - PLAYWRIGHT_MANAGER.get().wrappedBrowser = driver; + private static WrappedBrowser initializeBrowserWrapperGridMode(GridSettings gridSettings) { + wrappedBrowser(new WrappedBrowser(playwright())); + + wrappedBrowser().setBrowser(initializeBrowserGridMode(gridSettings)); + wrappedBrowser().setCurrentContext(intializeBrowserContext()); + wrappedBrowser().setCurrentPage(wrappedBrowser().getCurrentContext().newPage()); + + return wrappedBrowser(); } private static Browser initializeBrowserRegularMode() { @@ -169,199 +225,20 @@ private static Browser initializeBrowserRegularMode() { } } - private static class PlaywrightManager { - private PlaywrightManager() { - } - - private boolean disposed = true; - @Getter private BrowserConfiguration browserConfiguration; - private Playwright playwright; - private WrappedBrowser wrappedBrowser; - private boolean isBuildNameSet = false; - private String buildName; - - public WrappedBrowser start(BrowserConfiguration configuration) { - if (disposed) { - browserConfiguration(configuration); - playwright = Playwright.create(); - disposed = false; - - var executionType = Settings.web().getExecutionType(); - - if (executionType.equals("regular")) { - return initializeBrowserWrapperRegularMode(); - } else { - var gridSettings = ConfigurationService.get(WebSettings.class).getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst().orElse(null); - assert gridSettings != null : String.format("The specified execution type '%s' is not declared in the configuration", executionType); - - return initializeBrowserWrapperGridMode(gridSettings); - } - } - else return wrappedBrowser(); - } - - public void close() { - if (disposed) { - return; - } - - if (playwright != null) { - DebugInformation.debugInfo("SHUTTING DOWN PLAYWRIGHT"); - - if (wrappedBrowser() != null) { - wrappedBrowser().close(); - } - - playwright = null; - - if (wrappedBrowser().getGridSessionId() != null) { - RestAssured.baseURI = ConfigurationService.get(WebSettings.class).getGridSettings().stream().filter(g -> g.getProviderName().equals(Settings.web().getExecutionType().toLowerCase())).findFirst().orElse(null).getUrl(); - - var response = RestAssured.given() - .delete(String.format("/session/%s", wrappedBrowser().getGridSessionId())); - } - } - - disposed = true; - } - - public void restartBrowserContext() { - DebugInformation.debugInfo("RESTARTING CONTEXT"); - wrappedBrowser().changeContext(intializeBrowserContext()); - } - - private WrappedBrowser initializeBrowserWrapperRegularMode() { - wrappedBrowser(new WrappedBrowser(playwright)); - - wrappedBrowser().setBrowser(initializeBrowserRegularMode()); - wrappedBrowser().setCurrentContext(intializeBrowserContext()); - wrappedBrowser().setCurrentPage(wrappedBrowser().getCurrentContext().newPage()); - - return wrappedBrowser(); - } - - private WrappedBrowser initializeBrowserWrapperGridMode(GridSettings gridSettings) { - wrappedBrowser(new WrappedBrowser(playwright)); - - wrappedBrowser().setBrowser(initializeBrowserGridMode(gridSettings)); - wrappedBrowser().setCurrentContext(intializeBrowserContext()); - wrappedBrowser().setCurrentPage(wrappedBrowser().getCurrentContext().newPage()); - - return wrappedBrowser(); - } - - private Browser initializeBrowserRegularMode() { - BrowserTypes browserTypes = browserConfiguration().getBrowserTypes(); - - switch (browserTypes) { - case CHROMIUM -> { - var browserType = playwright.chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(false); - launchOptions.setArgs(List.of("--log-level=3", "--remote-allow-origins=*")); - launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case CHROMIUM_HEADLESS -> { - var browserType = playwright.chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(true); - launchOptions.setArgs(List.of("--log-level=3")); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case CHROME -> { - var browserType = playwright.chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setChannel("chrome"); - launchOptions.setHeadless(false); - launchOptions.setArgs(List.of("--log-level=3", "--remote-allow-origins=*")); - launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case CHROME_HEADLESS -> { - var browserType = playwright.chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setChannel("chrome"); - launchOptions.setHeadless(true); - launchOptions.setArgs(List.of("--log-level=3")); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case FIREFOX -> { - var browserType = playwright.firefox(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(false); - launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); - - return browser(browserType.launch(launchOptions)); - } - case FIREFOX_HEADLESS -> { - var browserType = playwright.firefox(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(true); - - return browser(browserType.launch(launchOptions)); - } - case EDGE -> { - var browserType = playwright.chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setChannel("msedge"); - launchOptions.setHeadless(false); - // launchOptions.setArgs(List.of("--log-level=3")); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case EDGE_HEADLESS -> { - var browserType = playwright.chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setChannel("msedge"); - launchOptions.setHeadless(true); - // launchOptions.setArgs(List.of("--log-level=3")); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case WEBKIT -> { - var browserType = playwright.webkit(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(false); - launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); - - return browser(browserType.launch(launchOptions)); - } - case WEBKIT_HEADLESS -> { - var browserType = playwright.webkit(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(true); + private static BrowserContext intializeBrowserContext() { + Browser.NewContextOptions options = getContextOptions(); + var context = browser().newContext(options); - return browser(browserType.launch(launchOptions)); - } - default -> throw new IllegalArgumentException("Unsupported."); - } + if (Settings.web().getShouldCaptureHttpTraffic()) { + startRecordingHttpTraffic(context); } - private BrowserContext intializeBrowserContext() { - Browser.NewContextOptions options = getContextOptions(); - var context = browser().newContext(options); - - if (Settings.web().getShouldCaptureHttpTraffic()) { - startRecordingHttpTraffic(context); - } - - return context; - } + return context; + } - // ToDo Browser Context options - private Browser.NewContextOptions getContextOptions() { - Browser.NewContextOptions options = new Browser.NewContextOptions(); + // ToDo Browser Context options + private static Browser.NewContextOptions getContextOptions() { + Browser.NewContextOptions options = new Browser.NewContextOptions(); // if (Settings.context().isShouldSetContextSettings()) { // options.setIgnoreHTTPSErrors(Settings.context().isIgnoreHTTPSErrors()); @@ -376,144 +253,152 @@ private Browser.NewContextOptions getContextOptions() { // options.setUserAgent(Settings.context().getUserAgent()); // } - options.setIgnoreHTTPSErrors(true); + options.setIgnoreHTTPSErrors(true); - // ToDo setProxy + // ToDo setProxy - return options; - } + return options; + } - private void startRecordingHttpTraffic(BrowserContext context) { - Traffic.getRequestContainers().add(new Requests(context)); - context.onRequest(x -> Traffic.getContextSpecificRequests(context).add(x)); + private static void startRecordingHttpTraffic(BrowserContext context) { + Traffic.getRequestContainers().add(new Requests(context)); + context.onRequest(x -> Traffic.getContextSpecificRequests(context).add(x)); - Traffic.getResponseContainers().add(new Responses(context)); - context.onResponse(x -> Traffic.getContextSpecificResponses(context).add(x)); - } + Traffic.getResponseContainers().add(new Responses(context)); + context.onResponse(x -> Traffic.getContextSpecificResponses(context).add(x)); + } - private Browser initializeBrowserGridMode(GridSettings gridSettings) { - var timeout = Settings.timeout().inMilliseconds().getConnectToRemoteGridTimeout(); + private static Browser initializeBrowserGridMode(GridSettings gridSettings) { + var timeout = Settings.timeout().inMilliseconds().getConnectToRemoteGridTimeout(); - var gridUrl = gridSettings.getUrl(); - if (gridUrl.startsWith("env_")) { - gridUrl = System.getProperty(gridSettings.getUrl()).replace("env_", ""); - } + var gridUrl = gridSettings.getUrl(); + if (gridUrl.startsWith("env_")) { + gridUrl = System.getProperty(gridSettings.getUrl()).replace("env_", ""); + } - try { - Gson gson = new Gson(); - String serializedSettings = URLEncoder.encode(gson.toJson(gridSettings.getArguments().get(0)), "UTF-8"); + try { + Gson gson = new Gson(); + String serializedSettings = URLEncoder.encode(gson.toJson(gridSettings.getArguments().get(0)), "UTF-8"); - if (gridSettings.getProviderName().equals("grid") || gridSettings.getProviderName().equals("selenoid")) { - var browserType = browserConfiguration.getBrowserTypes(); - if (browserType == BrowserTypes.FIREFOX || browserType == BrowserTypes.FIREFOX_HEADLESS || browserType == BrowserTypes.WEBKIT || browserType == BrowserTypes.WEBKIT_HEADLESS) { - throw new NotImplementedException("Playwright supports running in Selenium Grid only Chromium browsers."); - } + if (gridSettings.getProviderName().equals("grid") || gridSettings.getProviderName().equals("selenoid")) { + var browserType = BROWSER_CONFIGURATION_THREAD_LOCAL.get().getBrowserTypes(); + if (browserType == BrowserTypes.FIREFOX || browserType == BrowserTypes.FIREFOX_HEADLESS || browserType == BrowserTypes.WEBKIT || browserType == BrowserTypes.WEBKIT_HEADLESS) { + throw new NotImplementedException("Playwright supports running in Selenium Grid only Chromium browsers."); + } - RestAssured.baseURI = gridUrl; - Map capabilitiesMap = new HashMap<>(); - capabilitiesMap.put("alwaysMatch", gridSettings.getArguments().get(0)); + RestAssured.baseURI = gridUrl; + Map capabilitiesMap = new HashMap<>(); + capabilitiesMap.put("alwaysMatch", gridSettings.getArguments().get(0)); - Map body = new HashMap<>(); - body.put("capabilities", capabilitiesMap); + Map body = new HashMap<>(); + body.put("capabilities", capabilitiesMap); - var serializedBody = gson.toJson(body); + var serializedBody = gson.toJson(body); - var response = RestAssured.given() - .contentType(ContentType.JSON) - .body(serializedBody) - .post("/session"); + var response = RestAssured.given() + .contentType(ContentType.JSON) + .body(serializedBody) + .post("/session"); - wrappedBrowser().setGridSessionId(response.body().jsonPath().get("value.sessionId")); + wrappedBrowser().setGridSessionId(response.body().jsonPath().get("value.sessionId")); - var responseBody = response.body(); - var responseJson = response.jsonPath(); + var responseBody = response.body(); + var responseJson = response.jsonPath(); - var cdpUrl = new URI(response.jsonPath().get("value.capabilities['se:cdp']")); - cdpUrl = new URI(cdpUrl.getScheme(), cdpUrl.getUserInfo(), new URI(gridUrl).getHost(), new URI(gridUrl).getPort(), cdpUrl.getPath(), cdpUrl.getQuery(), cdpUrl.getFragment()); + var cdpUrl = new URI(response.jsonPath().get("value.capabilities['se:cdp']")); + cdpUrl = new URI(cdpUrl.getScheme(), cdpUrl.getUserInfo(), new URI(gridUrl).getHost(), new URI(gridUrl).getPort(), cdpUrl.getPath(), cdpUrl.getQuery(), cdpUrl.getFragment()); - return playwright.chromium().connectOverCDP(cdpUrl.toString(), new BrowserType.ConnectOverCDPOptions().setTimeout(timeout)); - } else if (gridSettings.getProviderName().equals("lambdatest")) { - return playwright.chromium().connect(String.format("%s?capabilities=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); - } else if (gridSettings.getProviderName().equals("browserstack")) { - return playwright.chromium().connect(String.format("%s?caps=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); - } else { - throw new NotImplementedException("Unsupported grid provider. Supported are: selenium grid, selenoid, lambdatest, and browserstack."); - } - } catch (Exception e) { - DebugInformation.printStackTrace(e); - return null; + return playwright().chromium().connectOverCDP(cdpUrl.toString(), new BrowserType.ConnectOverCDPOptions().setTimeout(timeout)); + } else if (gridSettings.getProviderName().equals("lambdatest")) { + return playwright().chromium().connect(String.format("%s?capabilities=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); + } else if (gridSettings.getProviderName().equals("browserstack")) { + return playwright().chromium().connect(String.format("%s?caps=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); + } else { + throw new NotImplementedException("Unsupported grid provider. Supported are: selenium grid, selenoid, lambdatest, and browserstack."); } + } catch (Exception e) { + DebugInformation.printStackTrace(e); + return null; } + } - private void changeWindowSize() { - try { - if (browserConfiguration().getHeight() != 0 && browserConfiguration().getWidth() != 0) { - wrappedBrowser().getCurrentPage().setViewportSize(browserConfiguration().getWidth(), browserConfiguration().getHeight()); - } - } catch (Exception ignored) {} + private static void changeWindowSize() { + try { + if (browserConfiguration().getHeight() != 0 && browserConfiguration().getWidth() != 0) { + wrappedBrowser().getCurrentPage().setViewportSize(browserConfiguration().getWidth(), browserConfiguration().getHeight()); + } + } catch (Exception ignored) {} + } + + private static String getBuildName() { + if (!isBuildNameSet) { + buildName = System.getProperty("buildName"); } - private String getBuildName() { + if (buildName == null) { + InputStream input = ConfigurationService.class.getResourceAsStream("/application.properties"); + var p = new Properties(); + try { + p.load(input); + } catch (IOException e) { + return null; + } + if (!isBuildNameSet) { - buildName = System.getProperty("buildName"); + buildName = p.getProperty("buildName"); } - if (buildName == null) { - InputStream input = ConfigurationService.class.getResourceAsStream("/application.properties"); - var p = new Properties(); - try { - p.load(input); - } catch (IOException e) { - return null; - } + if (buildName.equals("{randomNumber}") && !isBuildNameSet) { + buildName = TimestampBuilder.buildUniqueTextByPrefix("LE_"); + isBuildNameSet = true; + } + } - if (!isBuildNameSet) { - buildName = p.getProperty("buildName"); - } + return buildName; + } - if (buildName.equals("{randomNumber}") && !isBuildNameSet) { - buildName = TimestampBuilder.buildUniqueTextByPrefix("LE_"); - isBuildNameSet = true; - } - } + public static BrowserConfiguration browserConfiguration() { + return BROWSER_CONFIGURATION_THREAD_LOCAL.get(); + } - return buildName; - } + public static BrowserConfiguration browserConfiguration(BrowserConfiguration configuration) { + BROWSER_CONFIGURATION_THREAD_LOCAL.set(configuration); + return browserConfiguration(); + } - public BrowserConfiguration browserConfiguration() { - return browserConfiguration; - } + private static Playwright playwright() { + return PLAYWRIGHT_THREAD_LOCAL.get(); + } - public BrowserConfiguration browserConfiguration(BrowserConfiguration configuration) { - browserConfiguration = configuration; - return browserConfiguration(); - } + private static Playwright playwright(Playwright playwright) { + PLAYWRIGHT_THREAD_LOCAL.set(playwright); + return playwright(); + } - public WrappedBrowser wrappedBrowser() { - return wrappedBrowser; - } + public static WrappedBrowser wrappedBrowser() { + return BROWSER_WRAPPER_THREAD_LOCAL.get(); + } - public WrappedBrowser wrappedBrowser(WrappedBrowser wrappedBrowser) { - this.wrappedBrowser = wrappedBrowser; - return this.wrappedBrowser; - } + public static WrappedBrowser wrappedBrowser(WrappedBrowser wrappedBrowser) { + BROWSER_WRAPPER_THREAD_LOCAL.set(wrappedBrowser); + return BROWSER_WRAPPER_THREAD_LOCAL.get(); + } - private Browser browser() { - return wrappedBrowser().getBrowser(); - } + private static Browser browser() { + return wrappedBrowser().getBrowser(); + } - private Browser browser(Browser browser) { - wrappedBrowser().setBrowser(browser); - return browser(); - } + private static Browser browser(Browser browser) { + wrappedBrowser().setBrowser(browser); + return browser(); + } - private BrowserContext context() { - return wrappedBrowser().getCurrentContext(); - } + private static BrowserContext context() { + return wrappedBrowser().getCurrentContext(); + } - private BrowserContext context(BrowserContext browserContext) { - wrappedBrowser().setCurrentContext(browserContext); - return context(); - } + private static BrowserContext context(BrowserContext browserContext) { + wrappedBrowser().setCurrentContext(browserContext); + return context(); } -} +} \ No newline at end of file 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 35c31a16..b6b4a388 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 lombok.experimental.UtilityClass; import net.lightbody.bmp.client.ClientUtil; import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; @@ -30,7 +29,10 @@ import org.openqa.selenium.safari.SafariDriver; import org.openqa.selenium.safari.SafariOptions; import solutions.bellatrix.core.configuration.ConfigurationService; -import solutions.bellatrix.core.utilities.*; +import solutions.bellatrix.core.utilities.DebugInformation; +import solutions.bellatrix.core.utilities.Log; +import solutions.bellatrix.core.utilities.SecretsResolver; +import solutions.bellatrix.core.utilities.TimestampBuilder; import solutions.bellatrix.web.configuration.GridSettings; import solutions.bellatrix.web.configuration.WebSettings; @@ -46,66 +48,185 @@ import static io.restassured.RestAssured.given; -@UtilityClass public class DriverService { - private static final ThreadLocal DRIVER_MANAGER = ThreadLocal.withInitial(() -> { - var driverManager = new DriverManager(); - SingletonFactory.register(driverManager); - ShutdownManager.register(driverManager::close); - return driverManager; - }); + private static final ThreadLocal DISPOSED = ThreadLocal.withInitial(() -> true); + private static final ThreadLocal BROWSER_CONFIGURATION; + private static final ThreadLocal> CUSTOM_DRIVER_OPTIONS; + private static final ThreadLocal WRAPPED_DRIVER; + private static boolean isBuildNameSet = false; + private static String buildName; + + static { + CUSTOM_DRIVER_OPTIONS = new ThreadLocal<>(); + CUSTOM_DRIVER_OPTIONS.set(new HashMap<>()); + BROWSER_CONFIGURATION = new ThreadLocal<>(); + WRAPPED_DRIVER = new ThreadLocal<>(); + } - public static WebDriver start(BrowserConfiguration configuration) { - return DRIVER_MANAGER.get().start(configuration); + public static HashMap getCustomDriverOptions() { + return CUSTOM_DRIVER_OPTIONS.get(); } - public static void close() { - DRIVER_MANAGER.get().close(); + public static void addDriverOptions(String key, String value) { + CUSTOM_DRIVER_OPTIONS.get().put(key, value); } public static WebDriver getWrappedDriver() { - return DRIVER_MANAGER.get().wrappedDriver; + return WRAPPED_DRIVER.get(); } public static void setWrappedDriver(WebDriver driver) { - DRIVER_MANAGER.get().wrappedDriver = driver; + WRAPPED_DRIVER.set(driver); } public static BrowserConfiguration getBrowserConfiguration() { - return DRIVER_MANAGER.get().browserConfiguration; + return BROWSER_CONFIGURATION.get(); } - public static Map getCustomDriverOptions() { - return DRIVER_MANAGER.get().customDriverOptions; - } + public static WebDriver start(BrowserConfiguration configuration) { + if (DISPOSED.get()) { + BROWSER_CONFIGURATION.set(configuration); + DISPOSED.set(false); + WebDriver driver; + var webSettings = ConfigurationService.get(WebSettings.class); + var executionType = webSettings.getExecutionType(); + if (executionType.equals("regular")) { + driver = initializeDriverRegularMode(); + } else if (executionType.equals("grid") || executionType.equals("selenoid")) { + var gridSettings = webSettings.getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst(); + assert gridSettings.isPresent() : String.format("The specified execution type '%s' is not declared in the configuration", executionType); + driver = initializeDriverGridMode(gridSettings.get()); + } else if (executionType.equals("healenium")) { + var gridSettings = webSettings.getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst(); + assert gridSettings.isPresent() : String.format("The specified execution type '%s' is not declared in the configuration", executionType); + driver = initializeDriverGridMode(gridSettings.get()); + } else { + var gridSettings = webSettings.getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst(); + assert gridSettings.isPresent() : String.format("The specified execution type '%s' is not declared in the configuration", executionType); + driver = initializeDriverCloudGridMode(gridSettings.get()); + } - public static void addDriverOptions(String key, String value) { - DRIVER_MANAGER.get().addDriverOptions(key, value); + driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getPageLoadTimeout())); + driver.manage().timeouts().scriptTimeout(Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getScriptTimeout())); + + 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; + } else return WRAPPED_DRIVER.get(); } - private static class DriverManager { - private DriverManager() { + private static WebDriver initializeDriverCloudGridMode(GridSettings gridSettings) { + MutableCapabilities caps = new MutableCapabilities(); + + switch (BROWSER_CONFIGURATION.get().getBrowser()) { + case CHROME_HEADLESS: + case CHROME: { + var chromeOptions = new ChromeOptions(); + caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); + break; + } + case FIREFOX_HEADLESS: + case FIREFOX: { + var firefoxOptions = new FirefoxOptions(); + caps.setCapability(ChromeOptions.CAPABILITY, firefoxOptions); + break; + } + case EDGE_HEADLESS: + case EDGE: { + var edgeOptions = new EdgeOptions(); + caps.setCapability(ChromeOptions.CAPABILITY, edgeOptions); + break; + } + case SAFARI: { + var safariOptions = new SafariOptions(); + caps.setCapability(ChromeOptions.CAPABILITY, safariOptions); + break; + } } - private boolean disposed = true; - private BrowserConfiguration browserConfiguration; - private final Map customDriverOptions = new HashMap<>(); - private WebDriver wrappedDriver; - private boolean isBuildNameSet = false; - private String buildName; + HashMap options = new HashMap(); + + // Anton: maybe this is something else for other clouds, should be tested. + // If this is the case, we need to have branching per provider name. + options.put("sessionName", getBrowserConfiguration().getTestName()); + // if (gridSettings.getProviderName() == "browserstack") { + // options.put("sessionName", getBrowserConfiguration().getTestName()); + // } + + addGridOptions(options, gridSettings); + + caps.setCapability(gridSettings.getOptionsName(), options); + WebDriver driver = null; + try { + var url = getUrl(gridSettings.getUrl()); + driver = new RemoteWebDriver(new URI(url).toURL(), caps); + } catch (Exception e) { + DebugInformation.printStackTrace(e); + } + + return driver; + } + + private static WebDriver initializeDriverGridMode(GridSettings gridSettings) { + var caps = new DesiredCapabilities(); + if (BROWSER_CONFIGURATION.get().getPlatform() != Platform.ANY) { + caps.setCapability("platform", BROWSER_CONFIGURATION.get().getPlatform()); + } - private void addDriverOptions(String key, String value) { - customDriverOptions.put(key, value); + if (BROWSER_CONFIGURATION.get().getVersion() != 0) { + caps.setCapability("version", BROWSER_CONFIGURATION.get().getVersion()); + } else { + caps.setCapability("version", "latest"); } - private WebDriver start(BrowserConfiguration configuration) { - if (disposed) { - browserConfiguration = configuration; - disposed = false; + switch (BROWSER_CONFIGURATION.get().getBrowser()) { + case CHROME_HEADLESS: + case CHROME: { + var chromeOptions = new ChromeOptions(); + addGridOptions(chromeOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); + break; + } + case FIREFOX_HEADLESS: + case FIREFOX: { + var firefoxOptions = new FirefoxOptions(); + addGridOptions(firefoxOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, firefoxOptions); + break; + } + case EDGE_HEADLESS: + case EDGE: { + var edgeOptions = new EdgeOptions(); + addGridOptions(edgeOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, edgeOptions); + break; + } + case SAFARI: { + var safariOptions = new SafariOptions(); + addGridOptions(safariOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, safariOptions); + break; + } + case INTERNET_EXPLORER: { + var ieOptions = new InternetExplorerOptions(); + addGridOptions(ieOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, ieOptions); + break; + } + } - WebDriver driver; - var webSettings = ConfigurationService.get(WebSettings.class); - var executionType = webSettings.getExecutionType(); + WebDriver driver = null; + try { + var gridUrl = gridSettings.getUrl(); + var url = getUrl(gridUrl); driver = new RemoteWebDriver(new URI(url).toURL(), caps); } catch (MalformedURLException | URISyntaxException e) { @@ -173,26 +294,7 @@ private static WebDriver initializeDriverRegularMode() { System.setProperty("webdriver.chrome.silentOutput", "true"); if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); - private WebDriver initializeDriverCloudGridMode(GridSettings gridSettings) { - MutableCapabilities caps = new MutableCapabilities(); - - switch (browserConfiguration.getBrowser()) { - case CHROME_HEADLESS, CHROME -> { - var chromeOptions = new ChromeOptions(); - caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); - } - case FIREFOX_HEADLESS, FIREFOX -> { - var firefoxOptions = new FirefoxOptions(); - caps.setCapability(ChromeOptions.CAPABILITY, firefoxOptions); - } - case EDGE_HEADLESS, EDGE -> { - var edgeOptions = new EdgeOptions(); - caps.setCapability(ChromeOptions.CAPABILITY, edgeOptions); - } - case SAFARI -> { - var safariOptions = new SafariOptions(); - caps.setCapability(ChromeOptions.CAPABILITY, safariOptions); - } + driver = new TouchableWebDriver(chromeHeadlessOptions); } case FIREFOX -> { var firefoxOptions = new FirefoxOptions(); @@ -201,334 +303,214 @@ private WebDriver initializeDriverCloudGridMode(GridSettings gridSettings) { if (shouldCaptureHttpTraffic) firefoxOptions.setProxy(proxyConfig); driver = new FirefoxDriver(firefoxOptions); } - - return driver; - } - - private WebDriver initializeDriverGridMode(GridSettings gridSettings) { - var caps = new DesiredCapabilities(); - if (browserConfiguration.getPlatform() != Platform.ANY) { - caps.setCapability("platform", browserConfiguration.getPlatform()); + case FIREFOX_HEADLESS -> { + var firefoxHeadlessOptions = new FirefoxOptions(); + addDriverOptions(firefoxHeadlessOptions); + firefoxHeadlessOptions.setAcceptInsecureCerts(true); + firefoxHeadlessOptions.addArguments("--headless"); + if (shouldCaptureHttpTraffic) firefoxHeadlessOptions.setProxy(proxyConfig); + driver = new FirefoxDriver(firefoxHeadlessOptions); } - - if (browserConfiguration.getVersion() != 0) { - caps.setCapability("version", browserConfiguration.getVersion()); - } else { - caps.setCapability("version", "latest"); + case EDGE -> { + var edgeOptions = new EdgeOptions(); + addDriverOptions(edgeOptions); + if (shouldCaptureHttpTraffic) edgeOptions.setProxy(proxyConfig); + driver = new EdgeDriver(edgeOptions); } - - switch (browserConfiguration.getBrowser()) { - case CHROME_HEADLESS, CHROME -> { - var chromeOptions = new ChromeOptions(); - addGridOptions(chromeOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); - } - case FIREFOX_HEADLESS, FIREFOX -> { - var firefoxOptions = new FirefoxOptions(); - addGridOptions(firefoxOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, firefoxOptions); - } - case EDGE_HEADLESS, EDGE -> { - var edgeOptions = new EdgeOptions(); - addGridOptions(edgeOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, edgeOptions); - } - case SAFARI -> { - var safariOptions = new SafariOptions(); - addGridOptions(safariOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, safariOptions); - } - case INTERNET_EXPLORER -> { - var ieOptions = new InternetExplorerOptions(); - addGridOptions(ieOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, ieOptions); - } + case EDGE_HEADLESS -> { + var edgeOptions = new EdgeOptions(); + edgeOptions.addArguments("--headless"); + edgeOptions.addArguments("--disable-gpu"); + addDriverOptions(edgeOptions); + if (shouldCaptureHttpTraffic) edgeOptions.setProxy(proxyConfig); + driver = new EdgeDriver(edgeOptions); } - - WebDriver driver = null; - try { - var gridUrl = gridSettings.getUrl(); - var url = getUrl(gridUrl); - - driver = new RemoteWebDriver(new URI(url).toURL(), caps); - } catch (MalformedURLException | URISyntaxException e) { - DebugInformation.printStackTrace(e); + case SAFARI -> { + System.setProperty("webdriver.safari.driver", "/usr/bin/safaridriver"); + var safariOptions = new SafariOptions(); + addDriverOptions(safariOptions); + if (shouldCaptureHttpTraffic) safariOptions.setProxy(proxyConfig); + driver = new SafariDriver(safariOptions); + } + case INTERNET_EXPLORER -> { + var internetExplorerOptions = new InternetExplorerOptions(); + addDriverOptions(internetExplorerOptions); + internetExplorerOptions.introduceFlakinessByIgnoringSecurityDomains().ignoreZoomSettings(); + if (shouldCaptureHttpTraffic) internetExplorerOptions.setProxy(proxyConfig); + driver = new InternetExplorerDriver(internetExplorerOptions); } - - return driver; } - private WebDriver initializeDriverRegularMode() { - WebDriver driver = null; - boolean shouldCaptureHttpTraffic = ConfigurationService.get(WebSettings.class).getShouldCaptureHttpTraffic(); + return driver; + } - Proxy proxyConfig = null; - if (shouldCaptureHttpTraffic) { - ProxyServer.init(); - proxyConfig = ClientUtil.createSeleniumProxy(ProxyServer.get()); - ProxyServer.newHar(); - } + 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; + } - switch (browserConfiguration.getBrowser()) { - 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); - System.setProperty("webdriver.chrome.silentOutput", "true"); - if (shouldCaptureHttpTraffic) { - chromeOptions.setProxy(proxyConfig); + private static void addGridOptions(HashMap options, GridSettings gridSettings) { + Log.info("Add WebDriver Options:"); + Log.info(""); + for (var entry : gridSettings.getArguments()) { + for (var c : entry.entrySet()) { + if (c.getKey().toLowerCase().contains("build")) { + var buildName = getBuildName(); + if (buildName == null) { + buildName = c.getValue().toString(); } - driver = new ChromeDriver(chromeOptions); - } - case CHROME_HEADLESS -> { - 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); - chromeHeadlessOptions.addArguments("--headless=old"); - System.setProperty("webdriver.chrome.silentOutput", "true"); - if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); - - driver = new ChromeDriver(chromeHeadlessOptions); + options.put(c.getKey(), buildName); + Log.info(c.getKey() + " = " + buildName); + } else { + if (c.getValue() instanceof String && c.getValue().toString().startsWith("{env_")) { + var envValue = SecretsResolver.getSecret(c.getValue().toString()); + options.put(c.getKey(), envValue); + Log.info(c.getKey() + " = " + envValue); + } else { + options.put(c.getKey(), c.getValue()); + Log.info(c.getKey() + " = " + c.getValue()); + } } - 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", browserConfiguration.getDeviceName().getName()); + if ("lambdatest".equalsIgnoreCase(gridSettings.getProviderName())) { + options.put("lambdaMaskCommands", new String[]{"setValues", "setCookies", "getCookies"}); - chromeHeadlessOptions.setExperimentalOption("mobileEmulation", deviceNameOption); - System.setProperty("webdriver.chrome.silentOutput", "true"); - if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); + try { + var usernameSecret = gridSettings.getArguments().get(0).get("username").toString(); + var accessKeySecret = gridSettings.getArguments().get(0).get("accessKey").toString(); + var usernameValue = SecretsResolver.getSecret(usernameSecret); + var accessKeyValue = SecretsResolver.getSecret(accessKeySecret); - driver = new TouchableWebDriver(chromeHeadlessOptions); - } + var res = given().auth().preemptive().basic(usernameValue, accessKeyValue) + .get("https://api.lambdatest.com/automation/api/v1/user-files"); - case FIREFOX -> { - var firefoxOptions = new FirefoxOptions(); - addDriverOptions(firefoxOptions); - firefoxOptions.setAcceptInsecureCerts(true); - if (shouldCaptureHttpTraffic) firefoxOptions.setProxy(proxyConfig); - driver = new FirefoxDriver(firefoxOptions); - } - case FIREFOX_HEADLESS -> { - var firefoxHeadlessOptions = new FirefoxOptions(); - addDriverOptions(firefoxHeadlessOptions); - firefoxHeadlessOptions.setAcceptInsecureCerts(true); - firefoxHeadlessOptions.addArguments("--headless"); - if (shouldCaptureHttpTraffic) firefoxHeadlessOptions.setProxy(proxyConfig); - driver = new FirefoxDriver(firefoxHeadlessOptions); - } - case EDGE -> { - var edgeOptions = new EdgeOptions(); - addDriverOptions(edgeOptions); - if (shouldCaptureHttpTraffic) edgeOptions.setProxy(proxyConfig); - driver = new EdgeDriver(edgeOptions); - } - case EDGE_HEADLESS -> { - var edgeOptions = new EdgeOptions(); - edgeOptions.addArguments("--headless"); - edgeOptions.addArguments("--disable-gpu"); - addDriverOptions(edgeOptions); - if (shouldCaptureHttpTraffic) edgeOptions.setProxy(proxyConfig); - driver = new EdgeDriver(edgeOptions); + options.put("lambda:userFiles", res.body().jsonPath().getList("data.key")); + } catch (Exception e) { + DebugInformation.printStackTrace(e); } - case SAFARI -> { - System.setProperty("webdriver.safari.driver", "/usr/bin/safaridriver"); - var safariOptions = new SafariOptions(); - addDriverOptions(safariOptions); - if (shouldCaptureHttpTraffic) safariOptions.setProxy(proxyConfig); - driver = new SafariDriver(safariOptions); - } - case INTERNET_EXPLORER -> { - var internetExplorerOptions = new InternetExplorerOptions(); - addDriverOptions(internetExplorerOptions); - internetExplorerOptions.introduceFlakinessByIgnoringSecurityDomains().ignoreZoomSettings(); - if (shouldCaptureHttpTraffic) internetExplorerOptions.setProxy(proxyConfig); - driver = new InternetExplorerDriver(internetExplorerOptions); - } - } - return driver; - } - private 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 void addGridOptions(HashMap options, GridSettings gridSettings) { - Log.info("Add WebDriver Options:"); Log.info(""); - for (var entry : gridSettings.getArguments()) { - for (var c : entry.entrySet()) { - if (c.getKey().toLowerCase().contains("build")) { - var buildName = getBuildName(); - if (buildName == null) { - buildName = c.getValue().toString(); - } - - options.put(c.getKey(), buildName); - Log.info(c.getKey() + " = " + buildName); - } else { - if (c.getValue() instanceof String && c.getValue().toString().startsWith("{env_")) { - var envValue = SecretsResolver.getSecret(c.getValue().toString()); - options.put(c.getKey(), envValue); - Log.info(c.getKey() + " = " + envValue); - } else { - options.put(c.getKey(), c.getValue()); - Log.info(c.getKey() + " = " + c.getValue()); - } - } - } - - if ("lambdatest".equalsIgnoreCase(gridSettings.getProviderName())) { - options.put("lambdaMaskCommands", new String[]{"setValues", "setCookies", "getCookies"}); - - try { - var usernameSecret = gridSettings.getArguments().get(0).get("username").toString(); - var accessKeySecret = gridSettings.getArguments().get(0).get("accessKey").toString(); - var usernameValue = SecretsResolver.getSecret(usernameSecret); - var accessKeyValue = SecretsResolver.getSecret(accessKeySecret); - - var res = given().auth().preemptive().basic(usernameValue, accessKeyValue) - .get("https://api.lambdatest.com/automation/api/v1/user-files"); - - options.put("lambda:userFiles", res.body().jsonPath().getList("data.key")); - } catch (Exception e) { - DebugInformation.printStackTrace(e); - } - + } + } + private static void addGridOptions(TOption options, GridSettings gridSettings) { + for (var entry : gridSettings.getArguments()) { + for (var c : entry.entrySet()) { + if (c.getValue() instanceof String && c.getValue().toString().startsWith("{env_")) { + var envValue = SecretsResolver.getSecret(c.getValue().toString()); + options.setCapability(c.getKey(), envValue); + } else { + options.setCapability(c.getKey(), c.getValue()); } - - Log.info(""); } } - private void addGridOptions(TOption options, GridSettings gridSettings) { - for (var entry : gridSettings.getArguments()) { - for (var c : entry.entrySet()) { - if (c.getValue() instanceof String && c.getValue().toString().startsWith("{env_")) { - var envValue = SecretsResolver.getSecret(c.getValue().toString()); - options.setCapability(c.getKey(), envValue); - } else { - options.setCapability(c.getKey(), c.getValue()); - } - } - } + if ("lambdatest".equalsIgnoreCase(gridSettings.getProviderName())) { + options.setCapability("lambdaMaskCommands", new String[]{"setValues", "setCookies", "getCookies"}); + } + } - if ("lambdatest".equalsIgnoreCase(gridSettings.getProviderName())) { - options.setCapability("lambdaMaskCommands", new String[]{"setValues", "setCookies", "getCookies"}); - } + private static void addDriverOptions(TOption chromeOptions) { + for (var optionKey : BROWSER_CONFIGURATION.get().driverOptions.keySet()) { + chromeOptions.setCapability(optionKey, BROWSER_CONFIGURATION.get().driverOptions.get(optionKey)); } + } - private void addDriverOptions(TOption chromeOptions) { - for (var optionKey : browserConfiguration.driverOptions.keySet()) { - chromeOptions.setCapability(optionKey, browserConfiguration.driverOptions.get(optionKey)); + 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());} + } + + private static String getBuildName() { + if (!isBuildNameSet) { + buildName = System.getProperty("buildName"); } - private void changeWindowSize(WebDriver wrappedDriver) { + if (buildName == null) { + InputStream input = ConfigurationService.class.getResourceAsStream("/application.properties"); + var p = new Properties(); 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());} - } + p.load(input); + } catch (IOException e) { + return null; + } - private String getBuildName() { if (!isBuildNameSet) { - buildName = System.getProperty("buildName"); + buildName = p.getProperty("buildName"); } - if (buildName == null) { - InputStream input = ConfigurationService.class.getResourceAsStream("/application.properties"); - var p = new Properties(); - try { - p.load(input); - } catch (IOException e) { - return null; - } - - if (!isBuildNameSet) { - buildName = p.getProperty("buildName"); - } - - if (buildName.equals("{randomNumber}") && !isBuildNameSet) { - buildName = TimestampBuilder.buildUniqueTextByPrefix("LE_"); - isBuildNameSet = true; - } + if (buildName.equals("{randomNumber}") && !isBuildNameSet) { + buildName = TimestampBuilder.buildUniqueTextByPrefix("LE_"); + isBuildNameSet = true; } - - return buildName; } - private String getUrl(String url) { - String result = url; - if (url.startsWith("{env_")) { - result = SecretsResolver.getSecret(url); - } else if (url.contains("{env_")) { - String pattern = "\\{env_.*?\\}"; - Pattern compiledPattern = Pattern.compile(pattern); - Matcher matcher = compiledPattern.matcher(url); - List allMatches = new ArrayList(); - - while (matcher.find()) { - allMatches.add(matcher.group()); - } + return buildName; + } - for (String match : allMatches) { - result = result.replace(match, SecretsResolver.getSecret(match)); - } + private static String getUrl(String url) { + String result = url; + if (url.startsWith("{env_")) { + result = SecretsResolver.getSecret(url); + } else if (url.contains("{env_")) { + String pattern = "\\{env_.*?\\}"; + Pattern compiledPattern = Pattern.compile(pattern); + Matcher matcher = compiledPattern.matcher(url); + List allMatches = new ArrayList(); + + while (matcher.find()) { + allMatches.add(matcher.group()); } - return result; + for (String match : allMatches) { + result = result.replace(match, SecretsResolver.getSecret(match)); + } } - private void close() { - if (disposed) { - return; - } + return result; + } - if (wrappedDriver != null) { - DebugInformation.debugInfo("SHUTTING DOWN WRAPPED_DRIVER"); - wrappedDriver.quit(); - if (!customDriverOptions.isEmpty()) { - customDriverOptions.clear(); - } - } + public static void close() { + if (DISPOSED.get()) { + return; + } - boolean shouldCaptureHttpTraffic = ConfigurationService.get(WebSettings.class).getShouldCaptureHttpTraffic(); - if (shouldCaptureHttpTraffic) { - ProxyServer.close(); + if (WRAPPED_DRIVER.get() != null) { + DebugInformation.debugInfo("SHUTTING DOWN WRAPPED_DRIVER"); + WRAPPED_DRIVER.get().quit(); + if (CUSTOM_DRIVER_OPTIONS.get() != null) { + CUSTOM_DRIVER_OPTIONS.get().clear(); } + } - disposed = true; + boolean shouldCaptureHttpTraffic = ConfigurationService.get(WebSettings.class).getShouldCaptureHttpTraffic(); + if (shouldCaptureHttpTraffic) { + ProxyServer.close(); } + + DISPOSED.set(true); } } \ No newline at end of file From 6d7debd8b43c3dbbbc7ef243616cbe91ff54e176 Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Thu, 9 Jan 2025 15:15:44 +0200 Subject: [PATCH 15/19] refactoring: moved retry logic into a separate method in ShadowDomService --- .../shadowdom/ShadowDomService.java | 30 +++++-------------- .../shadowdom/ShadowDomService.java | 29 +++++------------- 2 files changed, 15 insertions(+), 44 deletions(-) diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/shadowdom/ShadowDomService.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/shadowdom/ShadowDomService.java index dbfea39d..f5177574 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/shadowdom/ShadowDomService.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/components/shadowdom/ShadowDomService.java @@ -106,25 +106,8 @@ private static String[] getAbsoluteCss(ShadowRoot shadowRoot, String locator) { .evaluate(String.format("(el, [locator]) => (%s)(el, locator)", javaScript), new Object[] { locator })) .toArray(String[]::new); }; - if (Wait.retry(() -> { - String[] foundElements; - try { - foundElements = js.call(); - } catch (Exception e) { - throw new RuntimeException(e); - } - if (foundElements == null || foundElements.length == 0) { - throw new IllegalArgumentException(); - } - }, Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getElementWaitTimeout()), Duration.ofSeconds(1), false)) { - try { - return js.call(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } else { - throw new IllegalArgumentException("No elements inside the shadow DOM were found with the locator: " + locator); - } + + return getCss(js, locator); } private static String[] getRelativeCss(ShadowRoot shadowRoot, String locator, String parentLocator) { @@ -134,10 +117,14 @@ private static String[] getRelativeCss(ShadowRoot shadowRoot, String locator, St .toArray(String[]::new); }; + return getCss(js, locator); + } + + private static String[] getCss(Callable callable, String locator) { if(Wait.retry(() -> { String[] foundElements; try { - foundElements = js.call(); + foundElements = callable.call(); } catch (Exception e) { throw new RuntimeException(e); } @@ -146,7 +133,7 @@ private static String[] getRelativeCss(ShadowRoot shadowRoot, String locator, St } }, Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getElementWaitTimeout()), Duration.ofSeconds(1), false)) { try { - return js.call(); + return callable.call(); } catch (Exception e) { throw new RuntimeException(e); } @@ -154,7 +141,6 @@ private static String[] getRelativeCss(ShadowRoot shadowRoot, String locator, St throw new IllegalArgumentException("No elements inside the shadow DOM were found with the locator: " + locator); } } - private static TComponent buildMissingShadowRootsAndCreate(Class clazz, ShadowRoot parentComponent, Ref fullCss) { var component = InstanceFactory.create(clazz); diff --git a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/shadowdom/ShadowDomService.java b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/shadowdom/ShadowDomService.java index 82dacb79..0f636194 100644 --- a/bellatrix.web/src/main/java/solutions/bellatrix/web/components/shadowdom/ShadowDomService.java +++ b/bellatrix.web/src/main/java/solutions/bellatrix/web/components/shadowdom/ShadowDomService.java @@ -110,26 +110,7 @@ private static String[] getAbsoluteCss(ShadowRoot shadowRoot, String locator) { shadowRoot.findElement(), locator, null).toArray(String[]::new); }; - if (Wait.retry(() -> { - String[] foundElements; - try { - foundElements = js.call(); - } catch (Exception e) { - throw new RuntimeException(e); - } - - if (foundElements == null || foundElements.length == 0) { - throw new IllegalArgumentException(); - } - }, Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getElementWaitTimeout()), Duration.ofSeconds(1), false)) { - try { - return js.call(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } else { - throw new IllegalArgumentException("No elements inside the shadow DOM were found with the locator: " + locator); - } + return getCss(js, locator); } private static String[] getRelativeCss(ShadowRoot shadowRoot, String locator, String parentLocator) { @@ -139,10 +120,14 @@ private static String[] getRelativeCss(ShadowRoot shadowRoot, String locator, St shadowRoot.findElement(), locator, parentLocator).toArray(String[]::new); }; + return getCss(js, locator); + } + + private static String[] getCss(Callable callable, String locator) { if (Wait.retry(() -> { String[] foundElements; try { - foundElements = js.call(); + foundElements = callable.call(); } catch (Exception e) { throw new RuntimeException(e); } @@ -152,7 +137,7 @@ private static String[] getRelativeCss(ShadowRoot shadowRoot, String locator, St } }, Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getElementWaitTimeout()), Duration.ofSeconds(1), false)) { try { - return js.call(); + return callable.call(); } catch (Exception e) { throw new RuntimeException(e); } From 5573f2c6e213c667501cc1ddfb1b049a13152d0f Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Mon, 13 Jan 2025 10:34:28 +0200 Subject: [PATCH 16/19] Update PlaywrightService.java --- .../infrastructure/PlaywrightService.java | 589 ++++++++---------- 1 file changed, 270 insertions(+), 319 deletions(-) diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java index 227dcfe7..ccbc2ccb 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java @@ -20,10 +20,12 @@ import com.microsoft.playwright.Playwright; import io.restassured.RestAssured; import io.restassured.http.ContentType; -import lombok.experimental.UtilityClass; +import lombok.Getter; import org.apache.commons.lang3.NotImplementedException; import solutions.bellatrix.core.configuration.ConfigurationService; import solutions.bellatrix.core.utilities.DebugInformation; +import solutions.bellatrix.core.utilities.ShutdownManager; +import solutions.bellatrix.core.utilities.SingletonFactory; import solutions.bellatrix.core.utilities.TimestampBuilder; import solutions.bellatrix.playwright.configuration.GridSettings; import solutions.bellatrix.playwright.configuration.WebSettings; @@ -42,204 +44,192 @@ import java.util.Properties; @SuppressWarnings("ALL") -@UtilityClass public class PlaywrightService { - private static final ThreadLocal DISPOSED; - private static final ThreadLocal BROWSER_CONFIGURATION_THREAD_LOCAL; - private static final ThreadLocal PLAYWRIGHT_THREAD_LOCAL; - private static final ThreadLocal BROWSER_WRAPPER_THREAD_LOCAL; - private static boolean isBuildNameSet = false; - private static String buildName; + private static ThreadLocal PLAYWRIGHT_MANAGER = new ThreadLocal<>(); static { - DISPOSED = ThreadLocal.withInitial(() -> true); - BROWSER_CONFIGURATION_THREAD_LOCAL = new ThreadLocal<>(); - PLAYWRIGHT_THREAD_LOCAL = new ThreadLocal<>(); - BROWSER_WRAPPER_THREAD_LOCAL = new ThreadLocal<>(); + var driverManager = new PlaywrightManager(); + SingletonFactory.register(driverManager); + ShutdownManager.register(driverManager::close); + PLAYWRIGHT_MANAGER.set(driverManager); } public static WrappedBrowser start(BrowserConfiguration configuration) { - if (DISPOSED.get()) { - browserConfiguration(configuration); - playwright(Playwright.create()); - DISPOSED.set(false); - var executionType = Settings.web().getExecutionType(); - - if (executionType.equals("regular")) { - return initializeBrowserWrapperRegularMode(); - } else { - var gridSettings = ConfigurationService.get(WebSettings.class).getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst().orElse(null); - assert gridSettings != null : String.format("The specified execution type '%s' is not declared in the configuration", executionType); - - return initializeBrowserWrapperGridMode(gridSettings); - } - } - else return wrappedBrowser(); + return PLAYWRIGHT_MANAGER.get().start(configuration); + } + public static void restartBrowserContext() { + PLAYWRIGHT_MANAGER.get().restartBrowserContext(); } - public static void close() { - if (DISPOSED.get()) { - return; - } - - if (playwright() != null) { - DebugInformation.debugInfo("SHUTTING DOWN PLAYWRIGHT"); - - if (wrappedBrowser() != null) { - wrappedBrowser().close(); - } - - PLAYWRIGHT_THREAD_LOCAL.remove(); - - if (wrappedBrowser().getGridSessionId() != null) { - RestAssured.baseURI = ConfigurationService.get(WebSettings.class).getGridSettings().stream().filter(g -> g.getProviderName().equals(Settings.web().getExecutionType().toLowerCase())).findFirst().orElse(null).getUrl(); - - var response = RestAssured.given() - .delete(String.format("/session/%s", wrappedBrowser().getGridSessionId())); - } - } - - DISPOSED.set(true); + PLAYWRIGHT_MANAGER.get().close(); } - - public static void restartBrowserContext() { - DebugInformation.debugInfo("RESTARTING CONTEXT"); - wrappedBrowser().changeContext(intializeBrowserContext()); + public static WrappedBrowser wrappedBrowser() { + return PLAYWRIGHT_MANAGER.get().wrappedBrowser; } - - private static WrappedBrowser initializeBrowserWrapperRegularMode() { - wrappedBrowser(new WrappedBrowser(playwright())); - - wrappedBrowser().setBrowser(initializeBrowserRegularMode()); - wrappedBrowser().setCurrentContext(intializeBrowserContext()); - wrappedBrowser().setCurrentPage(wrappedBrowser().getCurrentContext().newPage()); - - return wrappedBrowser(); + public static void wrappedBrowser(WrappedBrowser driver) { + PLAYWRIGHT_MANAGER.get().wrappedBrowser = driver; } - - private static WrappedBrowser initializeBrowserWrapperGridMode(GridSettings gridSettings) { - wrappedBrowser(new WrappedBrowser(playwright())); - - wrappedBrowser().setBrowser(initializeBrowserGridMode(gridSettings)); - wrappedBrowser().setCurrentContext(intializeBrowserContext()); - wrappedBrowser().setCurrentPage(wrappedBrowser().getCurrentContext().newPage()); - - return wrappedBrowser(); + public static BrowserConfiguration browserConfiguration() { + return PLAYWRIGHT_MANAGER.get().browserConfiguration; } - - private static Browser initializeBrowserRegularMode() { - BrowserTypes browserTypes = browserConfiguration().getBrowserTypes(); - - switch (browserTypes) { - case CHROMIUM -> { - var browserType = playwright().chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(false); - launchOptions.setArgs(List.of("--log-level=3", "--remote-allow-origins=*")); - launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case CHROMIUM_HEADLESS -> { - var browserType = playwright().chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(true); - launchOptions.setArgs(List.of("--log-level=3")); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case CHROME -> { - var browserType = playwright().chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setChannel("chrome"); - launchOptions.setHeadless(false); - launchOptions.setArgs(List.of("--log-level=3", "--remote-allow-origins=*", "--disable-search-engine-choice-screen")); - launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case CHROME_HEADLESS -> { - var browserType = playwright().chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setChannel("chrome"); - launchOptions.setHeadless(true); - launchOptions.setArgs(List.of("--log-level=3", "--disable-search-engine-choice-screen")); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); - } - case FIREFOX -> { - var browserType = playwright().firefox(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(false); - launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); - - return browser(browserType.launch(launchOptions)); - } - case FIREFOX_HEADLESS -> { - var browserType = playwright().firefox(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(true); - - return browser(browserType.launch(launchOptions)); - } - case EDGE -> { - var browserType = playwright().chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setChannel("msedge"); - launchOptions.setHeadless(false); - // launchOptions.setArgs(List.of("--log-level=3")); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); + private static class PlaywrightManager { + private PlaywrightManager() { + } + private boolean disposed = true; + @Getter private BrowserConfiguration browserConfiguration; + private Playwright playwright; + private WrappedBrowser wrappedBrowser; + private boolean isBuildNameSet = false; + private String buildName; + public WrappedBrowser start(BrowserConfiguration configuration) { + if (disposed) { + browserConfiguration(configuration); + playwright = Playwright.create(); + disposed = false; + var executionType = Settings.web().getExecutionType(); + if (executionType.equals("regular")) { + return initializeBrowserWrapperRegularMode(); + } else { + var gridSettings = ConfigurationService.get(WebSettings.class).getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst().orElse(null); + assert gridSettings != null : String.format("The specified execution type '%s' is not declared in the configuration", executionType); + return initializeBrowserWrapperGridMode(gridSettings); + } } - case EDGE_HEADLESS -> { - var browserType = playwright().chromium(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setChannel("msedge"); - launchOptions.setHeadless(true); - // launchOptions.setArgs(List.of("--log-level=3")); - // System.setProperty("webdriver.chrome.silentOutput", "true"); ? - - return browser(browserType.launch(launchOptions)); + else return wrappedBrowser(); + } + public void close() { + if (disposed) { + return; } - case WEBKIT -> { - var browserType = playwright().webkit(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(false); - launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); - - return browser(browserType.launch(launchOptions)); + if (playwright != null) { + DebugInformation.debugInfo("SHUTTING DOWN PLAYWRIGHT"); + if (wrappedBrowser() != null) { + wrappedBrowser().close(); + } + playwright = null; + if (wrappedBrowser().getGridSessionId() != null) { + RestAssured.baseURI = ConfigurationService.get(WebSettings.class).getGridSettings().stream().filter(g -> g.getProviderName().equals(Settings.web().getExecutionType().toLowerCase())).findFirst().orElse(null).getUrl(); + var response = RestAssured.given() + .delete(String.format("/session/%s", wrappedBrowser().getGridSessionId())); + } } - case WEBKIT_HEADLESS -> { - var browserType = playwright().webkit(); - BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); - launchOptions.setHeadless(true); - - return browser(browserType.launch(launchOptions)); + disposed = true; + } + public void restartBrowserContext() { + DebugInformation.debugInfo("RESTARTING CONTEXT"); + wrappedBrowser().changeContext(intializeBrowserContext()); + } + private WrappedBrowser initializeBrowserWrapperRegularMode() { + wrappedBrowser(new WrappedBrowser(playwright)); + wrappedBrowser().setBrowser(initializeBrowserRegularMode()); + wrappedBrowser().setCurrentContext(intializeBrowserContext()); + wrappedBrowser().setCurrentPage(wrappedBrowser().getCurrentContext().newPage()); + return wrappedBrowser(); + } + private WrappedBrowser initializeBrowserWrapperGridMode(GridSettings gridSettings) { + wrappedBrowser(new WrappedBrowser(playwright)); + wrappedBrowser().setBrowser(initializeBrowserGridMode(gridSettings)); + wrappedBrowser().setCurrentContext(intializeBrowserContext()); + wrappedBrowser().setCurrentPage(wrappedBrowser().getCurrentContext().newPage()); + return wrappedBrowser(); + } + private Browser initializeBrowserRegularMode() { + BrowserTypes browserTypes = browserConfiguration().getBrowserTypes(); + switch (browserTypes) { + case CHROMIUM -> { + var browserType = playwright.chromium(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setHeadless(false); + launchOptions.setArgs(List.of("--log-level=3", "--remote-allow-origins=*")); + launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); + // System.setProperty("webdriver.chrome.silentOutput", "true"); ? + return browser(browserType.launch(launchOptions)); + } + case CHROMIUM_HEADLESS -> { + var browserType = playwright.chromium(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setHeadless(true); + launchOptions.setArgs(List.of("--log-level=3")); + // System.setProperty("webdriver.chrome.silentOutput", "true"); ? + return browser(browserType.launch(launchOptions)); + } + case CHROME -> { + var browserType = playwright.chromium(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setChannel("chrome"); + launchOptions.setHeadless(false); + launchOptions.setArgs(List.of("--log-level=3", "--remote-allow-origins=*")); + launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); + // System.setProperty("webdriver.chrome.silentOutput", "true"); ? + return browser(browserType.launch(launchOptions)); + } + case CHROME_HEADLESS -> { + var browserType = playwright.chromium(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setChannel("chrome"); + launchOptions.setHeadless(true); + launchOptions.setArgs(List.of("--log-level=3")); + // System.setProperty("webdriver.chrome.silentOutput", "true"); ? + return browser(browserType.launch(launchOptions)); + } + case FIREFOX -> { + var browserType = playwright.firefox(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setHeadless(false); + launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); + return browser(browserType.launch(launchOptions)); + } + case FIREFOX_HEADLESS -> { + var browserType = playwright.firefox(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setHeadless(true); + return browser(browserType.launch(launchOptions)); + } + case EDGE -> { + var browserType = playwright.chromium(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setChannel("msedge"); + launchOptions.setHeadless(false); + // launchOptions.setArgs(List.of("--log-level=3")); + // System.setProperty("webdriver.chrome.silentOutput", "true"); ? + return browser(browserType.launch(launchOptions)); + } + case EDGE_HEADLESS -> { + var browserType = playwright.chromium(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setChannel("msedge"); + launchOptions.setHeadless(true); + // launchOptions.setArgs(List.of("--log-level=3")); + // System.setProperty("webdriver.chrome.silentOutput", "true"); ? + return browser(browserType.launch(launchOptions)); + } + case WEBKIT -> { + var browserType = playwright.webkit(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setHeadless(false); + launchOptions.setTimeout(Settings.web().getArtificialDelayBeforeAction()); + return browser(browserType.launch(launchOptions)); + } + case WEBKIT_HEADLESS -> { + var browserType = playwright.webkit(); + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions(); + launchOptions.setHeadless(true); + return browser(browserType.launch(launchOptions)); + } + default -> throw new IllegalArgumentException("Unsupported."); } - default -> throw new IllegalArgumentException("Unsupported."); } - } - - private static BrowserContext intializeBrowserContext() { - Browser.NewContextOptions options = getContextOptions(); - var context = browser().newContext(options); - - if (Settings.web().getShouldCaptureHttpTraffic()) { - startRecordingHttpTraffic(context); + private BrowserContext intializeBrowserContext() { + Browser.NewContextOptions options = getContextOptions(); + var context = browser().newContext(options); + if (Settings.web().getShouldCaptureHttpTraffic()) { + startRecordingHttpTraffic(context); + } + return context; } - - return context; - } - - // ToDo Browser Context options - private static Browser.NewContextOptions getContextOptions() { - Browser.NewContextOptions options = new Browser.NewContextOptions(); - + // ToDo Browser Context options + private Browser.NewContextOptions getContextOptions() { + Browser.NewContextOptions options = new Browser.NewContextOptions(); // if (Settings.context().isShouldSetContextSettings()) { // options.setIgnoreHTTPSErrors(Settings.context().isIgnoreHTTPSErrors()); // options.setAcceptDownloads(Settings.context().isAcceptDownloads()); @@ -252,153 +242,114 @@ private static Browser.NewContextOptions getContextOptions() { // options.setTimezoneId(Settings.context().getTimezoneId()); // options.setUserAgent(Settings.context().getUserAgent()); // } - - options.setIgnoreHTTPSErrors(true); - - // ToDo setProxy - - return options; - } - - private static void startRecordingHttpTraffic(BrowserContext context) { - Traffic.getRequestContainers().add(new Requests(context)); - context.onRequest(x -> Traffic.getContextSpecificRequests(context).add(x)); - - Traffic.getResponseContainers().add(new Responses(context)); - context.onResponse(x -> Traffic.getContextSpecificResponses(context).add(x)); - } - - private static Browser initializeBrowserGridMode(GridSettings gridSettings) { - var timeout = Settings.timeout().inMilliseconds().getConnectToRemoteGridTimeout(); - - var gridUrl = gridSettings.getUrl(); - if (gridUrl.startsWith("env_")) { - gridUrl = System.getProperty(gridSettings.getUrl()).replace("env_", ""); + options.setIgnoreHTTPSErrors(true); + // ToDo setProxy + return options; } - - try { - Gson gson = new Gson(); - String serializedSettings = URLEncoder.encode(gson.toJson(gridSettings.getArguments().get(0)), "UTF-8"); - - if (gridSettings.getProviderName().equals("grid") || gridSettings.getProviderName().equals("selenoid")) { - var browserType = BROWSER_CONFIGURATION_THREAD_LOCAL.get().getBrowserTypes(); - if (browserType == BrowserTypes.FIREFOX || browserType == BrowserTypes.FIREFOX_HEADLESS || browserType == BrowserTypes.WEBKIT || browserType == BrowserTypes.WEBKIT_HEADLESS) { - throw new NotImplementedException("Playwright supports running in Selenium Grid only Chromium browsers."); - } - - RestAssured.baseURI = gridUrl; - Map capabilitiesMap = new HashMap<>(); - capabilitiesMap.put("alwaysMatch", gridSettings.getArguments().get(0)); - - Map body = new HashMap<>(); - body.put("capabilities", capabilitiesMap); - - var serializedBody = gson.toJson(body); - - var response = RestAssured.given() - .contentType(ContentType.JSON) - .body(serializedBody) - .post("/session"); - - wrappedBrowser().setGridSessionId(response.body().jsonPath().get("value.sessionId")); - - var responseBody = response.body(); - var responseJson = response.jsonPath(); - - var cdpUrl = new URI(response.jsonPath().get("value.capabilities['se:cdp']")); - cdpUrl = new URI(cdpUrl.getScheme(), cdpUrl.getUserInfo(), new URI(gridUrl).getHost(), new URI(gridUrl).getPort(), cdpUrl.getPath(), cdpUrl.getQuery(), cdpUrl.getFragment()); - - return playwright().chromium().connectOverCDP(cdpUrl.toString(), new BrowserType.ConnectOverCDPOptions().setTimeout(timeout)); - } else if (gridSettings.getProviderName().equals("lambdatest")) { - return playwright().chromium().connect(String.format("%s?capabilities=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); - } else if (gridSettings.getProviderName().equals("browserstack")) { - return playwright().chromium().connect(String.format("%s?caps=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); - } else { - throw new NotImplementedException("Unsupported grid provider. Supported are: selenium grid, selenoid, lambdatest, and browserstack."); - } - } catch (Exception e) { - DebugInformation.printStackTrace(e); - return null; + private void startRecordingHttpTraffic(BrowserContext context) { + Traffic.getRequestContainers().add(new Requests(context)); + context.onRequest(x -> Traffic.getContextSpecificRequests(context).add(x)); + Traffic.getResponseContainers().add(new Responses(context)); + context.onResponse(x -> Traffic.getContextSpecificResponses(context).add(x)); } - } - - private static void changeWindowSize() { - try { - if (browserConfiguration().getHeight() != 0 && browserConfiguration().getWidth() != 0) { - wrappedBrowser().getCurrentPage().setViewportSize(browserConfiguration().getWidth(), browserConfiguration().getHeight()); + private Browser initializeBrowserGridMode(GridSettings gridSettings) { + var timeout = Settings.timeout().inMilliseconds().getConnectToRemoteGridTimeout(); + var gridUrl = gridSettings.getUrl(); + if (gridUrl.startsWith("env_")) { + gridUrl = System.getProperty(gridSettings.getUrl()).replace("env_", ""); } - } catch (Exception ignored) {} - } - - private static String getBuildName() { - if (!isBuildNameSet) { - buildName = System.getProperty("buildName"); - } - - if (buildName == null) { - InputStream input = ConfigurationService.class.getResourceAsStream("/application.properties"); - var p = new Properties(); try { - p.load(input); - } catch (IOException e) { + Gson gson = new Gson(); + String serializedSettings = URLEncoder.encode(gson.toJson(gridSettings.getArguments().get(0)), "UTF-8"); + if (gridSettings.getProviderName().equals("grid") || gridSettings.getProviderName().equals("selenoid")) { + var browserType = browserConfiguration.getBrowserTypes(); + if (browserType == BrowserTypes.FIREFOX || browserType == BrowserTypes.FIREFOX_HEADLESS || browserType == BrowserTypes.WEBKIT || browserType == BrowserTypes.WEBKIT_HEADLESS) { + throw new NotImplementedException("Playwright supports running in Selenium Grid only Chromium browsers."); + } + RestAssured.baseURI = gridUrl; + Map capabilitiesMap = new HashMap<>(); + capabilitiesMap.put("alwaysMatch", gridSettings.getArguments().get(0)); + Map body = new HashMap<>(); + body.put("capabilities", capabilitiesMap); + var serializedBody = gson.toJson(body); + var response = RestAssured.given() + .contentType(ContentType.JSON) + .body(serializedBody) + .post("/session"); + wrappedBrowser().setGridSessionId(response.body().jsonPath().get("value.sessionId")); + var responseBody = response.body(); + var responseJson = response.jsonPath(); + var cdpUrl = new URI(response.jsonPath().get("value.capabilities['se:cdp']")); + cdpUrl = new URI(cdpUrl.getScheme(), cdpUrl.getUserInfo(), new URI(gridUrl).getHost(), new URI(gridUrl).getPort(), cdpUrl.getPath(), cdpUrl.getQuery(), cdpUrl.getFragment()); + return playwright.chromium().connectOverCDP(cdpUrl.toString(), new BrowserType.ConnectOverCDPOptions().setTimeout(timeout)); + } else if (gridSettings.getProviderName().equals("lambdatest")) { + return playwright.chromium().connect(String.format("%s?capabilities=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); + } else if (gridSettings.getProviderName().equals("browserstack")) { + return playwright.chromium().connect(String.format("%s?caps=%s", gridUrl, serializedSettings), new BrowserType.ConnectOptions().setTimeout(timeout)); + } else { + throw new NotImplementedException("Unsupported grid provider. Supported are: selenium grid, selenoid, lambdatest, and browserstack."); + } + } catch (Exception e) { + DebugInformation.printStackTrace(e); return null; } - + } + private void changeWindowSize() { + try { + if (browserConfiguration().getHeight() != 0 && browserConfiguration().getWidth() != 0) { + wrappedBrowser().getCurrentPage().setViewportSize(browserConfiguration().getWidth(), browserConfiguration().getHeight()); + } + } catch (Exception ignored) {} + } + private String getBuildName() { if (!isBuildNameSet) { - buildName = p.getProperty("buildName"); + buildName = System.getProperty("buildName"); } - - if (buildName.equals("{randomNumber}") && !isBuildNameSet) { - buildName = TimestampBuilder.buildUniqueTextByPrefix("LE_"); - isBuildNameSet = true; + if (buildName == null) { + InputStream input = ConfigurationService.class.getResourceAsStream("/application.properties"); + var p = new Properties(); + try { + p.load(input); + } catch (IOException e) { + return null; + } + if (!isBuildNameSet) { + buildName = p.getProperty("buildName"); + } + if (buildName.equals("{randomNumber}") && !isBuildNameSet) { + buildName = TimestampBuilder.buildUniqueTextByPrefix("LE_"); + isBuildNameSet = true; + } } + return buildName; + } + public BrowserConfiguration browserConfiguration() { + return browserConfiguration; + } + public BrowserConfiguration browserConfiguration(BrowserConfiguration configuration) { + browserConfiguration = configuration; + return browserConfiguration(); + } + public WrappedBrowser wrappedBrowser() { + return wrappedBrowser; + } + public WrappedBrowser wrappedBrowser(WrappedBrowser wrappedBrowser) { + this.wrappedBrowser = wrappedBrowser; + return this.wrappedBrowser; + } + private Browser browser() { + return wrappedBrowser().getBrowser(); + } + private Browser browser(Browser browser) { + wrappedBrowser().setBrowser(browser); + return browser(); + } + private BrowserContext context() { + return wrappedBrowser().getCurrentContext(); + } + private BrowserContext context(BrowserContext browserContext) { + wrappedBrowser().setCurrentContext(browserContext); + return context(); } - - return buildName; - } - - public static BrowserConfiguration browserConfiguration() { - return BROWSER_CONFIGURATION_THREAD_LOCAL.get(); - } - - public static BrowserConfiguration browserConfiguration(BrowserConfiguration configuration) { - BROWSER_CONFIGURATION_THREAD_LOCAL.set(configuration); - return browserConfiguration(); - } - - private static Playwright playwright() { - return PLAYWRIGHT_THREAD_LOCAL.get(); - } - - private static Playwright playwright(Playwright playwright) { - PLAYWRIGHT_THREAD_LOCAL.set(playwright); - return playwright(); - } - - public static WrappedBrowser wrappedBrowser() { - return BROWSER_WRAPPER_THREAD_LOCAL.get(); - } - - public static WrappedBrowser wrappedBrowser(WrappedBrowser wrappedBrowser) { - BROWSER_WRAPPER_THREAD_LOCAL.set(wrappedBrowser); - return BROWSER_WRAPPER_THREAD_LOCAL.get(); - } - - private static Browser browser() { - return wrappedBrowser().getBrowser(); - } - - private static Browser browser(Browser browser) { - wrappedBrowser().setBrowser(browser); - return browser(); - } - - private static BrowserContext context() { - return wrappedBrowser().getCurrentContext(); - } - - private static BrowserContext context(BrowserContext browserContext) { - wrappedBrowser().setCurrentContext(browserContext); - return context(); } } \ No newline at end of file From 00ab08334d143de28849fb883ce0d17c0cad1eaa Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Mon, 13 Jan 2025 10:49:09 +0200 Subject: [PATCH 17/19] Update DriverService.java --- .../web/infrastructure/DriverService.java | 777 +++++++++--------- 1 file changed, 398 insertions(+), 379 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 b6b4a388..17a8fb07 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,6 +13,7 @@ package solutions.bellatrix.web.infrastructure; +import lombok.experimental.UtilityClass; import net.lightbody.bmp.client.ClientUtil; import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; @@ -29,10 +30,7 @@ import org.openqa.selenium.safari.SafariDriver; 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.SecretsResolver; -import solutions.bellatrix.core.utilities.TimestampBuilder; +import solutions.bellatrix.core.utilities.*; import solutions.bellatrix.web.configuration.GridSettings; import solutions.bellatrix.web.configuration.WebSettings; @@ -48,469 +46,490 @@ import static io.restassured.RestAssured.given; +@UtilityClass public class DriverService { - private static final ThreadLocal DISPOSED = ThreadLocal.withInitial(() -> true); - private static final ThreadLocal BROWSER_CONFIGURATION; - private static final ThreadLocal> CUSTOM_DRIVER_OPTIONS; - private static final ThreadLocal WRAPPED_DRIVER; - private static boolean isBuildNameSet = false; - private static String buildName; + private static ThreadLocal DRIVER_MANAGER = new ThreadLocal(); static { - CUSTOM_DRIVER_OPTIONS = new ThreadLocal<>(); - CUSTOM_DRIVER_OPTIONS.set(new HashMap<>()); - BROWSER_CONFIGURATION = new ThreadLocal<>(); - WRAPPED_DRIVER = new ThreadLocal<>(); + var driverManager = new DriverManager(); + SingletonFactory.register(driverManager); + ShutdownManager.register(driverManager::close); + DRIVER_MANAGER.set(driverManager); } - public static HashMap getCustomDriverOptions() { - return CUSTOM_DRIVER_OPTIONS.get(); + public static Map getCustomDriverOptions() { + return DRIVER_MANAGER.get().customDriverOptions; } public static void addDriverOptions(String key, String value) { - CUSTOM_DRIVER_OPTIONS.get().put(key, value); + DRIVER_MANAGER.get().addDriverOptions(key, value); } public static WebDriver getWrappedDriver() { - return WRAPPED_DRIVER.get(); + return DRIVER_MANAGER.get().wrapppedDriver; } public static void setWrappedDriver(WebDriver driver) { - WRAPPED_DRIVER.set(driver); + DRIVER_MANAGER.get().wrapppedDriver = driver; } public static BrowserConfiguration getBrowserConfiguration() { - return BROWSER_CONFIGURATION.get(); + return DRIVER_MANAGER.get().browserConfiguration; } public static WebDriver start(BrowserConfiguration configuration) { - if (DISPOSED.get()) { - BROWSER_CONFIGURATION.set(configuration); - DISPOSED.set(false); - WebDriver driver; - var webSettings = ConfigurationService.get(WebSettings.class); - var executionType = webSettings.getExecutionType(); - if (executionType.equals("regular")) { - driver = initializeDriverRegularMode(); - } else if (executionType.equals("grid") || executionType.equals("selenoid")) { - var gridSettings = webSettings.getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst(); - assert gridSettings.isPresent() : String.format("The specified execution type '%s' is not declared in the configuration", executionType); - driver = initializeDriverGridMode(gridSettings.get()); - } else if (executionType.equals("healenium")) { - var gridSettings = webSettings.getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst(); - assert gridSettings.isPresent() : String.format("The specified execution type '%s' is not declared in the configuration", executionType); - driver = initializeDriverGridMode(gridSettings.get()); - } else { - var gridSettings = webSettings.getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst(); - assert gridSettings.isPresent() : String.format("The specified execution type '%s' is not declared in the configuration", executionType); - driver = initializeDriverCloudGridMode(gridSettings.get()); - } - - driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getPageLoadTimeout())); - driver.manage().timeouts().scriptTimeout(Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getScriptTimeout())); - - 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; - } else return WRAPPED_DRIVER.get(); + return DRIVER_MANAGER.get().start(configuration); } - private static WebDriver initializeDriverCloudGridMode(GridSettings gridSettings) { - MutableCapabilities caps = new MutableCapabilities(); + public static void close() { + DRIVER_MANAGER.get().close(); + } - switch (BROWSER_CONFIGURATION.get().getBrowser()) { - case CHROME_HEADLESS: - case CHROME: { - var chromeOptions = new ChromeOptions(); - caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); - break; - } - case FIREFOX_HEADLESS: - case FIREFOX: { - var firefoxOptions = new FirefoxOptions(); - caps.setCapability(ChromeOptions.CAPABILITY, firefoxOptions); - break; - } - case EDGE_HEADLESS: - case EDGE: { - var edgeOptions = new EdgeOptions(); - caps.setCapability(ChromeOptions.CAPABILITY, edgeOptions); - break; - } - case SAFARI: { - var safariOptions = new SafariOptions(); - caps.setCapability(ChromeOptions.CAPABILITY, safariOptions); - break; - } + private static class DriverManager { + private DriverManager() { } - HashMap options = new HashMap(); + private boolean disposed = true; + private BrowserConfiguration browserConfiguration; + private final Map customDriverOptions = new HashMap<>(); + private WebDriver wrapppedDriver; + private boolean isBuildNameSet; + private String buildName; + + public void addDriverOptions(String key, String value) { + customDriverOptions.put(key, value); + } - // Anton: maybe this is something else for other clouds, should be tested. - // If this is the case, we need to have branching per provider name. - options.put("sessionName", getBrowserConfiguration().getTestName()); - // if (gridSettings.getProviderName() == "browserstack") { - // options.put("sessionName", getBrowserConfiguration().getTestName()); - // } + public WebDriver start(BrowserConfiguration configuration) { + if (disposed) { + browserConfiguration = configuration; + disposed = false; + WebDriver driver; + var webSettings = ConfigurationService.get(WebSettings.class); + var executionType = webSettings.getExecutionType(); + if (executionType.equals("regular")) { + driver = initializeDriverRegularMode(); + } else if (executionType.equals("grid") || executionType.equals("selenoid")) { + var gridSettings = webSettings.getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst(); + assert gridSettings.isPresent() : String.format("The specified execution type '%s' is not declared in the configuration", executionType); + driver = initializeDriverGridMode(gridSettings.get()); + } else if (executionType.equals("healenium")) { + var gridSettings = webSettings.getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst(); + assert gridSettings.isPresent() : String.format("The specified execution type '%s' is not declared in the configuration", executionType); + driver = initializeDriverGridMode(gridSettings.get()); + } else { + var gridSettings = webSettings.getGridSettings().stream().filter(g -> g.getProviderName().equals(executionType.toLowerCase())).findFirst(); + assert gridSettings.isPresent() : String.format("The specified execution type '%s' is not declared in the configuration", executionType); + driver = initializeDriverCloudGridMode(gridSettings.get()); + } - addGridOptions(options, gridSettings); + driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getPageLoadTimeout())); + driver.manage().timeouts().scriptTimeout(Duration.ofSeconds(ConfigurationService.get(WebSettings.class).getTimeoutSettings().getScriptTimeout())); - caps.setCapability(gridSettings.getOptionsName(), options); - WebDriver driver = null; - try { - var url = getUrl(gridSettings.getUrl()); - driver = new RemoteWebDriver(new URI(url).toURL(), caps); - } catch (Exception e) { - DebugInformation.printStackTrace(e); - } + if(getBrowserConfiguration().getHeight() != 0 && getBrowserConfiguration().getWidth() != 0) { + changeWindowSize(driver); + } + else { + driver.manage().window().maximize(); + } - return driver; - } + Log.info(String.format("Window resized to dimensions: %s", driver.manage().window().getSize().toString())); + wrapppedDriver = driver; - private static WebDriver initializeDriverGridMode(GridSettings gridSettings) { - var caps = new DesiredCapabilities(); - if (BROWSER_CONFIGURATION.get().getPlatform() != Platform.ANY) { - caps.setCapability("platform", BROWSER_CONFIGURATION.get().getPlatform()); + return driver; + } else + return wrapppedDriver; } - if (BROWSER_CONFIGURATION.get().getVersion() != 0) { - caps.setCapability("version", BROWSER_CONFIGURATION.get().getVersion()); - } else { - caps.setCapability("version", "latest"); - } + private WebDriver initializeDriverCloudGridMode(GridSettings gridSettings) { + MutableCapabilities caps = new MutableCapabilities(); - switch (BROWSER_CONFIGURATION.get().getBrowser()) { - case CHROME_HEADLESS: - case CHROME: { - var chromeOptions = new ChromeOptions(); - addGridOptions(chromeOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); - break; - } - case FIREFOX_HEADLESS: - case FIREFOX: { - var firefoxOptions = new FirefoxOptions(); - addGridOptions(firefoxOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, firefoxOptions); - break; - } - case EDGE_HEADLESS: - case EDGE: { - var edgeOptions = new EdgeOptions(); - addGridOptions(edgeOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, edgeOptions); - break; - } - case SAFARI: { - var safariOptions = new SafariOptions(); - addGridOptions(safariOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, safariOptions); - break; - } - case INTERNET_EXPLORER: { - var ieOptions = new InternetExplorerOptions(); - addGridOptions(ieOptions, gridSettings); - caps.setCapability(ChromeOptions.CAPABILITY, ieOptions); - break; + switch (browserConfiguration.getBrowser()) { + case CHROME_HEADLESS: + case CHROME: { + var chromeOptions = new ChromeOptions(); + caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); + break; + } + case FIREFOX_HEADLESS: + case FIREFOX: { + var firefoxOptions = new FirefoxOptions(); + caps.setCapability(ChromeOptions.CAPABILITY, firefoxOptions); + break; + } + case EDGE_HEADLESS: + case EDGE: { + var edgeOptions = new EdgeOptions(); + caps.setCapability(ChromeOptions.CAPABILITY, edgeOptions); + break; + } + case SAFARI: { + var safariOptions = new SafariOptions(); + caps.setCapability(ChromeOptions.CAPABILITY, safariOptions); + break; + } } - } - WebDriver driver = null; - try { - var gridUrl = gridSettings.getUrl(); - var url = getUrl(gridUrl); + HashMap options = new HashMap(); - driver = new RemoteWebDriver(new URI(url).toURL(), caps); - } catch (MalformedURLException | URISyntaxException e) { - DebugInformation.printStackTrace(e); - } + // Anton: maybe this is something else for other clouds, should be tested. + // If this is the case, we need to have branching per provider name. + options.put("sessionName", getBrowserConfiguration().getTestName()); + // if (gridSettings.getProviderName() == "browserstack") { + // options.put("sessionName", getBrowserConfiguration().getTestName()); + // } - return driver; - } + addGridOptions(options, gridSettings); - private static WebDriver initializeDriverRegularMode() { - WebDriver driver = null; - boolean shouldCaptureHttpTraffic = ConfigurationService.get(WebSettings.class).getShouldCaptureHttpTraffic(); + caps.setCapability(gridSettings.getOptionsName(), options); + WebDriver driver = null; + try { + var url = getUrl(gridSettings.getUrl()); + driver = new RemoteWebDriver(new URI(url).toURL(), caps); + } catch (Exception e) { + DebugInformation.printStackTrace(e); + } - Proxy proxyConfig = null; - if (shouldCaptureHttpTraffic) { - ProxyServer.init(); - proxyConfig = ClientUtil.createSeleniumProxy(ProxyServer.get()); - ProxyServer.newHar(); + return driver; } - switch (BROWSER_CONFIGURATION.get().getBrowser()) { - case CHROME -> { - var chromeOptions = new ChromeOptions(); - addDriverOptions(chromeOptions); - addDriverCapabilities(chromeOptions); - chromeOptions.addArguments("--log-level=3","--remote-allow-origins=*", "--disable-search-engine-choice-screen"); - chromeOptions.setAcceptInsecureCerts(true); - chromeOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); - System.setProperty("webdriver.chrome.silentOutput", "true"); - if (shouldCaptureHttpTraffic) { - chromeOptions.setProxy(proxyConfig); - } - - driver = new ChromeDriver(chromeOptions); + private WebDriver initializeDriverGridMode(GridSettings gridSettings) { + var caps = new DesiredCapabilities(); + if (browserConfiguration.getPlatform() != Platform.ANY) { + caps.setCapability("platform", browserConfiguration.getPlatform()); } - case CHROME_HEADLESS -> { - var chromeHeadlessOptions = new ChromeOptions(); - addDriverOptions(chromeHeadlessOptions); - chromeHeadlessOptions.setAcceptInsecureCerts(true); - chromeHeadlessOptions.addArguments("--log-level=3","--remote-allow-origins=*", "--disable-search-engine-choice-screen"); - chromeHeadlessOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); - chromeHeadlessOptions.addArguments("--headless=old"); - System.setProperty("webdriver.chrome.silentOutput", "true"); - if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); - - driver = new ChromeDriver(chromeHeadlessOptions); - } - case CHROME_MOBILE -> { - var chromeHeadlessOptions = new ChromeOptions(); - addDriverOptions(chromeHeadlessOptions); - chromeHeadlessOptions.setAcceptInsecureCerts(true); - chromeHeadlessOptions.addArguments("--log-level=3","--remote-allow-origins=*", "--disable-search-engine-choice-screen"); - chromeHeadlessOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); - - Map deviceMetrics = new HashMap<>(); - deviceMetrics.put("width", BROWSER_CONFIGURATION.get().getDeviceName().getWidth()); - deviceMetrics.put("height", BROWSER_CONFIGURATION.get().getDeviceName().getHeight()); - deviceMetrics.put("pixelRatio", BROWSER_CONFIGURATION.get().getDeviceName().getScaleFactor()); - - Map mobileEmulation = new HashMap<>(); - mobileEmulation.put("deviceMetrics", deviceMetrics); - mobileEmulation.put("userAgent", "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19"); - - chromeHeadlessOptions.setExperimentalOption("mobileEmulation", mobileEmulation); - System.setProperty("webdriver.chrome.silentOutput", "true"); - if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); - - driver = new TouchableWebDriver(chromeHeadlessOptions); - } - case FIREFOX -> { - var firefoxOptions = new FirefoxOptions(); - addDriverOptions(firefoxOptions); - firefoxOptions.setAcceptInsecureCerts(true); - if (shouldCaptureHttpTraffic) firefoxOptions.setProxy(proxyConfig); - driver = new FirefoxDriver(firefoxOptions); - } - case FIREFOX_HEADLESS -> { - var firefoxHeadlessOptions = new FirefoxOptions(); - addDriverOptions(firefoxHeadlessOptions); - firefoxHeadlessOptions.setAcceptInsecureCerts(true); - firefoxHeadlessOptions.addArguments("--headless"); - if (shouldCaptureHttpTraffic) firefoxHeadlessOptions.setProxy(proxyConfig); - driver = new FirefoxDriver(firefoxHeadlessOptions); - } - case EDGE -> { - var edgeOptions = new EdgeOptions(); - addDriverOptions(edgeOptions); - if (shouldCaptureHttpTraffic) edgeOptions.setProxy(proxyConfig); - driver = new EdgeDriver(edgeOptions); - } - case EDGE_HEADLESS -> { - var edgeOptions = new EdgeOptions(); - edgeOptions.addArguments("--headless"); - edgeOptions.addArguments("--disable-gpu"); - addDriverOptions(edgeOptions); - if (shouldCaptureHttpTraffic) edgeOptions.setProxy(proxyConfig); - driver = new EdgeDriver(edgeOptions); + + if (browserConfiguration.getVersion() != 0) { + caps.setCapability("version", browserConfiguration.getVersion()); + } else { + caps.setCapability("version", "latest"); } - case SAFARI -> { - System.setProperty("webdriver.safari.driver", "/usr/bin/safaridriver"); - var safariOptions = new SafariOptions(); - addDriverOptions(safariOptions); - if (shouldCaptureHttpTraffic) safariOptions.setProxy(proxyConfig); - driver = new SafariDriver(safariOptions); + + switch (browserConfiguration.getBrowser()) { + case CHROME_HEADLESS: + case CHROME: { + var chromeOptions = new ChromeOptions(); + addGridOptions(chromeOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, chromeOptions); + break; + } + case FIREFOX_HEADLESS: + case FIREFOX: { + var firefoxOptions = new FirefoxOptions(); + addGridOptions(firefoxOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, firefoxOptions); + break; + } + case EDGE_HEADLESS: + case EDGE: { + var edgeOptions = new EdgeOptions(); + addGridOptions(edgeOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, edgeOptions); + break; + } + case SAFARI: { + var safariOptions = new SafariOptions(); + addGridOptions(safariOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, safariOptions); + break; + } + case INTERNET_EXPLORER: { + var ieOptions = new InternetExplorerOptions(); + addGridOptions(ieOptions, gridSettings); + caps.setCapability(ChromeOptions.CAPABILITY, ieOptions); + break; + } } - case INTERNET_EXPLORER -> { - var internetExplorerOptions = new InternetExplorerOptions(); - addDriverOptions(internetExplorerOptions); - internetExplorerOptions.introduceFlakinessByIgnoringSecurityDomains().ignoreZoomSettings(); - if (shouldCaptureHttpTraffic) internetExplorerOptions.setProxy(proxyConfig); - driver = new InternetExplorerDriver(internetExplorerOptions); + + WebDriver driver = null; + try { + var gridUrl = gridSettings.getUrl(); + var url = getUrl(gridUrl); + + driver = new RemoteWebDriver(new URI(url).toURL(), caps); + } catch (MalformedURLException | URISyntaxException e) { + DebugInformation.printStackTrace(e); } + + return driver; } - return driver; - } + private WebDriver initializeDriverRegularMode() { + WebDriver driver = null; + boolean shouldCaptureHttpTraffic = ConfigurationService.get(WebSettings.class).getShouldCaptureHttpTraffic(); - 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; - } + Proxy proxyConfig = null; + if (shouldCaptureHttpTraffic) { + ProxyServer.init(); + proxyConfig = ClientUtil.createSeleniumProxy(ProxyServer.get()); + ProxyServer.newHar(); + } - private static void addGridOptions(HashMap options, GridSettings gridSettings) { - Log.info("Add WebDriver Options:"); - Log.info(""); - for (var entry : gridSettings.getArguments()) { - for (var c : entry.entrySet()) { - if (c.getKey().toLowerCase().contains("build")) { - var buildName = getBuildName(); - if (buildName == null) { - buildName = c.getValue().toString(); + switch (browserConfiguration.getBrowser()) { + case CHROME -> { + var chromeOptions = new ChromeOptions(); + addDriverOptions(chromeOptions); + addDriverCapabilities(chromeOptions); + chromeOptions.addArguments("--log-level=3","--remote-allow-origins=*", "--disable-search-engine-choice-screen"); + chromeOptions.setAcceptInsecureCerts(true); + chromeOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); + System.setProperty("webdriver.chrome.silentOutput", "true"); + if (shouldCaptureHttpTraffic) { + chromeOptions.setProxy(proxyConfig); } - options.put(c.getKey(), buildName); - Log.info(c.getKey() + " = " + buildName); - } else { - if (c.getValue() instanceof String && c.getValue().toString().startsWith("{env_")) { - var envValue = SecretsResolver.getSecret(c.getValue().toString()); - options.put(c.getKey(), envValue); - Log.info(c.getKey() + " = " + envValue); - } else { - options.put(c.getKey(), c.getValue()); - Log.info(c.getKey() + " = " + c.getValue()); - } + driver = new ChromeDriver(chromeOptions); + } + case CHROME_HEADLESS -> { + var chromeHeadlessOptions = new ChromeOptions(); + addDriverOptions(chromeHeadlessOptions); + chromeHeadlessOptions.setAcceptInsecureCerts(true); + chromeHeadlessOptions.addArguments("--log-level=3","--remote-allow-origins=*", "--disable-search-engine-choice-screen"); + chromeHeadlessOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); + chromeHeadlessOptions.addArguments("--headless=old"); + System.setProperty("webdriver.chrome.silentOutput", "true"); + if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); + + driver = new ChromeDriver(chromeHeadlessOptions); + } + case CHROME_MOBILE -> { + var chromeHeadlessOptions = new ChromeOptions(); + addDriverOptions(chromeHeadlessOptions); + chromeHeadlessOptions.setAcceptInsecureCerts(true); + chromeHeadlessOptions.addArguments("--log-level=3","--remote-allow-origins=*", "--disable-search-engine-choice-screen"); + chromeHeadlessOptions.setCapability(CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); + + Map deviceMetrics = new HashMap<>(); + deviceMetrics.put("width", browserConfiguration.getDeviceName().getWidth()); + deviceMetrics.put("height", browserConfiguration.getDeviceName().getHeight()); + deviceMetrics.put("pixelRatio", browserConfiguration.getDeviceName().getScaleFactor()); + + Map mobileEmulation = new HashMap<>(); + mobileEmulation.put("deviceMetrics", deviceMetrics); + mobileEmulation.put("userAgent", "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19"); + + chromeHeadlessOptions.setExperimentalOption("mobileEmulation", mobileEmulation); + System.setProperty("webdriver.chrome.silentOutput", "true"); + if (shouldCaptureHttpTraffic) chromeHeadlessOptions.setProxy(proxyConfig); + + driver = new TouchableWebDriver(chromeHeadlessOptions); + } + case FIREFOX -> { + var firefoxOptions = new FirefoxOptions(); + addDriverOptions(firefoxOptions); + firefoxOptions.setAcceptInsecureCerts(true); + if (shouldCaptureHttpTraffic) firefoxOptions.setProxy(proxyConfig); + driver = new FirefoxDriver(firefoxOptions); + } + case FIREFOX_HEADLESS -> { + var firefoxHeadlessOptions = new FirefoxOptions(); + addDriverOptions(firefoxHeadlessOptions); + firefoxHeadlessOptions.setAcceptInsecureCerts(true); + firefoxHeadlessOptions.addArguments("--headless"); + if (shouldCaptureHttpTraffic) firefoxHeadlessOptions.setProxy(proxyConfig); + driver = new FirefoxDriver(firefoxHeadlessOptions); + } + case EDGE -> { + var edgeOptions = new EdgeOptions(); + addDriverOptions(edgeOptions); + if (shouldCaptureHttpTraffic) edgeOptions.setProxy(proxyConfig); + driver = new EdgeDriver(edgeOptions); + } + case EDGE_HEADLESS -> { + var edgeOptions = new EdgeOptions(); + edgeOptions.addArguments("--headless"); + edgeOptions.addArguments("--disable-gpu"); + addDriverOptions(edgeOptions); + if (shouldCaptureHttpTraffic) edgeOptions.setProxy(proxyConfig); + driver = new EdgeDriver(edgeOptions); + } + case SAFARI -> { + System.setProperty("webdriver.safari.driver", "/usr/bin/safaridriver"); + var safariOptions = new SafariOptions(); + addDriverOptions(safariOptions); + if (shouldCaptureHttpTraffic) safariOptions.setProxy(proxyConfig); + driver = new SafariDriver(safariOptions); + } + case INTERNET_EXPLORER -> { + var internetExplorerOptions = new InternetExplorerOptions(); + addDriverOptions(internetExplorerOptions); + internetExplorerOptions.introduceFlakinessByIgnoringSecurityDomains().ignoreZoomSettings(); + if (shouldCaptureHttpTraffic) internetExplorerOptions.setProxy(proxyConfig); + driver = new InternetExplorerDriver(internetExplorerOptions); } } - if ("lambdatest".equalsIgnoreCase(gridSettings.getProviderName())) { - options.put("lambdaMaskCommands", new String[]{"setValues", "setCookies", "getCookies"}); - - try { - var usernameSecret = gridSettings.getArguments().get(0).get("username").toString(); - var accessKeySecret = gridSettings.getArguments().get(0).get("accessKey").toString(); - var usernameValue = SecretsResolver.getSecret(usernameSecret); - var accessKeyValue = SecretsResolver.getSecret(accessKeySecret); + return driver; + } - var res = given().auth().preemptive().basic(usernameValue, accessKeyValue) - .get("https://api.lambdatest.com/automation/api/v1/user-files"); + private 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; + } - options.put("lambda:userFiles", res.body().jsonPath().getList("data.key")); - } catch (Exception e) { - DebugInformation.printStackTrace(e); + private void addGridOptions(HashMap options, GridSettings gridSettings) { + Log.info("Add WebDriver Options:"); + Log.info(""); + for (var entry : gridSettings.getArguments()) { + for (var c : entry.entrySet()) { + if (c.getKey().toLowerCase().contains("build")) { + var buildName = getBuildName(); + if (buildName == null) { + buildName = c.getValue().toString(); + } + + options.put(c.getKey(), buildName); + Log.info(c.getKey() + " = " + buildName); + } else { + if (c.getValue() instanceof String && c.getValue().toString().startsWith("{env_")) { + var envValue = SecretsResolver.getSecret(c.getValue().toString()); + options.put(c.getKey(), envValue); + Log.info(c.getKey() + " = " + envValue); + } else { + options.put(c.getKey(), c.getValue()); + Log.info(c.getKey() + " = " + c.getValue()); + } + } } + if ("lambdatest".equalsIgnoreCase(gridSettings.getProviderName())) { + options.put("lambdaMaskCommands", new String[]{"setValues", "setCookies", "getCookies"}); - } + try { + var usernameSecret = gridSettings.getArguments().get(0).get("username").toString(); + var accessKeySecret = gridSettings.getArguments().get(0).get("accessKey").toString(); + var usernameValue = SecretsResolver.getSecret(usernameSecret); + var accessKeyValue = SecretsResolver.getSecret(accessKeySecret); + + var res = given().auth().preemptive().basic(usernameValue, accessKeyValue) + .get("https://api.lambdatest.com/automation/api/v1/user-files"); + + options.put("lambda:userFiles", res.body().jsonPath().getList("data.key")); + } catch (Exception e) { + DebugInformation.printStackTrace(e); + } - Log.info(""); - } - } - private static void addGridOptions(TOption options, GridSettings gridSettings) { - for (var entry : gridSettings.getArguments()) { - for (var c : entry.entrySet()) { - if (c.getValue() instanceof String && c.getValue().toString().startsWith("{env_")) { - var envValue = SecretsResolver.getSecret(c.getValue().toString()); - options.setCapability(c.getKey(), envValue); - } else { - options.setCapability(c.getKey(), c.getValue()); } + + Log.info(""); } } - if ("lambdatest".equalsIgnoreCase(gridSettings.getProviderName())) { - options.setCapability("lambdaMaskCommands", new String[]{"setValues", "setCookies", "getCookies"}); - } - } + private void addGridOptions(TOption options, GridSettings gridSettings) { + for (var entry : gridSettings.getArguments()) { + for (var c : entry.entrySet()) { + if (c.getValue() instanceof String && c.getValue().toString().startsWith("{env_")) { + var envValue = SecretsResolver.getSecret(c.getValue().toString()); + options.setCapability(c.getKey(), envValue); + } else { + options.setCapability(c.getKey(), c.getValue()); + } + } + } - private static void addDriverOptions(TOption chromeOptions) { - for (var optionKey : BROWSER_CONFIGURATION.get().driverOptions.keySet()) { - chromeOptions.setCapability(optionKey, BROWSER_CONFIGURATION.get().driverOptions.get(optionKey)); + if ("lambdatest".equalsIgnoreCase(gridSettings.getProviderName())) { + options.setCapability("lambdaMaskCommands", new String[]{"setValues", "setCookies", "getCookies"}); + } } - } - 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())); + private void addDriverOptions(TOption chromeOptions) { + for (var optionKey : browserConfiguration.driverOptions.keySet()) { + chromeOptions.setCapability(optionKey, browserConfiguration.driverOptions.get(optionKey)); } - } catch (Exception ex) { System.out.println("Error while resizing browser window: " + ex.getMessage());} - } - - private static String getBuildName() { - if (!isBuildNameSet) { - buildName = System.getProperty("buildName"); } - if (buildName == null) { - InputStream input = ConfigurationService.class.getResourceAsStream("/application.properties"); - var p = new Properties(); + private void changeWindowSize(WebDriver wrappedDriver) { try { - p.load(input); - } catch (IOException e) { - return null; - } + 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());} + } + private String getBuildName() { if (!isBuildNameSet) { - buildName = p.getProperty("buildName"); + buildName = System.getProperty("buildName"); } - if (buildName.equals("{randomNumber}") && !isBuildNameSet) { - buildName = TimestampBuilder.buildUniqueTextByPrefix("LE_"); - isBuildNameSet = true; + if (buildName == null) { + InputStream input = ConfigurationService.class.getResourceAsStream("/application.properties"); + var p = new Properties(); + try { + p.load(input); + } catch (IOException e) { + return null; + } + + if (!isBuildNameSet) { + buildName = p.getProperty("buildName"); + } + + if (buildName.equals("{randomNumber}") && !isBuildNameSet) { + buildName = TimestampBuilder.buildUniqueTextByPrefix("LE_"); + isBuildNameSet = true; + } } + + return buildName; } - return buildName; - } + private String getUrl(String url) { + String result = url; + if (url.startsWith("{env_")) { + result = SecretsResolver.getSecret(url); + } else if (url.contains("{env_")) { + String pattern = "\\{env_.*?\\}"; + Pattern compiledPattern = Pattern.compile(pattern); + Matcher matcher = compiledPattern.matcher(url); + List allMatches = new ArrayList(); + + while (matcher.find()) { + allMatches.add(matcher.group()); + } - private static String getUrl(String url) { - String result = url; - if (url.startsWith("{env_")) { - result = SecretsResolver.getSecret(url); - } else if (url.contains("{env_")) { - String pattern = "\\{env_.*?\\}"; - Pattern compiledPattern = Pattern.compile(pattern); - Matcher matcher = compiledPattern.matcher(url); - List allMatches = new ArrayList(); - - while (matcher.find()) { - allMatches.add(matcher.group()); + for (String match : allMatches) { + result = result.replace(match, SecretsResolver.getSecret(match)); + } } - for (String match : allMatches) { - result = result.replace(match, SecretsResolver.getSecret(match)); - } + return result; } - return result; - } + public void close() { + if (disposed) { + return; + } - public static void close() { - if (DISPOSED.get()) { - return; - } + if (wrapppedDriver != null) { + DebugInformation.debugInfo("SHUTTING DOWN WRAPPED_DRIVER"); + wrapppedDriver.quit(); + if (customDriverOptions != null) { + customDriverOptions.clear(); + } + } - if (WRAPPED_DRIVER.get() != null) { - DebugInformation.debugInfo("SHUTTING DOWN WRAPPED_DRIVER"); - WRAPPED_DRIVER.get().quit(); - if (CUSTOM_DRIVER_OPTIONS.get() != null) { - CUSTOM_DRIVER_OPTIONS.get().clear(); + boolean shouldCaptureHttpTraffic = ConfigurationService.get(WebSettings.class).getShouldCaptureHttpTraffic(); + if (shouldCaptureHttpTraffic) { + ProxyServer.close(); } - } - boolean shouldCaptureHttpTraffic = ConfigurationService.get(WebSettings.class).getShouldCaptureHttpTraffic(); - if (shouldCaptureHttpTraffic) { - ProxyServer.close(); + disposed = true; } - - DISPOSED.set(true); } } \ No newline at end of file From 7bbcc7c651422915d9fbfc7ffe6c445735cc57ad Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Wed, 15 Jan 2025 16:14:13 +0200 Subject: [PATCH 18/19] revert changes to testFrameworkSettings.dev.json --- .../src/main/resources/testFrameworkSettings.dev.json | 2 +- .../src/main/resources/testFrameworkSettings.dev.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.dev.json b/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.dev.json index 83c268dd..023d0c91 100644 --- a/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.dev.json +++ b/getting-started/bellatrix.playwright.getting.started/src/main/resources/testFrameworkSettings.dev.json @@ -4,7 +4,7 @@ }, "webSettings": { "baseUrl": "http://demos.bellatrix.solutions/", - "executionType":"regular", + "executionType":"regular", "defaultBrowser": "chrome", "defaultLifeCycle": "restart everytime time", "artificialDelayBeforeAction": "0", diff --git a/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.dev.json b/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.dev.json index 0f43ccc7..589ce73d 100644 --- a/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.dev.json +++ b/getting-started/bellatrix.web.getting.started/src/main/resources/testFrameworkSettings.dev.json @@ -4,7 +4,7 @@ }, "webSettings": { "baseUrl": "http://demos.bellatrix.solutions/", - "executionType":"regular", + "executionType":"regular", "defaultBrowser": "chrome", "defaultLifeCycle": "restart everytime time", "artificialDelayBeforeAction": "0", From 876f2839ebd33b1ce59659b95a049a202ac1a7dd Mon Sep 17 00:00:00 2001 From: MiriamKyoseva Date: Wed, 22 Jan 2025 15:53:19 +0200 Subject: [PATCH 19/19] fixing formatting of PlaywrightService file --- .../infrastructure/PlaywrightService.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java index ccbc2ccb..a712d009 100644 --- a/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java +++ b/bellatrix.playwright/src/main/java/solutions/bellatrix/playwright/infrastructure/PlaywrightService.java @@ -57,21 +57,27 @@ public class PlaywrightService { public static WrappedBrowser start(BrowserConfiguration configuration) { return PLAYWRIGHT_MANAGER.get().start(configuration); } + public static void restartBrowserContext() { PLAYWRIGHT_MANAGER.get().restartBrowserContext(); } + public static void close() { PLAYWRIGHT_MANAGER.get().close(); } + public static WrappedBrowser wrappedBrowser() { return PLAYWRIGHT_MANAGER.get().wrappedBrowser; } + public static void wrappedBrowser(WrappedBrowser driver) { PLAYWRIGHT_MANAGER.get().wrappedBrowser = driver; } + public static BrowserConfiguration browserConfiguration() { return PLAYWRIGHT_MANAGER.get().browserConfiguration; } + private static class PlaywrightManager { private PlaywrightManager() { } @@ -81,6 +87,7 @@ private PlaywrightManager() { private WrappedBrowser wrappedBrowser; private boolean isBuildNameSet = false; private String buildName; + public WrappedBrowser start(BrowserConfiguration configuration) { if (disposed) { browserConfiguration(configuration); @@ -97,6 +104,7 @@ public WrappedBrowser start(BrowserConfiguration configuration) { } else return wrappedBrowser(); } + public void close() { if (disposed) { return; @@ -115,10 +123,12 @@ public void close() { } disposed = true; } + public void restartBrowserContext() { DebugInformation.debugInfo("RESTARTING CONTEXT"); wrappedBrowser().changeContext(intializeBrowserContext()); } + private WrappedBrowser initializeBrowserWrapperRegularMode() { wrappedBrowser(new WrappedBrowser(playwright)); wrappedBrowser().setBrowser(initializeBrowserRegularMode()); @@ -126,6 +136,7 @@ private WrappedBrowser initializeBrowserWrapperRegularMode() { wrappedBrowser().setCurrentPage(wrappedBrowser().getCurrentContext().newPage()); return wrappedBrowser(); } + private WrappedBrowser initializeBrowserWrapperGridMode(GridSettings gridSettings) { wrappedBrowser(new WrappedBrowser(playwright)); wrappedBrowser().setBrowser(initializeBrowserGridMode(gridSettings)); @@ -133,6 +144,7 @@ private WrappedBrowser initializeBrowserWrapperGridMode(GridSettings gridSetting wrappedBrowser().setCurrentPage(wrappedBrowser().getCurrentContext().newPage()); return wrappedBrowser(); } + private Browser initializeBrowserRegularMode() { BrowserTypes browserTypes = browserConfiguration().getBrowserTypes(); switch (browserTypes) { @@ -219,6 +231,7 @@ private Browser initializeBrowserRegularMode() { default -> throw new IllegalArgumentException("Unsupported."); } } + private BrowserContext intializeBrowserContext() { Browser.NewContextOptions options = getContextOptions(); var context = browser().newContext(options); @@ -227,6 +240,7 @@ private BrowserContext intializeBrowserContext() { } return context; } + // ToDo Browser Context options private Browser.NewContextOptions getContextOptions() { Browser.NewContextOptions options = new Browser.NewContextOptions(); @@ -246,12 +260,14 @@ private Browser.NewContextOptions getContextOptions() { // ToDo setProxy return options; } + private void startRecordingHttpTraffic(BrowserContext context) { Traffic.getRequestContainers().add(new Requests(context)); context.onRequest(x -> Traffic.getContextSpecificRequests(context).add(x)); Traffic.getResponseContainers().add(new Responses(context)); context.onResponse(x -> Traffic.getContextSpecificResponses(context).add(x)); } + private Browser initializeBrowserGridMode(GridSettings gridSettings) { var timeout = Settings.timeout().inMilliseconds().getConnectToRemoteGridTimeout(); var gridUrl = gridSettings.getUrl(); @@ -294,6 +310,7 @@ private Browser initializeBrowserGridMode(GridSettings gridSettings) { return null; } } + private void changeWindowSize() { try { if (browserConfiguration().getHeight() != 0 && browserConfiguration().getWidth() != 0) { @@ -301,6 +318,7 @@ private void changeWindowSize() { } } catch (Exception ignored) {} } + private String getBuildName() { if (!isBuildNameSet) { buildName = System.getProperty("buildName"); @@ -323,30 +341,38 @@ private String getBuildName() { } return buildName; } + public BrowserConfiguration browserConfiguration() { return browserConfiguration; } + public BrowserConfiguration browserConfiguration(BrowserConfiguration configuration) { browserConfiguration = configuration; return browserConfiguration(); } + public WrappedBrowser wrappedBrowser() { return wrappedBrowser; } + public WrappedBrowser wrappedBrowser(WrappedBrowser wrappedBrowser) { this.wrappedBrowser = wrappedBrowser; return this.wrappedBrowser; } + private Browser browser() { return wrappedBrowser().getBrowser(); } + private Browser browser(Browser browser) { wrappedBrowser().setBrowser(browser); return browser(); } + private BrowserContext context() { return wrappedBrowser().getCurrentContext(); } + private BrowserContext context(BrowserContext browserContext) { wrappedBrowser().setCurrentContext(browserContext); return context();