From a9940f9657f935ed07bc5081b6048514e304e34f Mon Sep 17 00:00:00 2001 From: Charankumar H Date: Sun, 20 Jul 2025 11:33:32 +0530 Subject: [PATCH 1/4] Added IST timezone for CI/CD and browsers. --- .github/workflows/ci.yml | 3 +++ README.md | 9 ++++++--- .../swaglabs/portal/qa/browsermanager/ChromeBrowser.java | 3 ++- .../portal/qa/browsermanager/FirefoxBrowser.java | 3 ++- .../swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java | 3 ++- .../swaglabs/portal/qa/browsermanager/WebkitBrowser.java | 3 ++- .../swaglabs/portal/qa/constants/WebPortalConstants.java | 1 + 7 files changed, 18 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1de7d41..9bfdb4a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -118,6 +118,7 @@ jobs: - name: Send Results to Discord env: + TZ: 'Asia/Kolkata' DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} run: | # Gather metrics from test-summary output @@ -187,6 +188,7 @@ jobs: - name: Send Results to Discord env: + TZ: 'Asia/Kolkata' DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} run: | # Gather metrics from test-summary output @@ -258,6 +260,7 @@ jobs: - name: Send Results to Discord env: + TZ: 'Asia/Kolkata' DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} run: | # Gather metrics from test-summary output diff --git a/README.md b/README.md index 1d97f2c..10d087d 100644 --- a/README.md +++ b/README.md @@ -15,10 +15,12 @@ Automated end-to-end testing framework built with Playwright and Java, tailored for scalability and maintainability, this framework covers critical test scenarios with robust assertions and clean, modular code. Perfect for those looking to speed up their test automation journey or enhance their Playwright skills! -Thanks to [The Pocket](https://github.com/The-Pocket/PocketFlow-Tutorial-Codebase-Knowledge) for beautifully generating an entire easy-to-understand tutorial for this GitHub Repo. +Thanks to [The Pocket](https://github.com/The-Pocket/PocketFlow-Tutorial-Codebase-Knowledge) for beautifully generating +an entire easy-to-understand tutorial for this GitHub Repo. Massive respect for creating such a wonderful tool. Simply Brilliant! ❤️ -You can read the entire tutorial [here](https://code2tutorial.com/tutorial/81c3753d-35c2-41fd-941c-34a1c851e80c/index.md). +You can read the entire +tutorial [here](https://code2tutorial.com/tutorial/81c3753d-35c2-41fd-941c-34a1c851e80c/index.md). # TEST ARCHITECTURE @@ -53,7 +55,6 @@ You can read the entire tutorial [here](https://code2tutorial.com/tutorial/81c37 Browser_Creation_Flow - # CHROME DEVTOOLS PROTOCOL IMPLEMENTATION EXPLAINED **1. Initialize the CDP Session** @@ -125,6 +126,8 @@ You can read the entire tutorial [here](https://code2tutorial.com/tutorial/81c37 | 4 | Firefox | Headless | `mvn clean test -Drunmode=headless -Dbrowser=firefox -Dgroups=SWAG_LABS_SMOKE,SWAG_LABS_REGRESSION,SWAG_LABS_E2E -Dthreads=3 -Ddataproviderthreadcount=3` | | 5 | Edge | Local | `mvn clean test -Dbrowser=msedge -Dgroups=SWAG_LABS_SMOKE,SWAG_LABS_REGRESSION,SWAG_LABS_E2E -Dthreads=3 -Ddataproviderthreadcount=3` | | 6 | Edge | Headless | `mvn clean test -Drunmode=headless -Dbrowser=msedge -Dgroups=SWAG_LABS_SMOKE,SWAG_LABS_REGRESSION,SWAG_LABS_E2E -Dthreads=3 -Ddataproviderthreadcount=3` | +| 7 | WebKit | Local | `mvn clean test -Dbrowser=msedge -Dgroups=SWAG_LABS_SMOKE,SWAG_LABS_REGRESSION,SWAG_LABS_E2E -Dthreads=3 -Ddataproviderthreadcount=3` | +| 8 | WebKit | Headless | `mvn clean test -Drunmode=headless -Dbrowser=msedge -Dgroups=SWAG_LABS_SMOKE,SWAG_LABS_REGRESSION,SWAG_LABS_E2E -Dthreads=3 -Ddataproviderthreadcount=3` | **NOTE**: These above commands (no testng.xml required) will run the tests in parallel with the specified thread count and with the respective groups and thread counts. 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 811918a..40c7db8 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/ChromeBrowser.java @@ -13,6 +13,7 @@ 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)); + .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 ff55345..df55612 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/FirefoxBrowser.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/FirefoxBrowser.java @@ -12,6 +12,7 @@ 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)); + .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 ee659c7..0834bc4 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java @@ -12,6 +12,7 @@ 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)); + .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 104931f..cee8e76 100644 --- a/src/main/java/io/swaglabs/portal/qa/browsermanager/WebkitBrowser.java +++ b/src/main/java/io/swaglabs/portal/qa/browsermanager/WebkitBrowser.java @@ -12,6 +12,7 @@ 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)); + .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/constants/WebPortalConstants.java b/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java index 0c7f0bd..1993a2a 100644 --- a/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java +++ b/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java @@ -16,6 +16,7 @@ public final class WebPortalConstants { // DYNAMIC BROWSER & ENVIRONMENT CHOICE public static final String RUN_MODE = System.getProperty("runmode"); public static final String BROWSER = System.getProperty("browser"); + public static final String TIME_ZONE = "Asia/Kolkata"; public static final int SCREEN_WIDTH = 1920; public static final int SCREEN_HEIGHT = 1080; From 25a2fa0eef7238c7c729edeabea22c7215890e2d Mon Sep 17 00:00:00 2001 From: Charankumar H Date: Sun, 20 Jul 2025 11:39:39 +0530 Subject: [PATCH 2/4] Added IST timezone for CI/CD globally. --- .github/workflows/ci.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9bfdb4a..1e62b99 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,6 @@ name: Playwright Test Framework +env: + TZ: Asia/Kolkata on: workflow_dispatch: @@ -118,7 +120,6 @@ jobs: - name: Send Results to Discord env: - TZ: 'Asia/Kolkata' DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} run: | # Gather metrics from test-summary output @@ -188,7 +189,6 @@ jobs: - name: Send Results to Discord env: - TZ: 'Asia/Kolkata' DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} run: | # Gather metrics from test-summary output @@ -260,7 +260,6 @@ jobs: - name: Send Results to Discord env: - TZ: 'Asia/Kolkata' DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} run: | # Gather metrics from test-summary output From 67df1b7cf4bd28c37b7ca511ec8fd581b9aac0d0 Mon Sep 17 00:00:00 2001 From: Charankumar H Date: Sun, 20 Jul 2025 11:54:13 +0530 Subject: [PATCH 3/4] Moved screenshots to target folder for saving artifacts. --- README.md | 4 ++-- .../io/swaglabs/portal/qa/constants/WebPortalConstants.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 10d087d..d1624e3 100644 --- a/README.md +++ b/README.md @@ -126,8 +126,8 @@ tutorial [here](https://code2tutorial.com/tutorial/81c3753d-35c2-41fd-941c-34a1c | 4 | Firefox | Headless | `mvn clean test -Drunmode=headless -Dbrowser=firefox -Dgroups=SWAG_LABS_SMOKE,SWAG_LABS_REGRESSION,SWAG_LABS_E2E -Dthreads=3 -Ddataproviderthreadcount=3` | | 5 | Edge | Local | `mvn clean test -Dbrowser=msedge -Dgroups=SWAG_LABS_SMOKE,SWAG_LABS_REGRESSION,SWAG_LABS_E2E -Dthreads=3 -Ddataproviderthreadcount=3` | | 6 | Edge | Headless | `mvn clean test -Drunmode=headless -Dbrowser=msedge -Dgroups=SWAG_LABS_SMOKE,SWAG_LABS_REGRESSION,SWAG_LABS_E2E -Dthreads=3 -Ddataproviderthreadcount=3` | -| 7 | WebKit | Local | `mvn clean test -Dbrowser=msedge -Dgroups=SWAG_LABS_SMOKE,SWAG_LABS_REGRESSION,SWAG_LABS_E2E -Dthreads=3 -Ddataproviderthreadcount=3` | -| 8 | WebKit | Headless | `mvn clean test -Drunmode=headless -Dbrowser=msedge -Dgroups=SWAG_LABS_SMOKE,SWAG_LABS_REGRESSION,SWAG_LABS_E2E -Dthreads=3 -Ddataproviderthreadcount=3` | +| 7 | WebKit | Local | `mvn clean test -Dbrowser=webkit -Dgroups=SWAG_LABS_SMOKE,SWAG_LABS_REGRESSION,SWAG_LABS_E2E -Dthreads=3 -Ddataproviderthreadcount=3` | +| 8 | WebKit | Headless | `mvn clean test -Drunmode=headless -Dbrowser=webkit -Dgroups=SWAG_LABS_SMOKE,SWAG_LABS_REGRESSION,SWAG_LABS_E2E -Dthreads=3 -Ddataproviderthreadcount=3` | **NOTE**: These above commands (no testng.xml required) will run the tests in parallel with the specified thread count and with the respective groups and thread counts. 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 1993a2a..b701024 100644 --- a/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java +++ b/src/main/java/io/swaglabs/portal/qa/constants/WebPortalConstants.java @@ -21,6 +21,6 @@ public final class WebPortalConstants { public static final int SCREEN_WIDTH = 1920; public static final int SCREEN_HEIGHT = 1080; - public static final String SCREENSHOT_FILE_LOCATION = "./src/test/resources/screenshots/"; + public static final String SCREENSHOT_FILE_LOCATION = "./target/screenshots/"; public static final String IMAGE_FORMAT = ".png"; } \ No newline at end of file From 4feb7906b32a622678509e8e8b80fb0be7a0e944 Mon Sep 17 00:00:00 2001 From: Charankumar H Date: Sun, 20 Jul 2025 12:05:49 +0530 Subject: [PATCH 4/4] Handled Colon character for screenshot file upload to Github Artifacts. --- .../java/io/swaglabs/portal/qa/listeners/WebTestListeners.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 107931c..27beac6 100644 --- a/src/test/java/io/swaglabs/portal/qa/listeners/WebTestListeners.java +++ b/src/test/java/io/swaglabs/portal/qa/listeners/WebTestListeners.java @@ -68,7 +68,7 @@ private void takeScreenshot(ITestResult testResult) { String directory = testResult.isSuccess() ? "passed_screenshots" : "failed_screenshots"; String timestamp = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(new Date()); String parameter = extractSafeParameter(testResult); - String fileName = formatScreenshotFileName(statusPrefix, testName, parameter, timestamp); + String fileName = formatScreenshotFileName(statusPrefix, testName, parameter, timestamp).replaceAll(":", "_"); String dirPath = Paths.get(WebPortalConstants.SCREENSHOT_FILE_LOCATION + "/pages/", directory).toString(); String filePath = Paths.get(dirPath, fileName).toString(); try {