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"); + } + + +}