JUnit (экспериментально)
Введение
С помощью нескольких строк кода вы можете подключить Playwright к вашему любимому тестовому фреймворку для Java.
В JUnit вы можете использовать fixtures Playwright для автоматической инициализации Playwright, Browser, BrowserContext или Page. В примере ниже все три тестовых метода используют один и тот же Browser. Каждый тест использует свой собственный BrowserContext и Page.
package org.example;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.junit.UsePlaywright;
import org.junit.jupiter.api.Test;
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
@UsePlaywright
public class TestExample {
@Test
void shouldClickButton(Page page) {
page.navigate("data:text/html,<script>var result;</script><button onclick='result=\"Clicked\"'>Go</button>");
page.locator("button").click();
assertEquals("Clicked", page.evaluate("result"));
}
@Test
void shouldCheckTheBox(Page page) {
page.setContent("<input id='checkbox' type='checkbox'></input>");
page.locator("input").check();
assertEquals(true, page.evaluate("window['checkbox'].checked"));
}
@Test
void shouldSearchWiki(Page page) {
page.navigate("https://www.wikipedia.org/");
page.locator("input[name=\"search\"]").click();
page.locator("input[name=\"search\"]").fill("playwright");
page.locator("input[name=\"search\"]").press("Enter");
assertThat(page).hasURL("https://en.wikipedia.org/wiki/Playwright");
}
}
Fixtures
Просто добавьте аннотацию JUnit @UsePlaywright
к вашим тестовым классам, чтобы включить fixtures Playwright. Тестовые fixtures используются для создания окружения для каждого теста, предоставляя тесту все необходимое и ничего лишнего.
@UsePlaywright
public class TestExample {
@Test
void basicTest(Page page) {
page.navigate("https://playwright.dev/");
assertThat(page).hasTitle(Pattern.compile("Playwright"));
}
}
Аргумент Page page
указывает JUnit настроить fixture page
и предоставить его вашему тестовому методу.
Вот список предопределенных fixtures:
Fixture | Type | Description |
---|---|---|
page | Page | Изолированная страница для этого теста. |
browserContext | BrowserContext | Изолированный контекст для этого теста. Fixture page также принадлежит этому контексту. |
browser | Browser | Браузеры разделяются между тестами для оптимизации ресурсов. |
playwright | Playwright | Экземпляр Playwright разделяется между тестами, выполняющимися в одном потоке. |
request | APIRequestContext | Изолированный APIRequestContext для этого теста. Узнайте, как выполнять API тестирование. |
Настройка параметров
Чтобы настроить параметры fixtures, вы должны реализовать OptionsFactory
и указать класс в аннотации @UsePlaywright()
.
Вы можете легко переопределить параметры запуска для BrowserType.launch() или параметры контекста для Browser.newContext() и APIRequest.newContext(). См. следующий пример:
import com.microsoft.playwright.junit.Options;
import com.microsoft.playwright.junit.OptionsFactory;
import com.microsoft.playwright.junit.UsePlaywright;
@UsePlaywright(MyTest.CustomOptions.class)
public class MyTest {
public static class CustomOptions implements OptionsFactory {
@Override
public Options getOptions() {
return new Options()
.setHeadless(false)
.setContextOption(new Browser.NewContextOptions()
.setBaseURL("https://github.com"))
.setApiRequestOptions(new APIRequest.NewContextOptions()
.setBaseURL("https://playwright.dev"));
}
}
@Test
public void testWithCustomOptions(Page page, APIRequestContext request) {
page.navigate("/");
assertThat(page).hasURL(Pattern.compile("github"));
APIResponse response = request.get("/");
assertTrue(response.text().contains("Playwright"));
}
}
Запуск тестов параллельно
По умолчанию JUnit будет выполнять все тесты последовательно в одном потоке. Начиная с JUnit 5.3, вы можете изменить это поведение, чтобы запускать тесты параллельно для ускорения выполнения (см. эту страницу). Поскольку небезопасно использовать одни и те же объекты Playwright из нескольких потоков без дополнительной синхронизации, мы рекомендуем создавать экземпляр Playwright на поток и использовать его исключительно в этом потоке. Вот пример, как запускать несколько тестовых классов параллельно.
@UsePlaywright
class Test1 {
@Test
void shouldClickButton(Page page) {
page.navigate("data:text/html,<script>var result;</script><button onclick='result=\"Clicked\"'>Go</button>");
page.locator("button").click();
assertEquals("Clicked", page.evaluate("result"));
}
@Test
void shouldCheckTheBox(Page page) {
page.setContent("<input id='checkbox' type='checkbox'></input>");
page.locator("input").check();
assertEquals(true, page.evaluate("window['checkbox'].checked"));
}
@Test
void shouldSearchWiki(Page page) {
page.navigate("https://www.wikipedia.org/");
page.locator("input[name=\"search\"]").click();
page.locator("input[name=\"search\"]").fill("playwright");
page.locator("input[name=\"search\"]").press("Enter");
assertThat(page).hasURL("https://en.wikipedia.org/wiki/Playwright");
}
}
@UsePlaywright
class Test2 {
@Test
void shouldReturnInnerHTML(Page page) {
page.setContent("<div>hello</div>");
assertEquals("hello", page.innerHTML("css=div"));
}
@Test
void shouldClickButton(Page page) {
Page popup = page.waitForPopup(() -> {
page.evaluate("window.open('about:blank');");
});
assertEquals("about:blank", popup.url());
}
}
Настройте JUnit для выполнения тестов в каждом классе последовательно и запуска нескольких классов в параллельных потоках (с максимальным количеством потоков, равным 1/2 от числа ядер процессора):
junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = same_thread
junit.jupiter.execution.parallel.mode.classes.default = concurrent
junit.jupiter.execution.parallel.config.strategy=dynamic
junit.jupiter.execution.parallel.config.dynamic.factor=0.5