最强自动化测试框架Playwright(7)- 使用cookie避免重复登录

playwright在称为浏览器上下文的隔离环境中执行测试。这种隔离模型提高了可重复性,并防止了级联测试失败。测试可以加载现有的经过身份验证的状态。这消除了在每次测试中进行身份验证的需要,并加快了测试执行速度。

每次测试前登录

以下示例登录到 GitHub。执行这些步骤后,将对浏览器上下文进行身份验证。

  • 同步
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

为每个测试重做登录可能会减慢测试执行速度。若要缓解此问题,可以重用现有身份验证状态。

重复使用已登录状态

Web 应用使用基于 Cookie 或基于令牌的身份验证,其中经过身份验证的状态存储为 Cookie 或存储在本地存储中。

在控制台使用localStorage可以打印出cookie。

Playwright 提供了 browserContext.storageState([options]) 方法,可以将该cookie保存到本地文件中。

context = browser.new_context(storage_state="state.json")

示例:

将cookie保存至state.json文件中

from playwright.sync_api import Playwright, expect


def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto("https://pity.fun/#/user/login")
    page.get_by_placeholder("用户名: tester").click()
    page.get_by_placeholder("用户名: tester").fill("tester")
    page.get_by_placeholder("密码: tester").fill("tester")
    page.get_by_role("button", name="登 录").click()
    expect(page.get_by_title("工作台")).to_be_visible()

    # 保存storage state 到指定的文件
    storage = context.storage_state(path="state.json")

    # ---------------------
    context.close()
    browser.close()

with sync_playwright() as playwright:
    run(playwright)

 

从state.json获取cookie,在创建上下文时使用该cookie进行登录


from playwright.sync_api import Playwright, sync_playwright


def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)
    # 加载本地cookies,免登陆
    context = browser.new_context(storage_state="state.json")

    # 打开页面继续操作
    page = context.new_page()
    page.goto('https://pity.fun')
    page.pause()  # 打断点看是不是已经登录了

    context.close()
    browser.close()

with sync_playwright() as playwright:
    run(playwright)
执行可以看到,打开浏览器后,已经登录了。

高级方案

会话存储

重用经过身份验证的状态包括 Cookie 和基于本地存储的身份验证。很少使用会话存储来存储与登录状态关联的信息。会话存储特定于特定域,不会在页面加载期间持久化。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, value)
    }
  }
})('""" + session_storage + "')")

猜你喜欢

转载自blog.csdn.net/seanyang_/article/details/132248176