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

相关推荐
DLYSB_2 小时前
存储运维实战:基于 Ceph Event 监听与 Python 适配器的分布式存储健康度物理声光响应架构
运维·ceph·python·报警灯
阿童木写作2 小时前
跨境图片翻译工具多合一,批量图片视频字幕翻译加智能抠图
人工智能·python·音视频·语音识别
隐积3 小时前
3.1.7.Qt容器大家族(3):QVariant——万能盒子
开发语言·qt
阿童木写作4 小时前
Python实现Temu图片批量翻译自动化教程
运维·人工智能·python·自动化
就是一只白5 小时前
复制地理信息python版本
python
看浪的路人5 小时前
第1讲:Agent 到底是什么?和 Chatbot 有什么区别
python·ai
名字还没想好☜6 小时前
Next.js ‘use client‘ 到底加在哪:Server/Client Components 边界与常见报错
开发语言·前端·javascript·react·next.js
瓦学妹6 小时前
什么是网络索引?它是如何工作的?
大数据·网络·python·网络爬虫
天天爱吃肉82186 小时前
商用车多体动力学实战笔记|第6篇:动力传动系统(发动机、变速箱、分动器、TCS、LSD限滑差速)
大数据·人工智能·笔记·python·嵌入式硬件·汽车
初级代码游戏7 小时前
iOS开发 Swift 速记1:变量和基本数据类型
开发语言·ios·swift