身份驗證
簡介
Playwright 在稱為瀏覽器上下文的隔離環境中執行測試。這種隔離模型提高了可重現性並防止連鎖測試失敗。測試可以加載現有的已驗證狀態。這消除了在每個測試中進行身份驗證的需要,並加快了測試執行速度。
核心概念
無論您選擇哪種驗證策略,您可能會將已驗證的瀏覽器狀態存儲在檔案系統上。
我們建議建立 playwright/.auth
目錄並將其添加到 .gitignore
中。您的身份驗證程序將生成已驗證的瀏覽器狀態並將其保存到此 playwright/.auth
目錄中的檔案。稍後,測試將重用此狀態並以已驗證的方式開始。
- Bash
- PowerShell
- Batch
mkdir -p playwright/.auth
echo $'\nplaywright/.auth' >> .gitignore
New-Item -ItemType Directory -Force -Path playwright\.auth
Add-Content -path .gitignore "`r`nplaywright/.auth"
md playwright\.auth
echo. >> .gitignore
echo "playwright/.auth" >> .gitignore
在每個測試前登入
Playwright API 可以自動化互動與登入表單。
以下範例登入 GitHub。一旦這些步驟執行完畢,瀏覽器上下文將會被驗證。
- Sync
- Async
page = context.new_page()
page.goto('https://github.com/login')
# Interact with login form
page.get_by_label("Username or email address").fill("username")
page.get_by_label("Password").fill("password")
page.get_by_role("button", name="Sign in").click()
# Continue with the test
page = await context.new_page()
await page.goto('https://github.com/login')
# Interact with login form
await page.get_by_label("Username or email address").fill("username")
await page.get_by_label("Password").fill("password")
await page.page.get_by_role("button", name="Sign in").click()
# Continue with the test
重新登入每個測試會減慢測試執行速度。為了減輕這種情況,請改用現有的驗證狀態。
重複使用已登入狀 態
Playwright 提供了一種在測試中重複使用已登入狀態的方法。這樣你只需登入一次,然後在所有測試中跳過登入步驟。
Web apps 使用基於 cookie 或基於 token 的身份驗證,已驗證的狀態存儲為cookies或在local storage中。Playwright 提供browser_context.storage_state()方法,可用於從已驗證的上下文中檢索存儲狀態,然後建立具有預填狀態的新上下文。
Cookies 和 local storage 狀態可以在不同的瀏覽器中使用。它們依賴於您的應用程式的身份驗證模型: 一些應用程式可能需要同時使用 cookies 和 local storage。
以下程式碼片段從已驗證的上下文中檢索狀態,並使用該狀態建立一個新的上下文。
- Sync
- Async
# Save storage state into the file.
storage = context.storage_state(path="state.json")
# Create a new context with the saved storage state.
context = browser.new_context(storage_state="state.json")
# Save storage state into the file.
storage = await context.storage_state(path="state.json")
# Create a new context with the saved storage state.
context = await browser.new_context(storage_state="state.json")
進階情境
Session storage
重複使用已驗證的狀態涵蓋了 cookies 和 local storage 基於驗證。很少使用 session storage 來存儲與已登入狀態相關的資訊。Session storage 特定於某個特定的域,並且不會在頁面加載之間持續存在。Playwright 不提供持久化 session storage 的 API,但可以使用以下程式碼片段來保存/加載 session storage。
- Sync
- Async
import os
# Get session storage and store as env variable
session_storage = page.evaluate("() => JSON.stringify(sessionStorage)")
os.environ["SESSION_STORAGE"] = session_storage
# Set session storage in a new context
session_storage = os.environ["SESSION_STORAGE"]
context.add_init_script("""(storage => {
if (window.location.hostname === 'example.com') {
const entries = JSON.parse(storage)
for (const [key, value] of Object.entries(entries)) {
window.sessionStorage.setItem(key, value)
}
}
})('""" + session_storage + "')")
import os
# Get session storage and store as env variable
session_storage = await page.evaluate("() => JSON.stringify(sessionStorage)")
os.environ["SESSION_STORAGE"] = session_storage
# Set session storage in a new context
session_storage = os.environ["SESSION_STORAGE"]
await context.add_init_script("""(storage => {
if (window.location.hostname === 'example.com') {
const entries = JSON.parse(storage)
for (const [key, value] of Object.entries(entries)) {
window.sessionStorage.setItem(key, value)
}
}
})('""" + session_storage + "')")