• 09.06app端自动化


    前言
            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: emulator-5554
    4.   appPackage: com.vphone.launcher
    5.   appActivity: com.vphone.launcher.Launcher


    读取模块

    首先需要导入第三方包 :

    pip install pyYAML

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

    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.  
    7. print(readYaml(r'F:\Python_Project\app_auto_po\data\data.yaml'))
    8.  
    9. '''
    10. {'caps': {'platformName': 'Android', 'deviceName': '127.0.0.1:62001', 'appPackage': 'com.vphone.launcher', 'appActivity': 'com.vphone.launcher.Launcher'}}
    11. '''


    三、实例
    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)
    31.  data(存放数据)

    pageone

    1. from basepage.base import BasePages
    2. from appium.webdriver.common.mobileby import MobileBy
    3. class PageOne(BasePages):
    4. def __init__(self,driver):
    5. BasePages.__init__(self,driver)
    6. #元素定位
    7. def danji(self):
    8. self.click(MobileBy.XPATH,"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.LinearLayout[1]/android.widget.Button[1]")

    pagetwo

    1. from basepage.base import BasePages
    2. from appium.webdriver.common.mobileby import MobileBy
    3. class PageTwo(BasePages):
    4. def __init__(self,driver):
    5. BasePages.__init__(self,driver)
    6. #点击搜索框
    7. def dianji(self):
    8. self.click(MobileBy.ID,"fengchedongman.apps.com:id/lx")
    9. #输入内容
    10. def shuru(self,text):
    11. self.input(text,MobileBy.ID,'fengchedongman.apps.com:id/a0o')
    12. #点击搜索
    13. def sousuo(self):
    14. self.click(MobileBy.ID,'fengchedongman.apps.com:id/a0j')

    pagethree

    1. from basepage.base import BasePages
    2. from appium.webdriver.common.mobileby import MobileBy
    3. class PageThree(BasePages):
    4. def __init__(self,driver):
    5. BasePages.__init__(self,driver)
    6. #添加到书架
    7. def tianjia(self):
    8. self.click(MobileBy.ID,'fengchedongman.apps.com:id/gu')

    po模型代码

    1. from appium import webdriver
    2. import unittest,time
    3. from pages.pageone import PageOne
    4. from pages.pagetwo import PageTwo
    5. from pages.pagethree import PageThree
    6. class TestClass(unittest.TestCase):
    7. @classmethod
    8. def setUpClass(cls) -> None:
    9. caps = {}
    10. caps["deviceName"] = "emulator-5554"
    11. caps["platformName"] = "Android"
    12. caps["appPackag"] = "fengchedongman.apps.com"
    13. caps["appActivity"] = "com.Stub.App"
    14. cls.driver=webdriver.Remote("http://localhost:4723/wd/hub", caps)
    15. cls.driver.implicitly_wait(30)
    16. def test_001(self):
    17. p1=PageOne(self.driver)
    18. p1.danji()
    19. def test_002(self):
    20. p2=PageTwo(self.driver)
    21. p2.dianji()
    22. p2.shuru("逆天邪神")
    23. p2.sousuo()
    24. def test_003(self):
    25. p3=PageThree(self.driver)
    26. p3.tianjia()
    27. @classmethod
    28. def tearDownClass(cls) -> None:
    29. time.sleep(15)
    30. if __name__ == '__main__':
    31. unittest.main()
  • 相关阅读:
    73、SpringBoot 直接整合 JDBC
    电脑硬盘恢复技巧
    (Research)高分辨率单细胞图谱揭示非小细胞肺癌组织驻留中性粒细胞的多样性和可塑性
    基于C#实现的巧移火柴棍(火柴棍移动)
    foxmail群发邮件怎么发?
    电商前台项目(三):完成Search搜索模块业务
    两年Java开发工作经验面试总结
    Redis 切片集群
    人脸生成对抗+人脸识别流程+insightface
    ubuntu安装nps客户端
  • 原文地址:https://blog.csdn.net/qq_57411925/article/details/126732086