使用pytest+selenium+allure实现web页面自动化测试

测试文件

  • base 基本方法
  • data 测试数据
  • page web页面相关操作
  • image 测试截图
  • log 日志文件
  • report 测试报告文件
  • temp 临时文件
  • tool 文件读取,发邮件文件
  • TestCases 测试用例

在page下的__init__.py文件下配置

import os
import time
from selenium.webdriver.common.by import By# 项目路径
PROJECT_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 图片路径
IMAGE_PATH = os.path.join(PROJECT_PATH, 'image')
# 测试数据路径
DATA_PATH = os.path.join(PROJECT_PATH, 'data')
# 日志路径
LOG_PATH = os.path.join(PROJECT_PATH, 'log')
# 测试报告
REPORT_PATH = os.path.join(PROJECT_PATH, 'report', 'html')
# 临时文件
TEMP_PATH = os.path.join(PROJECT_PATH, 'temp')
# 请求url
url = "http://cal.apple886.com/""""  邮件信息  """
email_host = "smtp.qq.com"  # SMTP服务器
email_sender = '2022204437@qq.com'  # 发件人
email_license = 'jxyvidactsaiicja'  # 授权码
email_receivers = ['2022204437@qq.com']  # 收件人(可以群发)""" 以下为测试数据配置文件 """
image_path = os.path.join(IMAGE_PATH, '%serror.png' % time.strftime("%Y%m%d%H%M%S"))"""  以下为测试数据配置文件   """
add_data = os.path.join(DATA_PATH, 'add.json')
multi_data = os.path.join(DATA_PATH, 'multi.json')
subtr_data = os.path.join(DATA_PATH, 'subtr.json')"""  以下为logger配置文件   """
log_filename = os.path.join(LOG_PATH, '%sdemo.log' % time.strftime("%Y%m%d%H%M%S"))
log_when = "midnight"
log_interval = 1
log_backupCount = 30
log_encoding = "utf-8"
log_filemode = "w"
log_format = "%(asctime)s -[%(name)s]- %(levelname)s---[%(filename)s [%(funcName)s:%(lineno)s]] - %(message)s"
log_datefmt = "%Y-%m-%d %H:%M:%S"""""   以下为计算机配置数据   """
computer_add = By.XPATH, '//*[@id="simpleAdd"]'
computer_subtr = By.XPATH, '//*[@id="simpleSubtr"]'
computer_multi = By.XPATH, '//*[@id="simpleMulti"]'
computer_divi = By.XPATH, '//*[@id="simpleDivi"]'
computer_clear = By.XPATH, '//*[@id="simpleClearAllBtn"]'
computer_equal = By.XPATH, '//*[@id="simpleEqual"]'
computer_value = By.XPATH, '//*[@id="resultIpt"]'

在base下创建一个webpage.py文件

from selenium.webdriver.support.wait import WebDriverWait
from web.counter.base.logger import GetLogger
from web.counter import pagelog = GetLogger().get_logger()class WebPage:def __init__(self, driver):log.info("初始化driver{}".format(driver))self.driver = driver# 查找元素def base_find_element(self, loc, timeout=30, poll_frequency=0.5):log.info("正在查找元素{}".format(loc))return WebDriverWait(self.driver, timeout=timeout, poll_frequency=poll_frequency).until(lambda x: x.find_element(*loc))# 点击def base_click(self, loc):log.info("点击元素{}".format(loc))self.base_find_element(loc).click()# 输入def base_input(self, loc, key):log.info("输入元素{}输入值为{}".format(loc,key))self.base_find_element(loc).clear()self.base_find_element(loc).send_keys(key)# 获取文本def base_get_test(self, loc):log.info("获取文本{}".format(loc))return self.base_find_element(loc).text# 获取属性值def base_get_value(self, loc):log.info("获取{}属性值".format(loc))return self.base_find_element(loc).get_attribute('value')# 截图def base_get_image(self):log.error("错误!!!错误!!!错误!!!")self.driver.get_screenshot_as_file(page.image_path)

在base下创建一个driver.py文件

