第一次写博,最近解决了做自动化测试短信验证码自动获取填入的方法减少了脚本的人工干预,并非拦截短信,所以不存在安全警报提醒,拿出来分享给大家,有感兴趣的大家可以加Q1856100

  目前在职测试开发,,写一些脚本,个人认为这职业不科学不应该有的职业,测试就是测试,开发就是开发,运维还是老鸟,这行业总能折腾些莫名其妙的东西出来,刚做这行时学的第一门语言是bash shell, 去新去单位上班直接写了个一键搭建测试环境的测试脚本,本来不想干测试了,好好做微信小程序开发,可是苦于学历不高,时间不够,还有开发工作很累,工资行情也差不了多少,

  不扯了,说这些是因为最近由于一些蹊跷的事情,之前做过人力老板的李某人把我简历给了一家外包,让我以二等公民的身份去做自动化,我想着...项目多有挑战性,加上很长时间没有真正做过测试了,手痒痒就去了,之前做过一些接口自动化,自学过robotframework框架,来了之后才知道这是在做web端和andriod端的UI自动化测试,选好框架码好码就可以RUN了嘛!,用例倒是也简单,就是一些页面展示检查和图形比对....话不多吹

  可是一看需求,一接触就慌了,这TM不适合做自动化呀,第一, 数据查询类web端,这种就没必要做自动化还是功能点点来的快;第二, 主使用环境是IE .最重要的是由于安全原因和现网使用:不用允许留后门,设置万能码,上上下下协调了多少次就是不给解决,这样每次登陆就有2大门槛 1,短信验证码 2,图形验证码

  依据这两个问题,自己查找解决的办法,网上的方法大都是打酱油的多,查了很多也问了很多人,无果,没办法只能自己解决,短信验证码自动获取稍微的简单一些就从这儿入手,我的思路是:既然python处理数据存储也比较方便简单就用它结合selenium来做此产品的框架吧,首先,如果能实时的把短信存储到一份文件里就方便python去读取了,再把读取到的最新短信字段,通过截取数字,发送到输入框不就就搞定了么?

  好了! 需要一个有权限的 APK 在手机实时存储短信到手机内存 /sdcard/smslog.txt 里(外部SD卡也可以,能通过adb命令访问到):

/***** 

......

try {
long timestamp = System.currentTimeMillis();
String time = formatter.format(new Date());
String fileName = "smsLog.txt";
if (Environment.getExternalStorageState().equals(Environment.MOUNTED)) {
String path = Environment.getExternalStorageDirectory()+"/";
***
if (!dir.exists()) {
dir.mkdirs();
}

*

fos.write((time + " " + s).getBytes());
fos.close();
}
return fileName;
} catch (Exception e) {
Log.e("sms", "an error occured while writing file...", e);
}
return null;
}

*******/

注册一下接收器:
<receiver android:name=".SmsInterceptReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>

添加下权限:

<uses-permission android:name="android.permission.RECEIVE_SMS"/>

android脚本好了,签名+打包,装入手机就好了,安装实验一下:安装时我都是一些权限都打开给到这个APK

  自动生成了一个smslog.txt 再打开看一下内容,能正常记录,下面用写一个python脚本截取最后一段的最后四个数字就可以了

通过cmd

adb shell cat /sdcard/smsLog.txt

成功显示文件里的内容

2017-05-16-16-39-27 您好,你的短信验证码为7959
2017-05-16-16-40-09 您好,你的短信验证码为6474
2017-05-16-16-45-22 您好,你的短信验证码为4664
2017-05-16-17-19-47 您好,你的短信验证码为3320
2017-05-16-17-21-20 您好,你的短信验证码为3146
2017-05-16-17-27-40 您好,你的短信验证码为2709
2017-05-16-17-27-43 您好,你的短信验证码为9421
2017-05-16-17-27-46 您好,你的短信验证码为5035
2017-05-16-17-27-48 您好,你的短信验证码为2212
2017-05-16-17-27-49 您好,你的短信验证码为5745
2017-05-16-17-28-28 您好,你的短信验证码为5409
2017-05-16-17-28-32 您好,你的短信验证码为1176
2017-05-16-17-28-33 您好,你的短信验证码为8708
2017-05-16-17-28-35 您好,你的短信验证码为3997
2017-05-16-17-28-37 您好,你的短信验证码为3567
2017-05-16-18-45-57 您好,你的短信验证码为3060

 

在python脚本中再构个函数就解决了

def getSma():
adb = "adb shell cat /sdcard/smsLog.txt"
smsLog = os.popen(adb).readlines()
smscode = smsLog[-1][-6:-2]
return smscode

OK! 脚本登陆RUN,步骤到点击发送验证码之后成功获取并自动填入,短信验证码成功解决,提升了脚本的执行效率和自动化覆盖率!  下周再开始解决图形验证码自动识别问题, 之前用UFT试过识别率太低,这款商业软件越做越不值钱了. 咱不再去求人,自己解决,活着就是为了折腾.

