Skip to content

Commit 1d92ee0

Browse files
committed
Create POM pattern
1 parent 31d3a3c commit 1d92ee0

18 files changed

Lines changed: 514 additions & 0 deletions

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ buildNumber.properties
99
.mvn/timing.properties
1010
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
1111
.mvn/wrapper/maven-wrapper.jar
12+
.idea
13+
*.zip

pom.xml

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>anhtester.com</groupId>
8+
<artifactId>PlaywrightJava</artifactId>
9+
<version>1.0.0</version>
10+
11+
<properties>
12+
<maven.compiler.source>17</maven.compiler.source>
13+
<maven.compiler.target>17</maven.compiler.target>
14+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
15+
</properties>
16+
17+
<dependencies>
18+
<!-- https://mvnrepository.com/artifact/com.microsoft.playwright/playwright -->
19+
<dependency>
20+
<groupId>com.microsoft.playwright</groupId>
21+
<artifactId>playwright</artifactId>
22+
<version>1.27.1</version>
23+
</dependency>
24+
25+
<!-- https://mvnrepository.com/artifact/org.testng/testng -->
26+
<dependency>
27+
<groupId>org.testng</groupId>
28+
<artifactId>testng</artifactId>
29+
<version>7.6.1</version>
30+
<scope>test</scope>
31+
</dependency>
32+
33+
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
34+
<dependency>
35+
<groupId>org.slf4j</groupId>
36+
<artifactId>slf4j-api</artifactId>
37+
<version>2.0.3</version>
38+
<scope>test</scope>
39+
</dependency>
40+
41+
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
42+
<dependency>
43+
<groupId>org.slf4j</groupId>
44+
<artifactId>slf4j-simple</artifactId>
45+
<version>2.0.3</version>
46+
<scope>test</scope>
47+
</dependency>
48+
49+
</dependencies>
50+
51+
<build>
52+
<plugins>
53+
<plugin>
54+
<groupId>org.apache.maven.plugins</groupId>
55+
<artifactId>maven-compiler-plugin</artifactId>
56+
<version>3.10.1</version>
57+
<configuration>
58+
<source>${maven.compiler.source}</source>
59+
<target>${maven.compiler.target}</target>
60+
</configuration>
61+
</plugin>
62+
63+
<plugin>
64+
<groupId>org.apache.maven.plugins</groupId>
65+
<artifactId>maven-surefire-plugin</artifactId>
66+
<version>2.22.2</version>
67+
<configuration>
68+
<suiteXmlFiles>
69+
<suiteXmlFile>suites/CategoryTest.xml</suiteXmlFile>
70+
</suiteXmlFiles>
71+
</configuration>
72+
</plugin>
73+
</plugins>
74+
</build>
75+
76+
</project>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package anhtester.com.constant;
2+
3+
public class ConstantApp {
4+
public static final String URL = "https://app.hrsale.com/";
5+
public static final String USERNAME = "frances.burns";
6+
public static final String PASSWORD = "frances.burns";
7+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package anhtester.com.keyword;
2+
3+
import java.awt.*;
4+
import java.awt.event.KeyEvent;
5+
6+
public class ActionKeyword {
7+
public static void maximizeBrowserOnWindow(){
8+
Robot rb = null;
9+
try {
10+
rb = new Robot();
11+
} catch (AWTException e) {
12+
e.printStackTrace();
13+
}
14+
rb.keyPress(KeyEvent.VK_WINDOWS);
15+
rb.keyPress(KeyEvent.VK_UP);
16+
rb.keyRelease(KeyEvent.VK_WINDOWS);
17+
rb.keyRelease(KeyEvent.VK_UP);
18+
}
19+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package anhtester.com.manager;
2+
3+
import anhtester.com.keyword.ActionKeyword;
4+
import com.microsoft.playwright.*;
5+
6+
import java.awt.*;
7+
8+
public class BrowserFactory {
9+
protected static Playwright playwright;
10+
protected static Browser browser;
11+
protected static BrowserContext browserContext;
12+
protected static Page page;
13+
14+
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
15+
int screenWidth = (int) screenSize.getWidth();
16+
int screenHeight = (int) screenSize.getHeight();
17+
18+
//https://playwright.dev/java/docs/browsers
19+
20+
public static Page createBrowser(String browserName) {
21+
playwright = Playwright.create();
22+
PageManager.setPlaywright(playwright);
23+
24+
switch (browserName.toLowerCase().trim()) {
25+
case "chromium":
26+
System.out.println("Create Chromium browser...");
27+
browser = (PageManager.getPlaywright().chromium().launch(new BrowserType.LaunchOptions().setHeadless(false)));
28+
break;
29+
case "chrome":
30+
System.out.println("Create Chrome browser...");
31+
browser = (PageManager.getPlaywright().chromium().launch(new BrowserType.LaunchOptions().setChannel("chrome").setHeadless(false)));
32+
break;
33+
case "edge":
34+
System.out.println("Create Edge browser...");
35+
browser = (PageManager.getPlaywright().chromium().launch(new BrowserType.LaunchOptions().setChannel("msedge").setHeadless(false)));
36+
break;
37+
case "firefox":
38+
System.out.println("Create Firefox browser...");
39+
browser = (PageManager.getPlaywright().firefox().launch(new BrowserType.LaunchOptions().setHeadless(false)));
40+
break;
41+
case "safari":
42+
System.out.println("Create Safari browser...");
43+
browser = (PageManager.getPlaywright().webkit().launch(new BrowserType.LaunchOptions().setHeadless(false)));
44+
break;
45+
default:
46+
System.out.println("Set default Chromium browser...");
47+
browser = (PageManager.getPlaywright().chromium().launch(new BrowserType.LaunchOptions().setHeadless(false)));
48+
break;
49+
}
50+
51+
PageManager.setBrowser(browser);
52+
browserContext = PageManager.getBrowser().newContext();
53+
PageManager.setBrowserContext(browserContext);
54+
page = PageManager.getBrowserContext().newPage();
55+
PageManager.setPage(page);
56+
ActionKeyword.maximizeBrowserOnWindow();
57+
58+
return PageManager.getPage();
59+
}
60+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package anhtester.com.manager;
2+
3+
import anhtester.com.keyword.ActionKeyword;
4+
import com.microsoft.playwright.Browser;
5+
import com.microsoft.playwright.BrowserContext;
6+
import com.microsoft.playwright.Page;
7+
import com.microsoft.playwright.Playwright;
8+
9+
public class PageManager {
10+
11+
private static ThreadLocal<Browser> browserThreadLocal = new ThreadLocal<>();
12+
private static ThreadLocal<BrowserContext> browserContextThreadLocal = new ThreadLocal<>();
13+
private static ThreadLocal<Playwright> playwrightThreadLocal = new ThreadLocal<>();
14+
private static ThreadLocal<Page> pageThreadLocal = new ThreadLocal<>();
15+
16+
public static Browser getBrowser() {
17+
return browserThreadLocal.get();
18+
}
19+
20+
public static BrowserContext getBrowserContext() {
21+
return browserContextThreadLocal.get();
22+
}
23+
24+
public static Playwright getPlaywright() {
25+
return playwrightThreadLocal.get();
26+
}
27+
28+
public static Page getPage() {
29+
return pageThreadLocal.get();
30+
}
31+
32+
public static void setPlaywright(Playwright playwright) {
33+
playwrightThreadLocal.set(playwright);
34+
}
35+
36+
public static void setBrowser(Browser browser) {
37+
browserThreadLocal.set(browser);
38+
}
39+
40+
public static void setBrowserContext(BrowserContext browserContext) {
41+
browserContextThreadLocal.set(browserContext);
42+
}
43+
44+
public static void setPage(Page page) {
45+
pageThreadLocal.set(page);
46+
}
47+
48+
public static void closePage() {
49+
if (pageThreadLocal.get() != null) {
50+
pageThreadLocal.remove();
51+
}
52+
}
53+
54+
public static void closeBrowser() {
55+
if (browserThreadLocal.get() != null) {
56+
browserThreadLocal.remove();
57+
}
58+
if (playwrightThreadLocal.get() != null) {
59+
playwrightThreadLocal.remove();
60+
}
61+
}
62+
63+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package anhtester.com.common;
2+
3+
import anhtester.com.keyword.ActionKeyword;
4+
import anhtester.com.manager.BrowserFactory;
5+
import anhtester.com.manager.PageManager;
6+
import anhtester.com.pom.pages.CommonPage;
7+
import com.microsoft.playwright.*;
8+
import org.testng.annotations.*;
9+
10+
import java.awt.*;
11+
import java.awt.event.KeyEvent;
12+
13+
public class BaseTest {
14+
15+
@BeforeMethod
16+
@Parameters({"browser"})
17+
public void createBrowser(@Optional("chromium") String browserName) {
18+
BrowserFactory.createBrowser(browserName);
19+
}
20+
21+
@AfterMethod
22+
public void closePage() {
23+
PageManager.closePage();
24+
}
25+
26+
@AfterSuite
27+
public void closeBrowser() {
28+
PageManager.closeBrowser();
29+
}
30+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package anhtester.com.learning;
2+
3+
import com.microsoft.playwright.Browser;
4+
import com.microsoft.playwright.BrowserType;
5+
import com.microsoft.playwright.Page;
6+
import com.microsoft.playwright.Playwright;
7+
8+
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
9+
10+
public class LearnTestGenerator {
11+
public static void main(String[] args) {
12+
13+
//Open record locator
14+
//mvn exec:java -e -Dexec.mainClass=com.microsoft.playwright.CLI -Dexec.args="codegen anhtester.com"
15+
16+
Playwright playwright = Playwright.create();
17+
Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false));
18+
Page page = browser.newPage();
19+
20+
page.navigate("https://anhtester.com");
21+
System.out.println(page.title());
22+
System.out.println(page.url());
23+
24+
page.locator("#bg-header >> text=Website Testing").click();
25+
assertThat(page).hasURL("https://anhtester.com/courses/website-testing");
26+
27+
page.locator("div[role=\"tabpanel\"] >> text=Selenium WebDriver with Java Basic to Advanced").click();
28+
assertThat(page).hasURL("https://anhtester.com/course/selenium-webdriver-with-java-basic-to-advanced-c4.html");
29+
30+
browser.close();
31+
playwright.close();
32+
}
33+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package anhtester.com.learning;
2+
3+
import anhtester.com.common.BaseTest;
4+
import anhtester.com.constant.ConstantApp;
5+
import anhtester.com.manager.PageManager;
6+
import com.microsoft.playwright.*;
7+
import org.testng.annotations.Test;
8+
9+
import java.io.File;
10+
import java.nio.file.Paths;
11+
12+
public class LearnTraceViewer {
13+
@Test
14+
public void testTraceViewer() {
15+
16+
BrowserContext browserContext = Playwright.create().chromium().launch(new BrowserType.LaunchOptions().setHeadless(false)).newContext();
17+
18+
// Start tracing before creating / navigating a manager.
19+
browserContext.tracing().start(new Tracing.StartOptions()
20+
.setScreenshots(true)
21+
.setSnapshots(true)
22+
.setSources(true));
23+
24+
Page page = browserContext.newPage();
25+
page.navigate(ConstantApp.URL);
26+
page.locator("//input[@id='iusername']").fill(ConstantApp.USERNAME);
27+
page.locator("//input[@id='ipassword']").fill(ConstantApp.PASSWORD);
28+
page.locator("//button[@type='submit']").click();
29+
30+
// Stop tracing and export it into a zip archive.
31+
browserContext.tracing().stop(new Tracing.StopOptions()
32+
.setPath(Paths.get(System.getProperty("user.dir") + File.separator + "trace.zip")));
33+
34+
//How to run
35+
//Open Terminal in IntelliJ
36+
//npx playwright show-trace trace.zip
37+
38+
}
39+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package anhtester.com.pom.pages;
2+
3+
import com.microsoft.playwright.Page;
4+
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
5+
6+
public class CategoryPage extends CommonPage {
7+
8+
private String buttonAddNewCategory = "//span[normalize-space()='Add New category']";
9+
private String inputCategoryName = "//input[@id='name']";
10+
private String dropdownParentCategory = "//label[normalize-space()='Parent Category']/following-sibling::div//button";
11+
private String inputParentCategory = "//div[@class='dropdown-menu show']//input[@aria-label='Search']";
12+
private String inputOrderNUmber = "//input[@id='order_level']";
13+
private String inputMetaTitle = "//input[@placeholder='Meta Title']";
14+
private String inputMetaDescription = "//textarea[@name='meta_description']";
15+
private String buttonSave = "//button[normalize-space()='Save']";
16+
private String inputSearchCategory = "//input[@id='search']";
17+
private String itemCategoryNameFirst = "//tbody/tr[1]/td[2]";
18+
19+
Page page;
20+
21+
public CategoryPage(Page _page) {
22+
super(_page);
23+
page = _page;
24+
}
25+
26+
public void addNewCategory(String categoryName) {
27+
page.click(buttonAddNewCategory);
28+
page.fill(inputCategoryName, categoryName);
29+
page.click(dropdownParentCategory);
30+
page.waitForTimeout(1000);
31+
page.fill(inputParentCategory, "Gaming pc");
32+
page.waitForTimeout(1000);
33+
page.press(inputParentCategory, "Enter");
34+
page.fill(inputOrderNUmber, "1");
35+
page.fill(inputMetaTitle, categoryName);
36+
page.fill(inputMetaDescription, categoryName);
37+
page.click(buttonSave);
38+
}
39+
40+
public void checkCategory(String categoryName){
41+
page.waitForLoadState();
42+
page.fill(inputSearchCategory, categoryName);
43+
page.press(inputSearchCategory, "Enter");
44+
page.waitForTimeout(1000);
45+
assertThat(page.locator(itemCategoryNameFirst)).isVisible();
46+
assertThat(page.locator(itemCategoryNameFirst)).hasText(categoryName);
47+
}
48+
}

0 commit comments

Comments
 (0)