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

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()

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值