from selenium import webdriver
from web.counter import pageclass GetDriver:driver = None@classmethoddef get_driver(cls):if cls.driver is None:cls.driver = webdriver.Edge()cls.driver.maximize_window()cls.driver.get(page.url)return cls.driver@classmethoddef quit_driver(cls):if cls.driver:cls.driver.quit()cls.driver = None

在base下创建一个logger.py文件

import logging.handlers
from web.counter import pageclass GetLogger:logger = None@classmethoddef get_logger(cls):if cls.logger is None:# 获取日志器cls.logger = logging.getLogger()# 获取日志器级别cls.logger.setLevel(logging.INFO)# 获取处理器 控制台sh = logging.StreamHandler()# 获取处理器 文件-以以时间分隔th = logging.handlers.TimedRotatingFileHandler(filename=page.log_filename,when=page.log_when,interval=page.log_interval,backupCount=page.log_backupCount,encoding=page.log_encoding)fm = logging.Formatter(page.log_format)sh.setFormatter(fm)th.setFormatter(fm)cls.logger.addHandler(th)cls.logger.addHandler(sh)return cls.logger

在page下创建一个add_page.py文件

from selenium.webdriver.common.by import Byfrom web.counter.base.webpage import WebPage
from web.counter import pageclass AddPage(WebPage):# 点击数字def page_click_num(self, num):for n in str(num):loc = By.XPATH, '//*[@id="simple{}"]'.format(n)self.base_click(loc)# 点击加号def page_click_add(self):self.base_click(page.computer_add)# 点击等于def page_click_equal(self):self.base_click(page.computer_equal)# 获取结果def page_get_value(self):return self.base_get_value(page.computer_value)# 清屏def page_click_clear(self):self.base_click(page.computer_clear)# 截图def page_get_image(self):self.base_get_image()# 组装加法def page_add(self, a, b):self.page_click_num(a)self.page_click_add()self.page_click_num(b)self.page_click_equal()

在TestCases 下创建一个test_add.py文件

from time import sleep
import pytest
from web.counter.page.add_page import AddPage
from web.counter.base.driver import GetDriver
from web.counter.tool.read_json import GetJson
from web.counter.base.logger import GetLogger
from web.counter import pagelog = GetLogger().loggerclass TestAdd:def setup_class(self):self.computer = AddPage(GetDriver().get_driver())def teardown_class(self):GetDriver().quit_driver()@pytest.mark.parametrize("a, b, result", GetJson().get_data(page.add_data))def test_add_computer(self, a, b, result):self.computer.page_click_clear()self.computer.page_add(a, b)try:assert self.computer.page_get_value() == str(result)except:log.error("错误")sleep(1)self.computer.page_get_image()raise

在tool下创建一个read_json.py文件

import jsonclass GetJson:data_lists = Nonedata_dic = None# 读取json文件@classmethoddef read_json(cls, json_path):with open(json_path, "r", encoding="utf-8") as f:return json.load(f)# 获取测试数据@classmethoddef get_data(cls, json_path):cls.data_dic = cls.read_json(json_path)cls.data_lists = list()for data in cls.data_dic.values():cls.data_lists.append((data.get("a"), data.get("b"), data.get("result")))return cls.data_lists

在tool下创建一个send_emails.py文件