<自动化测试>之<自动获取手机短信验证码>的更多相关文章

  1. 彻底弄清c标准库中string.h里的常用函数用法

    在我们平常写的c/c++程序,一些算法题中,我们常常会用到c标准库中string.h文件中的函数,这些函数主要用于处理内存,字符串相关操作,是很有用的工具函数.而且有些时候,在笔试或面试中也会出现让你 ...

  2. 走进C标准库(8)——"string.h"中函数的实现相关字符串操作函数

    我的strcat: char *strcat(char *dest,char *src) { char * reval = dest; while(*dest) dest++; while(*src) ...

  3. 走进C标准库(3)——"stdio.h"中的getc和ungetc

    接前文. 再来看看getc和ungetc的实现.在看这两个函数的实现之前,我们先来想一想这两个函数分别需要做的工作. int getc(FILE *stream) 说明:函数getc从stream指向 ...

  4. 走进C标准库(2)——"stdio.h"中的fopen函数

    其他的库文件看起来没有什么实现层面的知识可以探究的,所以,直接来看stdio.h. 1.茶余饭后的杂谈,有趣的历史 在过去的几十年中,独立于设备的输入输出模型得到了飞速的发展,标准C从这个改善的模型中 ...

  5. 走进C标准库(1)——assert.h,ctype.h

    默默觉得原来的阅读笔记的名字太土了,改了个名字,叫做走进C标准库. 自己就是菜鸟一只,第一次具体看C标准库,文章参杂了对<the standard C library>的阅读和对源码的一些 ...

  6. C 非标准库(conio.h)

    所谓的 C 标准库(C standard library),是指在 ISO C 或者 POSIX 标准中定义的: POSIX is a superset(超集) of the standard C l ...

  7. 走进C标准库(4)——"stdio.h"中的putc

    花了点时间把园子弄得好看了点,现在继续. 函数名: putc 功  能: 输出一字符到指定流中 用  法: int putc(int ch, FILE *stream); #define _putc_ ...

  8. 走进C标准库(5)——"stdio.h"中的其他部分函数

    函数介绍来自:http://ganquan.info/standard-c/ 函数名: freopen 功  能: 替换一个流 用  法: FILE *freopen(char *filename, ...

  9. 走进C标准库(6)——"string.h"中函数的实现memchr

    我写的memchr: void *memchr(const void *buf, char ch, unsigned count){ unsigned ; while(*(buf++) != ch & ...

  10. 走进C标准库(7)——"string.h"中函数的实现memcmp,memcpy,memmove,memset

    我的memcmp: int memcmp(void *buf1, void *buf2, unsigned int count){ int reval; while(count && ...

随机推荐

  1. C++食物链【NOI2001】 并查集+建虚点

    B. 食物链[NOI2001] 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了 ...

  2. 001/Docker入门(Mooc)

    docker官网:https://www.docker.com/ 1.什么是docker 2.Docker思想     ==> [1].集装箱:保证程序完整(不缺东西,如配置文件等). [2]. ...

  3. levelDB SSTable-静态布局结构

    SSTable是Bigtable中至关重要的一块,对于LevelDB来说也是如此,对LevelDB的SSTable实现细节的了解也有助于了解Bigtable中一些实现细节.     本节内容主要讲述S ...

  4. Linux 重定向命令有哪些?有什么区别?

    1.重定向>Linux 允许将命令执行结果重定向到一个文件,本应显示在终端上的内容保存到指定文件中.如:ls >test.txt ( test.txt 如果不存在,则创建,存在则覆盖其内容 ...

  5. winform datagridview 绑定泛型集合变得不支持排序的解决方案

    原文:winform datagridview 绑定泛型集合变得不支持排序的解决方案 案例: 环境:Winform程序 控件:Datagridview 现象:Datagridview控件绑定到List ...

  6. C#设计模式:中介者模式(Mediator Pattern)

    一,什么是中介者模式(Mediator Pattern)? 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.比如:如果我们实现两个人的交互,难道我们要定义两个对象 ...

  7. JavaScript基础6——全选示例

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. Azkaban和Oozie的区别

    Azkaban和Oozie的区别: 当前,实际生产中最流行的两种Hadoop工作流引擎是Azkaban与Oozie.但活跃度最高的当是Azkaban了,下面对两者的异同之处作如下对比. 功能对比 Az ...

  9. Linux基于Hadoop2.8.0集群安装配置Hive2.1.1及基础操作

    前言 安装Apache Hive前提是要先安装hadoop集群,并且hive只需要在hadoop的namenode节点集群里安装即可,安装前需保证Hadoop已启(动文中用到了hadoop的hdfs命 ...

  10. 总结const、readonly、static三者的区别【收藏、转载】20190614

    总结const.readonly.static三者的区别 const:静态常量,也称编译时常量(compile-time constants),属于类型级,通过类名直接访问,被所有对象共享! a.叫编 ...