撰寫測試
簡介
Playwright 測試很簡單,就兩件事:
- 執行動作
- 根據預期斷言狀態
在執行動作之前無需等待任何事情: Playwright 會在執行每個動作之前自動等待各種可操作性檢查通過。
也不需要在執行檢查時處理競爭條件 - Playwright 斷言的設計方式是描述最終需要滿足的期望。
就是這樣!這些設計選擇使 Playwright 用戶可以完全忘記測試中的不穩定超時和競速檢查。
你將學到
第一個測試
看看以下範例,了解如何撰寫測試。請注意檔案名稱如何遵循 test_
前綴約定以及每個測試名稱。
import re
from playwright.sync_api import Page, expect
def test_has_title(page: Page):
page.goto("https://playwright.dev/")
# Expect a title "to contain" a substring.
expect(page).to_have_title(re.compile("Playwright"))
def test_get_started_link(page: Page):
page.goto("https://playwright.dev/")
# Click the get started link.
page.get_by_role("link", name="Get started").click()
# Expects page to have a heading with the name of Installation.
expect(page.get_by_role("heading", name="Installation")).to_be_visible()
Actions
導覽
大多數測試將從導航頁面到 URL 開始。之後,測試將能夠與頁面元素互動。
page.goto("https://playwright.dev/")
Playwright 會等待頁面達到載入狀態後再繼續前進。了解更多關於 page.goto() 選項。
互動
執行操作從定位元素開始。Playwright 使用 Locators API 來實現這一點。Locators 代表了一種在任何時刻在頁面上找到元素的方法,了解更多關於可用的 不同類型 的 locators。Playwright 會在執行操作之前等待元素變得 可操作,因此無需等待它變得可用。
# Create a locator.
get_started = page.get_by_role("link", name="Get started")
# Click it.
get_started.click()
在大多數情況下,它將寫在一行中:
page.get_by_role("link", name="Get started").click()
基本操作
這是最受歡迎的 Playwright 操作清單。請注意,還有更多操作,因此請務必查看 Locator API 部分以了解更多資訊。
Action | Description |
---|---|
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"))
以下是最受歡迎的非同步斷言清單。請注意,還有更多可以熟悉:
Assertion | Description |
---|---|
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 外掛是基於測試固定裝置的概念,例如內建 page 固定裝置,它會傳遞到你的測試中。由於瀏覽器上下 文的原因,頁面在測試之間是隔離的,這相當於一個全新的瀏覽器配置檔案,每個測試都會獲得一個全新的環境,即使多個測試在單個瀏覽器中執行。
from playwright.sync_api import Page
def test_example_test(page: Page):
pass
# "page" belongs to an isolated BrowserContext, created for this specific test.
def test_another_test(page: Page):
pass
# "page" in this second test is completely isolated from the first test.
使用 fixtures
你可以使用各種 fixtures 在測試之前或之後執行程式碼,並在它們之間共享物件。一個 function
範圍的 fixture,例如使用 autouse,行為類似於 beforeEach/afterEach。而一個 module
範圍的 fixture 使用 autouse,行為類似於 beforeAll/afterAll,會在所有測試之前和之後執行。
import pytest
from playwright.sync_api import Page, expect
@pytest.fixture(scope="function", autouse=True)
def before_each_after_each(page: Page):
print("before the test runs")
# Go to the starting url before each test.
page.goto("https://playwright.dev/")
yield
print("after the test runs")
def test_main_navigation(page: Page):
# Assertions use the expect API.
expect(page).to_have_url("https://playwright.dev/")