• 【App自动化测试】(九)移动端复杂测试环境模拟——来电、短信、网络切换



    前言
    本文为在霍格沃兹测试开发学社中学习到的一些技术写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 😘

    当我们使用模拟器来进行测试的时候,Appium为我们提供一些Android AVD 模拟器专用的API(类似MUMU等第三方模拟器无法使用),来帮助我们模拟复杂的测试环境,例如,模拟来电,模拟来短信,模拟网络切换等等,下面就也得大家介绍一下常用的API。

    1. 发送短信

    API链接:http://appium.io/docs/en/commands/device/network/send-sms/

    功能:在连接的模拟器上模拟发送SMS事件。(仅Android可用)

    方法send_sms( phone_number: str, message: str)

    参数说明

    • phone_number:发送人手机号
    • message:发送的短信内容

    使用方法self.driver.send_sms('18300000001', 'Hey Appium!')

    示例

    from time import sleep
    from appium import webdriver
    from appium.webdriver.extensions.android.gsm import GsmCallActions, GsmSignalStrength, GsmVoiceState
    from appium.webdriver.extensions.android.network import NetSpeed
    
    class TestPhoneNetwork:
        def setup(self):
            # 创建一个字典
            desire_cap = {}
            # 模拟器名称,只支持AVD模拟器
            desire_cap['automationName']='UiAutomator2'
            # 平台
            desire_cap['platform'] = 'Android'
            # 手机系统版本
            desire_cap['platformVersion'] = '6.0'
            # 设备名
            desire_cap['deviceName'] = 'emulator-5554'
            self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desire_cap)
            self.driver.implicitly_wait(10)
    
        def teardown(self):
            self.driver.quit()
    
        def test_send_sms(self):
            #模拟发短信
            self.driver.send_sms('555-123-4567',"Hello! Appium!")
    
    • 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

    效果展示
    在这里插入图片描述

    2. GSM电话

    API链接:http://appium.io/docs/en/commands/device/network/gsm-call/

    功能:在连接的模拟器上模拟打电话操作。(仅Android可用)

    方法make_gsm_call( phone_number: str, action: str)

    参数说明

    • phone_number:来电号码
    • action:呼叫动作,GsmCallActions中的对象
      • CALL:拨打
      • ACCEPT:接通
      • CANCEL:挂断
      • HOLD:呼叫保持

    使用方法self.driver.make_gsm_call('18300000001', GsmCallActions.CALL)

    示例

    from time import sleep
    from appium import webdriver
    from appium.webdriver.extensions.android.gsm import GsmCallActions, GsmSignalStrength, GsmVoiceState
    from appium.webdriver.extensions.android.network import NetSpeed
    
    class TestPhoneNetwork:
        def setup(self):
            # 创建一个字典
            desire_cap = {}
            # 模拟器名称,只支持AVD模拟器
            desire_cap['automationName']='UiAutomator2'
            # 平台
            desire_cap['platform'] = 'Android'
            # 手机系统版本
            desire_cap['platformVersion'] = '6.0'
            # 设备名
            desire_cap['deviceName'] = 'emulator-5554'
            self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desire_cap)
            self.driver.implicitly_wait(10)
    
        def teardown(self):
            self.driver.quit()
    
        def test_phone_call_acept(self):
            #模拟打电话并接通
            #打电话
            self.driver.make_gsm_call('18300000001', GsmCallActions.CALL)
            sleep(5)
            #接通
            self.driver.make_gsm_call('18300000001',GsmCallActions.ACCEPT)
            sleep(5)
        
        def test_phone_call_cancel(self):
            # 模拟打电话并挂断
            self.driver.make_gsm_call('18300000002', GsmCallActions.CALL)
            sleep(5)
            self.driver.make_gsm_call('13000010002', GsmCallActions.CANCEL)
            sleep(5)
    
        def test_phone_call_hold(self):
            # 模拟打电话并呼叫保持
            self.driver.make_gsm_call('18300000003', GsmCallActions.CALL)
            sleep(5)
            self.driver.make_gsm_call('13000010003', GsmCallActions.HOLD)
            sleep(5)
    
    • 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

    效果展示

    打电话:
    在这里插入图片描述
    接通:
    在这里插入图片描述

    3. 设置模拟信号强弱

    API链接:http://appium.io/docs/en/commands/device/network/gsm-signal/

    功能:模拟设置型号强弱。(仅Android可用)

    方法set_gsm_signal(strength: int)

    参数说明

    • strength:信号强度,GsmSignalStrength中的对象
      • NONE_OR_UNKNOWN :无信号
      • POOR:信号弱
      • MODERATE:信号中等
      • GOOD:信号好
      • GREAT :信号满格

    使用方法 self.driver.set_gsm_signal(GsmSignalStrength.GOOD)

    示例

    from time import sleep
    
    from appium import webdriver
    from appium.webdriver.common.appiumby import AppiumBy
    from appium.webdriver.extensions.android.gsm import GsmCallActions, GsmSignalStrength, GsmVoiceState
    from appium.webdriver.extensions.android.network import NetSpeed
    
    
    class TestPhoneNetwork:
        def setup(self):
            # 创建一个字典
            desire_cap = {}
            # 模拟器名称,只支持AVD模拟器
            desire_cap['automationName']='UiAutomator2'
            # 平台
            desire_cap['platform'] = 'Android'
            # 手机系统版本
            desire_cap['platformVersion'] = '6.0'
            # 设备名
            desire_cap['deviceName'] = 'emulator-5554'
            self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desire_cap)
            self.driver.implicitly_wait(10)
    
        def teardown(self):
            self.driver.quit()
    
        def test_phone_signal(self):
            # 模拟设置信号强度
            #满格
            self.driver.set_gsm_signal(GsmSignalStrength.GREAT)
      
            #以五格满格为准的话
            # 无信号
            # self.driver.set_gsm_signal(GsmSignalStrength.NONE_OR_UNKNOWN)
            # 两格
            # self.driver.set_gsm_signal(GsmSignalStrength.POOR)
            # 三格
            # self.driver.set_gsm_signal(GsmSignalStrength.MODERATE)
            # 四格
            #self.driver.set_gsm_signal(GsmSignalStrength.GOOD)
            
    
    • 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

    设置前信号状态:
    在这里插入图片描述
    设置后信号状态:设置成GREAT后,信号变为满格状态
    在这里插入图片描述

    4. 设置网速

    API链接:http://appium.io/docs/en/commands/device/network/network-speed/

    功能:设置模拟器网速。(仅Android模拟器可用)

    方法set_network_speed(speed_type: str)

    参数说明

    • speed_type:网络类型,NetSpeed中的对象
      • GSM:GSM/CSD (网速上限:14.4kbps, 网速下限:14.4kbps)
      • SCSD:HSCSD (网速上限: 14.4kbps, 网速下限: 57.6kbps)
      • GPRS:GPRS(网速上限: 28.8kbps, 网速下限: 57.6kbps)
      • EDGE:EDGE/EGPRS(网速上限:473.6kbps, 网速下限:473.6kbps)
      • UMTS: UMTS/3G(网速上限: 384.0kbps, 网速下限: 384.0kbps)
      • HSDPA: HSDPA(网速上限: 5760.0kbps, 网速下限: 13980.0kbps)
      • LTE: LTE(网速上限: 5800.0kbps, 网速下限: 17300.0kbps)
      • EVDO: EVDO (网速上限:7500.0kbps, 网速下限: 28000.0kbps)
      • FULL: 无限制(默认网速上限: 0.0kbps, 网速下限: 0.0kbps)

    使用方法self.driver.set_network_speed(NetSpeed.LTE)

    示例

    from time import sleep
    from appium import webdriver
    from appium.webdriver.extensions.android.gsm import GsmCallActions, GsmSignalStrength, GsmVoiceState
    from appium.webdriver.extensions.android.network import NetSpeed
    
    
    class TestPhoneNetwork:
        def setup(self):
            # 创建一个字典
            desire_cap = {}
            # 模拟器名称,只支持AVD模拟器
            desire_cap['automationName']='UiAutomator2'
            # 平台
            desire_cap['platform'] = 'Android'
            # 手机系统版本
            desire_cap['platformVersion'] = '8.1'
            # 设备名
            desire_cap['deviceName'] = 'emulator-5554'
            self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desire_cap)
            self.driver.implicitly_wait(10)
    
        def teardown(self):
            self.driver.quit()
    
        def test_phone_network_speed(self):
            self.driver.set_network_speed(NetSpeed.LTE)
    
    • 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

    效果展示:
    运行前网络类型GSM:
    在这里插入图片描述
    运行后网络类型LTE:
    在这里插入图片描述

    5. 设置网络连接类型

    功能:设置模拟器网速。(仅Android模拟器可用)

    方法set_network_connection( connection_type: int)

    参数说明

    • connection_type:网络连接类型
      • 0:无网络连接
      • 1:飞行模式
      • 2:只有WiFi
      • 4:只有数据模式
      • 6:WIFI和数据模式都启用

    使用方法self.driver.set_network_connection( 1)

    示例

    from time import sleep
    
    from appium import webdriver
    from appium.webdriver.extensions.android.gsm import GsmCallActions, GsmSignalStrength, GsmVoiceState
    from appium.webdriver.extensions.android.network import NetSpeed
    
    
    class TestPhoneNetwork:
        def setup(self):
            # 创建一个字典
            desire_cap = {}
            # 模拟器名称,只支持AVD模拟器
            desire_cap['automationName']='UiAutomator2'
            # 平台
            desire_cap['platform'] = 'Android'
            # 手机系统版本
            desire_cap['platformVersion'] = '8.1'
            # 设备名
            desire_cap['deviceName'] = 'emulator-5554'
            self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desire_cap)
            self.driver.implicitly_wait(10)
    
        def teardown(self):
            self.driver.quit()
    
        def test_phone_network_connection(self):
            # 模拟网络设置
            self.driver.set_network_connection(1)  # 1:airplane model
    
    • 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

    效果展示
    运行前没有开启飞行模式:
    在这里插入图片描述
    运行后开启运行模式:
    在这里插入图片描述

    ❓❗问题记录:
    在使用set_network_connection进行练习的过程中发现,当从其他模式切换到飞行模式,或者从飞行模式切换到其他模式的时候,测试用例都会执行失败并报错(虽然测试用例报错运行失败,但实际上模式切换是成功了。),主要报错内容如下:

    Permission Denial: not allowed to send broadcast android.intent.action.AIRPLANE_MODE from pid=14717, uid=2000

    错误的主要原因是因为没有权限无法进行飞行模式的切换。怎么去解决这个问题呢?目前也没找到解决办法,如果有了解的小伙伴,欢迎告知!!


    文末说明:
    接口测试中我们很容易混淆Session、cookie和token,你知道他们有什么区别吗?

    快来跟我一起看,一篇文章让你了解三者的区别。😎
    ⬇⬇⬇⬇⬇⬇⬇
    👍👍👍:接口测试经典面试题:Session、cookie、token有什么区别?

  • 相关阅读:
    Web安全基础
    C++中迭代器的使用
    Vue 之 vue3 与 TS 的配合使用整理
    得一微冲刺科创板上市:拟募资约12亿元,2021年营收同比增长260%
    发过的朋友圈怎么再快速发一次?
    【华为OD机试真题 python】 城市聚集度【2022 Q4 | 200分】
    5大数据结构
    ISO Swift高德导航开发指南
    计算机毕设(附源码)JAVA-SSM连锁便民超市前端系统
    前k个高频元素_优先队列_java
  • 原文地址:https://blog.csdn.net/gjj920318/article/details/127996756