Skip to main content

撰寫測試

簡介

Playwright 測試很簡單,它們

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

執行動作前無需等待任何事項:Playwright 會在執行每個動作前自動等待各種可動作性檢查通過。

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

就是這樣!這些設計選擇讓 Playwright 使用者能夠完全忘記測試中的不穩定逾時和競爭檢查。

您將學習

第一個測試

查看以下範例了解如何撰寫測試。注意檔案名稱遵循 test_ 前綴慣例,每個測試名稱也是如此。

test_example.py
import re
from playwright.sync_api import Page, expect

def test_has_title(page: Page):
page.goto("https://playwright.dev/")

# 期望標題「包含」子字串。
expect(page).to_have_title(re.compile("Playwright"))

def test_get_started_link(page: Page):
page.goto("https://playwright.dev/")

# 點擊開始使用連結。
page.get_by_role("link", name="Get started").click()

# 期望頁面有名為 Installation 的標題。
expect(page.get_by_role("heading", name="Installation")).to_be_visible()

動作

導覽

大部分的測試會先導航到 URL。之後,測試能夠與頁面元素互動。

page.goto("https://playwright.dev/")

Playwright 會等待頁面達到載入狀態後再繼續。了解更多關於 page.goto() 選項的資訊。

互動

執行動作始於定位元素。Playwright 使用定位器 API 來達成此目的。定位器代表在任何時刻尋找頁面上元素的方法,了解更多關於可用的不同類型定位器。Playwright 會在執行動作前等待元素變成可動作狀態,因此不需要等待它變成可用狀態。

# 建立一個定位器。
get_started = page.get_by_role("link", name="Get started")

# 點擊它。
get_started.click()

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

page.get_by_role("link", name="Get started").click()

基本動作

這是最受歡迎的 Playwright 動作清單。注意還有更多動作,請務必查看定位器 API 部分以了解更多。

動作描述
locator.check()勾選輸入核取方塊
locator.click()點擊元素
locator.uncheck()取消勾選輸入核取方塊
locator.hover()將滑鼠懸停在元素上
locator.fill()填寫表單欄位、輸入文字
locator.focus()聚焦元素
locator.press()按下單一按鍵
locator.set_input_files()選擇要上傳的檔案
locator.select_option()在下拉式選單中選擇選項

斷言

Playwright 包含會等待直到預期條件滿足的斷言。使用這些斷言可以讓測試變得不脆弱且具有彈性。例如,此程式碼會等待直到頁面獲得包含 "Playwright" 的標題:

import re
from playwright.sync_api import expect

expect(page).to_have_title(re.compile("Playwright"))

以下是最受歡迎的非同步斷言清單。請注意還有更多斷言可以熟悉:

斷言描述
expect(locator).to_be_checked()核取方塊已勾選
expect(locator).to_be_enabled()控制項已啟用
expect(locator).to_be_visible()元素可見
expect(locator).to_contain_text()元素包含文字
expect(locator).to_have_attribute()元素具有屬性
expect(locator).to_have_count()元素清單具有指定長度
expect(locator).to_have_text()元素符合文字
expect(locator).to_have_value()輸入元素具有值
expect(page).to_have_title()頁面具有標題
expect(page).to_have_url()頁面具有 URL

測試隔離

Playwright Pytest 外掛基於測試佈置的概念,例如傳遞給測試的內建頁面佈置。由於瀏覽器情境,頁面在測試之間是隔離的,這相當於全新的瀏覽器設定檔,每個測試都獲得新的環境,即使多個測試在單一瀏覽器中執行也是如此。

test_example.py
from playwright.sync_api import Page

def test_example_test(page: Page):
pass
# 「page」屬於為此測試建立的隔離 BrowserContext。

def test_another_test(page: Page):
pass
# 第二個測試中的「page」與第一個測試完全隔離。

使用佈置

您可以使用各種佈置在測試前後執行程式碼,並在測試之間共享物件。例如,具有自動使用功能的 function 範圍佈置表現得像 beforeEach/afterEach。而具有自動使用功能的 module 範圍佈置表現得像 beforeAll/afterAll,會在所有測試之前和之後執行。

test_example.py
import pytest
from playwright.sync_api import Page, expect

@pytest.fixture(scope="function", autouse=True)
def before_each_after_each(page: Page):

print("測試執行前")

# 在每個測試前導覽至起始 URL。
page.goto("https://playwright.dev/")
yield

print("測試執行後")

def test_main_navigation(page: Page):
# 斷言使用 expect API。
expect(page).to_have_url("https://playwright.dev/")

接下來做什麼