说明

在这里要感谢@utopia 分享的工具,原文:https://testerhome.com/topics/8025

我 fork 之后地址:https://github.com/xiaoluosun/iosMonkey

安装后试运行了下非常棒,扩展了几个小功能,准备每天跑起来

具体的安装部署就不说了,请移步到原文

新增功能:

1.新增了模拟器支持

2.支持自定义运行时长

3.每一步自动保存截图,并标注事件发生的位置(红色的“这里这里”文字,但保存截图偶尔会失败,正在找原因)

1. 支持模拟器

亲测了 iOS10.3,其他版本未测试。。。。。。

if(UDID.contains("-")) {
    System.out.println("=======启动模拟器的app守护进程=======");
    String catLog = "tail -n 3 -f ~/Library/Logs/CoreSimulator/" + UDID + "/system.log";
    Process pp = Runtime.getRuntime().exec(catLog);
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(pp.getInputStream()));

    String line = bufferedReader.readLine();
        if(line.contains("testMacdeiMac")){
            String str = line.split(" ")[4];
            String curbundleid = str.split("\\[")[0];
            if(curbundleid.contains("LuoJiFM-IOS")) {

            } else if (curbundleid.contains("CoreSimulatorBridge")) {

            } else {
                System.out.println("==当前启动的APP bundleid是【"+curbundleid+"】,非测试APP,重新呼起测试APP====");
                Runtime.getRuntime().exec("xcrun simctl launch booted " + BUNDLEID);
            }
        }

    bufferedReader.close();

}

2. 支持自定义运行时长

java -jar iosMonkey-1.0.jar -h
-u:设备的UDID
-t:运行时长(分),可选,默认180分钟
-b:测试App的Bundle
-port:macaca服务的端口,默认3456
-proxyport:usb代理端口,默认8900

主要是在 monkey 运行的主方法和守护 app 的方法里做了限制

long startTime = System.currentTimeMillis();

.......

long endTime = System.currentTimeMillis();
if((endTime - startTime) > (Integer.parseInt(TIMING) * 60 * 1000)) {
    System.out.println("已运行" + (endTime - startTime)/60/1000 + "分钟,任务即将结束");
    break;
}

3.每一步自动保存截图,并标注事件位置

模拟器截图失败率挺高的,截图会保存成 0 字节的文件,十次差不多要失败三四次,还没找到原因。

if(UDID.contains("-")) {
    try {
        // 模拟器截图
        Process pp = Runtime.getRuntime().exec("xcrun simctl io booted screenshot --type=jpeg " + screenshotPath);
        pp.waitFor();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
} else {
    try {
        // 真机截图(未测试)
        Runtime.getRuntime().exec("idevicescreenshot -u " + UDID + " " + screenshotPath);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在截图上标注事件的位置,就是在事件发生的坐标加了文字水印 “这里这里”,代码不贴了,看截图

左上角,搜索的后面


↙↙↙阅读原文可查看相关链接,并与作者交流