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

达峰的夏天 · 2016年03月18日 · 最后由 SUNFEIFEI 回复于 2018年05月10日 · 3369 次阅读

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

这是 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 条回复 时间 点赞
wolfgao 移动客户端 /UI 开源测试框架梳理和大比拼 中提及了此贴 02月27日 21:03
回复

你的问题解决了么

小帅 Macaca 文档正式开放啦 中提及了此贴 12月11日 16:16

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

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

Jessica 回复

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

小帅 [视频] 使用 Android 真机演示 Macaca 测试 中提及了此贴 03月02日 15:52

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

kobe990 Macaca 测试 Android 原理解析 - UIAutomator 篇 中提及了此贴 01月09日 23:33

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

小帅 如何从头编写你的 Macaca 测试用例 中提及了此贴 12月08日 18:00
达峰的夏天 [该话题已被删除] 中提及了此贴 10月19日 10:50

QQ 群号:287162474

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

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

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

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


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

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

小帅 [该话题已被删除] 中提及了此贴 08月05日 16:54

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

小帅 [该话题已被删除] 中提及了此贴 07月26日 18:09

@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)

kobe990 [该话题已被删除] 中提及了此贴 07月01日 00:17
达峰的夏天 [该话题已被删除] 中提及了此贴 06月27日 11:17
达峰的夏天 [该话题已被删除] 中提及了此贴 06月27日 11:17

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

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

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

把完整 log 贴出来吧 issues

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

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

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

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

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

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

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

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