移动端测试——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()
更新中......