Macaca [基于 Node.js 的自动化测试-Macaca] - 测试 Android 应用

xdf · March 18, 2016 · Last by SUNFEIFEI replied at May 10, 2018 · 5104 hits

上一篇 - 搭建自己的自动化测试平台

这是 Macaca 的官方 repo alibaba/macaca,目前已开源,欢迎提issue、star。

初次使用 Macaca一文中,只贴出了 iOS 平台的 sample,有用户会有些疑惑,我快速赶了个 App 例子出来,与 iOS 实现基本一致,以便于描述。有兴趣可以看源码

效果如下

android

如何运行

# 安装 macaca 客户端
$ cnpm i macaca-cli -g

# clone 示例用例到本地
$ git clone git@github.com:macacajs/macaca-test-sample.git

# 安装依赖

$ cnpm i

当然,iOS 与 Android 是同一份测试用例,只是 Android 运行起来需要加个区别参数。

这里很重要

由于网络原因,下载所依赖的chromedriver 会有问题,使用如下方式解决。

export CHROMEDRIVER_CDNURL=http://npm.taobao.org/mirrors/chromedriver
# iOS

make test

# Android

platform=android make test

用例编写

Macaca 的上下文切换非常稳定,同时用例写起来也比较简单。

describe('macaca test sample', function() {
this.timeout(5 * 60 * 1000);

var driver = wd.initPromiseChain();

before(function() {
return driver.initDriver();
});

after(function() {
return driver
.sleep(1000)
.quit();
});

it('#1 should login success', function() {
return driver
.login('12345678', '111111')
.sleep(1000);
});

it('#2 should display home', function() {
return driver
.takeScreenshot();
});

it('#3 should display webview', function() {
return driver
.elementByName('Webview')
.click()
.sleep(3000)
.takeScreenshot();
});

it('#4 should go into webview', function() {
return driver
.webview()
.elementById('pushView')
.tap()
.sleep(5000)
.webview()
.elementById('popView')
.tap()
.sleep(5000)
.takeScreenshot();
});

it('#5 should go into test', function() {
return driver
.native()
.elementByName('Baidu')
.click()
.sleep(5000)
.takeScreenshot();
});

it('#6 should works with web', function() {
return driver
.webview()
.elementById('index-kw')
.sendKeys('TesterHome')
.elementById('index-bn')
.tap()
.sleep(5000)
.source()
.then(function(html) {
html.should.containEql('TesterHome');
})
.takeScreenshot();
});

it('#7 should logout success', function() {
return driver
.native()
.elementByName('PERSONAL')
.click()
.sleep(1000)
.takeScreenshot()
.elementByName('Logout')
.click()
.sleep(1000)
.takeScreenshot();
});
});

一些问题

顺便贴几个问题,有朋友在部署平台时遇到 Docker 相关的问题和疑惑。

使用 docker-compose 的原因
Docker 遇到网络环境问题
Guide 文档在快速准备中

欢迎讨论,互相学习。

微博: http://weibo.com/xudafeng
Github: https://github.com/xudafeng

下一篇 - 使用 Macaca 测试 PC 端应用

共收到 28 条回复 时间 点赞

是重写了bootstrap吗?部署在Docker上是emulator?

xdf #2 · March 20, 2016 作者

#1楼 @tbya 是的,具体实现见这里。部署在 Docker 上的是持续集成系统,不是 emulator。

#2楼 @xdf 赞,server和client 通信的具体json字段能不能贴了看看?另外client这边查找元素是否支持xpath?如果支持,是使用uiselector 来实现类xpath的逻辑还是dump xml来做?

xdf #4 · March 21, 2016 作者

@tbya 交换格式见这里,推荐自己看repo哦。由于目前遇到的场景使用 class_name 就解决了,没有实现 xpath。

你这边是什么类型的 App,如果需求强烈我倾向在 UiSelector 上抽象选择器。

现在就卡在不知道怎么写用例了。
可以用python写么?求支持

xdf #6 · March 22, 2016 作者

#5楼 @davidyang 欢迎查看文档

用的windows环境,按照文档clone事例macaca-test-sample.git后,执行 macaca run --server --verbos模拟器没启动,也没报错。目前的教程只适合OS X么?

xdf #8 · March 24, 2016 作者

#7楼 @purpose 尽量使用 Mac 吧, win 目前没有持续支持的计划,不过应该是可以跑的。

把完整log 贴出来吧 issues

可以在android 的真机上跑吗?
试用你的git上的macaca-test example 执行 make test 命令 最后模拟器启动不起来,android也一样。

platform=android macaca run --server --verbose -d ./macaca-test/myapp.test.js

index.js:64:12 [master] pid:31250 webdriver server start with config:
{ port: 3456,
ip: '192.168.185.77',
host: 'jinchengdeMacBook-Pro.local',
loaded_time: '2016-04-07 15:41:44' }
middlewares.js:31:10 [master] pid:31250 base middlewares attached
router.js:101:10 [master] pid:31250 router set
webdriver sdk launched
events.js:141
throw er; // Unhandled 'error' event
^

Error: spawn /usr/local/lib/node_modules/.macaca-client_npminstall/mocha/2.2.4/.bin/mocha ENOENT
at exports._errnoException (util.js:874:11)
at Process.ChildProcess._handle.onexit (internal/child_process.js:178:32)
at onErrorNT (internal/child_process.js:344:16)
at doNTCallback2 (node.js:439:9)
at process._tickCallback (node.js:353:17)
按照以上步骤执行,还是报错了,没有使用sudo安装
@xdf

xdf [Topic was deleted] 中提及了此贴 27 Jun 11:17
xdf [Topic was deleted] 中提及了此贴 27 Jun 11:17
kobe990 [Topic was deleted] 中提及了此贴 01 Jul 00:17

