【pytest、playwright】构建POM项目,以及解决登录问题,allure环境问题

目录

前言

1、文件目录

2、安装依赖

3、POM项目实战-案例:打开指定页面

目录结构:

pages中的代码:

cases中的代码:

4、解决登录问题 

问题: 

解决方案:

获取登录的用户信息(cookie):

将用户信息(cookie)填充到context上下文中

3、生成测试报告Allure

下载配置

生成测试报告: 


前言

  • python3.8
  • jdk1.8【使用allure生成测试报告时需要使用】【jdk的配置,市面上很多,我就不说了哈】
  • 创建一个普通的python项目即可
  • 项目模式:pom.---> 先在pages中封装页面,再在cases中写用例

1、文件目录

先创建一个py项目,建立一下目录:

目录说明:

  • auth:保存登录cookies信息
  • cases:测试用例
  • mocks:放置mock的数据todo
  • pages:存放封装的page页面对象
  • plugins:插件
  • conftest.py:本地插件+全局参数
  • pytest.ini:pytest的配置文件,包含base_url、截图、录屏等  

2、安装依赖

例如,我安装的依赖:

pip install playwright
playwright install
pip install pytest-playwright
pip install pytest-base-url
pip install allure-pytest

先安装这些,后面有需要再安装即可

使用命令行,自动生成一个文件:

pip3 freeze >requirements.txt


3、POM项目实战-案例:打开指定页面

pom项目的设计模式就是,先在pages封装登录页面,再去cases写用例

目录结构:

pages中的代码:

from playwright.sync_api import Page
class ExplorePage():def __init__(self,page:Page):self.page = pageself.pub = page.locator('.user-icon')def gotoURL(self):self.page.goto('http://localhost:5173/explore')

代码解读 :

  • __init__函数一般都是元素定位相关的
  • 其他函数,就是点击呀,双击呀,输入呀这类函数的封装,例如上述代码就是进入页面的这个函数封装

cases中的代码:

import timeimport pytest
from pages.explore.explore import ExplorePage
from playwright.sync_api import expect
class TestLogin():@pytest.fixture(autouse=True)def for_each(self,page):self.login = ExplorePage(page)self.login.gotoURL()yieldprint('后置操作')def testdemo(self):time.sleep(10)expect(self.login.pub).to_be_visible()print(self.login.pub.count())

代码解读:

  • 第一个函数for_each()顾名思义,就是指在每个case执行之前都会执行。原因是,它是由pytest的fixture装饰器修改的,并且值是autouse=true,这就意味着,这个方法会在每个case执行之前自动调用,而不需要在测试方法中显式调用
  • for_each这个函数,yield之前的部分是在case执行之前运行,yield之后的部分只在case执行结束后运行
  • testdemo这个函数,就是测试方法了,expect函数是playwright提供的函数,根据后面的代码,可知道这一行代码意思是期望xxx元素是可见的,否则会case执行失败
  • count()函数就是获取这个元素在当前页面出现了几次

4、解决登录问题 

问题: 

首先,我们需要明确,要解决的登录问题是什么:

  • 简单的网页 中,可以根据获取各个input框,我们去让代码输入用户名、密码,进而登录。这种实现没有问题,但麻烦在每个case都需要在执行之前先去登陆一次,实在浪费时间
  • 稍微复杂的网页中,在你进行登录时,是没有办法完全依靠自动化实现的,例如会有各种各样的验证码,验证文字等,当然了非要用自动化,也不是完全不可以,但有些复杂,得不偿失了

解决方案

        我们写一个用例,让他登录一次,然后把登陆后的用户验证信息 保存中文件中,在以后的case中,我们只需要获取这个文件内容,把他自动填充到浏览器上下文中即可~【即使是上面的问题2,我们依然可以这么做,因为我们可以在这个方法中打断点,手动登录后再继续运行代码即可】

获取登录的用户信息(cookie):

以下是目录:

代码:

import timefrom playwright.sync_api import sync_playwright
def run(playwright) -> None:browser = playwright.chromium.launch(channel='chrome', headless=False)context = browser.new_context()page = context.new_page()page.goto('http://localhost:5173/explore')time.sleep(10)storage = context.storage_state(path="D:/Project/redbook/web-ui/auth/cookie.json")context.close()browser.close()with sync_playwright() as playwright:run(playwright)

 代码解读:

  • 前面几行就是创建context,以及进入指定页面
  • 我们在操作时,可在time.sleep时间等待打上断点,我们手动登录结束后,再取消断点,继续执行
  • storage这一行,就是通过context上下文,或者到storage_state的内容,并保存到后面路径中指定的文件里

