• Day37 移动端自动化(下)


    系列文章目录

    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模型

    二、引入yaml文件

    三、实例

    总结


    前言

            POM是移动自动化所用的模型,POM模型与web自动化中的PO模型非常相似。因此主要描述两者的不同与实例。


    一、POM模型

            POM(page object model)页面对象模型,主要应用于UI自动化测试框架的搭建,主流设计模式之一,页面对象模型:结合面向对象编程思路:把项目的每个页面当做一个对象进行编程。

    第一层:basepage层:描述每个页面相同的属性及行为
    第二层:pageobject层(每个的独有特征及独有的行为)
    第三层:testcase层(用例层,描述项目业务流程)
    第四层:testdata(数据层)

    二、引入yaml文件

    yaml文件:数据层次清晰,可以跨平台,支持多种语言使用(可以适用于别的app)

    优化代码:提取basepage中的配置客户端数据(将配置的数据放在yaml中) 创建config--config.yam

    yaml文件展示(主要存放用于连接的参数,注意这样缩进与空格打印结果是字典套字典)(注意:在冒号后有空格)

    1. caps:
    2. platformName: Android
    3. deviceName: 127.0.0.1:62001
    4. appPackage: com.vphone.launcher
    5. appActivity: com.vphone.launcher.Launcher

    读取模块

    首先需要导入第三方包 :

    pip install pyYAML

    (打印结果是字典套字典)

    python通过open方式读取文件数据,再通过load函数将数据转化为列表或字典;

    1. import yaml
    2. def readYaml(path):
    3. with open(path,"r",encoding="utf-8") as file:
    4. data = yaml.load(stream=file,Loader=yaml.FullLoader)
    5. return data
    6. print(readYaml(r'F:\Python_Project\app_auto_po\data\data.yaml'))
    7. '''
    8. {'caps': {'platformName': 'Android', 'deviceName': '127.0.0.1:62001', 'appPackage': 'com.vphone.launcher', 'appActivity': 'com.vphone.launcher.Launcher'}}
    9. '''

    三、实例

    basepage (存放公用方法)

    1. from appium.webdriver.common.touch_action import TouchAction
    2. class BasePages:
    3. def __init__(self,driver):
    4. self.driver = driver
    5. #元素定位
    6. def locator(self,*loc):
    7. return self.driver.find_element(*loc)
    8. #清空
    9. def clear(self,*loc):
    10. self.locator(*loc).clear()
    11. #输入
    12. def input(self,test,*loc):
    13. self.locator(*loc).send_keys(test)
    14. #点击
    15. def click_e(self,*loc):
    16. self.locator(*loc).click()
    17. #点击坐标轴
    18. def click_l(self,n,m):
    19. TouchAction(self.driver).tap(x =n,y = m).perform()
    20. #滑动(上下左右滑动)
    21. def swipe(self,start_x,start_y,end_x,end_y,duration=0):
    22. #获取屏幕的尺寸
    23. window_size = self.driver.get_window_size()
    24. x = window_size["width"]
    25. y = window_size["height"]
    26. self.driver.swipe(start_x=x*start_x,
    27. start_y=y*start_y,
    28. end_x= x*end_x,
    29. end_y=y*end_y,
    30. duration=duration)

     data(存放数据)

    1. caps:
    2. platformName: Android
    3. deviceName: 127.0.0.1:62001
    4. appPackage: com.vphone.launcher
    5. appActivity: com.vphone.launcher.Launcher

     readyaml (读取数据)

    1. import yaml
    2. def readYaml(path):
    3. with open(path,"r",encoding="utf-8") as file:
    4. data = yaml.load(stream=file,Loader=yaml.FullLoader)
    5. return data

     ac_page(打开应用中心页面)

    1. from basepage.basepage import BasePages
    2. from appium.webdriver.common.mobileby import MobileBy
    3. class ACPage(BasePages):
    4. def __init__(self,driver):
    5. BasePages.__init__(self,driver)
    6. #点击应用中心
    7. def click_AC(self):
    8. self.click_e(MobileBy.XPATH,'//android.widget.TextView[@content-desc="应用中心"]')

    search_page (点击搜索框的页面) 

    1. from basepage.basepage import BasePages
    2. from appium.webdriver.common.mobileby import MobileBy
    3. class SearchPage(BasePages):
    4. def __init__(self,driver):
    5. BasePages.__init__(self,driver)
    6. #点击输入框
    7. def click_sk(self):
    8. self.click_l(1440,85)
    9. #输入框中输入内容
    10. def input_value(self,text):
    11. 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')
    12. #点击搜索
    13. def click_s(self):
    14. self.click_l(1750,100)
    15. #点击微信
    16. def click_w(self):
    17. self.click_l(180,550)

     app_auto (测试用例)

    1. import unittest, time, os
    2. from ddt import ddt,data
    3. from appium import webdriver
    4. from readdata.readyaml import readYaml
    5. from pages.ac_page import ACPage
    6. from pages.search_page import SearchPage
    7. @ddt
    8. class AppCenter(unittest.TestCase):
    9. driver = None
    10. @classmethod
    11. def setUpClass(cls) -> None:
    12. data_path = 'data\data.yaml' # 文件所在的相对路径
    13. # 定位(dirname)当前文件的父类的父类目录(两次使用是因为,第一次定位到本身,第二次跳出当前目录),转为正确格式(abspath,将字符串中表示路径的杠由/转为\),最后拼接字符串(join,注意最后一个元素开头不要用/)
    14. path = os.path.join(os.path.abspath(os.path.dirname(os.path.dirname(__file__))), data_path)
    15. # 第一个参数的网址是从appium中录制获取的(固定格式可以直接记住),后面的参数是读取到yaml文件中的配置信息
    16. cls.driver = webdriver.Remote('http://localhost:4723/wd/hub', readYaml(path)['caps']) # 驱动对象
    17. cls.driver.implicitly_wait(30) # 在设置隐士等待
    18. def test_center(self):
    19. page = ACPage(self.driver)
    20. page.click_AC()
    21. @data('微信')
    22. def test_s(self,d):
    23. page=SearchPage(self.driver)
    24. page.click_sk()
    25. page.input_value(d)
    26. page.click_s()
    27. page.click_w()
    28. @classmethod
    29. def tearDownClass(cls) -> None:
    30. time.sleep(2)
    31. cls.driver.quit()
    32. if __name__ == '__main__':
    33. unittest.main()

    总结

  • 相关阅读:
    LeetCode 1470. 重新排列数组 / 654. 最大二叉树 / 998. 最大二叉树 II
    2.14日学习打卡----初学Zookeeper(一)
    Matlab:数组索引
    ES&elasticsearch-header菜鸟教程06--模糊查询
    一键部署监控
    以太坊历史发展进程
    Flutter自定义输入框同时出现多种字体颜色
    从零开始, 开发一个 Web Office 套件 (3): 鼠标事件
    ElasticSearch--查看健康状态(health)的方法(API)
    软件测试/测试开发丨App自动化测试——显示等待高级使用
  • 原文地址:https://blog.csdn.net/lookout99/article/details/126726212