跳轉到

2.3 斷言:驗證頁面狀態#

expect:Web 第一斷言#

Playwright 的斷言都用 expect,而且會自動重試——元素還沒出現時不會立刻失敗,而是等到超時(見 3.3)。

import { test, expect } from "@playwright/test";

await expect(page).toHaveTitle(/Playwright/);   // 頁面標題
await expect(page).toHaveURL(/dashboard/);      // 目前網址

元素狀態斷言#

// 元素可見 / 隱藏
await expect(page.getByText("歡迎回來")).toBeVisible();
await expect(page.getByText("錯誤訊息")).toBeHidden();

// 勾選狀態
await expect(page.getByLabel("記住我")).toBeChecked();

// 停用狀態
await expect(page.getByRole("button", { name: "送出" })).toBeDisabled();
await expect(page.getByRole("button", { name: "送出" })).toBeEnabled();

// 取得焦點
await expect(page.getByLabel("搜尋")).toBeFocused();

文字與屬性斷言#

// 元素包含特定文字(最常用)
await expect(page.getByRole("heading")).toContainText("歡迎");
await expect(page.getByRole("heading")).toHaveText("歡迎光臨");   // 完全相同

// 屬性值
await expect(page.getByRole("link")).toHaveAttribute("href", "/home");

// 輸入框的值
await expect(page.getByLabel("電子郵件")).toHaveValue("user@test.com");

清單與數量斷言#

// 清單項目數量
await expect(page.getByRole("listitem")).toHaveCount(5);

// 清單內容
await expect(page.getByRole("listitem")).toHaveText(["蘋果", "香蕉", "櫻桃"]);

有條件的斷言(表單驗證錯誤訊息等)#

真實場景:點送出後出現錯誤訊息:

test("空白表單應該顯示錯誤", async ({ page }) => {
  await page.goto("https://my-site.com/login");
  await page.getByRole("button", { name: "登入" }).click();

  await expect(page.getByText("請輸入電子郵件")).toBeVisible();
  await expect(page).toHaveURL(/login/);   // 沒有跳轉
});

常用斷言速查#

斷言 用途
toBeVisible() / toBeHidden() 可見 / 隱藏
toHaveText() / toContainText() 文字完全相同 / 包含
toHaveValue() 輸入框的值
toHaveCount() 元素數量
toBeChecked() 已勾選
toBeEnabled() / toBeDisabled() 可用 / 停用
toHaveURL() / toHaveTitle() 網址 / 標題
toHaveAttribute() 屬性值

心法:測試的名稱寫「使用者會看到什麼」。斷言不是在驗證 DOM,而是驗證使用者眼睛看到的結果——可見、文字、網址。