【Playwright+Python】系列教程(八)鉴权Authentication的使用

news/2024/11/18 5:42:48/文章来源:https://www.cnblogs.com/longronglang/p/18349921

写在前面

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

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

到底是什么意思?

就是你已经登陆过一次,在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 = Nonedef test_login(page: Page):global storagepage.goto("https://www.mdnice.com/")page.get_by_text("登录 / 注册").click()page.get_by_text("邮箱登录 >").click()# Interact with login formpage.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.jsonnew_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'])

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

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 osimport 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 formpage.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_storagesession_storage = os.environ["SESSION_STORAGE"]new_context = page.contextnew_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, expectdef 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'])

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

写在最后

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

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

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

你该怎么写呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780035.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Charles使用教程

一、Charles教程(一)Charles使用教程Charles是一个HTTP代理/ HTTP监视器/反向代理,能够查看其机器和Internet之间的所有HTTP和SSL / HTTPS流量。这包括请求,响应和HTTP标头(包含cookie和缓存信息) Charles 是在 Mac /Windows下常用的网络封包截取工具,在做 移动开发时,…

maven引用库显示红色波浪线时尝试删除_remote.repositories有用

使用第三方框架平台开发,其仓库为私服,在私服仓库不可用时但jar又是已经存在的情况下,maven很多引用库一直显示红色红波浪。 最后通过将repository下所有包下的_remote.repositories文件删除,问题解决了。 即,使用本地的jar,不需要检查远程仓库上的包。

Odoo17.0基于企业微信的考勤应用

对于使用企业微信进行办公的企业而言,使用企业微信打卡功能进行考勤非常常见,而如果能够将企业微信的打卡记录同步到odoo将极大的方便公司进行考勤统计和薪酬核算,降低人事工作的琐碎度,提供企业内部运营效率。本文就将展示如何借助企业微信高级版模块实现企业微信考勤应用…

StringBuffer作为参数传递

package com.shujia.day11;public class stringBufferDemo1 {public static void main(String[] args) {String s1 = "hello";//StringBuffer作为参数传递StringBuffer sb1 = new StringBuffer("hello");StringBuffer sb2 = new StringBuffer("world&…

Linux-USB驱动笔记--设备控制器(UDC)驱动

1、前言 在Linux-USB驱动笔记(四)–USB整体框架中有説到设备侧的设备控制器(UDC),下面我们来具体看一下。 2、设备控制器(UDC) USB设备控制器(UDC)驱动指的是作为其他USB主机控制器的USB硬件设备上的底层控制器驱动。该硬件和驱动负责将一个USB设备依附于一个USB主机控制器上…

机器学习是怎么回事?

什么是机器学习 最近在入门人工智能,发现了一大堆的名词,和大家分享一下我是怎么理解机器学习的。 机器学习的概念 在百度上有定义,这里我说一下我自己的定义哈。机器学习就是让机器可以猜到你心里想的那个数字。 我们想一下,什么是学习? 不就是从一开始的瞎猜到合理的推测…

MD5手机号在线解密 MD5解密

分享个好用的在线破解md5手机号的网站-日常使用完全足够 链接:http://www.tandaima.com 在线解密就任意的md5手机号都可以解密出来,并且还附带手机号归属地 API解密 地址:http://www.tandaima.com/api.html 还支持Api形式MD5手机号解密,但是每次解密需要token的这个可以酌…

java中——接口

接口的作用只能用来调用 如果十个人里有三个会游泳,就可以新建一个接口储存swim方法,三人可以通过继承关系调用 而抽象是在方法的基础上重写,体现出同一个方法的不同形态 如果十个人游泳,但是游泳的姿势不同,如狗刨。。。此时就可以通过抽象继承关系去重写子类的游泳姿势 …

SVG之path详解(一),全面解析椭圆弧命令A

简述 SVG 中的 <path> 元素用于创建路径,它是 SVG 中最强大和最灵活的基本形状之一 使用 <path> 元素可以绘制直线、曲线、弧线等各种复杂的图形,并且可以通过设置路径命令来控制路径的形状和样式在进入正题前,先温习一下svg的坐标系,x轴为水平向右,y轴为垂直…

AppleScript实现FaceTime数据检测,FaceTime蓝号检测,无痕检测是否开通FaceTime功能

FaceTime是苹果公司iOS和macOS(以前称Mac OS X或OS X)内置的一款视频通话软件,通过Wi-Fi或者蜂窝数据接入互联网,在两个装有FaceTime的设备之间实现视频通话。其要求通话双方均具有装有FaceTime的苹果设备,苹果ID以及可接入互联网的3G/4G/5G或者Wi-Fi网络。一、Windows电脑…

搭建时空基底,建设“数字之城”

在这个日新月异的时代,数字技术正以前所未有的速度重塑我们的世界。今天,让我们一同深入探讨如何通过搭建时空基底,为“数字之城”的建设奠定坚实基础。一、时空基底:数字之城的骨骼与脉络所谓“时空基底”,是指结合时间维度与空间维度的综合性信息框架,它是构建数字城市…

没闲着系列 22

最近下班后,时间还是比较宽松的,相对宽松。 今天更新一下TaskSaas近期有什么变动: 一个就是概览dashboard以及需求、问题的选择中,加入了ALL TODO DONE的分类,更便于查询全部、待做(新建、重新打开、进行中、待反馈)、已完成的分类。第二个是修复了工作台里的一系列bug。…