Skip to content

Commit c2efcdd

Browse files
Merge pull request #54 from iamcharankumar/fb_browser_cache
Upgrading the Playwright from 1.51 to 1.55
2 parents b3dca41 + cfe676b commit c2efcdd

File tree

11 files changed

+102
-42
lines changed

11 files changed

+102
-42
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<dependency>
2121
<groupId>com.microsoft.playwright</groupId>
2222
<artifactId>playwright</artifactId>
23-
<version>1.51.0</version>
23+
<version>1.55.0</version>
2424
</dependency>
2525
<dependency>
2626
<groupId>org.testng</groupId>

src/main/java/io/swaglabs/portal/qa/browsermanager/BrowserFactory.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,22 @@
22

33
import io.swaglabs.portal.qa.constants.WebPortalConstants;
44

5+
import java.util.HashMap;
6+
import java.util.Map;
7+
58
public class BrowserFactory {
69

10+
ThreadLocal<Map<String, IBrowser>> BROWWSER_CACHE = ThreadLocal.withInitial(HashMap::new);
11+
712
public IBrowser createBrowser() {
8-
return switch (BrowserName.fromConfigValue(WebPortalConstants.BROWSER)) {
9-
case CHROME -> new ChromeBrowser();
10-
case MS_EDGE -> new MsEdgeBrowser();
11-
case FIREFOX -> new FirefoxBrowser();
12-
case WEBKIT -> new WebkitBrowser();
13-
};
13+
String browserName = WebPortalConstants.BROWSER;
14+
return BROWWSER_CACHE.get().computeIfAbsent(browserName, name ->
15+
switch (BrowserName.fromConfigValue(browserName)) {
16+
case CHROME -> new ChromeBrowser();
17+
case EDGE -> new EdgeBrowser();
18+
case FIREFOX -> new FirefoxBrowser();
19+
case WEBKIT -> new WebkitBrowser();
20+
21+
});
1422
}
1523
}
Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,58 @@
11
package io.swaglabs.portal.qa.browsermanager;
22

3+
import com.microsoft.playwright.Browser;
34
import com.microsoft.playwright.BrowserContext;
45
import com.microsoft.playwright.Page;
56
import com.microsoft.playwright.Playwright;
67
import io.swaglabs.portal.qa.constants.WebPortalConstants;
8+
import io.swaglabs.portal.qa.exceptions.WebUtilsException;
9+
import lombok.extern.slf4j.Slf4j;
710

811
import java.util.Objects;
912

13+
@Slf4j
1014
public class BrowserManager implements IBrowserManager<Page> {
1115

16+
private static final ThreadLocal<BrowserContext> BROWSER_CONTEXT = new ThreadLocal<>();
17+
private static final ThreadLocal<Browser> BROWSER = new ThreadLocal<>();
18+
1219
@Override
1320
public Page getBrowserPage(Playwright playwright) {
14-
Objects.requireNonNull(playwright, "Playwright instance is null in Browser Manager!");
15-
boolean isHeadless = "headless".equals(WebPortalConstants.RUN_MODE);
16-
BrowserContext browserContext = new BrowserFactory().createBrowser().createSession(playwright, isHeadless);
17-
Objects.requireNonNull(browserContext, "Playwright Browser Context is null!");
18-
return browserContext.newPage();
21+
try {
22+
Objects.requireNonNull(playwright, "Playwright instance is null in Browser Manager!");
23+
boolean isHeadless = "headless".equals(WebPortalConstants.RUN_MODE);
24+
BrowserContext browserContext = new BrowserFactory().createBrowser().createSession(playwright, isHeadless);
25+
BROWSER_CONTEXT.set(browserContext);
26+
if (browserContext.browser() != null)
27+
BROWSER.set(browserContext.browser());
28+
return browserContext.newPage();
29+
} catch (Exception e) {
30+
log.error("Browser initialization failed.");
31+
cleanUp();
32+
throw new WebUtilsException("Failed to create browser page: " + e);
33+
}
1934
}
2035

2136
@Override
2237
public void destroyBrowserPage(Page page) {
23-
Objects.requireNonNull(page, "Playwright Browser is null!");
24-
page.close();
38+
try {
39+
if (page != null)
40+
page.close();
41+
} finally {
42+
cleanUp();
43+
}
44+
}
45+
46+
private void cleanUp() {
47+
BrowserContext browserContext = BROWSER_CONTEXT.get();
48+
if (browserContext != null) {
49+
browserContext.close();
50+
BROWSER_CONTEXT.remove();
51+
}
52+
Browser browser = BROWSER.get();
53+
if (browser != null) {
54+
browser.close();
55+
BROWSER.remove();
56+
}
2557
}
2658
}

