首页 > 编程语言 >【Playwright+Python】系列教程(八)鉴权Authentication的使用

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

时间:2024-08-08 23:06:38浏览次数:10  
标签:Playwright 登录 get Python text storage Authentication new page

写在前面

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

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

到底是什么意思?

就是你已经登陆过一次,在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("邮箱地址,比如:[email protected]").fill("[email protected]")
    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'])

效果:
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 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("邮箱地址,比如:[email protected]").fill("[email protected]")
    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'])

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

写在最后

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

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

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

你该怎么写呢?

标签:Playwright,登录,get,Python,text,storage,Authentication,new,page
From: https://www.cnblogs.com/longronglang/p/18349921

相关文章

  • 基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
    ......
  • Python和AI库NumPy(二):数组创建与操作的深入探索
    目录1.数组创建1.1基本数组创建1.2使用内置函数创建数组1.3特殊数组的创建2.数组的基本操作2.1数组属性2.2数组索引和切片2.3数组的形状操作2.4数组拼接与分割3.数组的数学操作3.1基本算术操作3.2广播机制3.3线性代数运算4.高级数组操作4.1花式......
  • 如何为本地python共享文件网页配置公网地址实现跨网络远程访问
    文章目录前言1.本地文件服务器搭建1.1.Python的安装和设置1.2.cpolar的安装和注册2.本地文件服务器的发布2.1.Cpolar云端设置2.2.Cpolar本地设置3.公网访问测试4.结语前言本文主要介绍如何在Windows系统电脑上使用python这样的简单程序语言,在自己的电脑上搭建一个......
  • 基于YOLOv10深度学习的交通信号灯检测识别系统【python源码+Pyqt5界面+数据集+训练代
    《博主简介》小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~......
  • 用Python简单操作MySQL!轻松实现数据读写
    PyMySQL是Python编程语言中的一个第三方模块,它可以让Python程序连接到MySQL数据库并进行数据操作。它的使用非常简单,只需要安装PyMySQL模块,然后按照一定的步骤连接到MySQL数据库即可。本文将介绍PyMySQL的安装、连接MySQL数据库、创建表、插入数据、查询数据、更新数据和删除数据......
  • [python][代码]Python中操作DataFrame的常用方法
    Python中操作DataFrame的常用方法主要依赖于pandas库,这是一个功能强大的数据分析工具。以下是一些基本和常用的DataFrame操作方法:1.创建DataFrame:pythonimportpandasaspddata={'Column1':[1,2,3],'Column2':['a','b','c']}df=pd.DataFrame(......
  • 使用 Python 优雅地编排 Dockerfile
    使用python替代dockercompose编排容器dockercompose是docker的容器编排工具,它是基于YAML配置,YAML是一种配置文件格式,支持传递环境变量,但是对于复杂的容器编排显得力不从心。于是我便开发这个程序,可以像写程序一样编排docker,可以充分发挥程序猿的想象力。pipi......
  • 学习 Python 语言,它能干什么?
    学习Python语言,它能干什么?为什么要学习编程语言?随着大数据,人工智能盒区块链技术的不断发展和应用,很多领域的创新需要借助一些前沿技术,而软件创建由需要借助编程语言,编程语言是创新与产品之间的桥桥梁,所以创新与编程语言是相辅相成的,人们借助编程语言完成产品的落地。为什......
  • Python的安装环境以及应用
    1.环境python2,Python最新安装3.12可以使用源码安装查看安装包[root@python001~]#yumlistinstalled|grepepel3[root@python001~]#yumlistinstalled|greppython[root@python001~]#yum-yinstallpython3    安装python3查看版本[root@python001......
  • 解锁Python副业密码:从零到日赚1000+的惊人蜕变之路与实战秘籍
    在当今这个数字化时代,掌握一门编程语言如同手握一把开启无限可能的钥匙。Python,以其简洁的语法、丰富的库支持和广泛的应用领域,成为了众多编程爱好者及专业人士的首选。本文将深入探讨如何利用Python技能,开启一条副业之路,并探讨实现日赚1000+的可行策略与实战心得。一、前言:......