13.UiAutomator 輔助APK的使用


一、在測試中彈出提示框

UiAutomator無法直接實現,,但是可以通過讓輔助APK接受UiAutomator發送的指令信息來實現,使用am命令

  • 實例:
1.新建輔助apk,用來接收Uiautomator用例中的廣播信息(新建android appliction project,然后next直到finish為止,注意創建過程中選對API)
2.建好工程后將一些不用的代碼刪除,需要刪除的代碼如下:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
3.然后在生成的輔助apk的src下的包中新建一個類作為廣播接收器,繼承”BroadcastReceiver”,代碼如下:
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.WindowManager;
//注意上面的import文件。應該有這些導入就夠了。之前調試過程中在Builder builder=new Builder(arg0);總是會報錯。后來解決掉才發現原來是導入文件的問題
public class AlertRecevier extends BroadcastReceiver{

    @Override
    public void onReceive(Context arg0, Intent arg1) {
            //接收鍵值對
            Bundle bundle=arg1.getExtras();
            String message=bundle.getString("alert");
            //創建消息彈窗
            Builder builder=new Builder(arg0);
            builder.setTitle("APP TEST");
            builder.setMessage(message);
            builder.setNegativeButton("OK",null);
            Dialog dialog=builder.create();

            dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            dialog.show();
    }
}
4.代碼編輯完成后,需要點輔助apk的.xml清單文件添加一個權限,

1)在清單界面點”Permissions”–“add”–“uises-permission”–“ok”
2)name=”android.permission.SYSTEM_ALERT_WINDOW” MaxSDK=20然后點add
3)remove “uises-permission”
4)點擊xml清單文件查看是否有這個權限””
5)在xml清單文件中注冊廣播接收器。也就是在結束標簽后面加入下列代碼

</activity>//結束標簽
<receiver android:name="AlertRecevier">//name=廣播接收器類名
    <intent-filter>
        <action android:name="jian.demo.action"/>//name=自定義
    </intent-filter>
</receiver>

6)右鍵點輔助APK工程–run as–android application,將apk安裝到手機上
7)打開命令行,輸入命令”adb shell am broadcast -a [自定義的name] -e [廣播接收器中定義的字符串] [可以隨便輸幾個值]”查看是否注冊成功,按照上述代碼,該命令的正確表現形式應該是”adb shell am broadcast -a jian.demo.action -e alert 1234”

5.在測試用例中寫入以下代碼:
//彈出指定彈窗
public void testDemo() throws IOException{
    alert("test alert!");
}

//寫一個方法
public void alert(String message) throws IOException{
    //自定義彈窗內容
    String cmd=("am broadcast -a jian.demo.action -e alert"+message);
    //輸入命令
    try{
        Runtime.getRuntime().exec(cmd);
    }catch(IOException e){
        e.printStackTrace();
    }
}

二、在測試中輸入中文

UiObject.setText(String)這個API無法輸入非ASCLL字符,比如中文、日文等,可以使用Unicode輸入助手解決這個問題,它將輸入的原始字符轉換為Unicode文本,通過中間轉化從而進行輸入各種文字

1.使用步驟:

1)手機端安裝jutf-7輸入法
2)將該輸入法設置為手機默認輸入法(系統設置–語言和輸入法–設置UTF7為默認輸入法)
3)寫用例過程中將UTF-7的輔助工具類加入進去
4)使用”UiObject.setText(“Utf7lmeHelper.e(“各種語言”))”來實現各種語言的輸入。

2.UTF-7的輔助工具類下載配置

1)GitHub上搜索通過搜索uiautomator來找到sumio/uiautomator-unicode-input-helper這個輸入工具並下載
2)點擊eclipes左上角file–import–android/existing android code into workspase–next
3)在新彈出的窗口導入下載好文件的路徑(是解壓后的文件)手動勾選copy projects into workspace然后點擊finish
4)導入完成后應該有一個name=Utf7Ime的project,右鍵點擊工程–run as –android application,即可將輸入法push到手機中
5)手機系統設置–語言和輸入法–設置UTF7為默認輸入法
6)在”\git\uiautomator-unicode-input-helper-master\UiAutomatorInputSample\src”路徑下(代表你下載時候的存儲位置)將兩個文件夾(com/jp)copy到eclipes的用例工程的src下面,正常情況src下面會多出來三個包

3.測試代碼
//輸入中文
public void testDemo1() throws UiObjectNotFoundException{
    //獲取新建聯系人的聯系人姓名輸入框
    UiObject edit=new UiObject(new UiSelector().className(EditText.class.getName()));
    edit.setText(Utf7ImeHelper.e("測試輸入"));
}

三、獲取應用信息

  • 實例:
