Selenium63-yaml文件

提升维护性策略

  • 定位和操作都在page层,不方便维护
  • 方案:把定位从page层分离到element层。
  • 使用yaml作为element层描述元素定位条件的文件格式。

YAML格式

  • YAML(/ˈjæməl/)YAML 是一种简洁的非标记语言。
    • 它是一个可读性高,用来表达数据序列化的格式。
  • YAML优势:
    • 以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。
  • YAML对象:
    • 键值对使用冒号结构表示key: value,冒号后面要加一个空格。

分离元素定位

  • 从页面对象中分离元素定位
  • 新建element文件夹:后台_登录.yaml
    用户名: "iduserName"
    密码: "id
    password"
    登录: "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: "id
    frmDlg"
    成功提示: "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"
    提交: "id
    pButton_ctlSave"
    取消: "idpButton_ctlCancel"
    加载中: "id
    Loading"
    浮动提示: "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
posted @ 2022-12-31 14:38  暄总-tester  阅读(145)  评论(0)    收藏  举报