Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@
<version>5.11.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.27.7</version>
<scope>test</scope>
</dependency>
</dependencies>


</project>
Original file line number Diff line number Diff line change
@@ -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);

}
}
Original file line number Diff line number Diff line change
@@ -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<String> productNames = products.locator("h5").allTextContents();
System.out.println(productNames);

}














}
Original file line number Diff line number Diff line change
@@ -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);

}
}
Original file line number Diff line number Diff line change
@@ -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");
}



}
175 changes: 175 additions & 0 deletions src/test/java/com/serenitydojo/playwright/PlaywrightLocators.java
Original file line number Diff line number Diff line change
@@ -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<String> 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");
}


}