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

打印 上一主题 下一主题

主题 918|帖子 918|积分 2754

写在前面

还是有些絮叨的感觉,官方翻译和某些博主写谁人玩楞,基本都是软件直接翻译后的产物。
读起来生硬不说,乃至有的时候不到是什么意思,真的是实在不敢恭维。
到底是什么意思?

就是你已经登岸过一次,在Session、Cookie未失效的情况下,登录过一次后,下次就不消再走一遍登录的过程,从而缩短了脚本实验时间,提高了测试效率。
我说清晰了吗?
明白了,谢谢!
自己能办到的事,不求别人,哈哈哈!
鉴权Authentication的使用

1、核心概念

这是官方给的必要配置,我来直接贴下吧,如下:
  1. mkdir -p playwright/.auth
  2. echo $'\nplaywright/.auth' >> .gitignore
复制代码
分析:恕我直言,加不加都行,并不影响什么,可忽略!
2、核心思想

每次运行脚本前,都需要跑一次登录的过程。
按照我们之前的习惯,肯定也要将登录抽离,放到公共方法里是吧,但我们这里要做的就是一个加强。
什么意思呢,就是登录一次,下次就不登录直接实验测试了。
3、实战场景举栗

场景:如今我要登录墨滴,然后点击写文章。
核心:重复使用已登录状态
3.1、使用cookies存储

Playwright 答应在测试中重用已登录状态,通过 browserContext.storageState() 方法提取 cookies 和当地存储的认证状态,以便在多个测试中避免重复登录。
示例代码:
  1. # -*- coding: utf-8 -*-
  2. # @Time    : 2024/08/08 20:03
  3. # @Author  : longrong.lang
  4. # @FileName: test_authentication.py
  5. # @Software: PyCharm
  6. # @Cnblogs :https://www.cnblogs.com/longronglang
  7. # @Motto:你只管努力,剩下的交给天意.
  8. import pytest
  9. from playwright.sync_api import expect, Page
  10. # 创建一个全局变量来保存存储状态
  11. storage = None
  12. def test_login(page: Page):
  13.     global storage
  14.     page.goto("https://www.mdnice.com/")
  15.     page.get_by_text("登录 / 注册").click()
  16.     page.get_by_text("邮箱登录 >").click()
  17.     # Interact with login form
  18.     page.get_by_placeholder("邮箱地址,比如:example@exapmle.com").fill("username@qq.com")
  19.     page.get_by_placeholder("请输入密码").fill("password")
  20.     page.get_by_text("我要登录啦!").click()
  21.     page.wait_for_timeout(1000)
  22.     # 断言页面标题是百度一下,你就知道
  23.     expect(page.get_by_text('社区日更文章领福利')).to_have_text("社区日更文章领福利")
  24.     # Save storage state into the file.
  25.     storage = page.context.storage_state(path="state.json")
  26. # 在其他测试中,创建新的上下文并使用之前保存的存储状态
  27. def test_write_article(page: Page) -> None:
  28.     global storage
  29.     """
  30.     方法1
  31.     创建新的上下文,使用之前存储的状态文件state.json
  32.     new_context = page.context.browser.new_context(storage_state=storage)
  33.     new_page = new_context.new_page()
  34.     """
  35.     """
  36.     方法2
  37.     直接新建一个页面,使用之前存储的状态文件state.json
  38.     """
  39.     new_page = page.context.browser.new_page(storage_state=storage)
  40.     new_page.goto("https://www.mdnice.com/")
  41.     new_page.get_by_text("写文章").click()
  42. if __name__ == '__main__':
  43.     pytest.main(['-vs', 'test_authentication.py'])
复制代码
结果:

这两种方式上,虽然用例可以实验成功,但是新开了好几个浏览器窗口
3.2、使用Session存储

Cookies 和当地存储的身份验证状态可以跨浏览器使用,但 Session 存储无法持久化,Playwright 不提供相应的 API,需手动实现保存和加载。
示例代码:
  1. # -*- coding: utf-8 -*-
  2. # @Time    : 2024/08/08 21:30
  3. # @Author  : longrong.lang
  4. # @FileName: test_session storage.py
  5. # @Software: PyCharm
  6. # @Cnblogs :https://www.cnblogs.com/longronglang
  7. # @Motto:你只管努力,剩下的交给天意.
  8. # contest.py
  9. import os
  10. import pytest
  11. from playwright.sync_api import Page
  12. # 定义全局登录
  13. @pytest.fixture(scope="function", autouse=True)
  14. def page(page: Page):
  15.     page.goto("https://www.mdnice.com/")
  16.     page.get_by_text("登录 / 注册").click()
  17.     page.get_by_text("邮箱登录 >").click()
  18.     # Interact with login form
  19.     page.get_by_placeholder("邮箱地址,比如:example@exapmle.com").fill("username@qq.com")
  20.     page.get_by_placeholder("请输入密码").fill("password")
  21.     page.get_by_text("我要登录啦!").click()
  22.     page.wait_for_timeout(1000)
  23.     # 断言页面标题是百度一下,你就知道
  24.     expect(page.get_by_text('社区日更文章领福利')).to_have_text("社区日更文章领福利")
  25.     # 获取当前页面的会话存储
  26.     session_storage = page.evaluate("() => JSON.stringify(sessionStorage)")
  27.     # 将会话存储存储为环境变量
  28.     os.environ["SESSION_STORAGE"] = session_storage
  29.     session_storage = os.environ["SESSION_STORAGE"]
  30.     new_context = page.context
  31.     new_context.add_init_script("""(storage => {
  32.       if (window.location.hostname === 'example.com') {
  33.         const entries = JSON.parse(storage)
  34.         for (const [key, value] of Object.entries(entries)) {
  35.           window.sessionStorage.setItem(key, value)
  36.         }
  37.       }
  38.     })('""" + session_storage + "')")
  39.     new_page = new_context.new_page()
  40.     yield new_page
  41. # test_demo.py
  42. from playwright.sync_api import Page, expect
  43. def test_write_article(page: Page) -> None:
  44.     page.goto("https://www.mdnice.com/")
  45.     page.get_by_text("写文章").click()
  46.     page.wait_for_timeout(1000)
  47. if __name__ == '__main__':
  48.     pytest.main(['-vs', 'test_authentication.py'])
复制代码
结果:

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

前天看过一个博主写的文章,真的震撼到我了,超级细致,而且代入感很强。
顿时让我感觉到,好的技能文章,也是有灵魂的。
那么题目来了,要是你来写技能文章?
你该怎么写呢?

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表