老李分享:接电话扩展之uiautomator

 

poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200。

问题

在做自动化测试的时候,我们遇到接电话的case。这个问题的难点在于要自动的实现某一个时刻有电话打进来才能起作用。像我上篇文章写的case,是一个接电话的case,那么要想让该case起作用,我就得启动case后,手动拨一个电话给该手机。这不叫自动化,只能称为半自动化。那么有没有办法能让某个手机在莫个时间准确的打个电话过来。

思路1

用框架去控制2台手机,告诉其中一台手机给另一台手机打个电话,用我们自研的框架可以实现这个功能。但是问题在于现在不能通过调用API来获取手机号啦,那么如果这么做的话,就得每次手动填写手机号。可能对做APP测试的公司也没太大问题,但是如果是测手机的,手机型号就有很多种,那么sim卡也是很多的,要是每次都填写手机号,是不可行的。所以这个方法在研究了一下午后被我放弃了。

思路2

现在获取手机号的方式有2种,一种发短信给10086,但是不是所有运营商的手机都可以。那么打电话算最靠谱了吧。所以我们需要一个机器来接受来电,然后记录下来电号码,暂且称该手机为总机。只要给总机拨个电话,那么总机就能知道手机号了。如果这个时候,再回拨给该手机,也就是实现了在某个时刻准确的打个电话过来。

所以得在总机上安装个apk,用BroadcastReceiver来处理这种需求。

apk

public class PhoneReceiver extends BroadcastReceiver {

private static final String TAG = "PhoneReceiver";

private String lastIncomingNumber;

private Context context;

private boolean hasCallBack = false;

@Override

public void onReceive(Context context, Intent intent) {

Log.d(TAG, "接收到广播 : " + intent.getAction());

// 如果是去电

this.context = context;

if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {

String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);

Log.d(TAG, "call OUT:" + phoneNumber);

} else {

TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);

tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);

}

}

PhoneStateListener listener = new PhoneStateListener() {

@Override

public void onCallStateChanged(int state, String incomingNumber) {

Log.d(TAG, "电话状态发生改变" + incomingNumber);

switch (state) {

case TelephonyManager.CALL_STATE_IDLE:

Log.d(TAG, String.format("电话状态变为空闲"));

if (!hasCallBack && lastIncomingNumber != null && lastIncomingNumber.length() != 0) {

hasCallBack = true;

Log.d(TAG, String.format("已挂断和 %s 的通话", lastIncomingNumber));

Intent phoneIntent = new Intent("android.intent.action.CALL", Uri.parse("tel:" + lastIncomingNumber));

phoneIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(phoneIntent);

}

break;

case TelephonyManager.CALL_STATE_OFFHOOK:

break;

case TelephonyManager.CALL_STATE_RINGING:

Log.d(TAG, String.format("收到%s的来电", incomingNumber));

hasCallBack = false;

lastIncomingNumber = incomingNumber;

break;

}

}

};

}

老李分享:接电话扩展之uiautomator 1的更多相关文章

  1. 老李分享:接电话扩展之uiautomator 2

    主要的类就是上面的PhoneReceiver广播接收者.来电的时候,我们记录下电话号码,等该来电挂断以后,立即回拨给对方.配置文件如下: <?xml version="1.0" ...

  2. 老李分享:接电话之uiautomator 1

    老李分享:接电话之uiautomator   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9 ...

  3. 老李分享:《Java Performance》笔记1——性能分析基础 1

    老李分享:<Java Performance>笔记1——性能分析基础   1.性能分析两种方法: (1).自顶向下: 应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会. ...

  4. 老李分享:JVM调优

    老李分享:JVM调优   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨 ...

  5. 老李分享:Web Services 组件 1

    老李分享:Web Services 组件   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9 ...

  6. 老李分享:qtp自动化测试框架赏析-关键字自动化测试框架

    老李分享:qtp自动化测试框架赏析-关键字自动化测试框架   QTP从2005年继winrunner,robot逐渐退出历史舞台之后,占领主流自动化测试工具市场已经10年之久.当初为了提高在自动化测试 ...

  7. 老李分享:开发python的unittest结果输出样式

    老李分享:开发python的unittest结果输出样式   Python的unittest结果命令行输出,格式比较乱.为了提高格式输出的可读性,实现可以不同的颜色标识.所以准备扩展Python的un ...

  8. Mvc项目架构分享之项目扩展

    Mvc项目架构分享之项目扩展 Contents 系列一[架构概览] 0.项目简介 1.项目解决方案分层方案 2.所用到的技术 3.项目引用关系 系列二[架构搭建初步] 4.项目架构各部分解析 5.项目 ...

  9. 老李分享:接口测试之jmeter

    老李分享:接口测试之jmeter   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.移动端自动化测试很多人把他仅仅理解成appu ...

随机推荐

  1. esri-leaflet入门教程(5)- 动态要素加载

    esri-leaflet入门教程(5)- 动态要素加载 by 李远祥 在上一章节中已经说明了esr-leaflet是如何加载ArcGIS Server提供的各种服务,这些都是服务本身来决定的,API脚 ...

  2. 解读Java内部类

    一.基本概念: 顾名思义,内部类存在于外部类当中,依附于外部类.就像眼睛和脑袋的关系一样. 二.几点说明: 1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以 ...

  3. Linux 7.2 + LAMP + Nagios-4.2.4 + 简单部署监控项

    Nagios详细文档 监控端 一.安装依赖包并设置Apache服务. yum -y install httpd php gcc gd perl unzip openssl-devel vi /etc/ ...

  4. HTML5拖放加入购物车

    H5拖放事件巩固实例: 1.简单布局一下,商品信息放入一个ul中:div为购物车,后续会创建元素 <ul> <li draggable="true"> &l ...

  5. 谈 jquery中.band() .live() .delegate() .on()的区别

    bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数 $("a").bind("click",function(){alert(& ...

  6. video.js支持m3u8格式直播

    为什么要使用video.js? 1. PC端浏览器并不支持video直接播放m3u8格式的视频 2. 手机端各式各样的浏览器定制的video界面风格不统一,直接写原生的js控制视频兼容性较差 3. v ...

  7. 每天一个Linux命令(15)--tail命令

    tail 命令从指定点开始将文件写到标准输出.使用  tail  命令的  -f  选项可以方便的查阅正在改变的日志文件 , tail  -f  filename  会把  filename  里最尾 ...

  8. iOS 图片旋转方法

    iOS 图片旋转方法 通过 CGImage 或 CIImage 旋转特定角度 UIImage可通过CGImage或CIImage初始化,初始化方法分别为init(cgImage: CGImage, s ...

  9. Scalatra--Introduction And Quick start

    Introduction Scalatra是一款轻易级Scala web框架,通过Scalatra可以很轻易创建web Application,由Linkedln开源并遵循了Ruby Web框架的Si ...

  10. Spark数据本地化-->如何达到性能调优的目的

    Spark数据本地化-->如何达到性能调优的目的 1.Spark数据的本地化:移动计算,而不是移动数据 2.Spark中的数据本地化级别: TaskSetManager 的 Locality L ...