运行结束后,即可看到cookie.json文件中已经有值啦~

将用户信息(cookie)填充到context上下文中

 我们在conftest.py文件中,操作如下:

import pytest@pytest.fixture(scope='session')
def browser_context_args(browser_context_args, playwright, pytestconfig):"""添加context上下文参数,默认每个页面加载cookie:"""return {"storage_state":pytestconfig.rootpath.joinpath('auth/cookie.json'),**browser_context_args}

 代码解读:

  • session意味着这个fixture将在整个测试回话中只被创建一次
  • 设置context上下文中storage_state中的值:通过pytestconfig获取到根目录,并拼接上括号中的路径中所指的文件内容
  • **browser_context_args: 这是一个解包操作,它将传入的browser_context_args字典的所有键值对添加到返回的字典中。这允许测试人员或fixture用户自定义其他浏览器上下文参数,并将这些参数与storage_state一起返回

3、生成测试报告Allure

下载配置

下载: Central Repository: io/qameta/allure/allure-commandline/2.13.9

找到zip下载:

 

Windows下,直接解压缩,并加到bin目录下,复制路径,打开环境变量:

验证是否成功:

生成测试报告: 

命令1:

pytest --alluredir ./report

先批量把所有case执行一遍

如果说,有的case搜索不到,检查一下文件名是不是text_xxx或xxx_test,否则识别不到

命令2:

allure serve ./report

 生成测试报告,本地的话会自动打开浏览器的,如果失败了,可能是jdk有问题~

也有可能是环境有问题,你以管理员身份打开,再运行就可以了~

运行:

成功后,会自动打开本地浏览器:

 这期先这样啦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/773337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DasViewer电脑客户端打开文件夹时,一直显示崩溃,该怎么解决?

问题如图 如若用的是DasViewer V3.2.4Beta版本,可以换回3.2.1版本进行尝试。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便快捷的数据浏…

发送请求- header配置

请求头里是客户端的要求,把你的诉求告诉服务端,服务端按照你的要求返回数据 , 请求header需要严格全配置,把请求header全部传入,不能频繁访问,让后端知道它是正常请求 一般只配置User-Agent和Content Typ…

云原生靶场kebernetesGoat、Metarget

靶场 文章目录 靶场kebernetesGoat靶场安装Docker in DockerSSRF漏洞容器逃逸到主系统Docker CIS 基线分析Kubernetes CIS 安全基线分析分析被部署挖矿软件的容器镜像获取环境信息Hidden in layersRBAC最低权限配置错误使用 Sysdig Falco 进行运行时安全监控和检测 Metarget ke…

iOS App 上架指南及关键

引言 上架App Store是将iOS应用提交申请并上线的过程,旨在让应用在App Store上展示,吸引用户并获取流量。本文将介绍iOS上架的整体流程,并提供一些建议和注意事项。 一、iOS上架的整体流程 1. 申请开发者账号 首先,需要申请苹…

DevSecOps平台架构系列-亚马逊云AWS DevSecOps平台架构

目录 一、概述 二、AWS DevSecOps实施原则 2.1 尽早采用安全测试,加速问题反馈 2.2 优先考虑预防性安全控制 2.3 部署检测性安全控制时,确保有与之互补的响应性安全控制 2.4 安全自动化 2.5 总结 三、AWS DevSecOps关键组件 3.1 关键组件 3.2 关…

新能源汽车充电桩主板各模块成本占比解析

汽车充电桩主板是汽车充电桩的重要组件,主要由微处理器模块、通信模块、控制模块、安全保护模块、传感器模块等多个模块构成。深入探究各模块在总成本中的比重,我们可以更好地优化成本结构、提高生产效率,并为未来的技术创新和市场需求变化做…

TypeScript【入门】

TypeSript ts是js的一个超集,解决js类型支持 js: 动态类型 ts:静态类型 代码执行的顺序是先编译在执行 发现错误更早 为什么要添加类型支持? 优势有什么? 全局安装 npm i -g typescript tsc -v 简化运行ts的步骤 typescript常用类型 类型…

C++类和对象、面向对象编程 (OOP)

文章目录 一、封装1.抽象、封装2.类和对象(0)学习视频(1)类的构成(2)三种访问权限(3)struct和class的区别(4)私有的成员变量、共有的成员函数(5)类内可以直接访问私有成员,不需要经过对象 二、继承三、多态1.概念2.多态的满足条件3.多态的使用条件4.多态原理剖析5.纯…