import time
import zipfile
import os
from email.mime.application import MIMEApplication
from web.counter import page
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipartclass SendEmails:def __init__(self):self.mime = MIMEMultipart()self.allure_report = Noneself.report_path = page.REPORT_PATHself.temp_path = page.TEMP_PATHdef send_email(self):self.mime['Subject'] = '%sxxx测试报告' % time.strftime('%Y年%m月%d日 %H:%M:%S ')content = 'hello, this is email content.'textApart = MIMEText(content)zip_Apart = MIMEApplication(open(SendEmails().make_zip, 'rb').read())zip_Apart.add_header('Content-Disposition', 'attachment', filename='allure_report.zip')self.mime.attach(textApart)self.mime.attach(zip_Apart)try:server = smtplib.SMTP(page.email_host)server.login(page.email_sender, page.email_license)server.sendmail(page.email_sender, page.email_receivers, self.mime.as_string())print('发送成功')server.quit()except smtplib.SMTPException as e:print('error:', e)  # 打印错误# 打包目录为zip文件(实际未压缩)@propertydef make_zip(self):if not os.path.exists(self.temp_path):os.makedirs(self.temp_path)self.allure_report = os.path.join(self.temp_path, 'allure_report.zip')zip_file = zipfile.ZipFile(self.allure_report, 'w')for present, dirs, files in os.walk(self.report_path):"""present:现在的目录dirs:该目录下包含的子目录files:该目录下包含的文件"""for file in files:pathfile = os.path.join(present, file)relpath = os.path.relpath(pathfile, page.PROJECT_PATH)  # 相对路径# ZIP_STORED:实际上并未压缩。zip_file.write(pathfile, relpath, zipfile.ZIP_STORED)zip_file.close()return self.allure_reportif __name__ == '__main__':report = page.REPORT_PATHtemp = page.TEMP_PATHprint(report)print(temp)SendEmails().send_email()print(SendEmails().allure_report)print("压缩包创建完成")# import zmail
# from web.counter import page
#
#
# def send_report():
#     """发送报告"""
#
#     with open(page.REPORT_PATH, encoding='utf-8') as f:
#         content_html = f.read()
#     try:
#         mail = {
#             'from': '2022204437@qq.com',
#             'subject': '最新的测试报告邮件',
#             'content_html': content_html,
#             'attachments': [page.REPORT_PATH, ]
#         }
#         server = zmail.server(*page.EMAIL_INFO.values())
#         server.send_mail(page.ADDRESSEE, mail)
#         print("测试邮件发送成功!")
#     except Exception as e:
#         print("Error: 无法发送邮件,{}!", format(e))
#
#
# if __name__ == "__main__":
#     '''请先在config/conf.py文件设置QQ邮箱的账号和密码'''
#     send_report()

web自动化大体就是这样,然后测试数据可以自己写

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

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

相关文章

10 Vue3中v-html指令的用法

概述 v-html主要是用来渲染富文本内容,比如评论信息,新闻信息,文章信息等。 v-html是一个特别不安全的指令,因为它会将文本以HTML的显示进行渲染,一旦文本里面包含一些恶意的js代码,可能会导致整个网页发…

12、Qt:用QProcess类启动外部程序:简单使用

一、说明 简单使用:在一个函数中,使用QProcess类的临时对象调用可执行文件exe,只有这个exe执行完了,这个函数才往下执行,一次性打印出exe所有输出信息;复杂使用:创建QProcess类的全局对象&…

Python---TCP 客户端程序开发

1. 开发 TCP 客户端程序开发步骤回顾 创建客户端套接字对象和服务端套接字建立连接发送数据接收数据关闭客户端套接字 2. socket 类的介绍 导入 socket 模块 import socket 创建客户端 socket 对象 socket.socket(AddressFamily, Type) 参数说明: AddressFamily 表示IP地…

重塑数字生产力体系,生成式AI将开启云计算未来新十年?

科技云报道原创。 今天我们正身处一个历史的洪流,一个巨变的十字路口。生成式AI让人工智能技术完全破圈,带来了机器学习被大规模采用的历史转折点。 它掀起的新一轮科技革命,远超出我们今天的想象,这意味着一个巨大的历史机遇正…

医院影像科PACS系统源码,医学影像系统,支持MPR、CPR、MIP、SSD、VR、VE三维图像处理

PACS系统是医院影像科室中应用的一种系统,主要用于获取、传输、存档和处理医学影像。它通过各种接口,如模拟、DICOM和网络,以数字化的方式将各种医学影像,如核磁共振、CT扫描、超声波等保存起来,并在需要时能够快速调取…

057:vue组件方法中加载匿名函数

第057个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

宽带阻抗匹配的工程实现-第一步,端口驻波仿真

概要 ADS仿真,Matlab仿真,宽带阻抗匹配,smith圆图。 其实阻抗匹配我工作以来经常说,也经常做,但是基本上都是直接在印制板上进行调试。现在想先用仿真软件直接设计出来,才发现很多东西嘴上说容易&#xf…

