Skip to content

better-go/android-uiautomator-server

This branch is up to date with openatx/android-uiautomator-server:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

fa695aa · Jul 22, 2024
May 12, 2024
May 24, 2024
Apr 8, 2024
May 4, 2024
Apr 8, 2024
Aug 5, 2019
Apr 30, 2024
May 29, 2015
Jul 22, 2024
Apr 8, 2024
Apr 8, 2024
May 20, 2015
May 20, 2015
Jun 4, 2015
Aug 5, 2019
Aug 7, 2015

Repository files navigation

Purpose

Android CI

UIAutomator is a great tool to perform Android UI testing, but to do it, you have to write java code, compile it, install the jar, and run. It's a complex steps for all testers...

This project is to build a light weight jsonrpc server in Android device, so that we can just write PC side script to write UIAutomator tests.

Build

  • Run command:
$ ./gradlew build
$ ./gradlew packageDebugAndroidTest
  • Run the jsonrpc server on Android device
$ ./gradlew cC
$ adb forward tcp:9008 tcp:9008 # tcp forward

If debug apk already installed, There is no need to use gradle.

simply run the following command

adb forward tcp:9008 tcp:9008
adb shell am instrument -w -r -e debug false -e class com.github.uiautomator.stub.Stub \
    com.github.uiautomator.test/androidx.test.runner.AndroidJUnitRunner

Run

$ curl -X POST -d '{"jsonrpc": "2.0", "id": "1f0f2655716023254ed2b57ba4198815", "method": "deviceInfo", "params": {}}' 'http://127.0.0.1:9008/jsonrpc/0'
{'currentPackageName': 'com.smartisanos.launcher',
 'displayHeight': 1920,
 'displayRotation': 0,
 'displaySizeDpX': 360,
 'displaySizeDpY': 640,
 'displayWidth': 1080,
 'productName': 'surabaya',
 'screenOn': True,
 'sdkInt': 23,
 'naturalOrientation': True}

Resources

Clipboard, Thanks to @fplust

The buildin input method

com.github.uiautomator/.AdbKeyboard

Encode the text into UTF-8 and then Base64

For example:

"Hello 你好" -> (UTF-8 && Base64) = SGVsbG8g5L2g5aW9

Send to AdbKeyboard with broadcast

Broadcast completed: result=-1 means success

# show ime list
$ adb shell ime list -s -a
com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME
com.google.android.tts/com.google.android.apps.speech.tts.googletts.settings.asr.voiceime.VoiceInputMethodService
com.github.uiautomator/.AdbKeyboard

# enable and set ime
$ adb shell ime enable com.github.uiautomator/.AdbKeyboard
$ adb shell settings put secure default_input_method com.github.uiautomator/.AdbKeyboard

# Append text to input field
$ adb shell am broadcast -a ADB_KEYBOARD_INPUT_TEXT --es text SGVsbG8g5L2g5aW9
Broadcasting: Intent { act=ADB_KEYBOARD_INPUT_TEXT flg=0x400000 (has extras) }
Broadcast completed: result=-1

# Clear text
$ adb shell am broadcast -a ADB_KEYBOARD_CLEAR_TEXT
Broadcasting: Intent { act=ADB_KEYBOARD_CLEAR_TEXT flg=0x400000 }
Broadcast completed: result=-1

# Clear text before append text
$ adb shell am broadcast -a ADB_KEYBOARD_SET_TEXT --es text SGVsbG8g5L2g5aW9
Broadcasting: Intent { act=ADB_KEYBOARD_SET_TEXT flg=0x400000 (has extras) }
Broadcast completed: result=-1

# Send Keycode or Editor code according to the InputEditor requires
$ adb shell am broadcast -a ADB_KEYBOARD_SMART_ENTER
Broadcasting: Intent { act=ADB_KEYBOARD_SMART_ENTER flg=0x400000 }
Broadcast completed: result=-1

# Send keycode, eg: ENTER
$ adb shell am broadcast -a ADB_KEYBOARD_INPUT_KEYCODE --ei code 66
# Send Editor code, eg: 2
$ adb shell am broadcast -a ADB_KEYBOARD_EDITOR_CODE --ei code 2 # IME_ACTION_GO

# Get clipboard (without data)
$ adb shell am broadcast -a ADB_KEYBOARD_GET_CLIPBOARD
Broadcasting: Intent { act=ADB_GET_CLIPBOARD flg=0x400000 }
Broadcast completed: result=0

# Get clipboard (with data, base64 encoded)
$ adb shell am broadcast -a ADB_GET_KEYBOARD_CLIPBOARD
Broadcasting: Intent { act=ADB_GET_CLIPBOARD flg=0x400000 }
Broadcast completed: result=-1, data="5LqG6Kej5Lyg57uf5paH5YyW"

# show keyboard
$ adb shell am broadcast -a ADB_KEYBOARD_SHOW
# hide keyboard
$ adb shell am broadcast -a ADB_KEYBOARD_HIDE

Change GPS mock location

You can change mock location from terminal using adb in order to test GPS on real devices.

adb [-s <specific device>] shell am broadcast -a send.mock [-e lat <latitude>] [-e lon <longitude>]
        [-e alt <altitude>] [-e accurate <accurate>]

For example:

adb  shell am broadcast -a send.mock -e lat 15.3 -e lon 99

Show toast

adb shell am start -n com.github.uiautomator/.ToastActivity -e message hello

Float window

adb shell am start -n com.github.uiautomator/.ToastActivity -e showFloatWindow true # show
adb shell am start -n com.github.uiautomator/.ToastActivity -e showFloatWindow false # hide

How to use with Python

import uiautomator2 as u2

d = u2.connect()

d.screen.on()
d(text="Settings").click()
d(scrollable=True).scroll.vert.forward()

Refer to python wrapper library uiautomator.

How to generate changelog

conventional-changelog

npm install -g conventional-changelog-cli
conventional-changelog -p grunt -i CHANGELOG.md -s -r 0

Notes

If you have any idea, please email codeskyblue@gmail.com or submit tickets.

Dependencies

Added features

  • support unicode input

Thanks to

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 99.8%
  • AIDL 0.2%