写在前面

还是有些絮叨的感觉,官方翻译和某些博主写那个玩楞,基本都是软件直接翻译后的产物。

读起来生硬不说,甚至有的时候不到是什么意思,真的是实在不敢恭维。

到底是什么意思?

就是你已经登陆过一次,在Session、Cookie未失效的情况下,登录过一次后,下次就不用再走一遍登录的过程,从而缩短了脚本执行时间,提高了测试效率。

我说清楚了吗?

明白了,谢谢!

自己能办到的事,不求别人,哈哈哈!

鉴权Authentication的使用

1、核心概念

这是官方给的必要配置,我来直接贴下吧,如下:

mkdir -p playwright/.auth
echo $'\nplaywright/.auth' >> .gitignore

说明:恕我直言,加不加都行,并不影响什么,可忽略!

2、核心思想

每次运行脚本前,都需要跑一次登录的过程。

按照我们之前的习惯,肯定也要将登录抽离,放到公共方法里是吧,但我们这里要做的就是一个加强。

什么意思呢,就是登录一次,下次就不登录直接执行测试了。

3、实战场景举栗

场景:现在我要登录墨滴,然后点击写文章。

核心:重复使用已登录状态

3.1、使用cookies存储

Playwright 允许在测试中重用已登录状态,通过 browserContext.storageState() 方法提取 cookies 和本地存储的认证状态,以便在多个测试中避免重复登录。

示例代码:

# -*- coding: utf-8 -*-
# @Time : 2024/08/08 20:03
# @Author : longrong.lang
# @FileName: test_authentication.py
# @Software: PyCharm
# @Cnblogs :https://www.cnblogs.com/longronglang
# @Motto:你只管努力,剩下的交给天意.
import pytest
from playwright.sync_api import expect, Page # 创建一个全局变量来保存存储状态
storage = None def test_login(page: Page):
global storage
page.goto("https://www.mdnice.com/")
page.get_by_text("登录 / 注册").click()
page.get_by_text("邮箱登录 >").click()
# Interact with login form
page.get_by_placeholder("邮箱地址,比如:example@exapmle.com").fill("username@qq.com")
page.get_by_placeholder("请输入密码").fill("password")
page.get_by_text("我要登录啦!").click()
page.wait_for_timeout(1000)
# 断言页面标题是百度一下,你就知道
expect(page.get_by_text('社区日更文章领福利')).to_have_text("社区日更文章领福利")
# Save storage state into the file.
storage = page.context.storage_state(path="state.json") # 在其他测试中,创建新的上下文并使用之前保存的存储状态
def test_write_article(page: Page) -> None:
global storage
"""
方法1
创建新的上下文,使用之前存储的状态文件state.json
new_context = page.context.browser.new_context(storage_state=storage)
new_page = new_context.new_page()
""" """
方法2
直接新建一个页面,使用之前存储的状态文件state.json
"""
new_page = page.context.browser.new_page(storage_state=storage)
new_page.goto("https://www.mdnice.com/")
new_page.get_by_text("写文章").click() if __name__ == '__main__':
pytest.main(['-vs', 'test_authentication.py'])

效果:



这两种方式上,虽然用例可以执行成功,但是新开了好几个浏览器窗口

3.2、使用Session存储

Cookies 和本地存储的身份验证状态可以跨浏览器使用,但 Session 存储无法持久化,Playwright 不提供相应的 API,需手动实现保存和加载。

示例代码:

# -*- coding: utf-8 -*-
# @Time : 2024/08/08 21:30
# @Author : longrong.lang
# @FileName: test_session storage.py
# @Software: PyCharm
# @Cnblogs :https://www.cnblogs.com/longronglang
# @Motto:你只管努力,剩下的交给天意.
# contest.py
import os import pytest
from playwright.sync_api import Page # 定义全局登录
@pytest.fixture(scope="function", autouse=True)
def page(page: Page):
page.goto("https://www.mdnice.com/")
page.get_by_text("登录 / 注册").click()
page.get_by_text("邮箱登录 >").click()
# Interact with login form
page.get_by_placeholder("邮箱地址,比如:example@exapmle.com").fill("username@qq.com")
page.get_by_placeholder("请输入密码").fill("password")
page.get_by_text("我要登录啦!").click()
page.wait_for_timeout(1000)
# 断言页面标题是百度一下,你就知道
expect(page.get_by_text('社区日更文章领福利')).to_have_text("社区日更文章领福利")
# 获取当前页面的会话存储
session_storage = page.evaluate("() => JSON.stringify(sessionStorage)")
# 将会话存储存储为环境变量
os.environ["SESSION_STORAGE"] = session_storage
session_storage = os.environ["SESSION_STORAGE"]
new_context = page.context
new_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 + "')")
new_page = new_context.new_page()
yield new_page # test_demo.py
from playwright.sync_api import Page, expect def test_write_article(page: Page) -> None:
page.goto("https://www.mdnice.com/")
page.get_by_text("写文章").click()
page.wait_for_timeout(1000) if __name__ == '__main__':
pytest.main(['-vs', 'test_authentication.py'])

效果:



这样写,比较优雅,至少不会同时打开多个浏览器,但还是多了一个tab,整体问题不大。

写在最后

前天看过一个博主写的文章,真的震撼到我了,超级细致,而且代入感很强。

顿时让我感觉到,好的技术文章,也是有灵魂的。

