【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默认生成的,一个是我们手动创建的~

相关推荐
尘中远8 分钟前
Qt高性能绘图库QIm——实现二维三维科学绘图
开发语言·qt·信息可视化
雨辰AI9 分钟前
从零搭建大模型本地运行环境|Python+CUDA 基础配置避坑大全
大数据·开发语言·人工智能·python·ai·ai编程·ai写作
DogDaoDao19 分钟前
【第 05 篇】Python的字典与集合
开发语言·python·集合·字典
兰令水32 分钟前
leecodecode【单调栈】【2026.6.12打卡-java版本】
java·开发语言·算法
涛声依旧-底层原理研究所34 分钟前
混合检索 + 重排:让 AI Agent 拥有「既全又准」的认知骨架
人工智能·python
leagsoft_100335 分钟前
零信任选型五刀法——零信任怎么选?五个问题,五条红线
开发语言·php
努力写A题的小菜鸡37 分钟前
01-PyTorch加载数据初认识(dataset运用)
人工智能·pytorch·python
abcy07121340 分钟前
python fastapi celery hdfs 异步上传
python·hdfs·fastapi
Dxy123931021642 分钟前
Python多线程如何操作全局变量:从踩坑到最佳实践
python
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第112题】【并发篇】第12题:AQS 中节点的入队时机有哪些?
java·开发语言·面试