MySQL详细教程

文章目录 前言一、数据库管理1.查看已有的数据库2.创建数据库3.删除数据库4.进入数据库 二、 数据表管理1.查看当前数据库下的所有数据表2.创建数据表3.删除表4.查看表结构 三、常用数据类型1.整型tinyintintbigint 2.浮点型floatdoubledecimal 3.字符型char(m)varchar(m)textm…

linux在使用重定向写入文件时(使用标准C库函数时)使处理信号异常(延时)--问题分析

linux在使用重定向写入文件时(使用标准C库函数时)使处理信号异常(延时)–问题分析 在使用alarm函数进行序号处理测试的时候发现如果把输出重定向到文件里面会导致信号的处理出现严重的延迟(ubuntu18) #include <stdio.h> #include <stdlib.h> #include <unist…

7.3*3卷积核生成

1.卷积核 在数字图像处理中的各种边沿检测、滤波、腐蚀膨胀等操作都离不开卷积核的生成。下面介绍如何生成各种3X3的卷积核。为后面的数字图像操作打下基础。   由于图像经过卷积操作后会减少两行两列&#xff0c;因此在生成卷积核的时候一般会对图像进行填充&#xff0c;填充…

【CXL协议-ARB/MUX层(5)】

5.0 Compute Express Link ARB/MUX 前言&#xff1a; 在CXL协议中&#xff0c;ARB/MUX层&#xff08;Arbitration/Multiplexer layer&#xff09;是负责管理资源共享和数据通路选择的一层。CXL协议包含了几个子协议&#xff0c;主要有CXL.io、CXL.cache 和 CXL.memory。ARB/MU…

LeetCode 面试经典150题 383.赎金信

题目&#xff1a; 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 思路&#x…

计算机网络——数据链路层(差错控制)

计算机网络——数据链路层&#xff08;差错控制&#xff09; 差错从何而来数据链路层的差错控制检错编码奇偶校验码循环冗余校验&#xff08;CRC&#xff09;FCS 纠错编码海明码海明距离纠错流程确定校验码的位数r确定校验码和数据位置 求出校验码的值检错并纠错 我们今年天来继…

【Linux】-Linux下的编辑器Vim的模式命令大全及其自主配置方法

目录 1.简单了解vim 2.vim的模式 2.1命令模式 2.2插入模式 2.3底行模式 3.vim各模式下的命令集 3.1正常&#xff08;命令模式下&#xff09; 3.1.1光标定位命令 3.1.2 复制粘贴 3.1.3 删除 3.1.4 撤销 3.1.5大小写转换 3.1.6替换 「R」&#xff1a;替换光标所到之处的字符&…

ComfyUI SDWebUI升级pytorch随记

目前使用的版本是去年10月的1.6版本&#xff0c;有点老。希望支持新的特性&#xff0c;于是乎开始作死。从升级torch开始。先看看已有的版本&#xff1a; (venv) rootubuntu-sd-server:~# pip show torch Name: torch Version: 2.0.1 Summary: Tensors and Dynamic neural net…

【贪心]【字符串】【分类讨论】420 强密码检验器

本文涉及知识点 贪心 字符串 分类讨论 LeetCode420 强密码检验器 满足以下条件的密码被认为是强密码&#xff1a; 由至少 6 个&#xff0c;至多 20 个字符组成。 包含至少 一个小写 字母&#xff0c;至少 一个大写 字母&#xff0c;和至少 一个数字 。 不包含连续三个重复字…

Reactor 模式全解:实现非阻塞 I/O 多路复用

Reactor网络模式是什么&#xff1f; Reactor网络模式时目前网络最常用的网络模式。如果你使用Netty&#xff0c;那么你在使用Reactor;如果你使用Twisted,那么你子啊使用Reactor;如果你使用netpoll&#xff0c;那么你在使用Reactor。 这里先给出答案&#xff1a;Reactor I/O多…

204基于matlab的图像融合

基于matlab的图像融合&#xff0c;包括三种方式&#xff0c;加权、PCA、IHS变换。比较三者融合后的图像差异。程序已调通&#xff0c;可直接运行。 204 matlab 图像融合 信息融合 - 小红书 (xiaohongshu.com)

【二叉树】Leetcode 94. 二叉树的中序遍历【简单】

二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 解题思路 中序遍历是一种二叉树遍历方式&#xff0c;按照“左根右”的顺序遍历二叉树节点。 1、递归…