• App自动化测试框架设计与实现



    1.demo1.py

    # 1.去登录考研帮系统
    import time
    from time import sleep
    
    from appium import webdriver
    #  用python代码去做app自动化 先要获取 app程序的手机信息
    #  手机配置信息 我们统一写在info中
    from class45.config.config_read import yaml_load
    
    data2 = yaml_load.read_yaml()#3.调用yaml文件的数据
    info = {
        #操作平台
        'platformName':'Android',
        #版本号
        'platformVersion':'7.1.2',
        #设备信息 可自由编写 不能为空 不能为中文
        'deviceName':'127.0.0.1:62001',
        # 包名
        'appPackage':'com.tal.kaoyan',
        #界面名/入口名
        #界面名 在这里要注意填写的界面名并不是app打开的第一页的字符码
        #当前包名和界面名获取的方式:cmd - adb shell dumpsys window | findstr mCurrentFocus
        # 获取入口名
        # 1.有apk的情况下获取包名和入口名 cmd - aapt dump badging 文件拖拽
        # 2.apk的包不见了,又想获取入口名,那我们可以通过monkey命令来获取
        # 1. adb shell pm list packages -3
        # 2. adb shell monkey -p 包名 -v-v-v 1
        # 其中onent的后面就是入口名 末尾的end不要带
        #有apk的
        'appActivity':'com.tal.kaoyan.ui.activity.SplashActivity',
        #重置
        'noReset':False
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    2.yaml文件

    platformName: Android,
    platformVersion: 7.1.2,
    deviceName: 127.0.0.1:62001,
    appPackage: com.tal.kaoyan,
    appActivity: com.tal.kaoyan.ui.activity.SplashActivity,
    noReset: False
    ip: 127.0.0.1
    port: 4723
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.读取yaml文件数据

    # 专门读取yaml文件数据
    # 第一步获取yaml文件中的参数
    import yaml
    
    
    class yaml_load:
        def read_yaml(self): #2.封装
            with open('../data/cs_caps.yaml','r',encoding='utf-8') as f: #6.导入yaml的文件绝对路径
                data = yaml.load(f,yaml.FullLoader)
                print(data)
                return data #2.返回
    data2 = yaml_load().read_yaml()
    print(data2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.放路径

    # 5.专门放路径
    import os
    class Config:
        config_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)),'data')
        #5.5拿到yaml文件的绝对路径
        yaml_path = config_dir+'\cs_caps.yaml'
        print(yaml_path)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5.字典赋值

    #7.我们配置信息的组成是一个字典,原来的字段我们无法进行传递参数 所以我们先创建一个空字段 然后给字典赋值
    from appium import webdriver
    
    from class45.config.config_read import yaml_load
    
    
    def desired_caps():
        data = yaml_load().read_yaml() #7.获取文件的值
        print(data)
        info = {}
        info['platformName'] = data['platformName']
        info['platformVersion'] = data['platformVersion']
        info['deviceName'] = data['deviceName']
        info['appPackage'] = data['appPackage']
        info['appActivity'] = data['appActivity']
        info['noReset'] = data['noReset']
        driver = webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub',info)
    
        driver.implicitly_wait(3)
        return driver
    
    if __name__ == '__main__':
        desired_caps()
    
    # 完成配置信息的优化后我们就可以直接在yaml文件去修改参数
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    6.专门封装取消滑动

    # 9.专门封装取消跳过滑动
    from selenium.webdriver.common.by import By
    
    from class45.base.base_page import Base
    
    
    class Common(Base):
        #10.3 Base中*loc所以我们元组
        cancel = (By.ID,'android:id/button2') #10.4点击取消 元素获取用的ID
        skip = (By.ID,'com.tal.kaoyan:id/tv_skip')
    
        #10.封装点击取消
        def check_cancel(self):
            # 10.1 调用点击的方法,需要去继承Base的方法
            try: #10.5因为不确定有没有取消点击,所以使用
                self.click(self) #10.8把点击跳过的元素传入到click
            except Exception as e:
                print('没有取消元素')
    
        # 10.6封装跳过
        def check_skip(self):
            try:
                self.click(self)
            except Exception as e:
                print('没有跳过的元素')
    
    
        #11.封装滑动 需要拆分两步,1.获取手机大小 2.设置的时候设置xy计算百分比
        #11.1封装屏幕大小
        def size(self):
            x = self.driver.get_window_size()['width']
            y = self.driver.get_window_size()['height']
            return x,y
    
        #11.2向左封装滑动
        def swipeLeft(self,n,t):
            size2 = self.size()
            x1 = size2[0]*0.8
            y1 = size2[0]*0.9
            x2 = size2[0]*0.2
            for i in range(n):
                self.driver.swipe(x1,y1.x2,y1,t)
    
    #9.1先找到取消、跳过的元素才能点击 所有我们提前封装好base 也就是基类或项目中经常要用的操作,封装在里面
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    7.封装经常要使用的动作

    #10. 在这封装经常要使用的动作
    from selenium.webdriver.support.wait import WebDriverWait
    
    
    class Base:
        def __init__(self,driver):
            self.driver = driver
            # 10.找到元素并且设置显示等待
    
        def locator(self,loc,timeout=10,poll=0.5): #loc要找的元素 timeout:总等待时长 poll:查看间隔
            WebDriverWait(self.driver,timeout,poll).until(lambda x:x.find_element(*loc))
            #10 输入的方法
        def input_(self,loc,text):
            self.locator(loc).send_keys(text)
            #10.点击的方法
        def click(self,loc):
            self.locator(loc).click()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    8.登录封装

    #12.实现登录 输入用户名 输入密码 点击登录
    #12.1 其实还有取消 跳过的业务 继承就可以了
    from selenium.webdriver.common.by import By
    
    from class45.common.common_fun import Common
    from class45.desired.desired_cap import desired_caps
    
    
    class LoginView(Common): #在登录操作中有点击跳过的操作 所以我们继承common -Base
        #12.2 账号的输入框 元素
        global username_type = (By.ID,'com.tal.kaoyan:id/login_email_edittext')
        #12.2 密码的输入框 元素
        global password_type = (By.ID,'com.tal.kaoyan:id/login_password_edittext')
        #12.2 登录按钮 元素
        global loginBtn = (By.ID,'com.tal.kaoyan:id/login_login_btn')
    
        #12.3 封装登录流程
        def login(self,username,password):
            self.check_cancel() #点击取消
            self.check_skip() #点击跳过
            self.input_(self,username_type,username)
            self.input_(self,password_type,password)
            self.click(self,loginBtn)
    
        # 13 扩展
        # 13.1 我知道了
        know = (By.ID, '')
        # 13.1下线提醒
        warning2 = (By.ID, '')
        # 13 点击我知道
        def check_alter(self):
            print('检查弹窗知道了')
            try:
                self.click(self.know)
            except Exception as e:
                print('没有我知道')
    
        def check_alter(self):
            print('检查下线提醒')
            try:
                self.click(self.warning2)
            except Exception as e:
                print('没有下线提醒')
    
    
    #12.4 查看登录有没有问题
    if __name__ == '__main__':
        driver = desired_caps()
        lp = LoginView(driver)
        lp.login('qwerty2664','qwerty123')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
  • 相关阅读:
    骨传导运动耳机哪个牌子好?值得买的骨传导运动耳机
    Vue-DPlayer详细使用(包含遇到坑)
    [N诺] 浙江大学历年机试题解
    微信小程序中自定义模板
    # Spring MVC与RESTful API:如何设计高效的Web接口
    OSG笔记:OSG实现文字倾斜
    post发送请求
    day09-Tomcat01
    2.2 在 Linux 上安装 MySQL Shell
    SQL必需掌握的100个重要知识点:汇总数据
  • 原文地址:https://blog.csdn.net/BlackEnn/article/details/126244578