@xdf
求问几个问题:
1:是不是用例编写中,一个case失败了。整个case集就无法继续跳过失败的case继续执行了。
2:每次都是重新安装对应apk么?还是杀掉数据重新启动来的
3:用例中的 .webview() .native() 作用是什么,有这些方法的时候会使得脚本执行失败。这是封装好了什么方法么。请问如何找到关联的文件。
小白诚心请教。
4: 截图产出在哪,以及报告的位置
5: adb shell ime set android.unicode.ime/.Utf7ImeService 设置完utf-7 字体输入后,手机再次启动键盘需要手动切到别的输入法才能继续正常使用输入法。
6: 接问题3 ,关于进入webview 以及进入native的方面会结果收集log报错如下:

1) macaca test sample #4 should go into webview:
Error: [contexts()] Not JSON response
at exports.newError (node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/utils.js:139:13)
at node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/callbacks.js:59:17
at node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/webdriver.js:179:5
at Request._callback (node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/http-utils.js:87:7)
at Request.self.callback (node_modules/webdriver-client/node_modules/macaca-wd/node_modules/request/request.js:368:22)
at Request. (node_modules/webdriver-client/node_modules/macaca-wd/node_modules/request/request.js:1219:14)
at IncomingMessage. (node_modules/webdriver-client/node_modules/macaca-wd/node_modules/request/request.js:1167:12)
at endReadableNT (_stream_readable.js:921:12)

2) macaca test sample #5 should go into test:
Error: [contexts()] Not JSON response
at exports.newError (node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/utils.js:139:13)
at node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/callbacks.js:59:17
at node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/webdriver.js:179:5
at Request._callback (node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/http-utils.js:87:7)
at Request.self.callback (node_modules/webdriver-client/node_modules/macaca-wd/node_modules/request/request.js:368:22)
at Request. (node_modules/webdriver-client/node_modules/macaca-wd/node_modules/request/request.js:1219:14)
at IncomingMessage. (node_modules/webdriver-client/node_modules/macaca-wd/node_modules/request/request.js:1167:12)
at endReadableNT (_stream_readable.js:921:12)

3) macaca test sample #6 should works with web:
Error: [contexts()] Not JSON response
at exports.newError (node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/utils.js:139:13)
at node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/callbacks.js:59:17
at node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/webdriver.js:179:5
at Request._callback (node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/http-utils.js:87:7)
at Request.self.callback (node_modules/webdriver-client/node_modules/macaca-wd/node_modules/request/request.js:368:22)
at Request. (node_modules/webdriver-client/node_modules/macaca-wd/node_modules/request/request.js:1219:14)
at IncomingMessage. (node_modules/webdriver-client/node_modules/macaca-wd/node_modules/request/request.js:1167:12)
at endReadableNT (_stream_readable.js:921:12)

4) macaca test sample #7 should logout success:
Error: [contexts()] Not JSON response
at exports.newError (node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/utils.js:139:13)
at node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/callbacks.js:59:17
at node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/webdriver.js:179:5
at Request._callback (node_modules/webdriver-client/node_modules/macaca-wd/wd/lib/http-utils.js:87:7)
at Request.self.callback (node_modules/webdriver-client/node_modules/macaca-wd/node_modules/request/request.js:368:22)
at Request. (node_modules/webdriver-client/node_modules/macaca-wd/node_modules/request/request.js:1219:14)
at IncomingMessage. (node_modules/webdriver-client/node_modules/macaca-wd/node_modules/request/request.js:1167:12)
at endReadableNT (_stream_readable.js:921:12)

小帅 [Topic was deleted] 中提及了此贴 26 Jul 18:09

#16楼 @ws328686288 @xdf 貌似好像 .webview() 执行时。 chromedriver自身有bug?? 部分机型系统上就一直连接不上。 至少我试了几台都是这样。

小帅 [Topic was deleted] 中提及了此贴 05 Aug 16:54

#18楼 @zhangzhao_lenovo 这个问题我解了。就是把这个方法去掉。然后定位下你的webview空间,点击一下就切入webview了。出来的时候再点击一下外部控件即可


这个是怎么操作的,急求解@xdf

@xdf win10就是装不上macaca的android驱动啊,总是报这样的错误!

xdf #23 · September 22, 2016 作者

@tt33025515 看小马合集,或者进qq群

#23楼 @xdf qq群号是什么,求入

#23楼 @xdf 合集都看了,依然无法解决,换了macos,依然安装不上android驱动

xdf #27 · October 11, 2016 作者

QQ群号:287162474

xdf [Topic was deleted] 中提及了此贴 19 Oct 10:50
小帅 如何从头编写你的 Macaca 测试用例 中提及了此贴 08 Dec 18:00

@xdf 请问在执行测试用例的过程中,如果app 发生 crash ,此时该如何捕捉当前 app crash 的时机并截图?经过测试,在执行测试用例的过程中 ,如果 app 发生奔溃,测试还是会继续往下执行,请问这个问题有结局的办法吗?

是否支持无线自动化,how?

小帅 [视频] 使用 Android 真机演示 Macaca 测试 中提及了此贴 02 Mar 15:52
Jessica 回复

请问你最后装上安卓驱动了吗?

你好,安卓autoAcceptAlerts,之前系统alerts在打开app的引导页就弹出就能处理,现在挪到了引导页之后首页弹出后autoAcceptAlerts就失效了,请问知道是什么情况吗。

最新版的2.0.7里面是不是把swipe去掉了,android现在滑动是通过drag吗,通过swipe滑动一直把空指针,request里的body是空的
通过drag一直提示,,这个是什么原因,我觉得很奇怪

小帅 Macaca 文档正式开放啦 中提及了此贴 11 Dec 16:16
回复

你的问题解决了么

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up