Macaca [视频] 使用 Android 真机演示 Macaca 测试

小帅 · 2016年03月31日 · 最后由 青雅 回复于 2017年03月02日 · 2989 次阅读

点击此链接看视频

Android 模拟器效果 链接

先下载我们的 sample app 安卓包。

目录结构:

| -- app
|     | -- android-app-bootstrap.zip
| -- macaca-test
|     | -- myapp.test.js
| -- package.json

新建 app 文件夹,将 sample app 打包好放到下面。新建 macaca-test 文件夹,macaca run --server 时默认会跑这个文件夹下以 .test.js 为后缀名的用例文件。

新建 package.json 文件,设置好你的 nodejs 模块依赖,然后执行命令行 cnpm i ,执行完以后你会发现会多出一个 node_modules 目录,这就是下载下来的 node 模块。我的 package.json 文件:

{
  "name": "macaca-android-test-sample",
  "version": "0.1.0",
  "description": "macaca-android-test-sample",
  "devDependencies": {
    "macaca-chromedriver": "*",
    "wd": "*"
  }
}

查询 wdjs API 正式开始编写用例代码, myapp.test.js 文件如下:

const path = require('path');
const wd = require('wd'); // 引用 wd 模块

describe('macaca mobile sample', function() {
  this.timeout(5 * 60 * 1000); // mocha 设置超时时间

  var driver = wd.promiseChainRemote({ // 初始化 webdriver
    host: 'localhost',
    port: 3456
  });

  before(function() { // 所有测试用例的统一前置动作
    return driver.init({ // 
      platformName: 'Android',
      app: path.join(__dirname, '..', 'app', `android-app-bootstrap.zip`), // 指定到你打包好的 app 目录,也可以是个 url
      udid: "06022ee300696cb6" // 如果你是真机测试,请设置 udid ,不设置则走模拟器
    });
  });

  after(function() { // 所有测试用例的统一后置动作
    return driver 
      .sleep(1000)
      .quit();
  });

  it('#1 should login success', function() { // 测试一下 login
    return driver
      .waitForElementsByClassName('android.widget.EditText', {}, 120000)
      .then(function(els) {
        return els[0];
      })
      .sendKeys(username)
      .sleep(1000)
      .elementsByClassName('android.widget.EditText')
      .then(function(els) {
        return els[1];
      })
      .sendKeys(password)
      .sleep(1000)
      .waitForElementByName('Login')
      .click()
      .sleep(1000);
  });

});

最后运行 macaca run --server 就可以看了

共收到 47 条回复 时间 点赞

期待下次内容更丰满些

mac 上面看不到视频。。。。

#2 楼 我这 Mac 上看视频有点儿模糊啊

麻烦讲解下 package.json 是干什么的呢, 其中的内容 是什么含义,例如:
"dependencies": {
"macaca-chromedriver": "",
"wd": "
"
},

执行出现如下错误:
\ loading...
install macaca-android success
install macaca-android failed with Error: Cannot find module 'macaca-android'

responseHandler.js:56:12 [master] pid:14028 Send Error Respone to Client TypeError: Android is not a function
responseHandler.js:62:14 [master] pid:14028 TypeError: Android is not a function
at WebdriverServer.detectDevice (/usr/local/lib/node_modules/macaca-client/node_modules/webdriver-server/lib/server/index.js:54:14)
at WebdriverServer.start (/usr/local/lib/node_modules/macaca-client/node_modules/webdriver-server/lib/server/index.js:38:22)
at next (native)
at onFulfilled (/usr/local/lib/node_modules/macaca-client/node_modules/co/index.js:65:19)
at /usr/local/lib/node_modules/macaca-client/node_modules/co/index.js:54:5
at Object.co (/usr/local/lib/node_modules/macaca-client/node_modules/co/index.js:50:10)
at Object.toPromise (/usr/local/lib/node_modules/macaca-client/node_modules/co/index.js:118:63)
at next (/usr/local/lib/node_modules/macaca-client/node_modules/co/index.js:99:29)
at onFulfilled (/usr/local/lib/node_modules/macaca-client/node_modules/co/index.js:69:7)
at /usr/local/lib/node_modules/macaca-client/node_modules/co/index.js:54:5
responseHandler.js:81:14 [master] pid:14028 Unexcepted error TypeError

InternalServerError: Internal Server Error
at Object.module.exports.throw (/usr/local/lib/node_modules/macaca-client/node_modules/webdriver-server/node_modules/koa/lib/context.js:91:23)
at Object.module.exports (/usr/local/lib/node_modules/macaca-client/node_modules/webdriver-server/lib/server/responseHandler.js:82:17)
at throw (native)
at onRejected (/usr/local/lib/node_modules/macaca-client/node_modules/co/index.js:81:24)
at process._tickCallback (node.js:365:9)

responseHandler.js:24:12 [master] pid:14028 Recieve HTTP Request from Client: method: DELETE url: /wd/hub/session, jsonBody: {}
responseHandler.js:48:14 [master] pid:14028 Send HTTP Respone to Client: {"sessionId":"","status":0}

