From 4d45c19c9fa2d9533fe328720d4e1b17da07db63 Mon Sep 17 00:00:00 2001 From: erhanbatu Date: Mon, 13 Jul 2026 17:16:03 +0200 Subject: [PATCH 1/4] first initial --- pom.xml | 7 ++++ .../playwright/ASimplePlaywrightTest.java | 41 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/pom.xml b/pom.xml index 497ee081..093ab125 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,13 @@ 5.11.3 test + + org.assertj + assertj-core + 3.27.7 + test + + \ No newline at end of file diff --git a/src/test/java/com/serenitydojo/playwright/ASimplePlaywrightTest.java b/src/test/java/com/serenitydojo/playwright/ASimplePlaywrightTest.java index c50e7ea0..4f0807bd 100644 --- a/src/test/java/com/serenitydojo/playwright/ASimplePlaywrightTest.java +++ b/src/test/java/com/serenitydojo/playwright/ASimplePlaywrightTest.java @@ -3,13 +3,54 @@ import com.microsoft.playwright.Browser; import com.microsoft.playwright.Page; import com.microsoft.playwright.Playwright; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; public class ASimplePlaywrightTest { + Playwright playwright; + Browser browser; + Page page; + + @BeforeEach + void setup(){ + //Create an environment + playwright = Playwright.create(); + browser = playwright.chromium().launch(); + page = browser.newPage(); + } + + @AfterEach + void tearDown(){ + browser.close(); + playwright.close(); + } + @Test void shouldShowThePageTitle() { // TODO: Write your first playwright test here + + page.navigate("https://practicesoftwaretesting.com/"); + String title = page.title(); + Assertions.assertTrue(title.contains("Practice Software Testing")); + + } + + @Test + void shouldSearchByKeyword(){ + + page.navigate("https://practicesoftwaretesting.com/"); + page.locator("[placeholder=Search]").fill("Pliers"); + //this is basically sort of xpath + page.locator("button:has-text('Search')").click(); + + //this will look for the element with card + int matchingSearchResults = page.locator(".card").count(); + System.out.println(matchingSearchResults); + + Assertions.assertTrue(matchingSearchResults>0); + } } From 01182e0724802bf427138720f148e242d3123ec6 Mon Sep 17 00:00:00 2001 From: erhanbatu Date: Mon, 13 Jul 2026 17:59:01 +0200 Subject: [PATCH 2/4] Section3 lesson --- .../playwright/ASimplePlaywrightTest.java | 41 ++++++++----- .../playwright/AnAnnotatedPlaywrightTest.java | 57 +++++++++++++++++++ 2 files changed, 83 insertions(+), 15 deletions(-) create mode 100644 src/test/java/com/serenitydojo/playwright/AnAnnotatedPlaywrightTest.java diff --git a/src/test/java/com/serenitydojo/playwright/ASimplePlaywrightTest.java b/src/test/java/com/serenitydojo/playwright/ASimplePlaywrightTest.java index 4f0807bd..5fc6f5f9 100644 --- a/src/test/java/com/serenitydojo/playwright/ASimplePlaywrightTest.java +++ b/src/test/java/com/serenitydojo/playwright/ASimplePlaywrightTest.java @@ -1,29 +1,40 @@ package com.serenitydojo.playwright; -import com.microsoft.playwright.Browser; -import com.microsoft.playwright.Page; -import com.microsoft.playwright.Playwright; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; +import com.microsoft.playwright.*; +import com.microsoft.playwright.junit.UsePlaywright; +import org.junit.jupiter.api.*; +import java.util.Arrays; + +//This annotation allows you to do test without creating playwright environment and browser +//@UsePlaywright public class ASimplePlaywrightTest { - Playwright playwright; - Browser browser; + private static Playwright playwright; + private static Browser browser; + private static BrowserContext browserContext; Page page; - @BeforeEach - void setup(){ - //Create an environment + @BeforeAll + public static void setUpBrowser(){ playwright = Playwright.create(); - browser = playwright.chromium().launch(); + browser = playwright.chromium().launch( + new BrowserType.LaunchOptions() + .setHeadless(false) + .setArgs(Arrays.asList("--no-sandbox", "--disable-extensions","--disable-gpu")) + ); + //this allows paralel execution + browserContext = browser.newContext(); + + } + + @BeforeEach + public void setUp(){ page = browser.newPage(); } - @AfterEach - void tearDown(){ + @AfterAll + public static void tearDown(){ browser.close(); playwright.close(); } diff --git a/src/test/java/com/serenitydojo/playwright/AnAnnotatedPlaywrightTest.java b/src/test/java/com/serenitydojo/playwright/AnAnnotatedPlaywrightTest.java new file mode 100644 index 00000000..a7622d38 --- /dev/null +++ b/src/test/java/com/serenitydojo/playwright/AnAnnotatedPlaywrightTest.java @@ -0,0 +1,57 @@ +package com.serenitydojo.playwright; + +import com.microsoft.playwright.Browser; +import com.microsoft.playwright.BrowserType; +import com.microsoft.playwright.Page; +import com.microsoft.playwright.Playwright; +import com.microsoft.playwright.junit.Options; +import com.microsoft.playwright.junit.OptionsFactory; +import com.microsoft.playwright.junit.UsePlaywright; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +@UsePlaywright(AnAnnotatedPlaywrightTest.MyOptions.class) +public class AnAnnotatedPlaywrightTest { + + public static class MyOptions implements OptionsFactory{ + + @Override + public Options getOptions() { + return new Options() + .setHeadless(false) + .setLaunchOptions( + new BrowserType.LaunchOptions() + .setArgs(Arrays.asList("--no-sandbox", "--disable-extensions","--disable-gpu")) + ); + } + } + @Test + void shouldShowThePageTitle(Page page) { + // TODO: Write your first playwright test here + + page.navigate("https://practicesoftwaretesting.com/"); + String title = page.title(); + Assertions.assertTrue(title.contains("Practice Software Testing")); + + } + + @Test + void shouldSearchByKeyword(Page page){ + + page.navigate("https://practicesoftwaretesting.com/"); + page.locator("[placeholder=Search]").fill("Pliers"); + //this is basically sort of xpath + page.locator("button:has-text('Search')").click(); + + //this will look for the element with card + int matchingSearchResults = page.locator(".card").count(); + System.out.println(matchingSearchResults); + + Assertions.assertTrue(matchingSearchResults>0); + + } +} From f9de2689a2371c519a30dafcfddbae4d33cf4f46 Mon Sep 17 00:00:00 2001 From: erhanbatu Date: Mon, 13 Jul 2026 21:40:28 +0200 Subject: [PATCH 3/4] Section4 lesson part1 --- .../playwright/AddingItemsToTheCartTest.java | 79 ++++++++ .../playwright/PlaywrightLocators.java | 175 ++++++++++++++++++ 2 files changed, 254 insertions(+) create mode 100644 src/test/java/com/serenitydojo/playwright/AddingItemsToTheCartTest.java create mode 100644 src/test/java/com/serenitydojo/playwright/PlaywrightLocators.java diff --git a/src/test/java/com/serenitydojo/playwright/AddingItemsToTheCartTest.java b/src/test/java/com/serenitydojo/playwright/AddingItemsToTheCartTest.java new file mode 100644 index 00000000..a6626c63 --- /dev/null +++ b/src/test/java/com/serenitydojo/playwright/AddingItemsToTheCartTest.java @@ -0,0 +1,79 @@ +package com.serenitydojo.playwright; + +import com.microsoft.playwright.*; +import com.microsoft.playwright.junit.UsePlaywright; +import com.microsoft.playwright.options.AriaRole; +import org.junit.jupiter.api.*; + +import java.util.Arrays; +import java.util.List; + + +public class AddingItemsToTheCartTest { + + protected static Playwright playwright; + protected static Browser browser; + protected static BrowserContext browserContext; + + Page page; + + @BeforeAll + static void setUpBrowser() { + playwright = Playwright.create(); + browser = playwright.chromium().launch( + new BrowserType.LaunchOptions().setHeadless(true) + .setArgs(Arrays.asList("--no-sandbox", "--disable-extensions", "--disable-gpu")) + ); + } + + @BeforeEach + void setUp() { + browserContext = browser.newContext(); + page = browserContext.newPage(); + } + + @AfterEach + void closeContext() { + browserContext.close(); + } + + @AfterAll + static void tearDown() { + browser.close(); + playwright.close(); + } + + @DisplayName("Search for pliers") + @Test + void searchForPliers(){ + page.navigate("https://practicesoftwaretesting.com/"); +// page.locator("[placeholder='Search']").fill("pliers"); + page.getByPlaceholder("Search").fill("pliers"); + page.getByRole(AriaRole.BUTTON, + new Page.GetByRoleOptions().setName("Search")).click(); + + Locator products = page.locator(".card").filter( + new Locator.FilterOptions() + .setHas(page.getByAltText("Pliers")) + .setHasNot(page.getByText("Out of stock")) + ); + + List productNames = products.locator("h5").allTextContents(); + System.out.println(productNames); + + } + + + + + + + + + + + + + + +} diff --git a/src/test/java/com/serenitydojo/playwright/PlaywrightLocators.java b/src/test/java/com/serenitydojo/playwright/PlaywrightLocators.java new file mode 100644 index 00000000..c09d4eb5 --- /dev/null +++ b/src/test/java/com/serenitydojo/playwright/PlaywrightLocators.java @@ -0,0 +1,175 @@ +package com.serenitydojo.playwright; + +import com.microsoft.playwright.*; +import com.microsoft.playwright.assertions.PlaywrightAssertions; +import org.junit.jupiter.api.*; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; +import org.junit.jupiter.api.Nested; + +import java.util.Arrays; +import java.util.List; + +import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat; + +@Execution(ExecutionMode.SAME_THREAD) +public class PlaywrightLocators { + + + protected static Playwright playwright; + protected static Browser browser; + protected static BrowserContext browserContext; + + Page page; + + @BeforeAll + static void setUpBrowser() { + playwright = Playwright.create(); + browser = playwright.chromium().launch( + new BrowserType.LaunchOptions().setHeadless(true) + .setArgs(Arrays.asList("--no-sandbox", "--disable-extensions", "--disable-gpu")) + ); + } + + @BeforeEach + void setUp() { + browserContext = browser.newContext(); + page = browserContext.newPage(); + } + + @AfterEach + void closeContext() { + browserContext.close(); + } + + @AfterAll + static void tearDown() { + browser.close(); + playwright.close(); + } + + @DisplayName("Locating elements using CSS") + @Nested + class LocatingElementsUsingCSS { + + @BeforeEach + void openContactPage() { + page.navigate("https://practicesoftwaretesting.com/contact"); + } + + @DisplayName("By id") + @Test + void locateTheFirstNameFieldByID() { + page.locator("#first_name").fill("Sarah-Jane"); + assertThat(page.locator("#first_name")).hasValue("Sarah-Jane"); + } + + @DisplayName("By CSS class") + @Test + void locateTheSendButtonByCssClass() { + page.locator("#first_name").fill("Sarah-Jane"); + page.locator(".btnSubmit").click(); + List alertMessages = page.locator(".alert").allTextContents(); + Assertions.assertTrue(!alertMessages.isEmpty()); + } + + @DisplayName("By attribute") + @Test + void locateTheSendButtonByAttribute() { + page.locator("[placeholder='Your last name *']").fill("Smith"); + PlaywrightAssertions.assertThat(page.locator("#last_name")).hasValue("Smith"); + } + + + + + + + + + + + + } + + + + + + + + + + + + + + + + + + + @DisplayName("Locating elements by text") + @Nested + class LocatingElementsByText { + + @BeforeEach + void openTheCatalogPage() { + openPage(); + } + + @DisplayName("Locating an element by text contents") + @Test + void byText() { + page.getByText("Bolt Cutters").click(); + + assertThat(page.getByText("MightyCraft Hardware")).isVisible(); + } + + @DisplayName("Using alt text") + @Test + void byAltText() { + page.getByAltText("Combination Pliers").click(); + + assertThat(page.getByText("ForgeFlex Tools")).isVisible(); + } + + @DisplayName("Using title") + @Test + void byTitle() { + page.getByAltText("Combination Pliers").click(); + + page.getByTitle("Practice Software Testing - Toolshop").click(); + } + } + + @DisplayName("Locating elements by test Id") + @Nested + class LocatingElementsByTestID { + + @BeforeAll + static void setTestId() { + playwright.selectors().setTestIdAttribute("data-test"); + } + + @DisplayName("Using a custom data-test field") + @Test + void byTestId() { + openPage(); + + playwright.selectors().setTestIdAttribute("data-test"); + + page.getByTestId("search-query").fill("Pliers"); + page.getByTestId("search-submit").click(); + } + + } + + + + private void openPage() { + page.navigate("https://practicesoftwaretesting.com"); + } + + +} From a49d1d378998949173b05522d54fc988ac3d569e Mon Sep 17 00:00:00 2001 From: erhanbatu Date: Mon, 13 Jul 2026 21:48:15 +0200 Subject: [PATCH 4/4] Section4 lesson part2 --- .../playwright/AddingItemsToTheCartTest.java | 36 ++----------------- .../playwright/HeadlessChromeOptions.java | 23 ++++++++++++ 2 files changed, 25 insertions(+), 34 deletions(-) create mode 100644 src/test/java/com/serenitydojo/playwright/HeadlessChromeOptions.java diff --git a/src/test/java/com/serenitydojo/playwright/AddingItemsToTheCartTest.java b/src/test/java/com/serenitydojo/playwright/AddingItemsToTheCartTest.java index a6626c63..4293f096 100644 --- a/src/test/java/com/serenitydojo/playwright/AddingItemsToTheCartTest.java +++ b/src/test/java/com/serenitydojo/playwright/AddingItemsToTheCartTest.java @@ -8,44 +8,12 @@ import java.util.Arrays; import java.util.List; - +@UsePlaywright(HeadlessChromeOptions.class) public class AddingItemsToTheCartTest { - protected static Playwright playwright; - protected static Browser browser; - protected static BrowserContext browserContext; - - Page page; - - @BeforeAll - static void setUpBrowser() { - playwright = Playwright.create(); - browser = playwright.chromium().launch( - new BrowserType.LaunchOptions().setHeadless(true) - .setArgs(Arrays.asList("--no-sandbox", "--disable-extensions", "--disable-gpu")) - ); - } - - @BeforeEach - void setUp() { - browserContext = browser.newContext(); - page = browserContext.newPage(); - } - - @AfterEach - void closeContext() { - browserContext.close(); - } - - @AfterAll - static void tearDown() { - browser.close(); - playwright.close(); - } - @DisplayName("Search for pliers") @Test - void searchForPliers(){ + void searchForPliers(Page page){ page.navigate("https://practicesoftwaretesting.com/"); // page.locator("[placeholder='Search']").fill("pliers"); page.getByPlaceholder("Search").fill("pliers"); diff --git a/src/test/java/com/serenitydojo/playwright/HeadlessChromeOptions.java b/src/test/java/com/serenitydojo/playwright/HeadlessChromeOptions.java new file mode 100644 index 00000000..7cc71a18 --- /dev/null +++ b/src/test/java/com/serenitydojo/playwright/HeadlessChromeOptions.java @@ -0,0 +1,23 @@ +package com.serenitydojo.playwright; + +import com.microsoft.playwright.BrowserType; +import com.microsoft.playwright.junit.Options; +import com.microsoft.playwright.junit.OptionsFactory; + +import java.util.Arrays; + +public class HeadlessChromeOptions implements OptionsFactory { + + + @Override + public Options getOptions() { + return new Options().setLaunchOptions( + new BrowserType.LaunchOptions().setHeadless(true) + .setArgs(Arrays.asList("--no-sandbox", "--disable-extensions", "--disable-gpu")) + ) + .setTestIdAttribute("data-test"); + } + + + +}