跳到主要內容

編寫測試

簡介

Playwright 測試很簡單,它們

  • 執行動作,以及
  • 斷言符合預期的狀態

在執行動作之前,無需等待任何事情:Playwright 會自動等待各種可操作性檢查通過,然後才執行每個動作。

在執行檢查時,也無需處理競爭條件 - Playwright 斷言的設計方式是描述最終需要滿足的預期。

就這樣!這些設計選擇讓 Playwright 使用者可以完全忘記測試中不穩定的超時和競爭條件檢查。

您將學習

第一個測試

請看以下範例,了解如何編寫測試。

UnitTest1.cs
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.Playwright;
using Microsoft.Playwright.MSTest;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace PlaywrightTests;

[TestClass]
public class ExampleTest : PageTest
{
[TestMethod]
public async Task HasTitle()
{
await Page.GotoAsync("https://playwright.dev.org.tw");

// Expect a title "to contain" a substring.
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
}

[TestMethod]
public async Task GetStartedLink()
{
await Page.GotoAsync("https://playwright.dev.org.tw");

// Click the get started link.
await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();

// Expects page to have a heading with the name of Installation.
await Expect(Page.GetByRole(AriaRole.Heading, new() { Name = "Installation" })).ToBeVisibleAsync();
}
}

動作

大部分測試會從導航頁面到 URL 開始。之後,測試將能夠與頁面元素互動。

await Page.GotoAsync("https://playwright.dev.org.tw");

Playwright 將等待頁面達到載入狀態,然後才繼續前進。了解更多關於 Page.GotoAsync() 選項的資訊。

互動

執行動作從定位元素開始。Playwright 使用定位器 API 來實現這一點。定位器代表一種在任何時刻在頁面上尋找元素的方式,了解更多關於可用的不同類型定位器的資訊。Playwright 將等待元素變成可操作的,然後才執行動作,因此無需等待它變成可用狀態。

// Create a locator.
var getStarted = Page.GetByRole(AriaRole.Link, new() { Name = "Get started" });

// Click it.
await getStarted.ClickAsync();

在大多數情況下,它會寫成一行

await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();

基本動作

這是最受歡迎的 Playwright 動作列表。請注意,還有更多動作,因此請務必查看定位器 API 章節,以了解更多關於它們的資訊。

動作描述
Locator.CheckAsync()勾選輸入核取方塊
Locator.ClickAsync()點擊元素
Locator.UncheckAsync()取消勾選輸入核取方塊
Locator.HoverAsync()將滑鼠懸停在元素上
Locator.FillAsync()填寫表單欄位,輸入文字
Locator.FocusAsync()聚焦元素
Locator.PressAsync()按下單個按鍵
Locator.SetInputFilesAsync()選擇要上傳的檔案
Locator.SelectOptionAsync()在下拉選單中選擇選項

斷言

Playwright 提供一個名為 Expect 的異步函數,用於斷言並等待直到滿足預期條件。

await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));

這是最受歡迎的異步斷言列表。請注意,還有更多斷言供您熟悉

斷言描述
Expect(Locator).ToBeCheckedAsync()核取方塊已勾選
Expect(Locator).ToBeEnabledAsync()控制項已啟用
Expect(Locator).ToBeVisibleAsync()元素可見
Expect(Locator).ToContainTextAsync()元素包含文字
Expect(Locator).ToHaveAttributeAsync()元素具有屬性
Expect(Locator).ToHaveCountAsync()元素列表具有給定的長度
Expect(Locator).ToHaveTextAsync()元素匹配文字
Expect(Locator).ToHaveValueAsync()輸入元素具有值
Expect(Page).ToHaveTitleAsync()頁面具有標題
Expect(Page).ToHaveURLAsync()頁面具有 URL

測試隔離

Playwright NUnit 和 MSTest 測試框架基底類別將透過提供單獨的 Page 實例來隔離每個測試。由於瀏覽器上下文,頁面在測試之間是隔離的,瀏覽器上下文相當於全新的瀏覽器設定檔,即使多個測試在單個瀏覽器中執行,每個測試也會獲得全新的環境。

UnitTest1.cs
using System.Threading.Tasks;
using Microsoft.Playwright.MSTest;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace PlaywrightTests;

[TestClass]
public class ExampleTest : PageTest
{
[TestMethod]
public async Task BasicTest()
{
await Page.GotoAsync("https://playwright.dev.org.tw");
}
}

使用測試鉤子

您可以使用 TestInitialize/TestCleanup 來準備和清理您的測試環境

UnitTest1.cs
using System.Threading.Tasks;
using Microsoft.Playwright.MSTest;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace PlaywrightTests;

[TestClass]
public class ExampleTest : PageTest
{
[TestMethod]
public async Task MainNavigation()
{
// Assertions use the expect API.
await Expect(Page).ToHaveURLAsync("https://playwright.dev.org.tw/");
}

[TestInitialize]
public async Task TestInitialize()
{
await Page.GotoAsync("https://playwright.dev.org.tw");
}
}

接下來是什麼