Skip to main content

JUnit (實驗性)

簡介

只需幾行程式碼,你就可以將 Playwright 連接到你最喜愛的 Java 測試執行器。

JUnit 中,你可以使用 Playwright fixtures 自動初始化 PlaywrightBrowserBrowserContextPage。在下面的範例中,所有三個測試方法使用相同的 Browser。每個測試使用自己的 BrowserContextPage

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 添加到您的測試類別,即可啟用 Playwright fixtures。測試 fixtures 用於為每個測試建立環境,提供測試所需的一切,而不會有其他東西。

@UsePlaywright
public class TestExample {

@Test
void basicTest(Page page) {
page.navigate("https://playwright.dev/");

assertThat(page).hasTitle(Pattern.compile("Playwright"));
}
}

Page page 參數告訴 JUnit 設定 page 固定裝置並將其提供給您的測試方法。

以下是預先定義的固定裝置清單:

FixtureTypeDescription
pagePage此測試執行的獨立頁面。
browserContextBrowserContext此測試執行的獨立上下文。page 物件也屬於此上下文。
browserBrowser瀏覽器在測試間共享以優化資源。
playwrightPlaywrightPlaywright 實例在同一執行緒上的測試間共享。
requestAPIRequestContext此測試執行的獨立 APIRequestContext。了解如何進行 API 測試

自訂選項

要自訂固定裝置選項,您應該實作一個 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 以在每個類別中依序執行測試,並在平行執行緒上執行多個類別(執行緒的最大數量等於 CPU 核心數的一半):

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