力扣每日一题day36[112.路径总和]

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 叶子节点 是指没有子节点…

nuxt打包占用磁盘IO

目录 前言排除过程 前言 jenkins运行打包,总是要卡一段时间,磁盘IO很高。我手动执行后的确发现了这个问题,如下图所示。 排除过程 我的方案很原始,利用git恢复到以前的版本,抽检,搞了差不多两个小时&am…

Megatron模型并行研究

Megatron模型并行研究 1. 技术调研 a. Megatron-LM Megatron-LM针对的是特别大的语言模型,使用的是模型并行的训练方式。但和普通的模型并行不同,他采用的其实是张量并行的形式,具体来说就是将一个层切开放到不同的GPU上,属于层…

XC8284B 高效率12MHz,34V升压LED驱动器 LED背光驱动、闪光灯

XC8284B是一个升压转换器驱动多达9个系列白色LED的单节离子电池设计的。其300mV反馈电压降低功率损耗,提高效率。优化后的工作频率可以满足LC滤波器小值和低工作电流的要求,具有较高的效率。内置软启动功能,可减少浪涌电流。微型封装类型为节…

论文中公式怎么降重 papergpt

大家好,今天来聊聊论文中公式怎么降重,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 论文中公式怎么降重 一、引言 在论文撰写过程中,公式是表达学…

【网络技术设备安全】BGP 基础与概述-2-中转 AS 中的 IBGP 路由传递

0x01 中转 AS 中的 IBGP 路由传递 参考该图: 上图,我们模拟一个 1.0 的路由通过 AS 65101 来传递 1:通过图可知,A 与 B 之间的 Peer 为 EBGP,B 与 E 之间为 Peer IBGP,E 与 F 之间为 Peer EBGP 邻接 2&a…

安卓好用的python编辑器,安卓平台python编辑器

本篇文章给大家谈谈安卓上好用的python编辑软件有哪些,以及安卓上好用的python编辑软件推荐,希望对各位有所帮助,不要忘了收藏本站喔。 1. 简介 Thonny是基于python内置图形库tkinter开发出来的支持多平台(windows,Mac,Linux)的python IDE&am…

文献速递:生成对抗网络医学影像中的应用—— CG-3DSRGAN:用于从低剂量PET图像恢复图像质量的分类指导的3D生成对抗网络

文献速递:生成对抗网络医学影像中的应用—— CG-3DSRGAN:用于从低剂量PET图像恢复图像质量的分类指导的3D生成对抗网络 本周给大家分享文献的主题是生成对抗网络(Generative adversarial networks, GANs)在医学影像中的应用。文献…

[已解决]HttpMessageNotReadableException: JSON parse error: Unexpected character:解析JSON时出现异常的问题分析与解决方案

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

人工智能对网络安全的影响

技术的快速发展带来了不断增长的威胁环境,网络犯罪分子和恶意行为者利用我们互联世界中的漏洞。在这个数字时代,数据泄露和网络攻击呈上升趋势,仅靠传统的安全措施已经不够了。人工智能 (AI) 的进步彻底改变了网络安全…

污水处理厂可视化:让环保与科技共舞

随着科技的飞速发展,我们的生活环境变得越来越美好。然而,随着城市化进程的加快,污水处理问题也日益凸显。如何有效、高效地处理污水,成为了一个亟待解决的问题。而“污水处理厂可视化”技术的出现,为这个问题提供了一…

opencv静态链接error LNK2019

opencv 3.1.0 静态库,包括以下文件 只链接opencv_world310d.lib,报错 opencv_world310d.lib(matrix.obj) : error LNK2019: 无法解析的外部符号 _ippicvsFlip_16u_I8,该符号在函数 "enum IppStatus (__stdcall*__cdecl cv::getFlipFu…

论文阅读——RS DINO

RS DINO: A Novel Panoptic Segmentation Algorithm for High Resolution Remote Sensing Images 基于MASKDINO模型,加了两个模块: BAM:Batch Attention Module 遥感图像切分的时候把一个建筑物整体比如飞机场切分到不同图片中,…