提升维护性策略
- 定位和操作都在page层,不方便维护
- 方案:把定位从page层分离到element层。
- 使用yaml作为element层描述元素定位条件的文件格式。
YAML格式
- YAML(/ˈjæməl/)YAML 是一种简洁的非标记语言。
- 它是一个可读性高,用来表达数据序列化的格式。
- YAML优势:
- 以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。
- YAML对象:
- 键值对使用冒号结构表示key: value,冒号后面要加一个空格。
分离元素定位
- 从页面对象中分离元素定位
- 新建element文件夹:后台_登录.yaml
用户名: "iduserName"
密码: "idpassword"
登录: "xpath==//span[text()='登录']"
改造pathmanager
- 补充element元素定位条件的目录
class PathManager:
# 项目目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 测试数据目录
DATA_PATH = os.path.join(BASE_DIR, 'testdata')
# 元素定位目录
ELEMENT_PATH=os.path.join(BASE_DIR, 'element')
准备解析yaml文件的工具
- 安装python的第三方插件yaml
- pip install yaml
- common包:readelement.py
import os
import yaml
from common.pathmanager import pm
class Element(object):
def __init__(self, name):
"""获取元素"""
self.file_name = '%s.yaml' % name
self.element_path = os.path.join(pm.ELEMENT_PATH, self.file_name)
if not os.path.exists(self.element_path):
raise FileNotFoundError("%s 文件不存在!" % self.element_path)
with open(self.element_path, encoding='utf-8') as f:
self.data = yaml.safe_load(f)
def __getitem__(self, item):
"""获取属性"""
data = self.data.get(item)
if data:
name, value = data.split('==')
return name, value
raise ArithmeticError("{}中不存在关键字:{}".format(self.file_name, item))
第二版登录页
- page包:后台_登录_page_v2.py
from pagebase.webpage import WebPage
from common.readelement import Element
e=Element('后台_登录')
……
def login(self,un,pw):#登录
self.input_text(e['用户名'],un)
self.input_text(e['密码'],pw)
self.click(e['登录'])
参考登录页,优化后台主页
- 新建element下:后台_主页.yaml
- 优化page里:后台_主页_page_v2.py
赛区管理页元素定位
- element:后台_双创_基础设置_赛区管理.yaml
赛区名称: "id_easyui_textbox_input1"
查询: "xpath//span[text()='查询']"
目标赛区名称: "xpath//td[@field='name']/div[text()='DIVISION_NAME']"
目标删除: "xpath//td[div='DIVISION_NAME']/../td[@field='view']/div/a[2]"
确定: "xpath//span[text()='确定']"
添加赛区: "xpath//span[text()='添加赛区']"
加载中: "idLoading"
添加赛区frame: "idfrmDlg"
成功提示: "xpath//div[text()='赛区信息保存成功']"
失败提示: "xpath//td[text()='MESSAGE']"
第二版赛区管理页
- 后台_双创_基础设置_赛区管理_page_v2.py
from pagebase.webpage import WebPage
from common.readelement import Element
e=Element('后台_双创_基础设置_赛区管理')
class BgDivisionManagerPage(WebPage):
def search(self,division_name):#用赛区名称查询
self.input_text(e['赛区名称'],division_name)
self.click(e['查询'])
def is_division_exist(self,division_name):#判断查询结果里是否存在等于目标赛区名称的记录
list1=list(e['目标赛区名称'])
list1[1]=list1[1].replace('DIVISION_NAME',division_name)
return self.is_element_present(tuple(list1))
def delete_and_confirm(self,division_name):#删除后确定
list1=list(e['目标删除'])
list1[1]=list1[1].replace('DIVISION_NAME',division_name)
self.click(tuple(list1))
self.click(e['确定'])
def to_add_division(self):#添加赛区
self.click(e['添加赛区'])
def wait_for_loaded(self):#等待加载完毕
self.wait_for_disappear(e['加载中'])
def switch_to_add_page(self):#切换到添加赛区子网页
self.switch_frame(e['添加赛区frame'])
def is_message_exist(self,message):#判断信息是否存在
list1=list(e['失败提示'])
list1[1]=list1[1].replace('MESSAGE',message)
msg_loc=e['成功提示'] if message == "赛区信息保存成功" else tuple(list1)
return self.is_element_present(msg_loc)
def wait_message_dispear(self,message):#等待信息消失
list1=list(e['失败提示'])
list1[1]=list1[1].replace('MESSAGE',message)
msg_loc=e['成功提示'] if message == "赛区信息保存成功" else tuple(list1)
self.wait_for_disappear(msg_loc)
添加赛区元素定位
- element:后台_双创_基础设置_添加赛区.yaml
赛区名称: "id_easyui_textbox_input1"
提交: "idpButton_ctlSave"
取消: "idpButton_ctlCancel"
加载中: "idLoading"
浮动提示: "class name==tooltip"
第二版添加赛区页
from pagebase.webpage import WebPage
from common.readelement import Element
e=Element('后台_双创_基础设置_添加赛区')
class BgAddDivisionPage(WebPage):
def input_division_name(self,division_name):#输入赛区名称
self.input_text(e['赛区名称'],division_name)
def submit(self):#提交
self.click(e['提交'])
def cancel(self):#取消
self.click(e['取消'])
def wait_for_loaded(self):#等待加载完毕
self.wait_for_disappear(e['加载中'])
def get_tooltip(self):#获得浮动提示
self.move_to_element(e['赛区名称'])
tooltip = self.get_text(e['浮动提示'])
return tooltip
使用第二版页面对象
- 导入第二版网页对象使用:test_后台_双创_基础设置_赛区管理_添加赛区_case_v7.py、所有conftest.py
from page.后台_登录_page_v2 import BgLoginPage
from page.后台_主页_page_v2 import BgHomePage
from page.后台_双创_基础设置_添加赛区_page_v2 import BgAddDivisionPage
from page.后台_双创_基础设置_赛区管理_page_v2 import BgDivisionManagerPage
运行调试测试用例
- 运行,查看结果
========== test session starts ===============
platform win32 -- Python 3.9.5, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
sensitiveurl: .*
rootdir: D:\PycharmProjects\aiseProject2\testcasecode
collected 10 items
test_后台_双创_基础设置_赛区管理_添加赛区_case_v7.py ..........
===========10 passed in 637.53s (0:10:37) ===========
Process finished with exit code 0