首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年08月08日 22:01

写在前面

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

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

到底是什么意思?

就是你已经登陆过一次,在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'])

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

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

写在最后

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

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

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

你该怎么写呢?

From:https://www.cnblogs.com/longronglang/p/18349921
本文地址: http://www.shuzixingkong.net/article/923
0评论
提交 加载更多评论
其他文章 在一串字符串中Java使用正则匹配电话号码的方法
本文简要介绍了Java中正则表达式匹配电话号码的方法,本文通过导入必要的Pattern和Matcher类,然后定义了一个测试字符串和一个正则表达式;接着,本文使用Pattern.compile()方法编译正则表达式,并使用matcher()方法创建Matcher对象;最后,使用find()方法查找匹
git的快速入门(含常用指令)
目录概念什么是gitgit与GitHub有什么区别提交、仓库、分支git的使用从GitHub上下载别人的代码直接将代码下载到本地克隆仓库获取代码将自己的代码上传到GitHub 本文拟将用通俗的语言描述git的使用方法,如有出入,请批评指正 概念 什么是git Git可以想象成一个超级高效的&quot
git的快速入门(含常用指令) git的快速入门(含常用指令) git的快速入门(含常用指令)
基于SiliconCloud快速体验GraphRag.Net
SiliconCloud介绍 SiliconCloud 基于优秀的开源基础模型,提供高性价比的 GenAI 服务。 不同于多数大模型云服务平台只提供自家大模型 API,SiliconCloud上架了包括 Qwen、DeepSeek、GLM、Yi、Mistral、LLaMA 3、SDXL、Instan
基于SiliconCloud快速体验GraphRag.Net 基于SiliconCloud快速体验GraphRag.Net 基于SiliconCloud快速体验GraphRag.Net
"揭秘CentosChina爬虫项目:掌握Scrapy框架的必备技巧与数据库设计"
你是否想深入了解如何使用Scrapy框架进行高效爬虫开发?本文将揭秘CentosChina爬虫项目,从项目需求分析、数据库表设计,到Scrapy框架的实用技巧,全方位解析。无论你是初学者还是资深开发者,这篇文章都将为你提供宝贵的经验与指导,助你在爬虫开发领域更上一层楼。
"揭秘CentosChina爬虫项目:掌握Scrapy框架的必备技巧与数据库设计" "揭秘CentosChina爬虫项目:掌握Scrapy框架的必备技巧与数据库设计" "揭秘CentosChina爬虫项目:掌握Scrapy框架的必备技巧与数据库设计"
BMC Genomics | 综合代谢组学和转录组学分析揭示了菊花黄酮和咖啡酰奎宁酸的生物合成机制
杭白菊是一种流行的药用和食用植物,主要通过黄酮类和咖啡酰奎宁酸(CQAs)的存在发挥其生物活性。然而,菊花头状花序中黄酮和CQA生物合成的调控机制尚不清楚。 本研究采用高效液相色谱法测定了菊花头状花序发育过程中黄酮类化合物和CQAs的含量,发现在S1和S2阶段含量较高,在S3 ~ S5阶段含量逐渐降
在IIS上部署ASP.NET Core Web API和Blazor Wasm详细教程
前言 前段时间我们完成了七天.NET 8 操作 SQLite 入门到实战的开发系列教程,有不少同学留言问如何将项目发布部署到IIS上面运行。本篇文章我们就一起来讲讲在IIS上部署ASP.NET Core Web API和Blazor Wasm。 前提条件 安装.NET Core SDK https:
在IIS上部署ASP.NET Core Web API和Blazor Wasm详细教程 在IIS上部署ASP.NET Core Web API和Blazor Wasm详细教程 在IIS上部署ASP.NET Core Web API和Blazor Wasm详细教程
适合新手进行接口与自动化测试练习的推荐网站!!!
对于新手来说,接口与自动化测试练习网站是提升技能的重要资源。以下是一些适合新手进行接口与自动化测试练习的推荐网站: 1、httpbin.org httpbin.org是一个在线提供HTTP服务的网站,它提供了丰富的HTTP接口,用于测试HTTP请求和响应的各种信息,如cookie、IP、header
适合新手进行接口与自动化测试练习的推荐网站!!! 适合新手进行接口与自动化测试练习的推荐网站!!! 适合新手进行接口与自动化测试练习的推荐网站!!!
《最新出炉》系列小成篇-Python+Playwright自动化测试-67 - 模拟手机浏览器兼容性测试
1.简介 在日常工作中,我们会遇到需要使用不同的硬件设备测试兼容性的问题,尤其是现在手机型号基本上是每个厂家每年发布一款新机型,而且手机的屏幕大小分辨率五花八门的,我们基本不可能全部机型都用真机测试一遍,playwright提供了模仿机型的功能,我们可以使用playwright来模拟设备。使用 Pl
《最新出炉》系列小成篇-Python+Playwright自动化测试-67 - 模拟手机浏览器兼容性测试 《最新出炉》系列小成篇-Python+Playwright自动化测试-67 - 模拟手机浏览器兼容性测试 《最新出炉》系列小成篇-Python+Playwright自动化测试-67 - 模拟手机浏览器兼容性测试