MonkeyRunner MonkeyRunner 实现自动点击截屏后与本地图库进行对比输出

周小丽 · 2015年08月26日 · 最后由 Anson 回复于 2015年09月09日 · 3256 次阅读
本帖已被设为精华帖!

先说下本人是菜鸟,通过网上资料学习,终于调通了 MonkeyRunner 实现自动点击截屏后与本地图库进行对比输出,以后做静态 UI 测试就不需要眼睛盯着看图了,这一切交给 MonkeyRunner 了。

首先通过 monkeyrunner 录制脚本 test.mr

test.mr

TOUCH|{'x':265,'y':1232,'type':'downAndUp',}
WAIT|{'seconds':5.0,}
TOUCH|{'x':355,'y':189,'type':'downAndUp',}
WAIT|{'seconds':5.0,}
TOUCH|{'x':85,'y':322,'type':'downAndUp',}
WAIT|{'seconds':5.0,}
TOUCH|{'x':371,'y':893,'type':'downAndUp',}
WAIT|{'seconds':5.0,}
TOUCH|{'x':371,'y':893,'type':'downAndUp',}
WAIT|{'seconds':5.0,}
TOUCH|{'x':47,'y':778,'type':'downAndUp',}
WAIT|{'seconds':5.0,}
TOUCH|{'x':657,'y':88,'type':'downAndUp',}
WAIT|{'seconds':5.0,}

然后通过 python 写自动截屏对比功能 monkey_snapshot.py

#!/usr/bin/env monkeyrunner
# Copyright 2010, The Android Open Source Project
#coding=utf8
import sys  
from com.android.monkeyrunner import MonkeyDevice
from com.android.monkeyrunner import MonkeyImage
from com.android.monkeyrunner import MonkeyRunner 

CMD_MAP = {  
    'TOUCH': lambda dev, arg: dev.touch(**arg),  
    'DRAG': lambda dev, arg: dev.drag(**arg),  
    'PRESS': lambda dev, arg: dev.press(**arg),  
    'TYPE': lambda dev, arg: dev.type(**arg),  
    'WAIT': lambda dev, arg: MonkeyRunner.sleep(**arg)  
    }

def process_file(fp, device,photo_id):
    for line in fp:
        (cmd, rest) = line.split('|')
        try:
            rest = eval(rest)  
        except:
            print 'unable to parse options'
            continue

        if cmd not in CMD_MAP:
            print 'unknown command: ' + cmd
            continue

        CMD_MAP[cmd](device, rest)
        print cmd
        pic_name='./shot'+str(photo_id)+'.png'
        result = device.takeSnapshot()

        #compare picture
        result2 = MonkeyRunner.loadImageFromFile("E:\MD\shot"+str(photo_id)+".png")
        print "E:\MD\shot"+str(photo_id)+".png"

        flag = result.sameAs(result2,0.95)
        if (flag == False):
            print 'prapre to save new png '+pic_name
            result.writeToFile(pic_name,'png')


        photo_id+=1
    print "All PlayBack Action Captured,Total:"+str(photo_id)+' PNG Saved'
    print "==============================================================="

def main():
    print  "Ok,Now StarRuning MyZXX MonkeyRuner SnopShoot Shell"
    print "==============================================================="
    device = MonkeyRunner.waitForConnection()
    package = 'com.qunsheng.md'
    activity = 'com.qunsheng.md.activity.WelcomeActivity'
    runComponent = package + '/' + activity
    device.startActivity(component=runComponent)
    MonkeyRunner.sleep(30)
    #device.press('KEYCODE_MENU','DOWN_AND_UP')
    #result = device.takeSnapshot()
    #result.writeToFile('./shot5.png','png')

    file = sys.argv[1]
    fp = open(file, 'r')
    photo_id=0
    process_file(fp, device,photo_id)
    fp.close();

if __name__ == '__main__':
    main()

最后脚本运行,将图片对比后 95% 部分都不相像的截图自动保存在当前目录

monkeyrunner monkey_snapshot.py E:\test.mr
共收到 7 条回复 时间 点赞

赞!
建议把标题里面的 “如何” 去掉吧,否则会被误认为是询问帖。

另外,这个图像对比准确度还是不足以直接作为结果对比的吧,毕竟全图 80% 粒度有点大
Monkey 以前写过一个 https://testerhome.com/topics/202

@chenhengjie123 ,你好渊博啊,是不是站内所有文章你都看过了啊

以前写过一个 MonkeyRunner + sikuli 的框架

@ganyunxiao,能否发个链接: MonkeyRunner + sikuli 的框架

#3 楼 @xiaoli 木有。。。近半年的基本都看过,但更早的只看了一些大神的发帖记录。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册