那么问题来了,要是你来写技术文章?

你该怎么写呢?

【Playwright+Python】系列教程(八)鉴权Authentication的使用的更多相关文章

  1. python接口自动化22-签名(signature)鉴权(authentication)之加密(HEX、MD5、HMAC-SHA256)

    前言 开放的接口为了避免被别人乱调用,浪费服务器资源,这就涉及到签名(Signature)加密了 API 使用签名方法(Signature)对接口进行鉴权(Authentication).每一次请求都 ...

  2. CRL快速开发框架系列教程八(使用CRL.Package)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  3. 黄聪:Microsoft Enterprise Library 5.0 系列教程(八) Unity Dependency Injection and Interception

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(八) Unity Dependency Injection and Interception 依赖注入容器Uni ...

  4. SpringBoot系列: Web应用鉴权思路

    ==============================web 项目鉴权============================== 主要的鉴权方式有:1. 用户名/密码鉴权, 然后通过 Sess ...

  5. Python系列教程-详细版 | 图文+代码,快速搞定Python编程(附全套速查表)

    作者:韩信子@ShowMeAI 教程地址:http://showmeai.tech/article-detail/python-tutorial 声明:版权所有,转载请联系平台与作者并注明出处 引言 ...

  6. Python系列教程大汇总

    Python初级教程 Python快速教程 (手册) Python基础01 Hello World! Python基础02 基本数据类型 Python基础03 序列 Python基础04 运算 Pyt ...

  7. Influx Sql系列教程八:query数据查询基本篇

    前面几篇介绍了InfluxDB的添加,删除修改数据,接下来进入查询篇,掌握一定的SQL知识对于理解本篇博文有更好的帮助,下面在介绍查询的基础操作的同时,也会给出InfluxSql与SQL之间的一些差别 ...

  8. Python系列教程(一):简介

    Python发展历史 起源 Python的作者,Guido von Rossum,荷兰人.1982年,Guido从阿姆斯特丹大学获得了数学和计算机硕士学位.然而,尽管他算得上是一位数学家,但他更加享受 ...

  9. Spring Boot2 系列教程 (八) | 配置日志

    前言 如题,今天介绍 springboot 默认日志的配置. 默认日志 Logback 默认情况下,Spring Boot 用 Logback 来记录日志,并用 INFO 级别输出到控制台.如果你在平 ...

  10. Unity3D脚本中文系列教程(八)

    ◆ static var matrix : Matrix4x4 描述:设置用于渲染所有gizmos的矩阵. 类方法 ◆ Static function DrawCube(center:Vector3, ...

随机推荐

  1. 使用python解析nginx日志

    性能测试时,需使用生产环境各接口请求比例分配接口请求比,nginx统计脚本如下: import re import pandas as pd import xlwt obj = re.compile( ...

  2. 可以把 FolkMQ 内嵌到 SpringBoot3 项目里(可内嵌的消息中间件,纯血国产)

    之前发了<把 FolkMQ 内嵌到 SpringBoot2 项目里(比如 "诺依" 啊)>.有人说都淘态了,有什么好内嵌的...所以再发个 SpringBoot3 Fo ...

  3. EthernetIP IO从站设备数据 转 Modbus RTU TCP项目案例

    1         案例说明 1.   设置网关采集EthernetIP IO设备数据 2.   把采集的数据转成Modbus协议转发给其他系统. 2        VFBOX网关工作原理 VFBOX ...

  4. HarmonyOS SDK助力中国建设银行探索金融领域创新场景

    今年年初,中国建设银行(以下简称建行)手机银行首批适配HarmonyOS NEXT,并高效实现其应用的核心功能迁移.同时,建行手机银行在HarmonyOS SDK的加持下,充分发挥鸿蒙原生应用在原生智 ...

  5. Centos7搭建Minio环境(配置开机自启)

    Minio 添加环境变量 # 设置控制台账号 最少3位 export MINIO_ACCESS_KEY=admin # 设置密码 最少8位 export MINIO_SECRET_KEY=123456 ...

  6. SpringBoot连接数据库的方式

    1.Spring集成的服务 直接通过注入方式使用,如redis,jdbc等等服务. spring: redis: host: localhost port: 6379 password: 123456 ...

  7. Spring里面bean的生命周期里面的init和destroy方法

    package net.cybclass.sp; import net.cybclass.sp.domain.Video; import net.cybclass.sp.domain.Video2; ...

  8. Solo开发者社区-H5-Dooring, 开箱即用的零代码搭建平台

    Dooring-Saas 是一款功能强大,高可扩展的零代码解决方案,致力于提供一套简单方便.专业可靠.无限可能的页面可视化搭建最佳实践.(Solo社区 投稿) 功能特点 可扩展, Dooring 实现 ...

  9. pyspark集成访问hive数据踩坑记录

    当前环境anaconda3.python3.9.13.jupyter 需要安装的pyspark.py4j pyspark和py4j的离线安装包地址Links for pyspark (tsinghua ...

  10. 全网最适合入门的面向对象编程教程:14 类和对象的 Python 实现-类的静态方法和类方法,你分得清吗?

    全网最适合入门的面向对象编程教程:14 类和对象的 Python 实现-类的静态方法和类方法,你分得清吗? 摘要: 本文主要介绍了Python中类和对象中的类方法和静态方法,以及类方法和静态方法的定义 ...