一、什么是POM
page object model 页面对象模型,主要应用于Ui自动化测试框架的搭建,主流设
计模式之一。
结合面向对象编程思路 :把项目的每个页面当做一个对象来进行编程。
- POM一般分为四层: 项目=n个页面=base层+pageobject层
- 第一层: base层:描述每个页面相同的属性及行为
- 第二层: pageobjects层:每个页面独有特征及独有的行为
- 第三层: testcases层:用例层,描述项目业务流程
- 第四层: testdata:数据层
pom模式设计意义:层次更加清晰,方便管理以及提供代码的复用性及扩展性
二、具体项目举例子
1. base层
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
# 定义一个类:描述每个页面相同的属性及行为
class BasePage:
# driver是driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps),将driver设置为内部属性
def __init__(self, driver):
self.driver = driver
# 元素定位,其中loc参数为定位方式以及对应的值,eg:loc = (AppiumBy.ID, "resourceid")
def locator(self, loc):
# return self.driver.find_element(AppiumBy.ID, "resourcceid")
return self.driver.find_element(*loc)
# 输入
def input(self, loc, value):
self.locator(loc).send_keys(value)
# 点击
def click(self, loc):
self.locator(loc).click()
# 滑动(上下左右)
def swipe(self, start_x, start_y, end_x, end_y, duration=0):
# 获取屏幕尺寸
window_size = self.driver.get_window_size()
x = window_size["width"]
y = window_size["height"]
self.driver.swipe(start_x=x*start_x, start_y=y*start_y, end_x=x*end_x, end_y=y*end_y, duration=duration)
2. pageobjects层
“”“
登录页面
”“”
from base.basepage import BasePage
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
class LoginPage(BasePage):
# 属性:每一个操作相应的定位
el_cancle = (AppiumBy.ID, "android:id/button2")
el_add = (AppiumBy.ID, "com.tal.kaoyan:id/activity_splash_guidfinish")
el_username = (AppiumBy.ANDROID_UIAUTOMATOR, "new UiSelector().text('请输入姓名‘)")
el_login = (AppiumBy.ANDROID_UIAUTOMATOR, "new UiSelector().text('登录‘).resouceid")
# 行为
# 登录
def login(self, username, passwd):
self.click(self.el_cancle)
# 左滑两次
for i in range(0, 2):
self.swipe(0.9, 0.5, 0.3, 0.5)
self.click(self.el_add)
self.input(self.el_username, username)
self.input(self.el_passwd, passwd)
self.click(self.el_login)
3. testcases层(test_开头)
from pageobject.login_page import LoginPage
from appium import webdriver
import pytest
class TestLogin:
# 设置终端参数,实际项目中用yaml数据格式封装到data中
desired_caps = {
"platformName": "Android", # 平台名称:IOS、Android、Firefoxos
"platformVersion": "5.1.1", # 设备系统版本号
"deviceName": "127.0.0.1:62001", # 设备名称,可通过adb devices查询
"appPackage": "com.tal.kaoyan", # 启动的包
"appActivity": "com.kaoyan.ui.activity.AppStarterActivity", # 启动的activity
"noReset": True # 不重置用户信息
}
# 发送指令给到appium service
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
def test_login(self):
login_page = LoginPage(driver=self.driver)
login_page.login("huahua", "huahuahuahua")
if __name__ == '__main__':
pytest.main()