-
PO设计原理:
将页面封装成对象
页面对象内封装业务方法
元素定位方法可存放到其他配置文件
PO.png
PO设计是一种思想,任何UI自动化测试都可以套用这种思想,不仅限于selenium的webUI模式
PO设计规范
-
页面对象化
1.每个页面封装成对象
例如:登录页面可以设计成LoginPage类
2.封装具体业务方法
例如:登陆页面的登陆方法有 login(username,password)
3.不保存具体的元素定位
例如:定位用户名和密码框的表达式不写在代码里,放在外部配置文件当中 -
页面元素属性化
1.只涉及到要操作的元素名称
2.具体的定位方式方法不写在代码里 -
元素定位可配置化
1.配置以键值对形式存在
2.区分出不同的页面
3.保存元素配置的文件形式没有限制文本文件、excel、数据库等
页面类的设计
-
页面类的层级抽象
1.构造页面对象
创建页面基类,封装基本操作方法,由其他业务类继承
2.封装相关业务方法
业务页面对象中封装常用的业务操作
3.抽取元素定位
抽取具体的元素定位方法存放到配置文件
4.测试案例构成
结合页面对象编写具体的业务流 -
Yaml格式配置文件特点
1.YAML 的数据组织主要依赖的是空白,缩进,分行等结构,可读性好。
2.YAML 实现简单,解析成本很低,和脚本语言的交互性好。
3.YAML 使用实现语言的数据类型
4.YAML 表达能力强,扩展性好
5.安装方法 --pip install pyyaml
书写PO模式建议:
1.先写出具体的业务逻辑--比如登录
2.再将写好的逻辑封装到类里面
3.继续构造其他的页面类
4.将这些类共同的功能抽象化父类,被其他业务类继承
5.可以将代码内部的具体元素抽离出来用外部的配置文件进行管理
- base类:封装元素定位方法
from appium import webdriver
class BasePage:
def __init__(self, desiredCaps):
self.driver = webdriver.Remote("http://localhost:4723/wd/hub", desiredCaps)
self.driver.implicitly_wait(10)
def click_element(self, locator):
self.driver.find_element(locator[0], locator[1]).click()
def text(self, locator):
return self.driver.find_element(locator[0], locator[1]).text
- 页面类:封装各个页面
class HomePage(BasePage):
def __init__(self, desiredCaps):
BasePage.__init__(self, desiredCaps)
homePage = conf_read('conf.yml')['homePage']
self.three = homePage['three']
self.add = homePage['add']
self.nine = homePage['nine']
self.equal = homePage['equal']
self.take = homePage['take']
self.five = homePage['five']
self.clickResult = homePage['clickResult']
self.result = homePage['result']
def calculate(self):
time.sleep(10)
self.click_element(self.three)
self.click_element(self.add)
self.click_element(self.nine)
self.click_element(self.equal)
self.click_element(self.take)
self.click_element(self.five)
self.click_element(self.equal)
self.click_element(self.clickResult)
assert self.text(self.result) != 60, '计算有误'
def driver_quit(self):
self.driver.quit()
- 此函数用于读取yaml文件
import yaml
def conf_read(conf_file):
with open(conf_file, 'r') as f:
file = f.read()
conf = yaml.load(file)
return conf
if __name__ == '__main__':
print(conf_read('xxx.yml')['desired_caps'])
- Yaml 文件存储个页面的具体定位方式
desiredCaps:
automationName: "UiAutomator2"
platformName: "Android"
plathformVersion: "8"
deviceName: "test0106"
appPackage: "com.ibox.calculators"
appActivity: ".SplashActivity"
noReset: True
newCommandTimeout: 6000
homePage:
three: ['xpath','//*[@resource-id="com.ibox.calculators:id/digit3"]']
add: ['xpath','//*[@resource-id="com.ibox.calculators:id/plus"]']
nine: ['xpath','//*[@resource-id="com.ibox.calculators:id/digit9"]']
equal: ['xpath','//*[@resource-id="com.ibox.calculators:id/equal"]']
take: ['xpath','//*[@resource-id="com.ibox.calculators:id/mul"]']
five: ['xpath','//*[@resource-id="com.ibox.calculators:id/digit5"]']
clickResult: ['xpath','//*[@resource-id="com.ibox.calculators:id/relativeLayout_top"]']
result: ['xpath','//*[@resource-id="com.ibox.calculators:id/cv"]/android.widget.TextView[2]']
网友评论