虽然之前的api自动化测试框架还有很多可完善的地方,但是由于基本满足了我目前的使用场景,于是这两天我又在ui自动化测试框架上进行了一番简单的临摹学习,实现了一个基础架构,接下来一小段时间会努力在丰富一下的。然后会和之前的api测试部分整合起来。
Page Object Model
这个ui自动化测试框架,应用到的一种模式叫做PO模式,Page Object Model(页面对象模型)。这个模式主要是说将每一个页面看做是一个对象,具体页面操作与测试流程相分离,单独一个方面的更改并不会影响到对方。
主要应用
- 利用selenium进行元素定位及操作
- 利用pytest进行测试验证。
- 其它辅助工具帮助更好的执行自动化,例如测试数据的读写、日志记录、html记录以及截屏图像等。
框架结构
整体框架主要分为四个部分:
- Page Model:包括封装selenium操作,及各个页面元素定位。
- TestCase:主要有测试用例文件、测试请求数据以及测试结果存储数据。
- Utils:包含框架用到的工具,例如读写excel、截屏、日志、发送邮件、html报告存储等。
-
Config:一些配置,例如url、环境配置等。
框架结构
PageModel
PageModel主要包括page软件包以及base_page.py文件。
页面元素定位及操作设置
建立page
软件包,内部存储各个页面的元素定位信息,以及需要执行的自动化操作。
首先是入口页需执行测试的对象。
#unique_page.py
from selenium.webdriver.common.by import By
elements = [
{'name': 'choose1', 'desc': '选择一', 'by': (By.XPATH, '/html/body/div[1]/'),
'action': 'click()'},
{'name': 'choose2', 'desc': '选择二', 'by': (By.XPATH, '/html/body/div[2]'),
'action': 'click()'},
{'name': 'create_btn', 'desc': '点击生成', 'by': (By.XPATH, '/html/body/div[3]/'),
'action': 'click()'}
]
以及结果页需要执行测试的对象。
#result.py
from selenium.webdriver.common.by import By
elements = [
{'name': 'description', 'desc': '描述', 'by': (By.XPATH, '/html/body/div[4]/'),
'action': 'text'},
]
元素操作封装
在base_page.py文件中,进行各项元素定位及操作的获取,并封装执行的操作。
获取元素
通过import_module方法,以字符串为参数,动态引用页面元素的位置及操作。即上方unique_page.py/result.py文件中的elements。
#base_page.py
import importlib
# 通过传入字符串来引用一个模块
def get_page_elements(page):
m = importlib.import_module(page)
element = m.elements
return element
封装页面操作
通过上方的get_page_elements方法获取到元素后,先在Page类中定义一些初始化变量。
#base_page.py
class Page(object):
def __init__(self, driver, page):
self.driver = driver
self.page = page
self.elements = get_page_elements(page)
self.by = ()
Page类中建立get_each_elem方法,获取元素的具体定位。
def get_each_elem(self, elem):
for each in self.elements:
if each['name'] == elem:
self.by = each['by']
Page类中建立selenium_elem方法,封装浏览器查找元素位置。这里的find_element方法括号内的参数,必须加*号变为位置参数,否则执行时会报错:Message: invalid argument: 'using' must be a string
。(我至今还没有明白为什么...)
def selenium_elem(self, args=None):
element = self.driver.find_element(*self.by)
return element
Page类中建立operate_elem方法,封装元素点击操作。相似的各种操作都可以在这之后建立,例如获取文案(.text)等等。
#执行元素点击操作
def operate_elem(self, elem, args=None):
self.get_each_elem(elem)
element = self.selenium_elem()
return self.driver.execute_script("arguments[0].click();", element)
#执行获取文案操作
def get_elem(self, elem, args=None):
self.get_each_elem(elem)
element = self.selenium_elem().text
return element
TestCase
测试用例软件包中,主要包括Case(各个页面的测试用例)、data(测试数据)以及result_data(需要保存的结果数据)。
测试用例中,直接调用PageModel中标明的页面元素以及操作方法。
#test_unique.py
from selenium import webdriver
from PageModel.base_page import Page
def test_one():
driver = webdriver.Chrome()
driver.get('https://***.com')
driver.switch_to.frame(0)#所测页面在一个frame中,需要先转入。
#进入入口页操作元素
obj = Page(driver, 'PageModel.page.unique_page')#第二个参数是字符串,动态引入页面元素定位
obj.operate_elem('choose1')#对元素执行点击操作
obj.operate_elem('choose2')#对元素执行点击操作
obj.operate_elem('create_btn')#对元素执行点击操作
#进入结果页操作元素
result = Page(driver, 'PageModel.page.result')
desc = result.get_elem('description')
assert desc == 'Success'
终端运行pytest test_unique.py
即可。
Utils
如果需要操作数据,比如从数据库表读取参数,或者将结果写入数据库表。可以增加excel的读写方法。
读取数据
#read_excel.py
import pandas as pd
def read_excel(file):
read_data = pd.read_excel(file)
data = []
for i in read_data.index.values:
row_data = read_data.loc[i, :].to_dict()
data.append(row_data)
return data
写入数据
#write_excel.py
import pandas as pd
def write_excel(data, file):
df = pd.DataFrame(data)
df.to_excel(file, index=False)
至此,一个简单的UI自动化测试框架搭建完成,现阶段,实现的只有结构图标记已完成的部分,还需要不断的去填充和学习。目前的目录如下~
当前框架目录
未来一小段日子会继续丰富的~~~
历时了三天,终于写完了~
这两天补充了两个模块,截图和打印日志,直接上对应的记录链接,所以现在的目录如下~
自我记录,有错误欢迎指正~
网友评论