src/main/java/io/swaglabs/portal/qa/browsermanager/BrowserName.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
public enum BrowserName {
1313

1414
CHROME("chrome"),
15-
MS_EDGE("msedge"),
15+
EDGE("msedge"),
1616
FIREFOX("firefox"),
1717
WEBKIT("webkit");
1818

@@ -21,7 +21,7 @@ public enum BrowserName {
2121
public static BrowserName fromConfigValue(String browserName) {
2222
Objects.requireNonNull(browserName, "Browser name cannot be null");
2323
return Arrays.stream(BrowserName.values())
24-
.filter(browserType -> browserType.getBrowserType().equalsIgnoreCase(browserName))
24+
.filter(browser -> browser.getBrowserType().equalsIgnoreCase(browserName))
2525
.findFirst().orElseThrow(() -> new WebUtilsException("Unknown browser: " + browserName));
2626
}
2727
}

src/main/java/io/swaglabs/portal/qa/browsermanager/MsEdgeBrowser.java renamed to src/main/java/io/swaglabs/portal/qa/browsermanager/EdgeBrowser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88

99
import java.util.List;
1010

11-
public class MsEdgeBrowser implements IBrowser {
11+
public class EdgeBrowser implements IBrowser {
1212
@Override
1313
public BrowserContext createSession(Playwright playwright, boolean isHeadless) {
1414
BrowserType.LaunchOptions msedgeLaunchOptions = WebPortalConstants.BROWSER_LAUNCH_OPTIONS
1515
.setHeadless(isHeadless)
16-
.setChannel(BrowserName.MS_EDGE.getBrowserType())
16+
.setChannel(BrowserName.EDGE.getBrowserType())
1717
.setArgs(List.of(WebPortalConstants.WINDOW_POSITION));
1818
return playwright.chromium().launch(msedgeLaunchOptions).newContext(new Browser.NewContextOptions()
1919
.setViewportSize(WebPortalConstants.SCREEN_WIDTH, WebPortalConstants.SCREEN_HEIGHT)

src/main/java/io/swaglabs/portal/qa/commons/WebBasePage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import java.util.Objects;
99

10-
public abstract class WebBasePage {
10+
public class WebBasePage {
1111

1212
protected Page basePage;
1313
protected Locators locators;

src/main/java/io/swaglabs/portal/qa/utils/ScreenshotsUtils.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ public static ScreenshotsUtils getInstance() {
3030
return instance;
3131
}
3232

33-
public ScreenshotContext takeFullPageScreenshotContext(Page page) {
33+
public void takeFullPageScreenshotContext(Page page, String filePath) {
3434
Objects.requireNonNull(page, "Page cannot be null.");
35-
return new ScreenshotContext(new FullPageScreenshotStrategy(page));
35+
new ScreenshotContext(new FullPageScreenshotStrategy(page)).captureScreenshot(filePath);
3636
}
3737

38-
public ScreenshotContext takeViewportScreenshotContext(Page page) {
38+
public void takeViewportScreenshotContext(Page page, String filePath) {
3939
Objects.requireNonNull(page, "Page cannot be null.");
40-
return new ScreenshotContext(new ViewportScreenshotStrategy(page));
40+
new ScreenshotContext(new ViewportScreenshotStrategy(page)).captureScreenshot(filePath);
4141
}
4242

4343
public void takeElementScreenshot(Locator locator, String fileName) {

src/test/java/io/swaglabs/portal/qa/commons/WebBaseTest.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
import java.util.Objects;
1919

2020
@Slf4j
21-
public abstract class WebBaseTest {
21+
public class WebBaseTest {
2222

23-
protected static ThreadLocal<Page> page = new ThreadLocal<>();
23+
protected static final ThreadLocal<Page> PAGE = new ThreadLocal<>();
2424
private static final ThreadLocal<Playwright> PLAYWRIGHT = new ThreadLocal<>();
2525
private static BrowserManager browserManager;
2626

@@ -33,9 +33,9 @@ public void setUp() {
3333
@BeforeMethod(alwaysRun = true)
3434
public void init(Method method) {
3535
PLAYWRIGHT.set(Playwright.create());
36-
page.set(browserManager.getBrowserPage(PLAYWRIGHT.get()));
36+
PAGE.set(browserManager.getBrowserPage(PLAYWRIGHT.get()));
3737
log.info("Browser has been set.");
38-
WebTestListeners.setPage(page.get());
38+
WebTestListeners.setPage(PAGE.get());
3939
if (isChromiumBrowser()) {
4040
initializeCdpSession();
4141
}
@@ -44,7 +44,7 @@ public void init(Method method) {
4444

4545
private void initializeCdpSession() {
4646
if (isChromiumBrowser()) {
47-
CdpUtils.initializeCdpSession(page.get());
47+
CdpUtils.initializeCdpSession(PAGE.get());
4848
CdpUtils.enableCdpSession();
4949
CdpUtils.sendCommand(CdpCommands.NETWORK_ENABLE.getDescription());
5050
CdpUtils.logErrorResponses();
@@ -60,17 +60,17 @@ private void initializeCdpSession() {
6060
}
6161

6262
private void trackPerformanceMetrics(String methodName) {
63-
PerformanceUtils.evaluatePageLoadTime(page.get(), methodName);
64-
PerformanceUtils.evaluateDomContentLoadTime(page.get(), methodName);
63+
PerformanceUtils.evaluatePageLoadTime(PAGE.get(), methodName);
64+
PerformanceUtils.evaluateDomContentLoadTime(PAGE.get(), methodName);
6565
}
6666

6767
@AfterMethod(alwaysRun = true)
6868
public void destroy() {
6969
if (isChromiumBrowser()) {
7070
CdpUtils.destroyCdpSession();
7171
}
72-
browserManager.destroyBrowserPage(page.get());
73-
page.remove();
72+
browserManager.destroyBrowserPage(PAGE.get());
73+
PAGE.remove();
7474
Objects.requireNonNull(PLAYWRIGHT.get(), "Playwright is null!");
7575
PLAYWRIGHT.get().close();
7676
PLAYWRIGHT.remove();
@@ -79,6 +79,6 @@ public void destroy() {
7979

8080
private boolean isChromiumBrowser() {
8181
String browserName = WebPortalConstants.BROWSER;
82-
return (browserName.equalsIgnoreCase(BrowserName.CHROME.getBrowserType()) || browserName.equalsIgnoreCase(BrowserName.MS_EDGE.getBrowserType()));
82+
return (browserName.equalsIgnoreCase(BrowserName.CHROME.getBrowserType()) || browserName.equalsIgnoreCase(BrowserName.EDGE.getBrowserType()));
8383
}
8484
}

src/test/java/io/swaglabs/portal/qa/listeners/WebTestListeners.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ private void takeScreenshot(ITestResult testResult) {
7171
String filePath = Paths.get(dirPath, fileName).toString();
7272
try {
7373
Files.createDirectories(Paths.get(dirPath));
74-
WebPortalConstants.SCREENSHOTS_UTILS.takeFullPageScreenshotContext(currentPage).captureScreenshot(filePath);
74+
WebPortalConstants.SCREENSHOTS_UTILS.takeFullPageScreenshotContext(currentPage, filePath);
7575
} catch (IOException e) {
7676
log.error("Screenshot failed for {}: {}", testName, e.getMessage());
7777
}

src/test/java/io/swaglabs/portal/qa/testcases/SwagLabsLoginPageTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public final class SwagLabsLoginPageTest extends SwagLabsTestBase {
1717
@BeforeMethod(alwaysRun = true)
1818
public void setUpSwagLabsPortal(Method method) {
1919
log.info("Thread id in BeforeMethod for the test method : {} is {}.", method.getName(), Thread.currentThread().getId());
20-
SWAG_LABS_PORTAL.set(new SwagLabsPortal(page.get()));
20+
SWAG_LABS_PORTAL.set(new SwagLabsPortal(PAGE.get()));
2121
SWAG_LABS_PORTAL.get().visit();
2222
}
2323

0 commit comments

Comments
 (0)