1 总体需要
1.1 实现目标
- 基于 BS 架构,模仿用户(鼠标、键盘)操作,达到疾速、反复执行测试用例;
- 便于回归测试,疾速笼罩主线用例或性能;
- 线上或线下巡检测试,联合继续集成,及时发现运行环境存在的问题;
- 晋升集体自动化测试技术能力,为业务提供强有力的测试伎俩。
1.2 性能需要
- 基于 Unittest,封装、调用和组织所有的测试用例,进行批量或指定用例运行;
- 反对邮件服务,可增加任意团队成员邮箱,及时告诉团队成员自动化运行后果;
- 反对 log 日志,保留运行过程所有或须要记录的数据;
- 反对 HTML 测试报告,直观展现测试后果和数据;
- 反对用例设计和测试后果拆散,便于数据管理;
- 反对 Json、conf、excel 等配置文件读取,提供灵便的配置文件操作方法;
- 反对用户登录封装,后续所有的用例登录专用一个办法;
- 反对任意批改 HTMLTestRuner,可定制测试报告模板;
- 反对测试报告多语言(英文和中文);
- 反对截图性能;
- 反对 Jenkins 继续集成。
1.3 其余要求
- 实用所有 bs 架构自动化测试;
- 模块化设计,我的项目框架模式组织代码;
- 公共办法封装,对立调用;
- 数据和后果离开,清晰明了;
- 反对邮件自定义;
- 代码正文清晰。
1.4 实用人员
- 有肯定测试根底的软件测试人员;
- 有肯定的代码(Python/Java)功底;
- 致力于学习 web UI 自动化测试的所有人员。
1.5 学习周期
- 两个星期到一个月,可达到独立进行 web UI 自动化测试;
1.6 学习倡议
- 倡议依照文章程序,一步一步进行学习和实际;
- 文章是从根本的环境搭建到最终框架齐全搭建的一个过程,相对来说还是比拟具体的;
- 文章偏差于我的项目实战,未有太多的实践介绍和名词解释,所以对 0 根底的人员来说,可能须要额定的工夫去补充一下常识。
2 具体设计
2.1 需要剖析
对 实现需求 进行详细分析,次要有下:
性能 | 阐明 |
---|---|
应用 Unittest 框架 | 开源自动化测试框架,间接应用 |
批量或指定用例运行 | Unittest 框架可反对此性能 |
log 日志 | 应用 Python 的 logging 库即可 |
生成 HTML 测试报告 | 应用 HtmlTestRunner.py 模块可实现此性能 |
用例设计和后果拆散 | 应用配置文件如 excel、json 等组织用例数据 |
反对 Json、conf、excel 等配置文件读取 | 这里先应用 excel 进行页面元素的驱动 |
用户登录封装 | 间接把登录性能模块化,应用 Unittest 框架中的 setup,teardown 即可 |
定制测试报告模板 | 应用 HTMLTestRuner.py 模块 |
报告多语言 | 应用 HTMLTestRuner.py 模块 |
截图性能 | 应用 Selenium 的 save_screenshot 办法 |
2.2 技术栈
技术 | 版本及阐明 |
---|---|
Python | V3.x(本文为 3.7)=== 编程语言撑持 |
Selenium | V3.141.0 ===UI 元素、控件的辨认、定位,以及浏览器管制等 |
HtmlTestRunner | Python3 版本 === 生成 Html 测试报告 |
Logging | Python 自带 === 生成 log 日志 |
Xlrd | V1.2.0===excel 读取办法 |
Unittest | Python 自带 === 自动化测试框架 |
Smtplib | Python 自带 === 邮件服务 |
Python 自带 === 邮件服务 | |
os | Python 自带 === 零碎模块 |
PyCharm | Community 2020.2 汉化版 |
操作系统 | Windows10 旗舰版 64 位 |
其它 | 后续补充 |
3 框架设计
3.1 框架阐明
3.2 框架执行流程
4 预期后果
4.1 测试过程 log 日志
4.2 测试报告 html 格局
4.3 测试报告邮件格局
5 特地阐明
代码根本实现,如果有好的倡议,可交换学习心得。
6 第一个 WebUI 自动化测试程序
在开始自动化框架搭建之前,咱们先写一个简略的自动化测试脚本,来领会一下什么是 web UI 自动化测试,以及元素的基本操作,为后续的框架搭建鉴定根底。
6.1 Selenium 根本实践
6.1.1 Selenium 装置
- 间接关上 cmd 窗口,输出以下命令在线装置:
pip3 install selenium
- 装置完后,在 cmd 窗口中输出以下命令,能够看到 selenium 曾经装置了
pip list
6.1.2 WebDriverAPI
selenium 提供了很多的 WebDriverAPI,能够来进行:
- 元素的辨认、定位
- 元素的单击、双击
- 滚动条的拖动
- 浏览器管制如窗口大小、后退后退、刷新、表单切换、多窗口切换、文件双传下载、cookie 操作、验证码等等
- 详情请参考以下:
Selenium WebDriver API 学习笔记(一):元素定位
Selenium WebDriver API 学习笔记(二):浏览器管制
Selenium WebDriver API 学习笔记(三):浏览器管制
6.2 浏览器驱动装置
- 要想应用 selenium 来操作浏览器上的元素,必须装置浏览器驱动;
- 这个要依据具体的浏览器版本来定义;
- 本文应用的是 Chrome 浏览器,版本为 88.0.4324.182(正式版本)(32 位);
6.2.1 Chromedriver 下载
- 下载地址:Chrome 浏览器各版本对应的驱动
6.2.2 Chromedriver 装置
- 下载下来后是一个 chromedriver.exe,如果是 w7 零碎须要把 chromedriver.exe 放在 chrome 浏览器的装置目录,而后在零碎环境变量中退出 chrome 浏览器的装置目录即可;如果是 w10 零碎,须要 chromedriver.exe 放在 Python 的装置目录即可,如本文是:
6.3 代码设计思路
6.3.1 pycharm 新建脚本
- 关上之前创立的我的项目【Automated-UITest-demo】,在我的项目上右键,新建 python 文件即可,这里新建一个名为 test_baidu 的 python 文件
- 创立完后,如下多了一个 test_baidu 的 py 文件
6.3.2 自动化需要
这里咱们做以下 UI 自动化测试:
1、主动关上 chrome 浏览器
2、输出百度网址
3、关上百度首页,输出 helloworld
4、最大化浏览器窗口
5、搜寻 helloworld. 并回车
6、浏览器窗口大小放大为 640*480
7、先进行浏览器后退,再次输出 csdn 进行搜寻
8、清空输出的内容
9、判断是否进入 csdn 官网
6.3.3 需要剖析
需要 | 剖析 |
---|---|
主动关上 chrome 浏览器 | 须要用到 webdriver.Chrome() |
输出百度网址 | 用到 driver.get() 办法 |
关上百度首页,输出 helloworld | 用到 send_keys() 办法 |
最大化浏览器窗口 | 应用 maximize_window() 办法 |
搜寻 helloworld. 并回车 | 用到 send_keys() 办法 |
浏览器窗口大小放大为 640*480 | 用到 set_window_size() 办法 |
浏览器后退 | back() 办法 |
清空输出的内容 | clear() 办法 |
判断 | driver.current_url 办法来判断以后的网址 |
- 以上办法具体应用,参考【1.2 WebDriverAPI】
6.3.4 元素定位
- 以上需要曾经搞清楚了,那么接下来要进行元素定位,这里大略能够对需要再拆解下,须要哪些元素?
元素 | 阐明 | 定位形式 |
---|---|---|
百度输入框 | 用来输出 helooworld | find_element_by_id |
搜寻 csdn 后点击 csdn 官网 | 用来模仿点击进入到 csdn 官网 | find_element_by_xpath |
- 那如何定位元素,晓得应用哪种定位形式?
A、咱们关上百度首页,而后按【F12】关上浏览器的调试模式
B、点击调试模式窗口左上角的小三角
C、鼠标挪动到百度搜寻输入框
D、点击一下即可,而后看到搜寻输入框的元素属性,即要应用的元素定位办法
6.4 代码实现
6.4.1 包 / 模块的引入
- 关上方才新建的 test_baidu.py 文件
- 而后输出以下内容:
from selenium import webdriver # 引入 selenium 模块的 webdriver
from selenium.webdriver.common.keys import Keys # 键盘输入,所以要用到 Keys
import time # 元素等待时间,所以引入 time 模块
6.4.2 关上百度
driver = webdriver.Chrome() # 关上 Chrome 浏览器
driver.get("http://www.baidu.com") # 输出百度网址
print("============ 验证浏览器的根本管制 ==========")
6.4.3 定位搜寻框输出 helloworld,窗口最大化
def search():
print("1、搜寻 helloworld. 并回车......")
time.sleep(2)
driver.find_element_by_id("kw").send_keys("helloworld") # 输出“helloworld”time.sleep(2)
driver.find_element_by_id("kw").send_keys(Keys.ENTER) # 回车进行搜寻
time.sleep(2)
driver.maximize_window() # 最大化以后窗口
6.4.4 窗口放大为 640*480
def windows_size():
print("2、浏览器窗口大小放大为 640*480......")
time.sleep(2)
driver.set_window_size(640, 480) # 管制浏览器显示尺寸为 640*480
time.sleep(0.5)
driver.maximize_window() # 最大化以后窗口
time.sleep(2)
6.4.5 窗口刷新
ef back_refresh():
print("3、先进行浏览器后退,再次输出 csdn 进行搜寻")
driver.back()
driver.find_element_by_id("kw").send_keys("csdn") # 输出 csdn
time.sleep(1)
driver.refresh() # 刷新
6.4.6 清空输出内容
def serach_clear():
print("4、清空输出的内容......")
driver.find_element_by_id("kw").send_keys("csdn") # 输出 csdn
time.sleep(2)
driver.find_element_by_id("kw").clear()
time.sleep(0.5)
6.4.7 进入 csdn 官网并判断
def csdn():
print("5、进入 csdn 官网")
driver.find_element_by_id("kw").send_keys("csdn") # 输出 csdn
time.sleep(2)
driver.find_element_by_id("kw").send_keys(Keys.ENTER) # 回车进行搜寻
time.sleep(2)
driver.find_element_by_xpath("//*[@id='1']/h3/a[1]").click()
time.sleep(2)
windows = driver.window_handles
driver.switch_to.window(windows[-1])
now_url = driver.current_url
m_get_url = "https://www.csdn.net/"
if now_url == m_get_url:
print("通过判断,曾经进入 csdn 官网!!")
else:
print("未进入到 csdn 官网,请查看代码!")
6.4.8 调用办法
search()
windows_size()
back_refresh()
serach_clear()
csdn()
driver.quit() # 敞开浏览器
6.5 残缺源码
# 作者:Administrator
# 日期:2021/2/24 15:15
# 文件名称:test_baidu.py
# Function:关上百度网主页,在搜寻栏输出“helloworld”from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome() # 关上 Chrome 浏览器
driver.get("http://www.baidu.com") # 输出百度网址
print("============ 验证浏览器的根本管制 ==========")
def search():
print("1、搜寻 helloworld. 并回车......")
time.sleep(2)
driver.find_element_by_id("kw").send_keys("helloworld") # 输出“helloworld”time.sleep(2)
driver.find_element_by_id("kw").send_keys(Keys.ENTER) # 回车进行搜寻
time.sleep(2)
driver.maximize_window() # 最大化以后窗口
def windows_size():
print("2、浏览器窗口大小放大为 640*480......")
time.sleep(2)
driver.set_window_size(640, 480) # 管制浏览器显示尺寸为 640*480
time.sleep(0.5)
driver.maximize_window() # 最大化以后窗口
time.sleep(2)
def back_refresh():
print("3、先进行浏览器后退,再次输出 csdn 进行搜寻")
driver.back()
driver.find_element_by_id("kw").send_keys("csdn") # 输出 csdn
time.sleep(1)
driver.refresh() # 刷新
def serach_clear():
print("4、清空输出的内容......")
driver.find_element_by_id("kw").send_keys("csdn") # 输出 csdn
time.sleep(2)
driver.find_element_by_id("kw").clear()
time.sleep(0.5)
def csdn():
print("5、进入 csdn 官网")
driver.find_element_by_id("kw").send_keys("csdn") # 输出 csdn
time.sleep(2)
driver.find_element_by_id("kw").send_keys(Keys.ENTER) # 回车进行搜寻
time.sleep(2)
driver.find_element_by_xpath("//*[@id='1']/h3/a[1]").click()
time.sleep(2)
windows = driver.window_handles
driver.switch_to.window(windows[-1])
now_url = driver.current_url
m_get_url = "https://www.csdn.net/"
if now_url == m_get_url:
print("通过判断,曾经进入 csdn 官网!!")
else:
print("未进入到 csdn 官网,请查看代码!")
search()
windows_size()
back_refresh()
serach_clear()
csdn()
driver.quit() # 敞开浏览器