Python Selenium搭建UI自动化测试框架
自动化测试是软件测试中非常重要的一部分,可以提高测试效率和测试覆盖率。在UI自动化测试中,Selenium是非常流行的工具。本文将介绍如何使用Python和Selenium搭建UI自动化测试框架。
一、环境准备
在开始搭建UI自动化测试框架之前,需要先安装Python和Selenium。可以从Python官网下载Python安装包,并使用pip命令安装Selenium。
二、框架目录结构
在搭建UI自动化测试框架之前,需要先规划好框架的目录结构。以下是一个比较完整的目录结构:
├── config
│ ├── __init__.py
│ ├── config.ini
│ └── logger.ini
├── data
│ ├── __init__.py
│ ├── test_data.xlsx
│ └── test_data.json
├── logs
│ ├── __init__.py
│ └── test.log
├── page
│ ├── __init__.py
│ └── login_page.py
├── report
│ ├── __init__.py
│ └── test_report.html
│ └── screenshots
│ ├── test_login_failure_2022-05-01_08-30-00.png
│ └── test_login_success_2022-05-01_08-30-00.png
├── testcase
│ ├── __init__.py
│ └── test_login.py
├── utils
│ ├── __init__.py
│ ├── driver.py
│ ├── logger.py
│ └── read_config.py
│ └── take_screenshot.py
├── .gitignore
├── README.md
├── requirements.txt
└── run.py
config:存放配置文件,包括config.ini和logger.ini。
data:存放测试数据,包括Excel和JSON格式的数据。
logs:存放日志文件,包括test.log。
page:存放页面对象,每个页面对应一个.py文件。
report:存放测试报告,包括test_report.html。
screenshots:用于存放测试过程中的截图。
testcase:存放测试用例,每个用例对应一个.py文件。
utils:存放工具类,包括driver.py、logger.py和read_config.py。
.gitignore:Git忽略文件列表。
README.md:项目说明文件。
requirements.txt:Python依赖包列表。
run.py:测试执行入口。
三、框架搭建
1.创建项目目录
在本地创建一个项目目录,进入该目录,执行以下命令:
mkdir config data logs page report report/screenshots testcase utils
touch .gitignore README.md requirements.txt run.py
cd config && touch __init__.py config.ini logger.ini && cd ..
cd data && touch __init__.py test_data.xlsx test_data.json && cd ..
cd logs && touch __init__.py test.log && cd ..
cd page && touch __init__.py login_page.py && cd ..
cd report && touch __init__.py test_report.html && cd ..
cd testcase && touch __init__.py test_login.py && cd ..
cd utils && touch __init__.py driver.py logger.py read_config.py && cd ..
2.安装依赖包
在项目目录下执行以下命令,安装依赖包:
pip install selenium openpyxl configparser loguru
3.编写配置文件
在config目录下的config.ini文件中,配置浏览器类型和网站地址:
[Browser]
browser_name = chrome
[URL]
base_url = https://www.example.com
在config目录下的logger.ini文件中,配置日志文件路径和日志级别:
[loggers]
keys=root
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=formatter
[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=formatter
args=(sys.stdout,)
[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=formatter
args=('logs/test.log', 'D', 1, 30)
[formatter_formatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S
4.编写工具类
在utils目录下的driver.py文件中,封装获取浏览器驱动的方法:
import os
from selenium import webdriver
from configparser import ConfigParser
def get_driver():
config = ConfigParser()
config.read(os.path.join(os.path.dirname(__file__), '../config/config.ini'))
browser_name = config.get('Browser', 'browser_name')
if browser_name.lower() == 'chrome':
return webdriver.Chrome()
elif browser_name.lower() == 'firefox':
return webdriver.Firefox()
elif browser_name.lower() == 'edge':
return webdriver.Edge()
else:
raise ValueError('Unsupported browser: {}'.format(browser_name))
在utils目录下的logger.py文件中,封装日志记录的方法:
import os
from loguru import logger
from configparser import ConfigParser
config = ConfigParser()
config.read(os.path.join(os.path.dirname(__file__), '../config/logger.ini'))
logger.add(config.get('handler_fileHandler', 'class'), level=config.get('logger_root', 'level'), rotation=config.getint('handler_fileHandler', 'args')[2], retention=config.getint('handler_fileHandler', 'args')[3])
def get_logger(name):
return logger.bind(name=name)
在utils目录下的read_config.py文件中,封装读取配置文件的方法:
import os
from configparser import ConfigParser
config = ConfigParser()
config.read(os.path.join(os.path.dirname(__file__), '../config/config.ini'))
def get_base_url():
return config.get('URL', 'base_url')
在utils目录下新增了一个take_screenshot.py文件,用于封装截图的方法:
import os
from datetime import datetime
from utils.driver import get_driver
def take_screenshot(name):
driver = get_driver()
screenshot_dir = os.path.join(os.path.dirname(__file__), '../report/screenshots')
os.makedirs(screenshot_dir, exist_ok=True)
screenshot_file = os.path.join(screenshot_dir, '{}_{}.png'.format(name, datetime.now().strftime('%Y-%m-%d_%H-%M-%S')))
driver.save_screenshot(screenshot_file)
5.编写页面对象
在page目录下的login_page.py文件中,封装登录页面的元素定位和操作方法:
from selenium.webdriver.common.by import By
from utils.driver import get_driver
class LoginPage:
url = '/login.html'
username_input = (By.ID, 'username')
password_input = (By.ID, 'password')
login_button = (By.ID, 'login-button')
def __init__(self):
self.driver = get_driver()
def open(self):
self.driver.get(get_base_url() + self.url)
def close(self):
self.driver.quit()
def login(self, username, password):
self.driver.find_element(*self.username_input).send_keys(username)
self.driver.find_element(*self.password_input).send_keys(password)
self.driver.find_element(*self.login_button).click()
6.编写测试用例
在testcase目录下的test_login.py文件中,编写登录测试用例:
import unittest
from page.login_page import LoginPage
from utils.take_screenshot import take_screenshot
class TestLogin(unittest.TestCase):
def setUp(self):
self.page = LoginPage()
def tearDown(self):
self.page.close()
def test_login_success(self):
self.page.open()
self.page.login('admin', 'admin123')
self.assertIn('Welcome', self.page.driver.title)
def test_login_failure(self):
self.page.open()
self.page.login('admin', 'wrong_password')
self.assertIn('Login failed', self.page.driver.page_source)
take_screenshot('test_login_failure')
7.编写测试执行入口
在run.py文件中,编写测试执行入口:
import unittest
from datetime import datetime
from utils.logger import get_logger
from report import HTMLTestRunner
logger = get_logger(__name__)
if __name__ == '__main__':
logger.info('Start testing...')
suite = unittest.defaultTestLoader.discover('testcase')
report_file = 'report/test_report_{}.html'.format(datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
with open(report_file, 'wb') as f:
runner = HTMLTestRunner.HTMLTestRunner(stream=f, title='Test Report', description='Test Result')
runner.run(suite)
logger.info('Testing finished. Report file: {}'.format(report_file))
# 将截图嵌入测试报告
with open(report_file, 'r+', encoding='utf-8') as f:
content = f.read()
for root, dirs, files in os.walk('report/screenshots'):
for file in files:
screenshot_file = os.path.join(root, file)
if 'test_report' not in screenshot_file:
screenshot_name = os.path.splitext(os.path.basename(screenshot_file))[0]
screenshot_time = datetime.strptime(screenshot_name.split('_')[-2], '%Y-%m-%d')
screenshot_url = os.path.join(get_base_url(), screenshot_file)
content = content.replace('{}"'.format(screenshot_name), '{}" width="50%"'.format(screenshot_url))
f.seek(0)
f.write(content)
四、测试执行
在项目目录下执行以下命令,执行测试:
python run.py
测试完成后,测试报告将保存在report目录下的test_report.html文件中。
五、Jenkins持续集成
持续集成是软件开发过程中非常重要的一环,可以帮助开发团队实现快速迭代和快速交付。Jenkins是一个开源的持续集成工具,可以帮助团队实现自动化构建、自动化测试和自动化部署。本文将介绍如何使用Jenkins进行UI自动化测试的持续集成。
1.Jenkins安装和配置
安装Jenkins
Jenkins可以从官网下载安装包,根据操作系统选择相应的安装包进行安装。安装完成后,启动Jenkins服务。
安装插件
Jenkins需要安装一些插件来支持UI自动化测试,包括:
Selenium Plugin:用于集成Selenium和Jenkins。
HTML Publisher Plugin:用于生成测试报告。
在Jenkins的插件管理页面中,搜索并安装这两个插件。
配置Jenkins
在Jenkins的系统管理页面中,配置全局环境变量和全局工具配置。
配置全局环境变量:设置PYTHONPATH变量,指向Python的安装目录。
配置全局工具:添加Python和浏览器驱动的安装路径。
2.Jenkins配置UI自动化测试任务
创建Jenkins任务
在Jenkins的首页中,点击“新建任务”,选择“自由风格软件项目”,输入任务名称,点击“确定”。
配置源码管理
在任务配置页面中,选择“Git”作为源码管理方式,填写代码仓库地址和分支信息。
配置构建触发器
在任务配置页面中,选择“构建触发器”,配置定时构建或者代码提交构建。
配置构建环境
在任务配置页面中,选择“构建环境”,配置Python环境和浏览器驱动。
配置构建步骤
在任务配置页面中,选择“构建步骤”,配置构建脚本。
构建脚本如下:
#!/bin/bash
# 安装依赖包
pip install -r requirements.txt
# 执行测试
python run.py
# 生成测试报告
cp report/test_report.html $WORKSPACE
# 发布测试报告
echo '<h2>UI自动化测试报告</h2>' > report.html
echo '<iframe src="test_report.html" width="100%" height="600"></iframe>' >> report.html
cp report.html $WORKSPACE
配置构建后操作
在任务配置页面中,选择“构建后操作”,配置测试报告的发布方式。
发布方式如下:
发布HTML测试报告:选择“HTML Publisher Plugin”,设置测试报告路径为$WORKSPACE/report.html。
3.Jenkins测试执行
在Jenkins的任务页面中,点击“立即构建”,Jenkins将自动拉取代码,执行测试,并生成测试报告。测试报告将发布到Jenkins的测试报告页面中。
本文主要介绍了如何使用Python Selenium框架搭建UI自动化测试框架,并给出了一个完整的目录结构示例进行参考。通过UI自动化测试框架,可以帮助团队快速构建自动化测试框架,提高测试效率和测试质量。希望本文能对你有所帮助。
相关文章:
Python Selenium搭建UI自动化测试框架
自动化测试是软件测试中非常重要的一部分,可以提高测试效率和测试覆盖率。在UI自动化测试中,Selenium是非常流行的工具。本文将介绍如何使用Python和Selenium搭建UI自动化测试框架。 一、环境准备 在开始搭建UI自动化测试框架之前,需要先安装…...
开发大语言模型需要数据?算法?算力?
开发大语言模型的关键是什么。最近看到不少文章为了流量,甚至连 5G 通讯都说成了是开发大语言模型的关键 其实从前面的原理介绍,不难看出,大语言模型的其中一个关键点是数据。 关键一:数据 训练数据主要是所谓的语料库。今天的很多语言模型的语料库主要有以下几种: …...
CSS选择器的常见用法
目录 1、CSS编写方式 2.CSS选择器 1.标签选择器 2.类选择器 3.id选择器 4.后代选择器 3.CSS属性 CSS叫做"层叠样式表",作用就是装饰网页.类似于我们平时所说的化妆。 字体、大小、间距、颜色、位置、边框、背景等等统称为样式,用来描述一个网页。 …...
Oracle EBS修改密码
FNDCPASS修改密码 用户名必须出现在FND_USER或FND_ORACLE_USERID表中。FNDCPASS实用程序和ALLRACLE功能是为应用程序用户/模式设计的。 对于FND_USER或FND_ORACLE_USERID中不存在的用户,可以使用alter命令更改密码。 查询用户是否存在FND_USER或FND_ORACLE_USERI…...
《花雕学AI》33:如何用XMind制作AI思维导图、鱼骨图和组织结构图
思维导图是一种有效的思维工具,它可以帮助我们整理信息,激发创意,提高效率。思维导图是一种以中心主题为核心,以分支结构为形式,以关键词和图像为内容的图形表示法。它可以让我们一目了然地看到知识的层次和逻辑&#…...
【rust】| 06——语言特性 | 所有权
系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础 | 变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 【rust】| 06——语言特…...
AUTOSAR入门
简介 AUTOSAR(AUTomotive Open System ARchitecture)是一种汽车软件架构标准,由德国大陆、博世、宝马等汽车及零部件制造商共同发起,拥有广泛的行业参与。其目标是为了解决汽车电子和软件系统日益复杂的问题,提高可重…...
运维高可用架构的 6 大常规方案
在介绍高可用架构的方案之前,先说一下什么是高可用架构,高可用架构应具备但不限于以下特征: 主从切换 很好理解,当其中一台机器的服务宕机后,对于服务调用者来说,能够迅速的切换到其他可用服务,…...
Java设计模式-桥接模式
简介 桥接模式(Bridge Pattern)是一种结构性设计模式,它的主要作用是将抽象部分和实现部分解耦,使它们可以独立变化而不会互相影响。桥接模式最早由GoF(Gang of Four)提出,在《设计模式》一书中…...
计及N-k安全约束的含光热电站电力系统优化调度模型【IEEE14节点、118节点】(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
欧拉函数详解
文章目录 欧拉函数定义性质计算公式求某个数欧拉函数值线性筛求区域内欧拉函数 欧拉函数 定义 在[1,n]的范围内所有与n互质的数字的个数。 我们用 φ ( n ) \varphi(n) φ(n)来表示数字n的欧拉函数的值,例如: φ ( 4 ) 2 \varphi(4)2 φ(4)2…...
手把手教你如何将安卓手机数据导入iPhone!【详解】
案例:安卓数据导入苹果手机 【大神们,刚换了新的苹果手机,原本的安卓手机数据怎么导入新手机?】 想要换用iPhone,但是又不想丢失安卓手机里的重要数据怎么办?如何将安卓手机数据导入iphone?本文…...
怎么轻松地搞定Win11系统备份任务?
“我是一个电脑小白,不是很懂电脑的一些操作。我刚买了一台新电脑,它装的是Win11系统,我害怕它出现什么问题,听朋友说可以通过备份的方法保护系统,这是真的吗?有谁知道该怎么进行Win11系统备份吗࿱…...
MySQL集群
目录 主从复制 主从复制流程: 为什么要有relay log中继日志? 为什么要有主从复制,好处? 实际生产环境中。如果对MySQL数据库的读写都在一台数据库服务器中操作,无论是再安全性、高可用性,还是高并发性等…...
关于Kerberos认证的一些攻击手法学习总结
Kerberos认证流程 前言 本文主要分享最近学习的关于域内Kerberos认证的一些攻击手法,以自我的理解为主,从原理理解切入到基本工具利用来阐述,个人的理解分析较为啰嗦,嫌太兀长的可以跳着看就好,还请各位谅解。如有错误…...
STL-deque容器
双端数组,可以对头端进行插入删除操作 deque 容器和 vecotr 容器有很多相似之处,比如: deque 容器也擅长在序列尾部添加或删除元素(时间复杂度为O(1)),而不擅长在序列中间添加或删除元素。deque 容器也可…...
❤ go语言和java语言的优缺点
❤ go语言和java语言的优缺点对比 对比GOJAVA介绍Java是一种流行的面向对象的编程语言,它的语法类似于C,并且具有丰富的类库和工具。Java的可移植性很好,可以在多种平台上运行。Go是一种新兴的编程语言,它比Java更加简洁和易学&a…...
安全成就未来|Fortinet Accelerate 2023·中国区巡展首站启幕
Fortinet Accelerate 2023中国区巡展 年度网络安全盛会 Fortinet Accelerate 2023中国区巡展,昨日在深圳拉开帷幕,开启15城巡展的“首城之站”。本年度巡展主题“安全成就未来”,Fortinet与中企通信、亚马逊云科技等生态合作伙伴,…...
输入URL到显示界面的整个过程
以如下这个比较简单的网络拓扑模型作为例子,探究中间发生的整个过程: 1 HTTP 浏览器做的第一步工作就是要对 URL 进行解析,从而生成发送给 Web 服务器的请求信息。下图展示了一条长长的URL里各个元素代表什么: 所以整个长长的URL…...
BetaFlight飞控启动运行过程简介
BetaFlight飞控启动&运行过程简介 1. 源由2. 启动过程2.1 main(主程序)2.2 init (初始化)2.3 run 3. 任务调度3.1 任务定义3.2 scheduler (调度器) 4. 总结5. 参考资料6. 附录 -- 问题汇总6.1 Why desiredPeriodCycles is so …...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
