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

news2025/7/19 4:58:41

目录

  • 1. 发送短信
  • 2. GSM电话
  • 3. 设置模拟信号强弱
  • 4. 设置网速
  • 5. 设置网络连接类型


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

当我们使用模拟器来进行测试的时候,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!")

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

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)

效果展示

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

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)
        

设置前信号状态:
在这里插入图片描述
设置后信号状态:设置成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)

效果展示:
运行前网络类型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

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

❓❗问题记录:
在使用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有什么区别?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/36343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#重启 --- 类和对象

​​​​​​ 1.类是抽象的,对象是具体的 2.类中有数据成员和方法成员(数据成员是名词性的,方法成员是动词性的) 1.类的关键字是class (变量:首字母小写,方法:首字母大写&#x…

【毕业设计】机器学习的员工离职模型研究-python

目录 前言 课题背景和意义 实现技术思路 变量分析 数据导入 构建机器学习模型 1. 1 复制数据删除不需要的变量 1.2 列变量属性分类 实现效果图样例 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设…

Charles证书安装windows11抓包 Https协议

1、Charles 的CA证书 如果需要截取分析 Https 协议相关的内容,那么需要安装 Charles 的 CA 证书,需要在 win11 电脑上安装证书。 2、证书安装路径 点击 Charles 的顶部菜单,选择 “Help” –> “SSL Proxying” –> “Install Charl…

Revit修改:网格角度,体量轮廓,梁随斜板

一、Revit中使幕墙系统网格改变角度 绘制幕墙系统时,若幕墙系统出现如下图情况: 若想改变该网格的角度,使其与该幕墙上下边界平行或垂直则选中该幕墙,修改属性栏的中的网格角度。如下图所示: 修改完所需角度后&#xf…

web网页设计期末课程大作业——汉中印象旅游景点介绍网页设计与实现19页面HTML+CSS+JavaScript

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

基于FPGA的Hamiton方程--辛几何算法实现(全网唯一)

1、本文实验基于冯康院士的《哈密尔顿系统的辛几何算法》开展,链接:https://pan.baidu.com/s/1GM0Px7SLWBWzh4sXmAdcwg 提取码:fmkt 2、虽然题目写的是基于FPGA的求解,但实际上采用的是VHLS来实现的,最近根本不想写v…

m基于rbf神经网络和遗传算法优化的MIMO-OFDM系统信道估计算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 MIMO-OFDM的信道估计:时,频,空三个域都要考虑,尤其是在空域,不同天线发射的导频序列需要相互正交,否则在接收端无法…

使用星凸随机超曲面模型对扩展对象和分组目标进行形状跟踪(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

学习Python要学习哪些课程?

通过学习 Python数据分析与应用课程,可以掌握Python进行科学计算、可视化绘图、数据处理,分析与建模、构建聚类、回归、分类模型的主要方法和技能,并为后续相关课程学习及将来从事数据分析挖掘研究、数据分析工作奠定基础。 Python数据分析与…

进程互斥以及进程互斥实现方法(包含代码)

进程互斥有关概念: 两种资源共享方式: 1.互斥共享:一个时间段内只允许一个进程进行访问 2.同时共享:一个时间段内允许多个进程进行“同时”访问 临界资源:一个时间段内只允许一个进程进行访问的资源 访问临界区的…

第二章 爬虫的实现原理和技术(一)

2.1 爬虫的实现原理 不同类型的爬虫,具体的实现原理也不尽相同,但是这些爬虫之间存在许多共性。下面我将以通用爬虫与聚焦爬虫为例,具体来讲解爬虫是如何来运作的。 通用爬虫的工作原理 通用爬虫是一个自动提取网页的程序,能够从Internet上下载网页,是大多的搜索引擎的…

关于FFmepg的冷知识,这一篇就够了

每一个从事音视频技术开发的工程师对FFmpeg都不会感到陌生,即使是刚刚踏入这个行业的初学者,但对他们来说这条路上好像有着一条不可逾越的鸿沟,“雷神”和许多大神都总结过一些FFmpeg的学习方法,小编在这里为大家做一个整理&#…

《恋上数据结构与算法》第1季:动态数组原理实现(图文并茂,一文带你了解ArrayList底层实现)

动态数组原理实现一、数组(Array)二、动态数组三、动态数组的设计四、动态数组的实现1. 添加元素2. 数组扩容3. 删除元素4. 数组缩容5. 清空元素6. 修改元素7. 查询元素8. 插入元素9. 查看元素位置10. 是否包含某个元素11. 元素的数量12. 数组是否为空13…

win11的C/C++环境配置——基于MinGW-W64 GCC-8.1.0

首先给出MinGW-W64 GCC-8.1.0的下载地址:MinGW8.1.0 Win11下的C/C环境配置下载MinGW-W64 GCC-8.1.0添加bin文件和include文件到path变量中测试下载MinGW-W64 GCC-8.1.0 网页截图如下: 可以复制下载地址到迅雷中加速,下载完成后的文件如下&a…

MCE | “神药”二甲双胍后,糖尿病药物研究谁将是下一个顶流?

说到糖尿病药物,就不得不提一嘴“神药”二甲双胍,但除了二甲双胍,抗糖尿病药物的研究难道就没有点新玩意儿?当然有! 糖尿病 (Diabetes) 是一种以高血糖为特征的慢性代谢病,是由于胰岛素分泌缺陷或者其生物…

美团闪购:闪电仓商户如狼似虎,传统商超便利店坐享其成?

近日,考研网红教师张雪峰一句“外卖员这个职业5-10年内可能会消失”再度登上热搜。 其实,他的这个推论,只是看到了目前外卖骑手的保有量,截至2021年,中国外卖骑手约1300万名。并没有看到炙手可热的“即时消费”新趋势&…

【Shell 脚本速成】05、Shell 运算详解

目录 一、赋值运算 二、算术运算[四则运算] 2.1 运算符与命令 2.2 整形运算 expr 命令:只能做整数运算,格式比较古板,运算符号两边注意空格 let命令:只能做整数运算,且运算元素必须是变量,无法直接对…

MySQL窗口函教-序号函数(row_number、rank、dense_rank)

MySQL窗门函教-序号函数(row_number、rank、dense_rank) 前言 mysql8.0中新增窗口函数(开窗函数) 窗口函数和普通聚合函数的区别 ①聚合函数是将多条记录聚合为一条;窗口函数是每条记录都会执行,有几条记…

代码源每日一题div1 区间和

区间和 - 题目 - Daimayuan Online Judge 题意: 思路: 根据前缀和的性质:当已知的前缀和区间是整个区间的划分时,才能求出整个区间的和 因为如果两个区间之间有交叉,交叉部分的和求不出来 因此,如果已知…

DeFi收益来源全面概述

去中心化金融一个主要的优势就是它对所有人开放,任何人在任何时间、任何地点都可以参与其中。这样一来,作为DeFi参与者就有机会获得在传统金融领域很难获得或根本不可能获得的收益。 加密货币的特性是开源的、无需许可的,这将DeFi变成了一个…