一、在測試中彈出提示框
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 "未獲取到信息"; }