【pytest、playwright】多账号同时操作

目录

方案实现思路:

方案一:

方案二:


方案实现思路:

依照上图所见,就知道,一个账号是pytest-playwright默认的环境,一个是 账号登录的环境

方案一:

直接上代码:

复制代码
import time
from playwright.sync_api import Page, BrowserContext
import pytest
from pages.explore.explore import ExplorePage
from playwright.sync_api import expect
class TestLogin():
    @pytest.fixture(autouse=True)
    def for_each(self,page:Page):
        self.login = ExplorePage(page)
        # 打开页面1,已登录的账号进行操作
        self.login.gotoURL()
        yield
        print('后置操作')


    def testmore(self,playwright):
        browser = playwright.chromium.launch(channel='chrome', headless=False)
        context = browser.new_context()
        page2 = context.new_page()
        self.login2 = ExplorePage(page2)
        # 打开页面2,未登录的账号进行操作
        self.login2.gotoURL()

代码解读:

  • 在case执行前,会自动调用for_each方法,这里面默认的登录用户就是conftest.py中配置的用户,执行case时,我们又重新打开浏览器,重新创建一个context上下文,这里我们就是账号2了,此时是未登录状态。此时就有了两个浏览器同时打开,第一个是登陆状态,第二个是未登录状态~
  • 这种方式实现并不好,因为如果我们需要登录的话,很可能有些网站支持不了

方案二:

在conftest.py文件中来配置:

复制代码
@pytest.fixture(scope='module')
def more_context(browser_context_args, browser, pytestconfig):
    # 将browser_context_args中配置的信息复制到context_args中,除了storage_state【这个是登录用户的信息】
    context_args = {k: v for k, v in browser_context_args.items() if k != 'storage_state'}
    # 获取新的登录用户的信息,并且需要将\\替换为/,否则找不到文件
    storage_state = str(pytestconfig.rootpath.joinpath('auth/cookie.json')).replace('\\', '/')
    # 从文件中读取出新的登录用户的信息,并且将内容填充到context_args的storage_state中
    # 关于新的登录用户信息,这部分,也可以不做,那就表示第二个用户是未登录状态,也可以满足一些自动化的测试点
    with open(storage_state, 'r') as file:
        context_args['storage_state'] = json.load(file)
    # 根据新的context_args信息,来创建新的context上下文对象
    context = browser.new_context(
        **context_args
    )
    return context

上述中cookie.json的内容怎么来,可以看这篇文章:【pytest、playwright】构建POM项目,以及解决登录问题,allure环境问题

case中的实现:

复制代码
import time

import playwright.sync_api
from playwright.sync_api import Page, BrowserContext
import pytest
from pages.explore.explore import ExplorePage
from playwright.sync_api import expect
class TestLogin():
    @pytest.fixture(autouse=True)
    def for_each(self, page:Page):
        self.login = ExplorePage(page)
        # 打开页面1,已登录的账号进行操作
        self.login.gotoURL()
        yield
        print('后置操作')


    def testmore02(self, more_context:BrowserContext):
        page2 = more_context.new_page()
        self.login2 = ExplorePage(page2)
        # 打开页面2,未登录的账号进行操作
        self.login2.gotoURL()
        time.sleep(5)
        print('账号2')

上述就会产生两个用户了,一个是playwright默认生成的,一个是我们手动创建的~

相关推荐
夏天的清晨3 分钟前
C++入门学习
开发语言·c++·学习
Patrick在香港4 分钟前
MCP 的 initialize 握手真的没了?67 行标准库实测 2026-07-28 规范
python·agent·claude·mcp·json-rpc
新鲜势力呀7 分钟前
PHP 文件上传系统实战:从上传卡顿到分片上传 + 秒传 + 云存储架构完整优化方案
开发语言·架构·php
vx_Biye_Design7 分钟前
springboot角色扮演服务平台65161-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·spring·课程设计
追烽少年x10 分钟前
从零构建一个3D点云预览器:Python + PySide6 + pyqtgraph 实战
python·3d
程序员老陆22 分钟前
从语法糖到类型系统:深度拆解 C++ Lambda 与可调用对象的“血缘关系”
开发语言·c++·程序设计
weixin_4404016923 分钟前
质朴的爬虫+数据处理
爬虫·python·数据分析·pandas
(Charon)23 分钟前
【C++面试】设计模式:手写单例模式与工厂模式
开发语言·c++
估值探索者24 分钟前
【Python量化系统工程实战 #01】数据存储选型 CSVSQLiteMySQL 对比与 SQLite 实战建库
开发语言·jvm·python·sqlite·api接口·数据api接口·股票数据api接口
计算机毕业编程指导师28 分钟前
计算机毕设答辩技巧:基于Hadoop+Django的公共交通运营数据分析与可视化系统怎么做 源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·spark·毕业设计·课程设计·交通运行