# adbkit-monkey **Repository Path**: mirrors_openstf/adbkit-monkey ## Basic Information - **Project Name**: adbkit-monkey - **Description**: A Node.js interface to the Android monkey tool. - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-18 - **Last Updated**: 2025-09-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # adbkit-monkey # Warning # This project along with other ones in [OpenSTF](https://github.com/openstf) organisation is provided as is for community, without active development. # You can check any other forks that may be actively developed and offer new/different features [here](https://github.com/openstf/stf/network). # Active development has been moved to [DeviceFarmer](https://github.com/DeviceFarmer) organisation. **adbkit-monkey** provides a [Node.js][nodejs] interface for working with the Android [`monkey` tool][monkey-site]. Albeit undocumented, they monkey program can be started in TCP mode with the `--port` argument. In this mode, it accepts a [range of commands][monkey-proto] that can be used to interact with the UI in a non-random manner. This mode is also used internally by the [`monkeyrunner` tool][monkeyrunner-site], although the documentation claims no relation to the monkey tool. ## Getting started Install via NPM: ```bash npm install --save adbkit-monkey ``` Note that while adbkit-monkey is written in CoffeeScript, it is compiled to JavaScript before publishing to NPM, which means that you are not required to use CoffeeScript. ### Examples The following examples assume that monkey is already running (via `adb shell monkey --port 1080`) and a port forwarding (`adb forward tcp:1080 tcp:1080`) has been set up. #### Press the home button ```javascript var assert = require('assert'); var monkey = require('adbkit-monkey'); var client = monkey.connect({ port: 1080 }); client.press(3 /* KEYCODE_HOME */, function(err) { assert.ifError(err); console.log('Pressed home button'); client.end(); }); ``` #### Drag out the notification bar ```javascript var assert = require('assert'); var monkey = require('adbkit-monkey'); var client = monkey.connect({ port: 1080 }); client.multi() .touchDown(100, 0) .sleep(5) .touchMove(100, 20) .sleep(5) .touchMove(100, 40) .sleep(5) .touchMove(100, 60) .sleep(5) .touchMove(100, 80) .sleep(5) .touchMove(100, 100) .sleep(5) .touchUp(100, 100) .sleep(5) .execute(function(err) { assert.ifError(err); console.log('Dragged out the notification bar'); client.end(); }); ``` #### Get display size ```javascript var assert = require('assert'); var monkey = require('adbkit-monkey'); var client = monkey.connect({ port: 1080 }); client.getDisplayWidth(function(err, width) { assert.ifError(err); client.getDisplayHeight(function(err, height) { assert.ifError(err); console.log('Display size is %dx%d', width, height); client.end(); }); }); ``` #### Type text Note that you should manually focus a text field first. ```javascript var assert = require('assert'); var monkey = require('adbkit-monkey'); var client = monkey.connect({ port: 1080 }); client.type('hello monkey!', function(err) { assert.ifError(err); console.log('Said hello to monkey'); client.end(); }); ``` ## API ### Monkey #### monkey.connect(options) Uses [Net.connect()][node-net] to open a new TCP connection to monkey. Useful when combined with `adb forward`. * **options** Any options [`Net.connect()`][node-net] accepts. * Returns: A new monkey `Client` instance. #### monkey.connectStream(stream) Attaches a monkey client to an existing monkey protocol stream. * **stream** The monkey protocol [`Stream`][node-stream]. * Returns: A new monkey `Client` instance. ### Client Implements `Api`. See below for details. #### Events The following events are available: * **error** **(err)** Emitted when an error occurs. * **err** An `Error`. * **end** Emitted when the stream ends. * **finish** Emitted when the stream finishes. #### client.end() Ends the underlying stream/connection. * Returns: The `Client` instance. #### client.multi() Returns a new API wrapper that buffers commands for simultaneous delivery instead of sending them individually. When used with `api.sleep()`, allows simple gestures to be executed. * Returns: A new `Multi` instance. See `Multi` below. #### client.send(command, callback) Sends a raw protocol command to monkey. * **command** The command to send. When `String`, a single command is sent. When `Array`, a series of commands is sent at once. * **callback(err, value, command)** Called when monkey responds to the command. If multiple commands were sent, the callback will be called once for each command. * **err** `null` when successful, `Error` otherwise. * **value** The response value, if any. * **command** The command the response is for. * Returns: The `Client` instance. ### Api The monkey API implemented by `Client` and `Multi`. #### api.done(callback) Closes the current monkey session and allows a new session to connect. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. #### api.flipClose(callback) Simulates closing the keyboard. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. #### api.flipOpen(callback) Simulates opening the keyboard. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. #### api.get(name, callback) Gets the value of a variable. Use `api.list()` to retrieve a list of supported variables. * **name** The name of the variable. * **callback(err, value)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * **value** The value of the variable. * Returns: The `Api` implementation instance. #### api.getAmCurrentAction(callback) Alias for `api.get('am.current.action', callback)`. #### api.getAmCurrentCategories(callback) Alias for `api.get('am.current.categories', callback)`. #### api.getAmCurrentCompClass(callback) Alias for `api.get('am.current.comp.class', callback)`. #### api.getAmCurrentCompPackage(callback) Alias for `api.get('am.current.comp.package', callback)`. #### api.getCurrentData(callback) Alias for `api.get('am.current.data', callback)`. #### api.getAmCurrentPackage(callback) Alias for `api.get('am.current.package', callback)`. #### api.getBuildBoard(callback) Alias for `api.get('build.board', callback)`. #### api.getBuildBrand(callback) Alias for `api.get('build.brand', callback)`. #### api.getBuildCpuAbi(callback) Alias for `api.get('build.cpu_abi', callback)`. #### api.getBuildDevice(callback) Alias for `api.get('build.device', callback)`. #### api.getBuildDisplay(callback) Alias for `api.get('build.display', callback)`. #### api.getBuildFingerprint(callback) Alias for `api.get('build.fingerprint', callback)`. #### api.getBuildHost(callback) Alias for `api.get('build.host', callback)`. #### api.getBuildId(callback) Alias for `api.get('build.id', callback)`. #### api.getBuildManufacturer(callback) Alias for `api.get('build.manufacturer', callback)`. #### api.getBuildModel(callback) Alias for `api.get('build.model', callback)`. #### api.getBuildProduct(callback) Alias for `api.get('build.product', callback)`. #### api.getBuildTags(callback) Alias for `api.get('build.tags', callback)`. #### api.getBuildType(callback) Alias for `api.get('build.type', callback)`. #### api.getBuildUser(callback) Alias for `api.get('build.user', callback)`. #### api.getBuildVersionCodename(callback) Alias for `api.get('build.version.codename', callback)`. #### api.getBuildVersionIncremental(callback) Alias for `api.get('build.version.incremental', callback)`. #### api.getBuildVersionRelease(callback) Alias for `api.get('build.version.release', callback)`. #### api.getBuildVersionSdk(callback) Alias for `api.get('build.version.sdk', callback)`. #### api.getClockMillis(callback) Alias for `api.get('clock.millis', callback)`. #### api.getClockRealtime(callback) Alias for `api.get('clock.realtime', callback)`. #### api.getClockUptime(callback) Alias for `api.get('clock.uptime', callback)`. #### api.getDisplayDensity(callback) Alias for `api.get('display.density', callback)`. #### api.getDisplayHeight(callback) Alias for `api.get('display.height', callback)`. Note that the height may exclude any virtual home button row. #### api.getDisplayWidth(callback) Alias for `api.get('display.width', callback)`. #### api.keyDown(keyCode, callback) Sends a key down event. Should be coupled with `api.keyUp()`. Note that `api.press()` performs the two events automatically. * **keyCode** The [key code][android-keycodes]. All monkeys support numeric keycodes, and some support automatic conversion from key names to key codes (e.g. `'home'` to `KEYCODE_HOME`). This will not work for number keys however. The most portable method is to simply use numeric key codes. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. #### api.keyUp(keyCode, callback) Sends a key up event. Should be coupled with `api.keyDown()`. Note that `api.press()` performs the two events automatically. * **keyCode** See `api.keyDown()`. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. #### api.list(callback) Lists supported variables. * **callback(err, vars)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * **vars** An array of supported variable names, to be used with `api.get()`. * Returns: The `Api` implementation instance. #### api.press(keyCode, callback) Sends a key press event. * **keyCode** See `api.keyDown()`. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. #### api.quit(callback) Closes the current monkey session and quits monkey. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. #### api.sleep(ms, callback) Sleeps for the given duration. Can be useful for simulating gestures. * **ms** How many milliseconds to sleep for. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. #### api.tap(x, y, callback) Taps the given coordinates. * **x** The x coordinate. * **y** The y coordinate. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. #### api.touchDown(x, y, callback) Sends a touch down event on the given coordinates. * **x** The x coordinate. * **y** The y coordinate. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. #### api.touchMove(x, y, callback) Sends a touch move event on the given coordinates. * **x** The x coordinate. * **y** The y coordinate. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. #### api.touchUp(x, y, callback) Sends a touch up event on the given coordinates. * **x** The x coordinate. * **y** The y coordinate. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. #### api.trackball(x, y, callback) Sends a trackball event on the given coordinates. * **x** The x coordinate. * **y** The y coordinate. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. #### api.type(text, callback) Types the given text. * **text** A text `String`. Note that only characters for which [key codes][android-keycodes] exist can be entered. Also note that any IME in use may or may not transform the text. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. #### api.wake(callback) Wakes the device from sleep and allows user input. * **callback(err)** Called when monkey responds. * **err** `null` when successful, `Error` otherwise. * Returns: The `Api` implementation instance. ### Multi Buffers `Api` commands and delivers them simultaneously for greater control over timing. Implements all `Api` methods, but without the last `callback` parameter. #### multi.execute(callback) Sends all buffered commands. * **callback(err, values)** Called when monkey has responded to all commands (i.e. just once at the end). * **err** `null` when successful, `Error` otherwise. * **values** An array of all response values, identical to individual `Api` responses. ## More information * [Monkey][monkey-site] - [Source code][monkey-source] - [Protocol][monkey-proto] * [Monkeyrunner][monkeyrunner-site] ## Contributing See [CONTRIBUTING.md](CONTRIBUTING.md). ## License See [LICENSE](LICENSE). Copyright © CyberAgent, Inc. All Rights Reserved. [nodejs]: [monkey-site]: [monkey-source]: [monkey-proto]: [monkeyrunner-site]: [node-net]: [node-stream]: [android-keycodes]: