Playwright系列(9):如何鉴权

简介: Playwright系列(9):如何鉴权

大家好,我是阿萨。 写自动化,避免不了写鉴权的脚本。怎么用Playwright  去写鉴权的脚本呢?用 Playwright 编写的测试在隔离的干净环境中执行,称为浏览器上下文。这种隔离模式提高了可重复性,防止了测试失败。新的浏览器上下文可以加载现有的认证状态。这消除了在每个上下文中登录的需要,加快了测试的执行。

自动登录
Playwright API可以自动进行登录表格的交互。

下面的例子是自动登录到GitHub。一旦这些步骤被执行,浏览器上下文将被认证。

同步:


page = context.new_page()page.goto('https://github.com/login')# Interact with login formpage.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

异步:


page = context.new_page()page = await context.new_page()await page.goto('https://github.com/login')# Interact with login formawait page.get_by_text("Login").click()await page.get_by_label("User Name").fill(USERNAME)await page.get_by_label("Password").fill(PASSWORD)await page.get_by_text('Submit').click()# Continue with the test



为每个测试重新进行登录会减慢测试的执行。为了避免这种情况,可以重用现有的认证状态。

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

网络应用程序使用基于cookie或令牌的认证,其中认证状态以cookie或本地存储的形式存储。Playwright提供了browserContext.storageState([options])方法,可以用来从认证的上下文中检索存储状态,然后用预填充的状态创建新的上下文。

Cookies和本地存储状态可以在不同的浏览器中使用。它们取决于你的应用程序的认证模型:一些应用程序可能需要cookies和本地存储。

下面的代码片段从认证的上下文中检索状态,然后用该状态创建一个新的上下文。

同步:


# 将存储状态保存到文件中。storage = context.storage_state(path="state.json")# 用保存的存储状态创建一个新的上下文。context = browser.new_context(storage_state="state.json")

异步:


# 将存储状态保存到文件中。storage = await context.storage_state(path="state.json")# 用保存的存储状态创建一个新的上下文。context =await browser.new_context(storage_state="state.json")



会话存储
罕见的是,会话存储被用于存储与登录状态相关的信息。会话存储是特定于某一特定领域的,并且不会跨页面加载持久化。Playwright没有提供持久化会话存储的API,但是下面的片段可以用来保存/加载会话存储。

同步:


import os# Get session storage and store as env variablesession_storage = page.evaluate("() => JSON.stringify(sessionStorage)")os.environ["SESSION_STORAGE"] = session_storage
# Set session storage in a new contextsession_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 variablesession_storage = await page.evaluate("() => JSON.stringify(sessionStorage)")os.environ["SESSION_STORAGE"] = session_storage
# Set session storage in a new contextsession_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 + "')")



多因子认证
带有多因素认证(MFA)的账户不能完全自动化,需要人工干预。持久性认证可用于部分自动化的MFA场景。

持久性认证
请注意,持久性认证不适合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

异步:


import asynciofrom playwright.async_api import async_playwright
async def main():    async with async_playwright() as p:        user_data_dir = '/path/to/directory'        browser = await p.chromium.launch_persistent_context(user_data_dir, headless=False)        # Execute login steps manually in the browser window
asyncio.run(main())



生命周期
在磁盘上创建一个用户数据目录。
用用户数据目录启动一个持久的上下文,并登录MFA账户。
重复使用用户数据目录来运行自动化方案。

相关文章
|
存储 Python
03-Locust-命令行运行及参数说明
03-Locust-命令行运行及参数说明
|
测试技术 Shell API
Playwright系列(3):运行测试用例
Playwright系列(3):运行测试用例
556 1
|
开发工具 git
Playwright系列(6):如何集成到GitHub
Playwright系列(6):如何集成到GitHub
392 0
Playwright系列(6):如何集成到GitHub
|
API 开发工具 开发者
Playwright系列(12):调试选择器
Playwright系列(12):调试选择器
507 0
|
测试技术 Python
Playwright系列(4):录制测试脚本
Playwright系列(4):录制测试脚本
483 0
|
前端开发 JavaScript
Playwright系列(9):常见操作HTML 元素方式
Playwright系列(9):常见操作HTML 元素方式
827 0
|
Web App开发 API Python
Playwright系列(8):认识playwright 相关库
Playwright系列(8):认识playwright 相关库
545 0
Playwright系列(8):认识playwright 相关库
|
数据采集 人工智能 自然语言处理
FireCrawl:开源 AI 网络爬虫工具,自动爬取网站及子页面内容,预处理为结构化数据
FireCrawl 是一款开源的 AI 网络爬虫工具,专为处理动态网页内容、自动爬取网站及子页面而设计,支持多种数据提取和输出格式。
4708 71
FireCrawl:开源 AI 网络爬虫工具,自动爬取网站及子页面内容,预处理为结构化数据
|
传感器 弹性计算 人工智能
简介Multi-Agent
多智能体系统(MAS)是由多个自主智能体组成的计算系统,各智能体能独立决策、协同作业,无需中央控制。其特点包括自主性、分布性、交互性、异构性和适应性,广泛应用于人工智能、经济、交通、医疗和环保等领域,展现出巨大潜力。然而,MAS也面临通信开销、一致性、安全性和可扩展性等挑战。
1184 3
|
JavaScript 前端开发
Playwright执行 JavaScript 脚本:探索浏览器自动化的新境界
在Web自动化中,Playwright提供`page.evaluate()`和`page.evaluate_handle()`来执行JavaScript脚本。`page.evaluate()`返回脚本执行结果,而`page.evaluate_handle()`返回JSHandle。示例展示了如何使用它们,如打印网页标题、操作元素及获取页面内容。通过这些方法,可以处理常规方法难以操作的网页元素。