1.新建輔助apk(移步本文一、1.2.步驟)
2.在輔助apk中創建廣播類,代碼如下:
//Import文件
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.List;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
//廣播接收器代碼
public class AppInfo extends BroadcastReceiver{
    public void onReceive(Context arg0, Intent arg1) {
        //使用bundle把我們要傳的信息提取出來
        Bundle bundle=arg1.getExtras();
        //定義參數包名和文件名(pn,fn)
        String packageName=bundle.getString("pn");
        String fileName=bundle.getString("fn");
        //使用包管理來獲取信息
        PackageManager pm=arg0.getPackageManager();
        try {
            PackageInfo manifext=pm.getPackageInfo(packageName, 0);
            //獲取版本號
            String versionName=manifext.versionName;
            //獲取應用的名子
            String apkName=pm.getApplicationLabel(pm.getApplicationInfo(packageName,0)).toString();
            //將信息寫入文件
            writeFile("/mnt/sdcard", fileName, "versionName:"+versionName);
            writeFile("/mnt/sdcard", fileName, "apkName:"+apkName);
            //獲取主activity查詢條件
            Intent mainIntent=new Intent(Intent.ACTION_MAIN);
            mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            mainIntent.setPackage(packageName);
            //通過上面的查詢條件獲取查詢列表
            List<ResolveInfo> resolveInfos=pm.queryIntentActivities(mainIntent, PackageManager.MATCH_DEFAULT_ONLY);
            //列表判斷
            for(ResolveInfo r:resolveInfos){
                String activityName=r.activityInfo.name;
                if(activityName.contains(packageName)){
                    //寫入操作
                    writeFile("/mnt/sdcard", fileName, "activityName:"+activityName);
                }
            }
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
    }
    //寫入文件的方法
    public void writeFile(String path,String fileName,String text){
        File file=new File(path+File.separator+fileName);
        try {
            //如果他不存在就創建一個
            if(!file.exists()){
                file.createNewFile();   
            }
            //文件輸出流
            FileOutputStream out=new FileOutputStream(file,true);
            OutputStreamWriter ow=new OutputStreamWriter(out);
            BufferedWriter bw=new BufferedWriter(ow);

            bw.append(text);
            bw.newLine();
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
3.添加權限”android.permission.WRITE_EXTERNAL_STORAGE”(SD卡寫入文件的權限),添加方法參考本文一、4步驟
4.修改AndroidManiFest.xml文件注冊廣播接收器,在標簽后面填入代碼
<receiver android:name=".AppInfo">//廣播類名
    <intent-filter >
        <action android:name="jian.info.action"/>//自定義動作名
    </intent-filter>
</receiver>
5.右鍵點輔助APK工程–run as–android application,將apk安裝到手機上
6. 打開命令行,輸入”adb shell am broadcast -a [自定義的name] -e pn [包名] -e fn [自定義文件名]”查看是否注冊成功,按照上述代碼,該命令的正確表現形式應該是”adb shell am broadcast -a jian.info.action -e pn com.android.clock -e fn apkInfo.txt”正常情況下SD卡下應該會有一個apkInfo.txt的文件
7.編寫測試用例,代碼如下:
//測試用例
public void tesrDemo2(){
    //設置包名
    String packageName="com.android.deskclock";
    //獲取
    String version=getApkInfo("versionName", packageName);
    String apkName=getApkInfo("vapkName", packageName);
    String activityName=getApkInfo("activityName", packageName);
    //輸出
    System.out.println("version:"+version);
    System.out.println("apkName:"+apkName);
    System.out.println("activityName:"+activityName);
    //啟動應用
    launchApp(packageName, activityName);
}
//啟動應用的方法
public void launchApp(String packageName,String activityName){
    String command="am start -W -n "+packageName+"/"+activityName;
    try {
        Runtime.getRuntime().exec(command);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
//寫一個讀文件的方法
public String getApkInfo(String key,String packageName){
    //文件路徑
    File file=new File("/mnt/sdcard/apkTestInfo.txt");
    //看文件是否存在,如果已存在就刪除
    if(file.exists()){
        file.delete();
    }
    //定義命令
    String cmd="am broadcast -a jian.info.action"+" -e pn"+packageName+"-e fn apkTestInfo.txt";
    try {
        //當文件不存在的時候才執行cmd命令
        while(!file.exists()){
        Runtime.getRuntime().exec(cmd);
        sleep(5000);
        }
        FileInputStream in=new FileInputStream(file);
        InputStreamReader re=new InputStreamReader(in);
        BufferedReader reader=new BufferedReader(re);
        //逐行讀取
        String line="";
        while((line=reader.readLine())!=null){
            if((line.contains(key))){
                String[] s=line.split(":");
                return s[1];
            }
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return "未獲取到信息";
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM