Skip to main content

身份验证

Playwright 可用于自动化需要身份验证的场景。

使用 Playwright 编写的测试在称为 browser contexts 的隔离、干净的环境中执行。这种隔离模型提高了可重复性并防止级联测试失败。新的浏览器上下文可以加载现有的身份验证状态。这消除了在每个上下文中登录的需要,并加快了测试执行速度。

注意:本指南涵盖基于 cookie/token 的身份验证(通过应用程序 UI 登录)。对于 HTTP 身份验证,请使用 browser.new_context(**kwargs)

Automate logging in

Playwright API 可以 自动化登录表单的交互

以下示例自动化登录 GitHub。执行这些步骤后,浏览器上下文将通过身份验证。

page = context.new_page()
page.goto('https://github.com/login')

# Interact with login form
page.get_by_text("Login").click()
page.get_by_label("User Name").fill(USERNAME)
page.get_by_label("Password").fill(PASSWORD)
page.get_by_text('Submit').click()
# Continue with the test

为每个测试重做登录会降低测试执行速度。为了缓解这种情况,请改用现有的身份验证状态。

Reuse signed in state

Playwright 提供了一种在测试中重用登录状态的方法。这样,您只需登录一次,然后即可跳过所有测试的登录步骤。

Web 应用程序使用基于 cookie 或基于令牌的身份验证,其中经过身份验证的状态存储为 cookieslocal storage。Playwright 提供了 browserContext.storageState([options]) 方法,该方法可用于从经过身份验证的上下文中检索存储状态,然后创建具有预填充状态的新上下文。

Cookies 和本地存储状态可以在不同的浏览器中使用。它们取决于您的应用程序的身份验证模型:某些应用程序可能同时需要 cookie 和本地存储。

以下代码片段从经过身份验证的上下文中检索状态,并使用该状态创建一个新上下文。

# 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")

Session storage

极少数情况下,session storage 用于存储与登录状态相关的信息。会话存储特定于特定域,并且不会在页面加载之间持久保存。Playwright 不提供持久保存会话存储的 API,但可以使用以下代码片段来保存/加载会话存储。

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, key)
}
}
})('""" + session_storage + "')")

Multi-factor authentication

具有多重身份验证 (MFA) 的帐户无法完全自动化,需要人工干预。持久身份验证可用于部分自动化 MFA 场景。

Persistent authentication

请注意,持久身份验证不适用于 CI 环境,因为它依赖于磁盘位置。用户数据目录特定于浏览器类型,不能在浏览器类型之间共享。

用户数据目录可以与 browser_type.launch_persistent_context(user_data_dir, **kwargs) API 一起使用。

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
user_data_dir = '/path/to/directory'
browser = p.chromium.launch_persistent_context(user_data_dir, headless=False)
# Execute login steps manually in the browser window

Lifecycle

  1. 在磁盘上创建用户数据目录。
  2. 使用用户数据目录启动持久上下文并登录 MFA 帐户。
  3. 重用用户数据目录以运行自动化场景。