点击此链接看视频
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
就可以看了
期待下次内容更丰满些
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 了,请教下~
@tsj1107 按你的步骤,执行 macaca run --server,显示:webdriver sdk launched。
请问后续如何操作(完全小白)?
@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
@zxl 可能跟 sdk 版本有关系 建议使用 api level 是 19-23 的 sdk
@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 未成功安装。
#16 楼 @jessiezhou0412 代码的注释里有写哦
udid: "06022ee300696cb6" // 如果你是真机测试,请设置 udid ,不设置则走模拟器
既然你使用了模拟器 这里就不需要指定真机的 udid 了
@tsj1107 有点看不明白,请指导下。
第一,demo 脚本中 .native() .webview() 这些方法,在 api.md 中没有搜到。
第二,在 api.md 中找到 status(),在 demo 脚本中增加 .status(),运行成功,却不能获取到 server's 的状态
@zxl 是这样的 .native() .webview() 是我们对于 sample app 自己封装的 webdriver client, 原始 API 参照这个例子 https://github.com/tsj1107/macaca-android-test-sample
@tediwang 目前不太好解决 如果你是因为真机写用例的时候调试每次都要重启重装慢 我们也有解决方案 参考我的小伙伴写得文章 编写移动端 Macaca 测试用例
请问各位大神,在使用 macaca 编写测试脚本中,如何获取 element 对应的 ID 是多少呢?(我现在使用的是 uiautomatorviewer 去获取,但是经常获取到的 ID 有误,或某些元素根本没有 ID;然后只能获取当前页面所有 ID 一个个的尝试 -- 此方法太 low 了)
@woshitianlong 可以用 shell 吗
#29 楼 @cuijinxin 可以换 linux 机器吗 或者 mac,win 暂时没花时间支持
@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
BIZYIXINiMac:macaca-test-sample netease$ macaca run --server
error: unknown option `--server'
BIZYIXINiMac:macaca-test-sample netease$ macaca run server
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
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 怎么获取?
安卓真机 UDID 怎么查询?
语法
请教一下,macaca 链接真机厕所,手机需要做什么操作,电脑需要做什么操作,才能电脑手机相互连通啊?
报这个错,请问是什么原因啊?
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:3Test completed!