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

相关推荐
站大爷IP17 分钟前
Python文件操作的"保险箱":with语句深度实战指南
python
运器12324 分钟前
【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)
开发语言·人工智能·python·算法·ai·散列表·ai编程
whoarethenext40 分钟前
使用 C++ 实现 MFCC 特征提取与说话人识别系统
开发语言·c++·语音识别·mfcc
ITfeib1 小时前
Flutter
开发语言·javascript·flutter
想躺平的咸鱼干1 小时前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
Owen_Q2 小时前
Denso Create Programming Contest 2025(AtCoder Beginner Contest 413)
开发语言·算法·职场和发展
·云扬·2 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
liulilittle3 小时前
C++ i386/AMD64平台汇编指令对齐长度获取实现
c语言·开发语言·汇编·c++
巴里巴气3 小时前
selenium基础知识 和 模拟登录selenium版本
爬虫·python·selenium·爬虫模拟登录
19893 小时前
【零基础学AI】第26讲:循环神经网络(RNN)与LSTM - 文本生成
人工智能·python·rnn·神经网络·机器学习·tensorflow·lstm