系列文章目录
Day01 软件测试基础总结
Day02 测试用例知识点总结(上)
Day03 测试用例知识点总结(下)
Day04 禅道-从安装到卸载
Day05 MySql的基础使用
Day06 MySql知识点总结
Day07 MySql知识点再总结与多表查询
Day08 redis的基础知识
Day08 VMware的安装、Linux系统安装和Linux基础命令
Day09 Linux常用命令总结
Day10 Linux环境部署和项目构建
Day11 shell脚本基础知识
Day12 接口和协议
Day13 Postman的使用
Day13 Windows环境下的JDK安装与Tomcat的启动
Day14 jenkins部署
Day15 jenkins的简单使用
Day16 charles的基本使用
Day17 考试
Day18 考试
Day19 Fiddler的简单使用
Day20 Python基础
Day21 python 语句基础
Day22 Python数据类型(上)
Day23 Python数据类型(下)
Day24 Python函数
Day25 Python的文件操作和异常处理
Day26 Python面向对象
Day27 Python的部分算法
Day28 单元测试 unittest
Day29 单元测试 pytest
Day30 接口测试requests
Day31 Web端自动化基础
Day32 Web自动化进阶
Day33 PO模型
Day34 移动端测试(上)
Day35 移动端测试(下)
Day36 移动端自动化(上)
Day37 移动端自动化(下)
目录
前言
POM是移动自动化所用的模型,POM模型与web自动化中的PO模型非常相似。因此主要描述两者的不同与实例。
一、POM模型
POM(page object model)页面对象模型,主要应用于UI自动化测试框架的搭建,主流设计模式之一,页面对象模型:结合面向对象编程思路:把项目的每个页面当做一个对象进行编程。
第一层:basepage层:描述每个页面相同的属性及行为
第二层:pageobject层(每个的独有特征及独有的行为)
第三层:testcase层(用例层,描述项目业务流程)
第四层:testdata(数据层)
二、引入yaml文件
yaml文件:数据层次清晰,可以跨平台,支持多种语言使用(可以适用于别的app)
优化代码:提取basepage中的配置客户端数据(将配置的数据放在yaml中) 创建config--config.yam
yaml文件展示(主要存放用于连接的参数,注意这样缩进与空格打印结果是字典套字典)(注意:在冒号后有空格)
caps:
platformName: Android
deviceName: 127.0.0.1:62001
appPackage: com.vphone.launcher
appActivity: com.vphone.launcher.Launcher
读取模块
首先需要导入第三方包 :
pip install pyYAML
(打印结果是字典套字典)
python通过open方式读取文件数据,再通过load函数将数据转化为列表或字典;
import yaml
def readYaml(path):
with open(path,"r",encoding="utf-8") as file:
data = yaml.load(stream=file,Loader=yaml.FullLoader)
return data
print(readYaml(r'F:\Python_Project\app_auto_po\data\data.yaml'))
'''
{'caps': {'platformName': 'Android', 'deviceName': '127.0.0.1:62001', 'appPackage': 'com.vphone.launcher', 'appActivity': 'com.vphone.launcher.Launcher'}}
'''
三、实例
basepage (存放公用方法)
from appium.webdriver.common.touch_action import TouchAction
class BasePages:
def __init__(self,driver):
self.driver = driver
#元素定位
def locator(self,*loc):
return self.driver.find_element(*loc)
#清空
def clear(self,*loc):
self.locator(*loc).clear()
#输入
def input(self,test,*loc):
self.locator(*loc).send_keys(test)
#点击
def click_e(self,*loc):
self.locator(*loc).click()
#点击坐标轴
def click_l(self,n,m):
TouchAction(self.driver).tap(x =n,y = m).perform()
#滑动(上下左右滑动)
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)
data(存放数据)
caps:
platformName: Android
deviceName: 127.0.0.1:62001
appPackage: com.vphone.launcher
appActivity: com.vphone.launcher.Launcher
readyaml (读取数据)
import yaml
def readYaml(path):
with open(path,"r",encoding="utf-8") as file:
data = yaml.load(stream=file,Loader=yaml.FullLoader)
return data
ac_page(打开应用中心页面)
from basepage.basepage import BasePages
from appium.webdriver.common.mobileby import MobileBy
class ACPage(BasePages):
def __init__(self,driver):
BasePages.__init__(self,driver)
#点击应用中心
def click_AC(self):
self.click_e(MobileBy.XPATH,'//android.widget.TextView[@content-desc="应用中心"]')
search_page (点击搜索框的页面)
from basepage.basepage import BasePages
from appium.webdriver.common.mobileby import MobileBy
class SearchPage(BasePages):
def __init__(self,driver):
BasePages.__init__(self,driver)
#点击输入框
def click_sk(self):
self.click_l(1440,85)
#输入框中输入内容
def input_value(self,text):
self.input(text,MobileBy.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.View/android.widget.EditText')
#点击搜索
def click_s(self):
self.click_l(1750,100)
#点击微信
def click_w(self):
self.click_l(180,550)
app_auto (测试用例)
import unittest, time, os
from ddt import ddt,data
from appium import webdriver
from readdata.readyaml import readYaml
from pages.ac_page import ACPage
from pages.search_page import SearchPage
@ddt
class AppCenter(unittest.TestCase):
driver = None
@classmethod
def setUpClass(cls) -> None:
data_path = 'data\data.yaml' # 文件所在的相对路径
# 定位(dirname)当前文件的父类的父类目录(两次使用是因为,第一次定位到本身,第二次跳出当前目录),转为正确格式(abspath,将字符串中表示路径的杠由/转为\),最后拼接字符串(join,注意最后一个元素开头不要用/)
path = os.path.join(os.path.abspath(os.path.dirname(os.path.dirname(__file__))), data_path)
# 第一个参数的网址是从appium中录制获取的(固定格式可以直接记住),后面的参数是读取到yaml文件中的配置信息
cls.driver = webdriver.Remote('http://localhost:4723/wd/hub', readYaml(path)['caps']) # 驱动对象
cls.driver.implicitly_wait(30) # 在设置隐士等待
def test_center(self):
page = ACPage(self.driver)
page.click_AC()
@data('微信')
def test_s(self,d):
page=SearchPage(self.driver)
page.click_sk()
page.input_value(d)
page.click_s()
page.click_w()
@classmethod
def tearDownClass(cls) -> None:
time.sleep(2)
cls.driver.quit()
if __name__ == '__main__':
unittest.main()