@zxl package.json 主要是用来配置依赖的 nodejs 模块的 dependencies 是配置所依赖的模块 devDependencies 是用来配置开发环境下依赖的模块。

文中有勘误已改, 请使用 cnpm i 来安装 。

events.js:154
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:890:11)
at Process.ChildProcess._handle.onexit (internal/child_process.js:182:32)
at onErrorNT (internal/child_process.js:348:16)
at _combinedTickCallback (node.js:383:13)
at process._tickCallback (node.js:407:11)

@xdf 是执行权限问题么?mac 环境,我之前/usr/local/lib/node_modules/ 已经 chown 了,请教下~

#7 楼 @oatsuper
可以忽略,后续自己好了

@oatsuper 与这个问题类似吧 链接

@tsj1107 按你的步骤,执行 macaca run --server,显示:webdriver sdk launched。

请问后续如何操作(完全小白)?

小帅 #11 · 2016年04月05日 Author

@zxl 我可能文档没有写清楚 首先你要在 android studio 中启动一个 virtual device

@tsj1107 是的,我是先启动了 一个 virtual device(使用 ./emulator @Nexus_5_API_22
emulator: UpdateCheck: current version '24.4.1', last version '24.4.1'); 但在执行 macaca run 时,出现以下问题:
install macaca-android failed with Error: Cannot find module 'macaca-android'

responseHandler.js:56:12 [master] pid:7847 Send Error Respone to Client TypeError: Android is not a function

小帅 #13 · 2016年04月05日 Author

@zxl 可能跟 sdk 版本有关系 建议使用 api level 是 19-23 的 sdk

@xdf @tsj1107 的确, 发现 macaca-webdriver 和 macaca-android 抛出的异常, 使用 npm 安装这两个后,可成功启动 demo 测试, 另求一份 API。。。 看着.test.js 的代码,完全不知道 怎么写。。。。

@zxl 请教下,我安装您写的步骤运行的,也启动了 virtual device,但运行过程中出现了如下问题,请问如何解决
Error: [init({"platformName":"Android","app":"app/android-app-bootstrap.zip","udid":"06022ee300696cb6"})] The environment you requested was unavailable.
at endReadableNT (_stream_readable.js:905:12)

@jessiezhou0412 我也是小白, 按照各位大神给的步骤,一步步操作。最后才成功运行了 demo。 在折腾的过程中我个人觉得,主要是环境依赖上出现较多问题。 如 node.js npm 的版本, macaca-webdriver 和 macaca-android 未成功安装。

小帅 #18 · 2016年04月05日 Author

#16 楼 @jessiezhou0412 代码的注释里有写哦

udid: "06022ee300696cb6" // 如果你是真机测试,请设置 udid ,不设置则走模拟器

既然你使用了模拟器 这里就不需要指定真机的 udid 了

@tsj1107 有点看不明白,请指导下。
第一,demo 脚本中 .native() .webview() 这些方法,在 api.md 中没有搜到。
第二,在 api.md 中找到 status(),在 demo 脚本中增加 .status(),运行成功,却不能获取到 server's 的状态

小帅 #22 · 2016年04月05日 Author

@zxl 是这样的 .native() .webview() 是我们对于 sample app 自己封装的 webdriver client, 原始 API 参照这个例子 https://github.com/tsj1107/macaca-android-test-sample

#18 楼 @tsj1107 android 真机测试是否可以指定 udid,而不指定 app,这样不会每次都安装。场景:包已经存在。

小帅 #16 · 2016年04月06日 Author

@tediwang 目前不太好解决 如果你是因为真机写用例的时候调试每次都要重启重装慢 我们也有解决方案 参考我的小伙伴写得文章 编写移动端 Macaca 测试用例

@tsj1107 @xdf 查看 API 文档,对一些 API 的传参不太了解,建议增加参数的说明和使用示例,如:clickElement(element, cb) -> cb(err), 其中的 element, cb 分别代表什么,传值类型是什么(通过多次尝试,发现 element 是要素 ID)

请问各位大神,在使用 macaca 编写测试脚本中,如何获取 element 对应的 ID 是多少呢?(我现在使用的是 uiautomatorviewer 去获取,但是经常获取到的 ID 有误,或某些元素根本没有 ID;然后只能获取当前页面所有 ID 一个个的尝试 -- 此方法太 low 了)


报错了,这是什么原因?


macaca run 后没有任何反应
macaca-test 里是有写好的脚本的

#29 楼 @cuijinxin 可以换 linux 机器吗 或者 mac,win 暂时没花时间支持

#30 楼 @xdf 真是个悲伤的故事 不过还是谢谢了

@cuijinxin 实在抱歉啊,win 上解决坑的时间比解决问题时间还多,推荐用 linux

看不懂啊

楼主,你这个 udid 有点坑啊,它会跟着网络环境而变化的,你知道这个问题吗?谢谢!相关获取的代码:
import android.provider.Settings.Secure;
private String android_id = Secure.getString(getContext().getContentResolver(),
Secure.ANDROID_ID);

