Skip to content

Commit

Permalink
refactor!: Transform the package to a library
Browse files Browse the repository at this point in the history
  • Loading branch information
mykola-mokhnach committed Oct 13, 2023
1 parent 43688b9 commit 466afc6
Show file tree
Hide file tree
Showing 158 changed files with 90 additions and 13,547 deletions.
4 changes: 0 additions & 4 deletions .github/ISSUE_TEMPLATE.md

This file was deleted.

84 changes: 0 additions & 84 deletions .github/workflows/functional-test.yml

This file was deleted.

6 changes: 3 additions & 3 deletions .github/workflows/publish.js.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: Use Node.js 18.x
uses: actions/setup-node@v1
uses: actions/setup-node@v3
with:
node-version: 18.x
node-version: lts/*
- run: |
npm install -g appium@next
npm install -g appium
npm install --no-package-lock
npm run build
name: Install dev dependencies
Expand Down
13 changes: 3 additions & 10 deletions .github/workflows/unit-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,10 @@ jobs:
outputs:
versions: ${{ steps.generate-matrix.outputs.versions }}
steps:
- name: Generate Node.js versions matrix
- name: Select 3 most recent LTS versions of Node.js
id: generate-matrix
run: |
sudo apt-get install -y lynx
lynx -dump https://endoflife.date/nodejs | grep -E -o '[0-9]+[( a-zA-Z]+LTS\)' | grep -E -o '([0-9]+)' > eol.list
cat eol.list
lts1=$(cat eol.list | head -1)
lts2=$(cat eol.list | head -2 | tail -1)
lts3=$(cat eol.list | head -3 | tail -1)
VERSIONS="[$lts1, $lts2, $lts3]"
echo "versions=${VERSIONS}" >> "$GITHUB_OUTPUT"
run: echo "versions=$(curl -s https://endoflife.date/api/nodejs.json | jq -c '[[.[] | select(.lts != false)][:3] | .[].cycle | tonumber]')" >> "$GITHUB_OUTPUT"


test:
needs:
Expand Down
7 changes: 0 additions & 7 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,4 @@ package-lock.json*
.idea
target
out
bootstrap/bin/*
!bootstrap/bin/AppiumBootstrap.jar
bootstrap/local.properties
bootstrap/.classpath
bootstrap/target/
bootstrap/.project
bootstrap/.settings
.vscode
108 changes: 3 additions & 105 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,106 +5,14 @@

# Appium Android Driver

Appium Android Driver is a test automation tool for Android devices. Appium Android Driver automates native, hybrid and mobile web apps, tested on simulators, emulators and real devices. Appium Android Driver is part of the [Appium](https://github.com/appium/appium) mobile test automation tool.

*Note*: Issue tracking for this repo has been disabled. Please use the [main Appium issue tracker](https://github.com/appium/appium/issues) instead.

## Deprecation Notice

This driver is obsolete and should _not_ be used to automate devices running Android version
6.0 (codename Marshmallow, API level 23) or greater.
Consider using [UIAutomator2](https://github.com/appium/appium-uiautomator2-driver) or
[Espresso](https://github.com/appium/appium-espresso-driver) drivers for such purpose instead.
Along with the fact that Android Driver is obsolete, parts of its codebase are inherited
by the aforementioned drivers, so the project itself is still being partially maintained.

## Usage

Import Android Driver, set [desired capabilities](http://appium.io/docs/en/writing-running-appium/caps/index.html#android-only) and create a session:

```js
import { AndroidDriver } from `appium-android-driver`

let defaultCaps = {
app: 'path/to/your.apk',
deviceName: 'Android',
platformName: 'Android'
};

let driver = new AndroidDriver();
await driver.createSession(defaultCaps);
```
Run commands:
```js
await driver.setOrientation('LANDSCAPE');
console.log(await driver.getOrientation()); // -> 'LANDSCAPE'
```

### Technical details of the bootstrap system installed on the device

The system works by a `com.android.uiautomator.testrunner.UiAutomatorTestCase`
placed on the Android device, which opens a [SocketServer](http://docs.oracle.com/javase/7/docs/api/java/net/ServerSocket.html)
on port `4724`. This server receives commands, converts them to appropriate
Android UI Automator commands, and runs them in the context of the device.

The commands are sent through the JavaScript interface.

### UiAutomator interface

Appium's UiAutomator interface has two methods `start` and `shutdown`.

`async start (uiAutomatorBinaryPath, className, startDetector, ...extraParams)`

`start` will push uiAutomatorBinary to device and start UiAutomator with className
and return the SubProcess. `startDetector` and `extraParams` are optional arguments.
`startDetector` will be used as condition to check against your output stream of test if any. `extraParams` will be passed along as command line arguments when starting the subProcess.

`shutdown` will kill UiAutomator process on the device and also kill the subProcess.


```js
import UiAutomator from 'lib/uiautomator';
import ADB from 'appium-adb';

let adb = await ADB.createADB();
let uiAutomator = new UiAutomator(adb);

let startDetector = (s) => { return /Appium Socket Server Ready/.test(s); };
await uiAutomator.start('foo/bar.jar', 'io.appium.android.bootstrap.Bootstrap',
startDetector, '-e', 'disableAndroidWatchers', true);
await uiAutomator.shutdown();
```

### Specifying and selecting devices/emulators

The driver will attempt to connect to a device/emulator based on these properties in the `desiredCapabilities` object:

1. `avd`: Launch or connect to the emulator with the given name.
1. `udid`: Connect to the device with the given UDID.
1. `platformVersion`: Connect to the first device or active emulator whose OS begins with the desired OS. This means `platformVersion: 5` will take the first `5x` device from the output of `adb devices` if there are multiple available.

If none of these capabilities are given, the driver will connect to the first device or active emulator returned from the output of `adb devices`.

If more than one of these capabilities are given, the driver will only use first the capability in the order above. That is, `avd` takes priority over `udid`, which takes priority over `platformVersion`.

## API Notes

`lock` behaves differently in Android than it does in iOS. In Android it does not take any arguments, and locks the screen and returns immediately.

## Opt-In Features (With Security Risk)

These can be enabled when running this driver through Appium, via the `--allow-insecure` or `--relaxed-security` flags.

|Feature Name|Description|
|------------|-----------|
|get_server_logs|Allows retrieving of Appium server logs via the Webdriver log interface|
|adb_shell|Allows execution of arbitrary adb shell commands via the "mobile: shell" command|
Appium Android Driver is the collection of common primitives used by other Android drivers, like UIA2/Espresso. This driver cannot work as a separate entity.

## Development

### Transpile ES2015 code
### Install and Compile

```
npm i
npm run build
```

Expand All @@ -113,13 +21,3 @@ npm run build
```
npm test
```

Some tests need particular emulators. Currently they are twofold:
1. API level 25: either set `ANDROID_25_AVD` environment variable to the name of
avd, or defaults to `"Nexus_5_API_25"`. If neither exist, the tests are skipped.
2. API level 24: either set `ANDROID_24_NO_GMS_AVD` environment variable to the name of
avd, or defaults to `"Nexus_5_API_24"`. If neither exist, the tests are skipped.

Some tests also also need a specific version of Chromedriver (specifically, `2.20`),
which is available in the `test/assets` folder, or can be specified with the
`CHROME_2_20_EXECUTABLE` environment variable.
19 changes: 0 additions & 19 deletions bootstrap/README.md

This file was deleted.

Binary file removed bootstrap/bin/AppiumBootstrap.jar
Binary file not shown.
109 changes: 0 additions & 109 deletions bootstrap/build.xml

This file was deleted.

Loading

0 comments on commit 466afc6

Please sign in to comment.