From 48745346293bdaa9c46f38891ba8d7438d328d6d Mon Sep 17 00:00:00 2001 From: Charankumar H <29479534+iamcharankumar@users.noreply.github.com> Date: Sat, 9 Aug 2025 16:59:07 +0530 Subject: [PATCH 1/4] Refactord the Browser Management and created Screenshots Utils class. --- .../qa/browsermanager/BrowserFactory.java | 6 ++- .../qa/browsermanager/BrowserManager.java | 6 +-- .../portal/qa/browsermanager/BrowserName.java | 4 +- .../qa/browsermanager/ChromeBrowser.java | 9 ++-- .../qa/browsermanager/FirefoxBrowser.java | 9 ++-- .../qa/browsermanager/MsEdgeBrowser.java | 11 ++--- .../qa/browsermanager/WebkitBrowser.java | 9 ++-- .../portal/qa/commons/WebBasePage.java | 10 ----- .../qa/constants/WebPortalConstants.java | 14 +++++++ .../portal/qa/exceptions/UtilsException.java | 8 ---- .../qa/exceptions/WebUtilsException.java | 8 ++++ .../portal/qa/pages/SwagLabsProductPage.java | 5 ++- .../screenshotsmanager/ScreenshotsUtils.java | 42 +++++++++++++++++++ .../portal/qa/utils/PropertiesUtils.java | 4 +- .../portal/qa/commons/WebBaseTest.java | 15 +++++-- .../portal/qa/listeners/WebTestListeners.java | 5 +-- 16 files changed, 108 insertions(+), 57 deletions(-) delete mode 100644 src/main/java/io/swaglabs/portal/qa/exceptions/UtilsException.java create mode 100644 src/main/java/io/swaglabs/portal/qa/exceptions/WebUtilsException.java create mode 100644 src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotsUtils.java diff --git a/src/main/java/io/swaglabs/portal/qa/browsermanager/BrowserFactory.java b/src/main/java/io/swaglabs/portal/qa/browsermanager/BrowserFactory.java index 55d8900..b9ad047 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/BrowserFactory.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/BrowserFactory.java @@ -1,9 +1,11 @@ package io.swaglabs.portal.qa.browsermanager; +import io.swaglabs.portal.qa.constants.WebPortalConstants; + public class BrowserFactory { - public IBrowser createBrowser(String browserName) { - return switch (BrowserName.fromString(browserName)) { + public IBrowser createBrowser() { + return switch (BrowserName.fromString(WebPortalConstants.BROWSER)) { case FIREFOX -> new FirefoxBrowser(); case WEBKIT -> new WebkitBrowser(); case MS_EDGE -> new MsEdgeBrowser(); diff --git a/src/main/java/io/swaglabs/portal/qa/browsermanager/BrowserManager.java b/src/main/java/io/swaglabs/portal/qa/browsermanager/BrowserManager.java index 123bf8c..b676e5a 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/BrowserManager.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/BrowserManager.java @@ -11,10 +11,8 @@ public class BrowserManager implements IBrowserManager { @Override public Page getBrowserPage(Playwright playwright) { - String browserName = WebPortalConstants.BROWSER; - String runMode = WebPortalConstants.RUN_MODE; - boolean isHeadless = runMode.equals("headless"); - BrowserContext browserContext = new BrowserFactory().createBrowser(browserName).createSession(playwright, isHeadless); + boolean isHeadless = "headless".equals(WebPortalConstants.RUN_MODE); + BrowserContext browserContext = new BrowserFactory().createBrowser().createSession(playwright, isHeadless); Objects.requireNonNull(browserContext, "Playwright Browser Context is null!"); return browserContext.newPage(); } diff --git a/src/main/java/io/swaglabs/portal/qa/browsermanager/BrowserName.java b/src/main/java/io/swaglabs/portal/qa/browsermanager/BrowserName.java index 5adba0d..d8fbc9b 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/BrowserName.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/BrowserName.java @@ -1,6 +1,6 @@ package io.swaglabs.portal.qa.browsermanager; -import io.swaglabs.portal.qa.exceptions.UtilsException; +import io.swaglabs.portal.qa.exceptions.WebUtilsException; import lombok.AllArgsConstructor; import lombok.Getter; @@ -20,6 +20,6 @@ public enum BrowserName { public static BrowserName fromString(String browserName) { return Arrays.stream(BrowserName.values()) .filter(browserType -> browserType.getBrowserType().equalsIgnoreCase(browserName)) - .findFirst().orElseThrow(() -> new UtilsException("Unknown browser: " + browserName)); + .findFirst().orElseThrow(() -> new WebUtilsException("Unknown browser: " + browserName)); } } \ No newline at end of file diff --git a/src/main/java/io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java b/src/main/java/io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java index 40c7db8..4757cf4 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java @@ -10,10 +10,9 @@ public class ChromeBrowser implements IBrowser { @Override public BrowserContext createSession(Playwright playwright, boolean isHeadless) { - return playwright.chromium().launch(new BrowserType.LaunchOptions() - .setHeadless(isHeadless)) - .newContext(new Browser.NewContextOptions() - .setViewportSize(WebPortalConstants.SCREEN_WIDTH, WebPortalConstants.SCREEN_HEIGHT) - .setTimezoneId(WebPortalConstants.TIME_ZONE)); + BrowserType.LaunchOptions chromeLaunchOptions = WebPortalConstants.BROWSER_LAUNCH_OPTIONS.setHeadless(isHeadless); + return playwright.chromium().launch(chromeLaunchOptions).newContext(new Browser.NewContextOptions() + .setViewportSize(WebPortalConstants.SCREEN_WIDTH, WebPortalConstants.SCREEN_HEIGHT) + .setTimezoneId(WebPortalConstants.TIME_ZONE)); } } \ No newline at end of file diff --git a/src/main/java/io/swaglabs/portal/qa/browsermanager/FirefoxBrowser.java b/src/main/java/io/swaglabs/portal/qa/browsermanager/FirefoxBrowser.java index df55612..d83de6b 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/FirefoxBrowser.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/FirefoxBrowser.java @@ -9,10 +9,9 @@ public class FirefoxBrowser implements IBrowser { @Override public BrowserContext createSession(Playwright playwright, boolean isHeadless) { - return playwright.firefox().launch(new BrowserType.LaunchOptions() - .setHeadless(isHeadless)) - .newContext(new Browser.NewContextOptions() - .setViewportSize(WebPortalConstants.SCREEN_WIDTH, WebPortalConstants.SCREEN_HEIGHT) - .setTimezoneId(WebPortalConstants.TIME_ZONE)); + BrowserType.LaunchOptions firefoxLaunchOptions = WebPortalConstants.BROWSER_LAUNCH_OPTIONS.setHeadless(isHeadless); + return playwright.firefox().launch(firefoxLaunchOptions).newContext(new Browser.NewContextOptions() + .setViewportSize(WebPortalConstants.SCREEN_WIDTH, WebPortalConstants.SCREEN_HEIGHT) + .setTimezoneId(WebPortalConstants.TIME_ZONE)); } } \ No newline at end of file diff --git a/src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java b/src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java index 0834bc4..fd31d3c 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java @@ -9,10 +9,11 @@ public class MsEdgeBrowser implements IBrowser { @Override public BrowserContext createSession(Playwright playwright, boolean isHeadless) { - return playwright.chromium().launch(new BrowserType.LaunchOptions() - .setHeadless(isHeadless).setChannel(BrowserName.MS_EDGE.getBrowserType())) - .newContext(new Browser.NewContextOptions() - .setViewportSize(WebPortalConstants.SCREEN_WIDTH, WebPortalConstants.SCREEN_HEIGHT) - .setTimezoneId(WebPortalConstants.TIME_ZONE)); + BrowserType.LaunchOptions msedgeLaunchOptions = WebPortalConstants.BROWSER_LAUNCH_OPTIONS + .setHeadless(isHeadless) + .setChannel(BrowserName.MS_EDGE.getBrowserType()); + return playwright.chromium().launch(msedgeLaunchOptions).newContext(new Browser.NewContextOptions() + .setViewportSize(WebPortalConstants.SCREEN_WIDTH, WebPortalConstants.SCREEN_HEIGHT) + .setTimezoneId(WebPortalConstants.TIME_ZONE)); } } \ No newline at end of file diff --git a/src/main/java/io/swaglabs/portal/qa/browsermanager/WebkitBrowser.java b/src/main/java/io/swaglabs/portal/qa/browsermanager/WebkitBrowser.java index cee8e76..d031db2 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/WebkitBrowser.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/WebkitBrowser.java @@ -9,10 +9,9 @@ public class WebkitBrowser implements IBrowser { @Override public BrowserContext createSession(Playwright playwright, boolean isHeadless) { - return playwright.webkit().launch(new BrowserType.LaunchOptions() - .setHeadless(isHeadless)) - .newContext(new Browser.NewContextOptions() - .setViewportSize(WebPortalConstants.SCREEN_WIDTH, WebPortalConstants.SCREEN_HEIGHT) - .setTimezoneId(WebPortalConstants.TIME_ZONE)); + BrowserType.LaunchOptions webkitLaunchOptions = new BrowserType.LaunchOptions().setHeadless(isHeadless); + return playwright.webkit().launch(webkitLaunchOptions).newContext(new Browser.NewContextOptions() + .setViewportSize(WebPortalConstants.SCREEN_WIDTH, WebPortalConstants.SCREEN_HEIGHT) + .setTimezoneId(WebPortalConstants.TIME_ZONE)); } } \ No newline at end of file diff --git a/src/main/java/io/swaglabs/portal/qa/commons/WebBasePage.java b/src/main/java/io/swaglabs/portal/qa/commons/WebBasePage.java index d13b862..1366116 100644 --- a/src/main/java/io/swaglabs/portal/qa/commons/WebBasePage.java +++ b/src/main/java/io/swaglabs/portal/qa/commons/WebBasePage.java @@ -2,18 +2,13 @@ import com.microsoft.playwright.Locator; import com.microsoft.playwright.Page; -import io.swaglabs.portal.qa.constants.WebPortalConstants; import io.swaglabs.portal.qa.exceptions.WebPageException; import io.swaglabs.portal.qa.locators.Locators; -import io.swaglabs.portal.qa.screenshotsmanager.ElementScreenshotStrategy; -import io.swaglabs.portal.qa.screenshotsmanager.ScreenshotContext; import java.util.Objects; public abstract class WebBasePage { - private static final String ELEMENT_SCREENSHOT_FILE_LOCATION = WebPortalConstants.SCREENSHOT_FILE_LOCATION + "/elements/" - + WebPortalConstants.BROWSER + "_" + WebPortalConstants.RUN_MODE + "_Element_"; protected Page basePage; protected Locators locators; @@ -53,9 +48,4 @@ private String extractText(Locator locator, String errorMessage) { Objects.requireNonNull(locator, errorMessage); return locator.textContent().trim(); } - - protected void takeElementScreenshot(Locator locator, String fileName) { - ScreenshotContext screenshotContext = new ScreenshotContext(new ElementScreenshotStrategy(locator)); - screenshotContext.captureScreenshot(basePage, ELEMENT_SCREENSHOT_FILE_LOCATION + fileName + WebPortalConstants.IMAGE_FORMAT); - } } \ No newline at end of file diff --git a/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java b/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java index b701024..52e107c 100644 --- a/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java +++ b/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java @@ -1,9 +1,14 @@ package io.swaglabs.portal.qa.constants; +import com.microsoft.playwright.BrowserType; +import io.swaglabs.portal.qa.screenshotsmanager.ScreenshotContext; +import io.swaglabs.portal.qa.screenshotsmanager.ScreenshotsUtils; import io.swaglabs.portal.qa.utils.WebConfigLoader; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import java.util.List; + @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class WebPortalConstants { @@ -18,9 +23,18 @@ public final class WebPortalConstants { public static final String BROWSER = System.getProperty("browser"); public static final String TIME_ZONE = "Asia/Kolkata"; + // Web Browser resolution public static final int SCREEN_WIDTH = 1920; public static final int SCREEN_HEIGHT = 1080; public static final String SCREENSHOT_FILE_LOCATION = "./target/screenshots/"; public static final String IMAGE_FORMAT = ".png"; + + // Browser Type Launch Options Config + public static final BrowserType.LaunchOptions BROWSER_LAUNCH_OPTIONS = new BrowserType.LaunchOptions() + .setArgs(List.of("--window-position=0,0")); + + // SCREENSHOT STRATEGIES + public static final ScreenshotsUtils SCREENSHOTS_UTILS = ScreenshotsUtils.getInstance(); + public static final ScreenshotContext FULL_PAGE_SCREENSHOT = SCREENSHOTS_UTILS.getFullPageScreenshotContext(); } \ No newline at end of file diff --git a/src/main/java/io/swaglabs/portal/qa/exceptions/UtilsException.java b/src/main/java/io/swaglabs/portal/qa/exceptions/UtilsException.java deleted file mode 100644 index 01de526..0000000 --- a/src/main/java/io/swaglabs/portal/qa/exceptions/UtilsException.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.swaglabs.portal.qa.exceptions; - -public class UtilsException extends RuntimeException { - - public UtilsException(String errorMessage) { - super(errorMessage); - } -} diff --git a/src/main/java/io/swaglabs/portal/qa/exceptions/WebUtilsException.java b/src/main/java/io/swaglabs/portal/qa/exceptions/WebUtilsException.java new file mode 100644 index 0000000..112e5a6 --- /dev/null +++ b/src/main/java/io/swaglabs/portal/qa/exceptions/WebUtilsException.java @@ -0,0 +1,8 @@ +package io.swaglabs.portal.qa.exceptions; + +public class WebUtilsException extends RuntimeException { + + public WebUtilsException(String errorMessage) { + super(errorMessage); + } +} diff --git a/src/main/java/io/swaglabs/portal/qa/pages/SwagLabsProductPage.java b/src/main/java/io/swaglabs/portal/qa/pages/SwagLabsProductPage.java index e3f59e7..2dcf27c 100644 --- a/src/main/java/io/swaglabs/portal/qa/pages/SwagLabsProductPage.java +++ b/src/main/java/io/swaglabs/portal/qa/pages/SwagLabsProductPage.java @@ -3,6 +3,7 @@ import com.microsoft.playwright.Locator; import com.microsoft.playwright.Page; import com.microsoft.playwright.options.AriaRole; +import io.swaglabs.portal.qa.constants.WebPortalConstants; public final class SwagLabsProductPage extends SwagLabsBasePage { @@ -17,7 +18,7 @@ public String getProductNameText() { public String getProductPriceText() { Locator productPrice = locators.getPageLocator(".inventory_details_price"); String productPriceText = getTextContent(productPrice); - takeElementScreenshot(productPrice, productPriceText); + WebPortalConstants.SCREENSHOTS_UTILS.takeElementScreenshot(basePage, productPrice, productPriceText); return productPriceText; } @@ -32,7 +33,7 @@ public boolean isProductAddedToCart() { public boolean isShoppingCartClicked() { Locator shoppingCart = locators.getPageLocator(".shopping_cart_link"); - takeElementScreenshot(shoppingCart, "shoppingCart"); + WebPortalConstants.SCREENSHOTS_UTILS.takeElementScreenshot(basePage, shoppingCart, "shoppingCart"); clickElement(shoppingCart); return true; } diff --git a/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotsUtils.java b/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotsUtils.java new file mode 100644 index 0000000..9f00fcb --- /dev/null +++ b/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotsUtils.java @@ -0,0 +1,42 @@ +package io.swaglabs.portal.qa.screenshotsmanager; + +import com.microsoft.playwright.Locator; +import com.microsoft.playwright.Page; +import io.swaglabs.portal.qa.constants.WebPortalConstants; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.Objects; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ScreenshotsUtils { + + private static final String ELEMENT_SCREENSHOT_FILE_LOCATION = WebPortalConstants.SCREENSHOT_FILE_LOCATION + + "/elements/" + WebPortalConstants.BROWSER + "_" + WebPortalConstants.RUN_MODE + "_Element_"; + private static ScreenshotsUtils instance; + + public static ScreenshotsUtils getInstance() { + if (instance == null) { + synchronized (ScreenshotsUtils.class) { + if (instance == null) { + instance = new ScreenshotsUtils(); + } + } + } + return instance; + } + + public ScreenshotContext getFullPageScreenshotContext() { + return new ScreenshotContext(new FullPageScreenshotStrategy()); + } + + public ScreenshotContext getElementScreenshotContext(Locator locator) { + Objects.requireNonNull(locator, "Locator cannot be null for taking element screenshot"); + return new ScreenshotContext(new ElementScreenshotStrategy(locator)); + } + + public void takeElementScreenshot(Page page, Locator locator, String fileName) { + getElementScreenshotContext(locator).captureScreenshot(page, + ELEMENT_SCREENSHOT_FILE_LOCATION + fileName + WebPortalConstants.IMAGE_FORMAT); + } +} \ No newline at end of file diff --git a/src/main/java/io/swaglabs/portal/qa/utils/PropertiesUtils.java b/src/main/java/io/swaglabs/portal/qa/utils/PropertiesUtils.java index fa7c05c..e8343fe 100644 --- a/src/main/java/io/swaglabs/portal/qa/utils/PropertiesUtils.java +++ b/src/main/java/io/swaglabs/portal/qa/utils/PropertiesUtils.java @@ -1,6 +1,6 @@ package io.swaglabs.portal.qa.utils; -import io.swaglabs.portal.qa.exceptions.UtilsException; +import io.swaglabs.portal.qa.exceptions.WebUtilsException; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -23,7 +23,7 @@ public static Properties loadProperties(String fileName) { properties = new Properties(); properties.load(fileInputStream); } catch (IOException e) { - throw new UtilsException("Properties File failed loading..." + e.getMessage()); + throw new WebUtilsException("Properties File failed loading..." + e.getMessage()); } return properties; } diff --git a/src/test/java/io/swaglabs/portal/qa/commons/WebBaseTest.java b/src/test/java/io/swaglabs/portal/qa/commons/WebBaseTest.java index c42053b..a2a543b 100644 --- a/src/test/java/io/swaglabs/portal/qa/commons/WebBaseTest.java +++ b/src/test/java/io/swaglabs/portal/qa/commons/WebBaseTest.java @@ -24,7 +24,6 @@ public abstract class WebBaseTest { private static final ThreadLocal PLAYWRIGHT = new ThreadLocal<>(); private static BrowserManager browserManager; - @BeforeSuite(alwaysRun = true) public void setUp() { browserManager = new BrowserManager(); @@ -37,6 +36,13 @@ public void init(Method method) { page.set(browserManager.getBrowserPage(PLAYWRIGHT.get())); log.info("Browser has been set."); WebTestListeners.setPage(page.get()); + if (isChromiumBrowser()) { + initializeCdpSession(); + } + trackPerformanceMetrics(method.getName()); + } + + private void initializeCdpSession() { if (isChromiumBrowser()) { CdpUtils.initializeCdpSession(page.get()); CdpUtils.enableCdpSession(); @@ -51,8 +57,11 @@ public void init(Method method) { CdpUtils.logPageLoadCompletion(); CdpUtils.logPageNavigatedWithinDocument(); } - PerformanceUtils.evaluatePageLoadTime(page.get(), method.getName()); - PerformanceUtils.evaluateDomContentLoadTime(page.get(), method.getName()); + } + + private void trackPerformanceMetrics(String methodName) { + PerformanceUtils.evaluatePageLoadTime(page.get(), methodName); + PerformanceUtils.evaluateDomContentLoadTime(page.get(), methodName); } @AfterMethod(alwaysRun = true) diff --git a/src/test/java/io/swaglabs/portal/qa/listeners/WebTestListeners.java b/src/test/java/io/swaglabs/portal/qa/listeners/WebTestListeners.java index 27beac6..a78bba8 100644 --- a/src/test/java/io/swaglabs/portal/qa/listeners/WebTestListeners.java +++ b/src/test/java/io/swaglabs/portal/qa/listeners/WebTestListeners.java @@ -2,8 +2,6 @@ import com.microsoft.playwright.Page; import io.swaglabs.portal.qa.constants.WebPortalConstants; -import io.swaglabs.portal.qa.screenshotsmanager.FullPageScreenshotStrategy; -import io.swaglabs.portal.qa.screenshotsmanager.ScreenshotContext; import lombok.extern.slf4j.Slf4j; import org.testng.*; @@ -73,8 +71,7 @@ private void takeScreenshot(ITestResult testResult) { String filePath = Paths.get(dirPath, fileName).toString(); try { Files.createDirectories(Paths.get(dirPath)); - ScreenshotContext screenshotContext = new ScreenshotContext(new FullPageScreenshotStrategy()); - screenshotContext.captureScreenshot(currentPage, filePath); + WebPortalConstants.FULL_PAGE_SCREENSHOT.captureScreenshot(currentPage, filePath); } catch (IOException e) { log.error("Screenshot failed for {}: {}", testName, e.getMessage()); } From 1986addcd01e448d8665ad7020e6f2620046039e Mon Sep 17 00:00:00 2001 From: Charankumar H <29479534+iamcharankumar@users.noreply.github.com> Date: Mon, 11 Aug 2025 23:41:16 +0530 Subject: [PATCH 2/4] Refactored Screenshot Strategy. --- .../qa/browsermanager/ChromeBrowser.java | 5 +++- .../qa/browsermanager/MsEdgeBrowser.java | 5 +++- .../qa/constants/WebPortalConstants.java | 7 ++---- .../portal/qa/pages/SwagLabsProductPage.java | 4 ++-- .../ElementScreenshotStrategy.java | 7 +++--- .../FullPageScreenshotStrategy.java | 8 +++++-- .../screenshotsmanager/ScreenshotContext.java | 14 ++++------- .../ScreenshotStrategy.java | 4 +--- .../ScreenshotsUtils.java | 24 +++++++++---------- .../portal/qa/listeners/WebTestListeners.java | 2 +- 10 files changed, 40 insertions(+), 40 deletions(-) rename src/main/java/io/swaglabs/portal/qa/{screenshotsmanager => utils}/ScreenshotsUtils.java (55%) diff --git a/src/main/java/io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java b/src/main/java/io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java index 4757cf4..89b3ccf 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java @@ -6,11 +6,14 @@ import com.microsoft.playwright.Playwright; import io.swaglabs.portal.qa.constants.WebPortalConstants; +import java.util.List; + public class ChromeBrowser implements IBrowser { @Override public BrowserContext createSession(Playwright playwright, boolean isHeadless) { - BrowserType.LaunchOptions chromeLaunchOptions = WebPortalConstants.BROWSER_LAUNCH_OPTIONS.setHeadless(isHeadless); + BrowserType.LaunchOptions chromeLaunchOptions = WebPortalConstants.BROWSER_LAUNCH_OPTIONS.setHeadless(isHeadless) + .setArgs(List.of("--window-position=0,0")); return playwright.chromium().launch(chromeLaunchOptions).newContext(new Browser.NewContextOptions() .setViewportSize(WebPortalConstants.SCREEN_WIDTH, WebPortalConstants.SCREEN_HEIGHT) .setTimezoneId(WebPortalConstants.TIME_ZONE)); diff --git a/src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java b/src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java index fd31d3c..bf7c704 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java @@ -6,12 +6,15 @@ import com.microsoft.playwright.Playwright; import io.swaglabs.portal.qa.constants.WebPortalConstants; +import java.util.List; + public class MsEdgeBrowser implements IBrowser { @Override public BrowserContext createSession(Playwright playwright, boolean isHeadless) { BrowserType.LaunchOptions msedgeLaunchOptions = WebPortalConstants.BROWSER_LAUNCH_OPTIONS .setHeadless(isHeadless) - .setChannel(BrowserName.MS_EDGE.getBrowserType()); + .setChannel(BrowserName.MS_EDGE.getBrowserType()) + .setArgs(List.of("--window-position=0,0")); return playwright.chromium().launch(msedgeLaunchOptions).newContext(new Browser.NewContextOptions() .setViewportSize(WebPortalConstants.SCREEN_WIDTH, WebPortalConstants.SCREEN_HEIGHT) .setTimezoneId(WebPortalConstants.TIME_ZONE)); diff --git a/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java b/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java index 52e107c..50fa824 100644 --- a/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java +++ b/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java @@ -1,8 +1,7 @@ package io.swaglabs.portal.qa.constants; import com.microsoft.playwright.BrowserType; -import io.swaglabs.portal.qa.screenshotsmanager.ScreenshotContext; -import io.swaglabs.portal.qa.screenshotsmanager.ScreenshotsUtils; +import io.swaglabs.portal.qa.utils.ScreenshotsUtils; import io.swaglabs.portal.qa.utils.WebConfigLoader; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -31,10 +30,8 @@ public final class WebPortalConstants { public static final String IMAGE_FORMAT = ".png"; // Browser Type Launch Options Config - public static final BrowserType.LaunchOptions BROWSER_LAUNCH_OPTIONS = new BrowserType.LaunchOptions() - .setArgs(List.of("--window-position=0,0")); + public static final BrowserType.LaunchOptions BROWSER_LAUNCH_OPTIONS = new BrowserType.LaunchOptions(); // SCREENSHOT STRATEGIES public static final ScreenshotsUtils SCREENSHOTS_UTILS = ScreenshotsUtils.getInstance(); - public static final ScreenshotContext FULL_PAGE_SCREENSHOT = SCREENSHOTS_UTILS.getFullPageScreenshotContext(); } \ No newline at end of file diff --git a/src/main/java/io/swaglabs/portal/qa/pages/SwagLabsProductPage.java b/src/main/java/io/swaglabs/portal/qa/pages/SwagLabsProductPage.java index 2dcf27c..3b13ef6 100644 --- a/src/main/java/io/swaglabs/portal/qa/pages/SwagLabsProductPage.java +++ b/src/main/java/io/swaglabs/portal/qa/pages/SwagLabsProductPage.java @@ -18,7 +18,7 @@ public String getProductNameText() { public String getProductPriceText() { Locator productPrice = locators.getPageLocator(".inventory_details_price"); String productPriceText = getTextContent(productPrice); - WebPortalConstants.SCREENSHOTS_UTILS.takeElementScreenshot(basePage, productPrice, productPriceText); + WebPortalConstants.SCREENSHOTS_UTILS.takeElementScreenshot(productPrice, productPriceText); return productPriceText; } @@ -33,7 +33,7 @@ public boolean isProductAddedToCart() { public boolean isShoppingCartClicked() { Locator shoppingCart = locators.getPageLocator(".shopping_cart_link"); - WebPortalConstants.SCREENSHOTS_UTILS.takeElementScreenshot(basePage, shoppingCart, "shoppingCart"); + WebPortalConstants.SCREENSHOTS_UTILS.takeElementScreenshot(shoppingCart, "shoppingCart"); clickElement(shoppingCart); return true; } diff --git a/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ElementScreenshotStrategy.java b/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ElementScreenshotStrategy.java index 412f2cf..46a0858 100644 --- a/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ElementScreenshotStrategy.java +++ b/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ElementScreenshotStrategy.java @@ -1,18 +1,17 @@ package io.swaglabs.portal.qa.screenshotsmanager; import com.microsoft.playwright.Locator; -import com.microsoft.playwright.Page; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import java.nio.file.Paths; -@AllArgsConstructor +@RequiredArgsConstructor public class ElementScreenshotStrategy implements ScreenshotStrategy { private final Locator locator; @Override - public void capture(Page page, String filePath) { + public void capture(String filePath) { locator.screenshot(new Locator.ScreenshotOptions().setPath(Paths.get(filePath))); } } \ No newline at end of file diff --git a/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/FullPageScreenshotStrategy.java b/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/FullPageScreenshotStrategy.java index 5a3dcc4..7a93710 100644 --- a/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/FullPageScreenshotStrategy.java +++ b/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/FullPageScreenshotStrategy.java @@ -1,13 +1,17 @@ package io.swaglabs.portal.qa.screenshotsmanager; import com.microsoft.playwright.Page; +import lombok.RequiredArgsConstructor; import java.nio.file.Paths; +@RequiredArgsConstructor public class FullPageScreenshotStrategy implements ScreenshotStrategy { + private final Page PAGE; + @Override - public void capture(Page page, String filePath) { - page.screenshot(new Page.ScreenshotOptions().setPath(Paths.get(filePath)).setFullPage(true)); + public void capture(String filePath) { + PAGE.screenshot(new Page.ScreenshotOptions().setPath(Paths.get(filePath)).setFullPage(true)); } } \ No newline at end of file diff --git a/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotContext.java b/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotContext.java index 357bde0..11db371 100644 --- a/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotContext.java +++ b/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotContext.java @@ -1,17 +1,13 @@ package io.swaglabs.portal.qa.screenshotsmanager; -import com.microsoft.playwright.Page; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; -import java.util.Objects; - -@AllArgsConstructor +@RequiredArgsConstructor public class ScreenshotContext { - private ScreenshotStrategy screenshotStrategy; + private final ScreenshotStrategy screenshotStrategy; - public void captureScreenshot(Page page, String filePath) { - Objects.requireNonNull(screenshotStrategy, "Screenshot strategy is not set."); - screenshotStrategy.capture(page, filePath); + public void captureScreenshot(String filePath) { + screenshotStrategy.capture(filePath); } } \ No newline at end of file diff --git a/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotStrategy.java b/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotStrategy.java index 7de88d3..b18ee08 100644 --- a/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotStrategy.java +++ b/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotStrategy.java @@ -1,8 +1,6 @@ package io.swaglabs.portal.qa.screenshotsmanager; -import com.microsoft.playwright.Page; - public interface ScreenshotStrategy { - void capture(Page page, String filePath); + void capture(String filePath); } \ No newline at end of file diff --git a/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotsUtils.java b/src/main/java/io/swaglabs/portal/qa/utils/ScreenshotsUtils.java similarity index 55% rename from src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotsUtils.java rename to src/main/java/io/swaglabs/portal/qa/utils/ScreenshotsUtils.java index 9f00fcb..9d69516 100644 --- a/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ScreenshotsUtils.java +++ b/src/main/java/io/swaglabs/portal/qa/utils/ScreenshotsUtils.java @@ -1,8 +1,11 @@ -package io.swaglabs.portal.qa.screenshotsmanager; +package io.swaglabs.portal.qa.utils; import com.microsoft.playwright.Locator; import com.microsoft.playwright.Page; import io.swaglabs.portal.qa.constants.WebPortalConstants; +import io.swaglabs.portal.qa.screenshotsmanager.ElementScreenshotStrategy; +import io.swaglabs.portal.qa.screenshotsmanager.FullPageScreenshotStrategy; +import io.swaglabs.portal.qa.screenshotsmanager.ScreenshotContext; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -11,9 +14,9 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ScreenshotsUtils { + private static ScreenshotsUtils instance; private static final String ELEMENT_SCREENSHOT_FILE_LOCATION = WebPortalConstants.SCREENSHOT_FILE_LOCATION + "/elements/" + WebPortalConstants.BROWSER + "_" + WebPortalConstants.RUN_MODE + "_Element_"; - private static ScreenshotsUtils instance; public static ScreenshotsUtils getInstance() { if (instance == null) { @@ -26,17 +29,14 @@ public static ScreenshotsUtils getInstance() { return instance; } - public ScreenshotContext getFullPageScreenshotContext() { - return new ScreenshotContext(new FullPageScreenshotStrategy()); - } - - public ScreenshotContext getElementScreenshotContext(Locator locator) { - Objects.requireNonNull(locator, "Locator cannot be null for taking element screenshot"); - return new ScreenshotContext(new ElementScreenshotStrategy(locator)); + public ScreenshotContext getFullPageScreenshotContext(Page page) { + return new ScreenshotContext(new FullPageScreenshotStrategy(page)); } - public void takeElementScreenshot(Page page, Locator locator, String fileName) { - getElementScreenshotContext(locator).captureScreenshot(page, - ELEMENT_SCREENSHOT_FILE_LOCATION + fileName + WebPortalConstants.IMAGE_FORMAT); + public void takeElementScreenshot(Locator locator, String fileName) { + Objects.requireNonNull(locator, "Locator cannot be null."); + Objects.requireNonNull(fileName, "File name cannot be null."); + String filePath = ELEMENT_SCREENSHOT_FILE_LOCATION + fileName + WebPortalConstants.IMAGE_FORMAT; + new ScreenshotContext(new ElementScreenshotStrategy(locator)).captureScreenshot(filePath); } } \ No newline at end of file diff --git a/src/test/java/io/swaglabs/portal/qa/listeners/WebTestListeners.java b/src/test/java/io/swaglabs/portal/qa/listeners/WebTestListeners.java index a78bba8..e8e60a6 100644 --- a/src/test/java/io/swaglabs/portal/qa/listeners/WebTestListeners.java +++ b/src/test/java/io/swaglabs/portal/qa/listeners/WebTestListeners.java @@ -71,7 +71,7 @@ private void takeScreenshot(ITestResult testResult) { String filePath = Paths.get(dirPath, fileName).toString(); try { Files.createDirectories(Paths.get(dirPath)); - WebPortalConstants.FULL_PAGE_SCREENSHOT.captureScreenshot(currentPage, filePath); + WebPortalConstants.SCREENSHOTS_UTILS.getFullPageScreenshotContext(currentPage).captureScreenshot(filePath); } catch (IOException e) { log.error("Screenshot failed for {}: {}", testName, e.getMessage()); } From 54c6ebbe58b8a2315faaf5cbbc65426994cb8e14 Mon Sep 17 00:00:00 2001 From: Charankumar H <29479534+iamcharankumar@users.noreply.github.com> Date: Mon, 11 Aug 2025 23:49:31 +0530 Subject: [PATCH 3/4] Created window position constant. --- .../io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java | 2 +- .../io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java | 2 +- .../io/swaglabs/portal/qa/constants/WebPortalConstants.java | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java b/src/main/java/io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java index 89b3ccf..0c59976 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java @@ -13,7 +13,7 @@ public class ChromeBrowser implements IBrowser { @Override public BrowserContext createSession(Playwright playwright, boolean isHeadless) { BrowserType.LaunchOptions chromeLaunchOptions = WebPortalConstants.BROWSER_LAUNCH_OPTIONS.setHeadless(isHeadless) - .setArgs(List.of("--window-position=0,0")); + .setArgs(List.of(WebPortalConstants.WINDOW_POSITION)); return playwright.chromium().launch(chromeLaunchOptions).newContext(new Browser.NewContextOptions() .setViewportSize(WebPortalConstants.SCREEN_WIDTH, WebPortalConstants.SCREEN_HEIGHT) .setTimezoneId(WebPortalConstants.TIME_ZONE)); diff --git a/src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java b/src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java index bf7c704..26138b1 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java @@ -14,7 +14,7 @@ public BrowserContext createSession(Playwright playwright, boolean isHeadless) { BrowserType.LaunchOptions msedgeLaunchOptions = WebPortalConstants.BROWSER_LAUNCH_OPTIONS .setHeadless(isHeadless) .setChannel(BrowserName.MS_EDGE.getBrowserType()) - .setArgs(List.of("--window-position=0,0")); + .setArgs(List.of(WebPortalConstants.WINDOW_POSITION)); return playwright.chromium().launch(msedgeLaunchOptions).newContext(new Browser.NewContextOptions() .setViewportSize(WebPortalConstants.SCREEN_WIDTH, WebPortalConstants.SCREEN_HEIGHT) .setTimezoneId(WebPortalConstants.TIME_ZONE)); diff --git a/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java b/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java index 50fa824..6a494a4 100644 --- a/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java +++ b/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java @@ -6,8 +6,6 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; -import java.util.List; - @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class WebPortalConstants { @@ -25,6 +23,7 @@ public final class WebPortalConstants { // Web Browser resolution public static final int SCREEN_WIDTH = 1920; public static final int SCREEN_HEIGHT = 1080; + public static final String WINDOW_POSITION = "--window-position=0,0"; public static final String SCREENSHOT_FILE_LOCATION = "./target/screenshots/"; public static final String IMAGE_FORMAT = ".png"; From a378dd8b84f49b8d72928ec0d2d1d56fc4a468e1 Mon Sep 17 00:00:00 2001 From: Charankumar H <29479534+iamcharankumar@users.noreply.github.com> Date: Mon, 11 Aug 2025 23:52:47 +0530 Subject: [PATCH 4/4] Renamed variable. --- .../qa/screenshotsmanager/ElementScreenshotStrategy.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ElementScreenshotStrategy.java b/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ElementScreenshotStrategy.java index 46a0858..3e1a332 100644 --- a/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ElementScreenshotStrategy.java +++ b/src/main/java/io/swaglabs/portal/qa/screenshotsmanager/ElementScreenshotStrategy.java @@ -8,10 +8,10 @@ @RequiredArgsConstructor public class ElementScreenshotStrategy implements ScreenshotStrategy { - private final Locator locator; + private final Locator LOCATOR; @Override public void capture(String filePath) { - locator.screenshot(new Locator.ScreenshotOptions().setPath(Paths.get(filePath))); + LOCATOR.screenshot(new Locator.ScreenshotOptions().setPath(Paths.get(filePath))); } } \ No newline at end of file