【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…

vue如何将对象中不为空的键值对拼接到地址栏后面

在我们日常开发中,在调get接口时,需要按照https://mp.fbwz.net/mp_blog/creaton/editor?not_checkout1&not_checkon2,这种类型进行调接口,那么我们需要把对象中那些不为空的参数拼接成此类型,可以使用以下方法&am…

云原生靶场kebernetesGoat、Metarget

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

flutter 保存一堆多语言翻译词条,由key和value组成

原理&#xff1a; 1.从String列表里面获取某个value&#xff1a; List<String> jsonStrings [{"name": "John", "age": 30},{"name": "Jane", "age": 25},{"name": "Bob", "age…

iOS App 上架指南及关键

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

网络入门基础:从零开始了解互联网世界

随着互联网技术的飞速发展&#xff0c;网络已经成为我们生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;网络都扮演着重要的角色。然而&#xff0c;对于初学者来说&#xff0c;网络世界可能显得复杂而陌生。本文旨在为大家提供一个网络入门基础的指南&#xff0…

Ubuntu安装nginx-http-flv,并获取统计信息

1、依赖安装 sudo apt-get install build-essential sudo apt-get install libpcre3 libpcre3-dev sudo apt-get install libssl-dev sudo apt-get install zlib1g sudo apt-get install zlib1g-dev 2、源码下载 NGINX 的版本应该大于或者等于 1.2.6&#xff0c;与其他版本的…

实战LangChain(三):深化交互——利用Neo4j提升聊天机器人的对话能力

实战LangChain(三):深化交互——利用Neo4j提升聊天机器人的对话能力 实战LangChain(一):构建您的第一个聊天机器人_langchai 机器人 实战LangChain(二):探索RAG——为聊天机器人注入知识-CSDN博客 实战LangChain(三):深化交互——利用Neo4j提升聊天机器人的对话…

2024年150道高频Java面试题(三)

5. String str“i” 与 String strnew String(“i”) 一样吗&#xff1f; String str "i" 和 String str new String("i") 在Java中并不完全相同&#xff0c;尽管它们都用于创建包含单个字符 ‘i’ 的字符串对象。 首先&#xff0c;String str "…

第三十三章 配置服务器访问 - SSL TLS 参数

文章目录 第三十三章 配置服务器访问 - SSL TLS 参数SSL TLS 参数可选参数错误页面复制服务器配置禁用对已配置服务器的访问删除服务器配置 第三十三章 配置服务器访问 - SSL TLS 参数 SSL TLS 参数 以下参数仅与使用 SSL/TLS 来保护 Web Gateway 和IRIS 之间的连接的安装相关…

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

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

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

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

TypeScript【入门】

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

音频干扰检测(频域方法)

测试音响系统的通路上是否有外部干扰时&#xff0c;可以通过播放1000赫兹的正弦波信号&#xff0c;在输出端采集数字信号&#xff08;I2S&#xff0c;TDD&#xff0c;A2B&#xff09;并保存为.wav文件。 然后通过以下Python代码检测。 import numpy as np import librosa im…

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

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

MySQL详细教程

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

MacBook终端安装brew命令

关于MacBook终端安装brew命令&#xff0c;官方的操作流程会报错 Failed during: /usr/bin/git fetch --force origin 有没有跟我一样的小伙伴遇到了一样的难题 终于 经过我来回来去的搜索找到了可以利用国内镜像源进行安装brew 简直非常Nice&#xff01;&#xff01;&#x…

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

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

7.3*3卷积核生成

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