项目简介:对“在线计算器”的加法功能进行自动化测试
使用技术:PO框架+Unittest+Selenium
项目框架:
以下针对代码结构及功能作相应分析:
1、base基类层
base_cal_test.py包含page页面一些公用的方法,比如说查找定位计算器元素,点击功能等;
get_driver.py 获取driver对象
- 注意解包loc只需要在查找元素的地方使用就可以
包含
#初始化方法
#查找元素方法
#点击元素方法
#获取value属性方法封装
#截图方法
源代码:base_cal_test.py
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import time
class Base:
# 初始化方法
def __init__(self,driver):
self.driver = driver
# 查找元素
def base_find_element(self,loc,timeout=30,poll=0.5):
"""
@param loc: 元素的定位信息,元组格式
@param timeout: 默认超时时间30秒
@param poll: 访问频率,0.5秒一次
@return: 返回查找到的元素
"""
return WebDriverWait(self.driver,
timeout=timeout,
poll_frequency=poll).until(lambda x:x.find_element(*loc))
# 点击元素
def base_click(self,loc):
self.base_find_element(loc).click()
# 获取元素的value值
def base_get_ele_value(self,loc):
#使用get_attribute("value")获取指定元素的属性值
return self.base_find_element(loc).get_attribute("value")
# 截图
def base_get_image(self):
self.driver.get_screenshot_as_file('../image/{}.png'.format(time.strftime("%Y_%m_%d %H:%M:%S")))
get_driver.py
from selenium import webdriver
from PO.练习计算器 import page
class GetDriver:
#设置driver
driver = None
# 获取driver
@classmethod
def get_driver(cls):
if cls.driver is None:
#实例化浏览器
cls.driver = webdriver.Chrome()
#最大化
cls.driver.maximize_window()
#打开浏览器
cls.driver.get(page.url)
return cls.driver
#单例原则
# 关闭driver
@classmethod
def quit_driver(cls):
if cls.driver:
print('关闭之前',cls.driver)
cls.driver.quit()
print('关闭之后', cls.driver)
cls.driver = None
print('关闭之后', cls.driver)
#注意此处有很大的坑,必须在关闭之后要置空
if __name__ == '__main__':
#第一次获取浏览器
print(GetDriver().get_driver())
# 第二次获取浏览器
print(GetDriver().get_driver())
GetDriver.quit_driver()
2、page(页面对象):一个页面封装成一个对象,继承base,
模块名:page+实际操作模块名称;
类名:大驼峰命名:PageLogin
方法名:每个元素操作单独封装成一个方法
__init__.py:包含服务器配置url和计算器元素的定位方式
'''以下为计算器数据的配置数据'''
from selenium.webdriver.common.by import By
'''以下为服务器域名配置地址'''
url = "http://cal.apple886.com/"
#数字键
#加号
clac_add = By.ID, "simpleAdd"
#减号
clac_sub = By.ID, "simpleSubtr"
#乘号:
clac_multi = By.ID, "simpleMulti"
#除号
clac_divi = By.ID, "simpleDivi"
#等号
clac_equal = By.ID, "simpleEqual"
#清空
clac_clear = By.ID, "simpleClearAllBtn"
#获取结果
clac_result = By.ID, "simpleIpt"
page_cal_test.py
from selenium.webdriver.common.by import By
from PO.练习计算器 import page
from PO.练习计算器.base.base_cal_test import Base
class PageCalc(Base):
# 输入数字方法
def page_input_num(self,num):
for i in str(num):
#拆开单个按键定位方式
loc = By.ID, "simple{}".format(i)
self.base_click(loc)
# 点击+操作符
def page_click_add(self):
self.base_click(page.clac_add)
# 点击"等号"计算出结果
def page_click_eq(self):
self.base_click(page.clac_equal)
# 获取结果
def page_get_result(self):
return self.base_get_ele_value(page.clac_result)
# 点击清屏
def page_clear(self):
self.base_click(page.clac_clear)
# 截图
def page_get_image(self):
self.base_get_image()
#组装加法业务方法
def page_calc(self,num1,num2):
self.page_input_num(num1)
self.page_click_add()
self.page_input_num(num2)
self.page_click_eq()
3、scripts/cases(业务层)
导包调用page,使用unittest框架调用page页面对象层完成业务流程测试需求
模块名:test+实际操作模块名称
测试业务名称:大驼峰命名,把模块名抄写一下
test_calc.py
import json
import unittest
from parameterized import parameterized
from PO.练习计算器.page.page_cal_test import PageCalc
from PO.练习计算器.base.get_driver import GetDriver
from PO.练习计算器.scripts.tools.read_json import read_json
def get_data():
datas = read_json("calc.json")
data = []
for info in datas.values():
data.append((info.get('num1'), info.get('num2'), info.get('except')))
return data
class Test_calc(unittest.TestCase):
@classmethod
def setUpClass(cls):
#获取driver
cls.driver = GetDriver.get_driver()
cls.calc = PageCalc(cls.driver)
@classmethod
def tearDownClass(cls):
#关闭driver
GetDriver.quit_driver()
#测试加法方法
@parameterized.expand(get_data())
def test_add_calc(self,num1,num2,expect):
#调用业务方法
#进行计算
self.calc.page_calc(num1,num2)
try:
#断言
self.calc.assertEqual(self.calc.page_get_result(),expect)
except:
#截图
self.calc.page_get_image()
在scripts/tools文件夹里添加对数据读取的封装函数
read_json.py
import json
def read_json(filename):
with open('../data/'+ filename,'r' , encoding='utf-8') as f:
return json.load(f)
if __name__ == '__main__':
datas = read_json("calc.json")
print(datas)
这里的read_json函数返回的是读取测试用例数据,格式如下,所以需要在test_calc.py文件中有对应的改造,需要的格式是:[( ),( ),( )]
在该项目中需要注意:
1、在需要定位网页元素的时候需要用到loc的时候,只用在查找元素那块使用*进行解码
2、注意:在关闭driver对象的语句之后一定要将driver重置为None
3、深刻体会封装的含义