zoukankan      html  css  js  c++  java
  • 转载:Android自动化测试- 自动获取短信验证码

    前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码。

    主要就是实时获取短信信息。

    android上获取短信信息主要有BroadcastReceiver方式与数据库方式,要实时的话就BroadcastReceiver比较方便

    public class SMSReceiver extends BroadcastReceiver{
          private String verifyCode="";
        public static final String TAG = "SMSReceiver";
        public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
        @Override
        public void onReceive(Context context, Intent intent){
           if (intent.getAction().equals(SMS_RECEIVED_ACTION)){
               SmsMessage[] messages = getMessagesFromIntent(intent);
               for (SmsMessage message : messages){
                  Log.i(TAG, message.getOriginatingAddress() + " : " +
                      message.getDisplayOriginatingAddress() + " : " +
                      message.getDisplayMessageBody() + " : " +
                      message.getTimestampMillis());
                  String smsContent=message.getDisplayMessageBody();
                  Log.i(TAG, smsContent);              
                  writeFile(smsContent);//将短信内容写入SD卡
               }
           }
        }
    
        public final SmsMessage[] getMessagesFromIntent(Intent intent){
            Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
            byte[][] pduObjs = new byte[messages.length][];
            for (int i = 0; i < messages.length; i++)
            {
                pduObjs[i] = (byte[]) messages[i];
            }
            byte[][] pdus = new byte[pduObjs.length][];
            int pduCount = pdus.length;
            SmsMessage[] msgs = new SmsMessage[pduCount];
            for (int i = 0; i < pduCount; i++)        {
                pdus[i] = pduObjs[i];
                msgs[i] = SmsMessage.createFromPdu(pdus[i]);
            }
            return msgs;
        }
      //将短信内容写到SD卡上的文件里,便于将文件pull到PC,这样可方便其它如WWW/WAP平台的自动化  
        @SuppressLint("SdCardPath")
        public void writeFile(String str){
            String filePath="/mnt/sdcard/verifyCode.txt";        
            byte [] bytes = str.getBytes();
            try{
            File file=new File(filePath);
            file.createNewFile();
            FileOutputStream fos=new FileOutputStream(file);
            fos.write(bytes);
            fos.close();
            }catch(IOException e){
                e.printStackTrace();
            }       
        }

    如此当有短信收到时就可以将短信内容写到SD卡中的文件里

    在另一个java类中写个读取文件内容的方法,并在写测试用例过程中,将得到的String按验证码的具体位置截取即可。

    public String read(String str) throws IOException{    
            File file=new File(str);
            FileInputStream fis=new FileInputStream(file);
            StringBuffer sb=new StringBuffer();
            
            BufferedInputStream bis=new BufferedInputStream(fis);
            BufferedReader  read = new BufferedReader (new InputStreamReader(bis));
            int c=0;
            while ((c=read.read())!=-1) {
                sb.append((char) c);
            }
            read.close();
            bis.close();
            fis.close();
            Log.i(TAG, sb.toString());        
            String verify=sb.toString();        
            return verify;
        }

    最后需要在manifest中增加申明,且注册权限

    <receiver android:name="com.cplatform.surfdesktop.test.util.SMSReceiver">
                <intent-filter>
                    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                </intent-filter>
    
     </receiver>
    
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.READ_SMS"/>

    测试过程中需要用到短信验证码时就可以实时获取了

  • 相关阅读:
    POJ 3261 Milk Patterns (求可重叠的k次最长重复子串)
    UVaLive 5031 Graph and Queries (Treap)
    Uva 11996 Jewel Magic (Splay)
    HYSBZ
    POJ 3580 SuperMemo (Splay 区间更新、翻转、循环右移,插入,删除,查询)
    HDU 1890 Robotic Sort (Splay 区间翻转)
    【转】ACM中java的使用
    HDU 4267 A Simple Problem with Integers (树状数组)
    POJ 1195 Mobile phones (二维树状数组)
    HDU 4417 Super Mario (树状数组/线段树)
  • 原文地址:https://www.cnblogs.com/dtest/p/4549287.html
Copyright © 2011-2022 走看看