自动化方法模拟Android手机点击、触屏事件

使用apk来自动化测试,需要手机有root权限,所以采用写java程序,利用adb shell来实现自动化测试。

 一、所需知识

最基础的adb shell 指令。input tab 等。

二、所需环境
硬件:一台电脑、一部手机、一根数据线。软件:jdk、adb工具
三、编码

功能:模拟用户打开微信,并进行搜索就这么完成了。其实这里用shell命令模拟用户操作还是有些问题的,比如说控件长按(sendevent),好难理解,而且需要跟其中传递的控件坐标参数应该要跟屏幕分辨率联系起来,实际应用范围不是很广泛 。

import java.awt.AWTException;
import java.io.DataOutputStream;
import java.io.IOException;

public class TencentTest {

private String[] search = {
                   //  "adb shell",
                 //    "sleep 3",
                     "input keyevent 3",// 返回到主界面,数值与按键的对应关系可查阅KeyEvent
                     "sleep 1",// 等待1秒
                     "am start -n com.tencent.mm/com.tencent.mm.ui.LauncherUI",// 打开微信的启动界面,am命令的用法可自行百度、Google
                     "sleep 3",// 等待3秒
                     "am start -n com.tencent.mm/com.tencent.mm.plugin.search.ui.SearchUI",// 打开微信的搜索
                     "input text 123",// 像搜索框中输入123,但是input不支持中文,蛋疼,而且这边没做输入法处理,默认会自动弹出输入法
           };

  public static void main(String[] args) throws AWTException,         InterruptedException, IOException
    {
      TencentTest tencentTest = new TencentTest();
      //如果input text中有中文,可以将中文转成unicode进行input,没有测试,只是觉得这个思路是可行的
      tencentTest.search[5] = tencentTest.chineseToUnicode(tencentTest.search[5]);
      tencentTest.execShell(tencentTest.search);

    }

/**

  • 执行Shell命令
    • @param commands
  • 要执行的命令数组
    */
    public void execShell(String[] commands) {
    // 获取Runtime对象
    Runtime runtime = Runtime.getRuntime(); DataOutputStream os = null;
    try {
    // 获取root权限,这里大量申请root权限会导致应用卡死,可以把Runtime和Process放在Application中初始化
    Process process = runtime.exec(“adb shell”);
    os = new DataOutputStream(process.getOutputStream());
    for (String command : commands) {
    if (command == null) {
    continue;
    } // donnot use os.writeBytes(commmand), avoid chinese charset // error os.write(command.getBytes()); os.writeBytes("\n"); os.flush(); } os.writeBytes("exit\n"); os.flush(); process.waitFor(); } catch (Exception e) {
    e.printStackTrace();
    }
    }

/**

  • 把中文转成Unicode码
  • @param str
  • @return
    */
    public String chineseToUnicode(String str){
    String result=””;
    for (int i = 0; i < str.length(); i++){ int chr1 = (char) str.charAt(i); if(chr1>=19968&&chr1<=171941){//汉字范围 \u4e00-\u9fa5 (中文)
    result+=”\u” + Integer.toHexString(chr1);
    }else{
    result+=str.charAt(i);
    }
    }
    return result;
    }

/**

  • 判断是否为中文字符
  • @param c
  • @return
    */
    public boolean isChinese(char c) {
    Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
    if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
    || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
    || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
    || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
    || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
    || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
    return true;
    }
    return false;
    }

}

效果图如下:

 

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627

发表评论

邮箱地址不会被公开。 必填项已用*标注