TypeError: Path must be a string. Received undefined,我遇到这个问题

@ftvbftvbq 为什么变化?

TelephonyManager TelephonyMgr = (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
String DeviceId = TelephonyMgr.getDeviceId();

String udid =Secure.getString(getActivity().getContentResolver(),Secure.ANDROID_ID);

Be aware that while Secure.ANDROID_ID will generate a one-time unique ID when the device is booted the very first time, this ID will be lost should the device ever be reset to its factory defaults. A better solution is to rely upon the device's MAC address, assuming of course the device has Wi-Fi support, which practically all devices these days do

我觉得前面那个更加稳定 @xdf

小帅 [该话题已被删除] 中提及了此贴 08月05日 16:54
达峰的夏天 [该话题已被删除] 中提及了此贴 08月26日 10:50

BIZYIXINiMac:macaca-test-sample netease$ macaca run --server

error: unknown option `--server'

BIZYIXINiMac:macaca-test-sample netease$ macaca run server


  • version 1.1.4 is outdate *
  • run: npm i -g macaca-cli@1.1.5 * ************************************

port: 3456 was occupied, changed port: 3457
events.js:141
throw er; // Unhandled 'error' event
^

Error: listen EADDRINUSE :::3456
at Object.exports._errnoException (util.js:907:11)
at exports._exceptionWithHostPort (util.js:930:20)
at Server._listen2 (net.js:1250:14)
at listen (net.js:1286:10)
at Server.listen (net.js:1382:5)
at Application.app.listen (/usr/local/lib/node_modules/.macaca-cli_npminstall/node_modules/.1.1.2@koa/lib/application.js:74:24)
at /usr/local/lib/node_modules/.macaca-cli_npminstall/node_modules/.1.0.65@webdriver-server/lib/server/index.js:38:11
at module.exports.Promise (/usr/local/lib/node_modules/.macaca-cli_npminstall/node_modules/.1.0.65@webdriver-server/lib/server/index.js:16:10)
at Webdriver.start (/usr/local/lib/node_modules/.macaca-cli_npminstall/node_modules/.1.0.65@webdriver-server/lib/index.js:24:10)
at bootstrap (/usr/local/lib/node_modules/.macaca-cli_npminstall/node_modules/.1.1.4@macaca-cli/lib/server/server.js:29:19)
BIZYIXINiMac:macaca-test-sample netease$ macaca run


  • version 1.1.4 is outdate *
  • run: npm i -g macaca-cli@1.1.5 * ************************************

port: 3456 was occupied, changed port: 3457
events.js:141
throw er; // Unhandled 'error' event
^

Error: listen EADDRINUSE :::3456
at Object.exports._errnoException (util.js:907:11)
at exports._exceptionWithHostPort (util.js:930:20)
at Server._listen2 (net.js:1250:14)
at listen (net.js:1286:10)
at Server.listen (net.js:1382:5)
at Application.app.listen (/usr/local/lib/node_modules/.macaca-cli_npminstall/node_modules/.1.1.2@koa/lib/application.js:74:24)
at /usr/local/lib/node_modules/.macaca-cli_npminstall/node_modules/.1.0.65@webdriver-server/lib/server/index.js:38:11
at module.exports.Promise (/usr/local/lib/node_modules/.macaca-cli_npminstall/node_modules/.1.0.65@webdriver-server/lib/server/index.js:16:10)
at Webdriver.start (/usr/local/lib/node_modules/.macaca-cli_npminstall/node_modules/.1.0.65@webdriver-server/lib/index.js:24:10)
at bootstrap (/usr/local/lib/node_modules/.macaca-cli_npminstall/node_modules/.1.1.4@macaca-cli/lib/server/server.js:29:19)
BIZYIXINiMac:macaca-test-sample netease$

安卓手机 udid 怎么获取?

确实是新手 各位指点下 一直这个错

1) macaca desktop sample "before all" hook:
Error: [init({"autoAcceptAlerts":true,"browserName":"electron","platformName":"desktop"})] The environment you requested was unavailable.

安卓真机 UDID 怎么查询?

#45 楼 感谢@xdf UDID 已解决,但是 macaca 使用真机 run 时报错
inspector 已经能连接到手机

请教一下,macaca 链接真机厕所,手机需要做什么操作,电脑需要做什么操作,才能电脑手机相互连通啊?

小帅 [视频] 使用 iOS 真机演示 Macaca 测试 中提及了此贴 02月23日 12:28

报这个错,请问是什么原因啊?

macaca-cli-run:92:10 [master] pid:5856 Error: spawn C:\Users\weiqh\macaca-and
roid-test-sample-master\macaca-test\node_modules\mocha\bin_mocha.cmd ENOENT
at exports._errnoException (util.js:953:11)
at Process.ChildProcess._handle.onexit (internal/child_process.js:182:32)
at onErrorNT (internal/child_process.js:348:16)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
at process._tickCallback (internal/process/next_tick.js:98:9)
at Function.Module.runMain (module.js:577:11)
at startup (node.js:160:18)
at node.js:449:3

Test completed!

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