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..5fc6f5f9 100644
--- a/src/test/java/com/serenitydojo/playwright/ASimplePlaywrightTest.java
+++ b/src/test/java/com/serenitydojo/playwright/ASimplePlaywrightTest.java
@@ -1,15 +1,67 @@
package com.serenitydojo.playwright;
-import com.microsoft.playwright.Browser;
-import com.microsoft.playwright.Page;
-import com.microsoft.playwright.Playwright;
-import org.junit.jupiter.api.Assertions;
-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 {
+ private static Playwright playwright;
+ private static Browser browser;
+ private static BrowserContext browserContext;
+ Page page;
+
+ @BeforeAll
+ public static void setUpBrowser(){
+ playwright = Playwright.create();
+ 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();
+ }
+
+ @AfterAll
+ public static 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);
+
}
}
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..4293f096
--- /dev/null
+++ b/src/test/java/com/serenitydojo/playwright/AddingItemsToTheCartTest.java
@@ -0,0 +1,47 @@
+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;
+
+@UsePlaywright(HeadlessChromeOptions.class)
+public class AddingItemsToTheCartTest {
+
+ @DisplayName("Search for pliers")
+ @Test
+ void searchForPliers(Page page){
+ 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/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);
+
+ }
+}
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");
+ }
+
+
+
+}
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");
+ }
+
+
+}