Fork me on GitHub

移动端测试——PO模式 (8)

一、PO简介

PO 说明
PO模式

Page Object Model
测试页面和测试脚本分离

即页面封装成类,供测试脚本进行调用
优点 ➢ 提高测试用例的可读性

➢ 减少了代码的重复

➢ 提高测试用例的可维护性,特别是针对UI频繁变动的项目
缺点 ➢结构复杂

基于流程做了模块化的拆分

1. 1 Appium方法二次封装

减少过多使用类似方法,更方便管理定位元素,尽量将函数方法简洁化、统一化

1.1.1 定位方法

名称 系统提供的定位方法 系统已封装的定位方法
单个
元素
driver.find_element_by_id()

driver.find_element_by_class_name()

driver.find_element_by_xpath()
find_element(by=By.XX, value=None)



find_element(By.XX, value)
一组
元素
driver.find_elements_by_id()

driver.find_elements_by_class_name()

driver.find_elements_by_xpath()
find_elements(by=By.XX, value=None)



find_elements(By.XX, value)
  • 封装的定位方法
    使用统一的方法来完成元素的定位
参数 说明
by 定位类型 By.ID

By.CLASS_NAME

By.XPATH
value 定位元素的属性值

1.1.2 点击元素与输入内容

参数 说明
location 定位类型
location_vlaue 定位元素属性值
text 需要输入的值

第一种封装方法

# 点击元素
def click_element(self, location,location_vlaue):
    self.find_element(location,location_vlaue).click()
# 输入内容
def input_element(self, location,location_vlaue,text):
    self.find_element(location,location_vlaue).send_keys(text)

问题:
没有简化参数的传递,仅仅将点击和输入做了封装.

第二种封装方法推荐

  • location类型为元祖
    格式:
    (By.ID,value),(By.CLASS_NAME,value),(By.XPATH,value)

其中*location将元祖类型的值进行了一次解包操作,来满足find_element的参数传递要求

# 点击元素
def click_element(self, location):
    self.find_element(*location).click() 
# 输入内容
def input_element(self, location,text):
    self.fm = self.find_element(*location)
    self.fm.clear() # 需要先清空输入框,防止有默认内容
    self.fm.send_keys(text)

eg:

进入设置,点击搜索框,输入123后,然后点击搜索框返回按钮

封装代码:Base.py

from selenium.webdriver.support.wait import WebDriverWait


class Base(object):
    def __init__(self,driver):
        self.driver = driver
    def find_element(self,loc,timeout=10):
        # 封装称为智能等待方法
        # loc:类型为元祖,格式(By.ID,value),(By.CLASS_NAME,value),(By.XPATH,value)
        # timeout:搜索超时时间
        return WebDriverWait(self.driver, timeout).until(lambda x: x.find_element(*loc))
    def click_element(self,loc):
        # 封装点击操作
        self.find_element(loc).click()
    def input_text(self,loc,text):
        # 封装输入操作
        self.fm = self.find_element(loc)
        self.fm.clear() # 需要先清空输入框,防止有默认内容
        self.fm.send_keys(text)

测试代码:test.py

from appium import webdriver
from selenium.webdriver.common.by import By

# 导入已封装的类 Base.py
from Base import Base


class Test_Base:
    def __init__(self):
        desired_caps = {}
        # 手机 系统信息
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '5.1'
        # 设备号
        desired_caps['deviceName'] = '192.168.56.101:5555'
        # 包名
        desired_caps['appPackage'] = 'com.android.settings'
        # 启动名
        desired_caps['appActivity'] = '.Settings'
        # 允许输入中文
        desired_caps['unicodeKeyboard'] = True
        desired_caps['resetKeyboard'] = True
        # 手机驱动对象
        self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)

    def test(self):
        # 搜索按钮
        search_button = (By.ID,"com.android.settings:id/search")
        # 搜索输入框
        search_text = (By.ID,"android:id/search_src_text")
        # 搜索框返回按钮
        search_return_button = (By.CLASS_NAME,"android.widget.ImageButton")
        # 实例化二次封装的Base类
        base_object = Base(self.driver)
        # 点击搜索输入框
        base_object.click_element(search_button)
        # 搜索框内输入123
        base_object.input_text(search_text,123)
        # 点击搜索框返回按钮
        base_object.click_element(search_return_button)
        # 退出driver对象
        self.driver.quit()

        
if __name__ == "__main__":
    Test_Base().test()

更新中......


posted @ 2019-09-24 22:48  紫枫一梦千年  阅读(305)  评论(0编辑  收藏  举报