Compare commits

..
Author SHA1 Message Date
dpgraham e6a2dd73c6 Release 1.11.1 2019-02-19 11:30:32 -08:00
dpgraham bca930cc07 Release 1.11.1-rc.1 2019-02-14 15:53:02 -08:00
dpgraham 2654c5911c Update appium server 2019-02-14 15:26:44 -08:00
dpgraham 64f83556b6 Prepare 1.11.1 release candidate 2019-02-14 14:43:23 -08:00
dpgraham 6d45010646 Prune dev dependencies 2019-02-14 14:30:46 -08:00
dpgraham 3efeb04c67 Update base driver and uiautomator2 driver 2019-02-14 14:23:00 -08:00
dpgraham 49c7a2574c Update YouIEngine Driver to 1.1.2 2019-02-13 16:33:47 -08:00
dpgraham 2ed55e8448 Release 1.11.0 2019-02-13 10:41:14 -08:00
dpgraham 350223eb10 Release 1.11.0-rc.5 2019-02-12 10:16:11 -08:00
dpgraham 444272321a Update appium-adb 2019-02-12 10:13:38 -08:00
dpgraham 986ba5620c Release 1.11.0-rc.4 2019-02-11 13:12:12 -08:00
dpgraham 4ec267217e Update appium-android-driver 2019-02-11 13:10:45 -08:00
dpgraham 4c518ddb02 Release 1.11.0-rc.3 2019-01-15 15:15:13 -08:00
dpgraham bd2fd7030b Update appium-espresso-driver 2019-01-15 15:13:57 -08:00
dpgraham 440b27d778 Update appium-uiautomator2-driver 2019-01-15 15:11:48 -08:00
Dan Graham 8edba58fc9 Add deprecation notice when automationName not set (#11979)
* Add deprecation notice when automationName not set

* PR changes
2019-01-15 14:53:21 -08:00
dpgraham df9fa1bac8 Bump version to rc2 2019-01-10 11:25:05 -08:00
dpgraham 474e482d6c Update appium-xcuitest-driver 2019-01-10 11:20:16 -08:00
dpgraham 831ddfd2d6 Release 1.11.0-rc.1 2019-01-09 11:03:27 -08:00
dpgraham abb94791b2 Revert version number 2019-01-09 10:59:49 -08:00
dpgraham 57a0fb6ba7 Do not ignore npm-shrinkwrap.json 2019-01-09 10:58:38 -08:00
dpgraham 4ee1daa1b5 Release 1.11.0-rc.1 2019-01-09 09:39:39 -08:00
dpgraham 24287354b8 Update way outdated dependencies 2019-01-09 09:32:33 -08:00
dpgraham 8b81fbbeb6 Release 1.11.0-rc.0 2019-01-03 11:20:20 -08:00
dpgraham dd0f928ca3 Change version name to make release RC work 2019-01-03 11:20:14 -08:00
dpgraham 55fb6e3c86 Prepare 1.11.0 release candidate 2019-01-03 11:18:33 -08:00
1436 changed files with 58601 additions and 133811 deletions
-13
View File
@@ -1,13 +0,0 @@
# editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
+2
View File
@@ -0,0 +1,2 @@
coverage
node_modules
+3
View File
@@ -0,0 +1,3 @@
{
"extends": "appium"
}
-54
View File
@@ -1,54 +0,0 @@
# Generated by FOSSA CLI (https://github.com/fossas/fossa-cli)
# Visit https://fossa.com to learn more
version: 3
project:
id: appium
name: appium
paths:
exclude:
- ./sample-code
- '**/fixtures/**'
- '**/demo/**'
- '**/example/**'
- '**/examples/**'
targets:
only:
- type: npm
path: .
- type: npm
path: ./packages/appium
- type: npm
path: ./packages/base-driver
- type: npm
path: ./packages/eslint-config-appium-ts
- type: npm
path: ./packages/fake-driver
- type: npm
path: ./packages/support
- type: npm
path: ./packages/test-support
- type: npm
path: ./packages/types
- type: npm
path: ./packages/schema
- type: npm
path: ./packages/universal-xmlplugin
- type: npm
path: ./packages/opencv
- type: npm
path: ./packages/images-plugin
- type: npm
path: ./packages/base-plugin
- type: npm
path: ./packages/relaxed-caps-plugin
- type: npm
path: ./packages/fake-plugin
- type: npm
path: ./packages/docutils
revision:
branch: master
-4
View File
@@ -1,4 +0,0 @@
* text=auto eol=lf
# Handle as a text file but merge as binary.
package-lock.json merge=binary
+32
View File
@@ -0,0 +1,32 @@
## The problem
Briefly describe the issue you are experiencing (or the feature you want to see added to Appium). Tell us what you were trying to do and what happened instead. Remember, this is _not_ a place to ask questions. For that, go to http://discuss.appium.io!
## Environment
* Appium version (or git revision) that exhibits the issue:
* Last Appium version that did not exhibit the issue (if applicable):
* Desktop OS/version used to run Appium:
* Node.js version (unless using Appium.app|exe):
* Mobile platform/version under test:
* Real device or emulator/simulator:
* Appium CLI or Appium.app|exe:
## Details
If necessary, describe the problem you have been experiencing in more detail.
## Link to Appium logs
Create a [GIST](https://gist.github.com) which is a paste of your _full_ Appium logs, and link them here.
Do _NOT_ paste your full Appium logs here, as it will make this issue very long and hard to read!
If you are reporting a bug, _always_ include Appium logs!
## Code To Reproduce Issue [ Good To Have ]
Please remember that with sample code it's easier to reproduce the bug and it's much faster to fix it.
Please git clone https://github.com/appium/appium and from the `sample-code` directory, use one of your favourite languages and sample apps to reproduce the issue.
In case a similar scenario is missing in sample-code, please submit a PR with one of the sample apps provided.
-111
View File
@@ -1,111 +0,0 @@
name: 🐞 Bug Report
description: Create a new bug report.
title: '🐞 bug: <title>'
labels: [Bug, Needs Triage]
body:
- type: markdown
attributes:
value: ':stop_sign: _Make sure you are reporting an issue. For general questions, please use [http://discuss.appium.io](http://discuss.appium.io)._'
- type: checkboxes
attributes:
label: Is there an existing issue for this?
description: 'Please [search :mag: the issues](https://github.com/appium/appium/issues) to check if this bug has already been reported.'
options:
- label: I have searched the existing issues
required: true
- type: input
attributes:
label: Appium Version
description: What Appium server version are you running?
placeholder: Output of `appium --version`
validations:
required: true
- type: dropdown
attributes:
label: Appium Host Type
description: |
How is your Appium server being hosted? For options other than "Command Line", please add more details under "Further Information".
options:
- Command Line
- Virtual Machine/Docker
- Cloud Provider (e.g. BrowserStack/Sauce Labs)
- Other
validations:
required: true
- type: input
attributes:
label: Are you using Appium components not maintained by the Appium team?
description: Refer to the [Appium Ecosystem](http://appium.io/docs/en/latest/ecosystem/) page for officially-supported components.
placeholder: Please provide the names of any third-party components.
- type: checkboxes
attributes:
label: Is this issue reproducible using the latest components?
description: |
You can retrieve the latest server/driver/plugin version number by running `npm info <package-name> version`. If you are not up to date, please try to reproduce your issue after updating all affected components.
options:
- label: I confirm the issue is still reproducible with the latest component versions
- type: textarea
attributes:
label: Current Behavior
description: Describe the problem you are experiencing. **Please do not paste your logs here.** Screenshots are welcome.
validations:
required: true
- type: textarea
attributes:
label: Expected Behavior
description: Describe what you expect to happen instead.
validations:
required: true
- type: input
attributes:
label: Appium Log
description: |
Please create a [Gist](https://gist.github.com) with your _full_ Appium server log and link it here. Alternatively, you can directly attach your logfile in the "Further Information" field below.
:warning: _Remember to redact or remove any sensitive information!_
placeholder: 'https://gist.github.com/...'
- type: textarea
attributes:
label: Environment Details
description: |
Please provide additional information about your environment; feel free to remove any items which are not relevant.
:warning: _Remember to redact or remove any sensitive information!_
value: |
- Debug details (`appium --show-debug-info`):
- Last component version(s) which did _not_ exhibit the problem:
- Platform and version of device under test:
- Real device or emulator/simulator:
- type: textarea
attributes:
label: Minimal Reproducible Example
description: |
Please provide [the smallest, complete code snippet](https://stackoverflow.com/help/minimal-reproducible-example) that Appium's maintainers can run to reproduce the issue. An easy way to get started is to copy [sample code](https://github.com/appium/appium/tree/master/packages/appium/sample-code) and modify it accordingly. Failing this, any sort of reproduction steps are better than nothing!
If the result is more than a screenful of text _or_ requires multiple files, please:
- _Attach_ (do not paste) it to this textarea, _or_
- Put it in a [Gist](https://gist.github.com) and paste the link, _or_
- Provide a link to a new or existing public repository exhibiting the issue
validations:
required: true
- type: textarea
attributes:
label: Further Information
description: If needed, please provide additional information about your issue (attachments, links, references, etc.).
- type: markdown
attributes:
value: ':stop_sign: _Make sure you are reporting an issue. For general questions, please use [http://discuss.appium.io](http://discuss.appium.io)._'
-5
View File
@@ -1,5 +0,0 @@
blank_issues_enabled: true
contact_links:
- name: ❓ Question
url: https://discuss.appium.io/
about: Please use the Appium forum for any questions.
@@ -1,33 +0,0 @@
name: 💡 Feature Request
description: Suggest an idea for this project.
title: "💡 feat: <title>"
labels: [Enhancement]
body:
- type: textarea
attributes:
label: Is your feature request related to a problem?
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...].
validations:
required: true
- type: textarea
attributes:
label: Describe the solution you'd like.
description: A clear and concise description of what you want to happen.
validations:
required: true
- type: textarea
attributes:
label: Describe alternatives you've considered.
description: A clear and concise description of any alternative solutions or features you've considered.
validations:
required: false
- type: textarea
attributes:
label: Additional context
description: Add any other context or screenshots about the feature request here.
validations:
required: false
+3 -4
View File
@@ -10,17 +10,16 @@ _Put an `x` in the boxes that apply_
- [ ] Bugfix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] Documentation Update (if none of the other choices apply)
## Checklist
_Put an `x` in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your code._
- [ ] I have read the [Contributing Guide](https://appium.io/docs/en/latest/contributing/)
- [ ] I have signed the CLA
- [ ] I have read the [CONTRIBUTING](https://github.com/appium/appium/blob/master/CONTRIBUTING.md) doc
- [ ] I have signed the [CLA](https://cla.js.foundation/appium/appium)
- [ ] Lint and unit tests pass locally with my changes
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] I have added the necessary documentation (if appropriate)
- [ ] I have added necessary documentation (if appropriate)
- [ ] Any dependent changes have been merged and published in downstream modules
## Further comments
-41
View File
@@ -1,41 +0,0 @@
name: Setup Node, Install, Build
description: |
Common setup for Appium CI jobs: checkout, setup Node, install deps, optional build, optional V8 cache clear.
inputs:
node-version:
description: Node.js version to setup
required: true
install-command:
description: npm install command
required: false
default: npm ci --foreground-scripts
run-build:
description: Whether to run npm run build
required: false
default: 'true'
runs:
using: composite
steps:
- name: Use Node.js ${{ inputs.node-version }}
uses: actions/setup-node@v6
with:
node-version: ${{ inputs.node-version }}
cache: npm
- name: SocketDev Security Check
uses: SocketDev/action@v1
with:
mode: firewall-free
- name: Install dependencies
shell: bash
run: |
# Replace npm with sfw npm in the install command
install_cmd="${{ inputs.install-command }}"
install_cmd="${install_cmd//npm /sfw npm }"
$install_cmd
- name: Build packages
if: ${{ inputs.run-build == 'true' }}
shell: bash
run: npm run build
-149
View File
@@ -1,149 +0,0 @@
version: v1
labels:
- label: 'Enhancement'
sync: true
matcher:
commits: '^feat.*?:'
title: '^feat.*?:'
- label: 'Bug'
sync: true
matcher:
commits: '^fix.*?:'
title: '^fix.*?:'
- label: 'Documentation'
sync: true
matcher:
commits: '^docs.*?:'
title: '^docs.*?:'
files: ['packages/docutils/**', 'packages/appium/docs/**', '**/*.md']
- label: 'chore'
sync: true
matcher:
commits: '^chore.*?:'
title: '^chore.*?:'
files: ['.github/**', '.husky/**', '.vscode/**', './.*', './*.js', '**/test/**']
- label: 'SemVer:Breaking'
sync: true
matcher:
commits: '(^(.+?)!:)|(BREAKING CHANGE:)'
- label: 'Dependencies'
sync: true
matcher:
files: ['**/package.json', 'package-lock.json', '**/requirements.txt']
author: 'renovate'
- label: 'appium core'
sync: true
matcher:
files: ['packages/appium/**']
- label: '@appium/base-driver'
sync: true
matcher:
files: ['packages/base-driver/**']
- label: '@appium/base-plugin'
sync: true
matcher:
files: ['packages/base-plugin/**']
- label: '@appium/storage-plugin'
sync: true
matcher:
files: ['packages/storage-plugin/**']
- label: '@appium/docutils'
sync: true
matcher:
files: ['packages/docutils/**']
- label: '@appium/driver-test-support'
sync: true
matcher:
files: ['packages/driver-test-support/**']
- label: '@appium/eslint-config-appium-ts'
sync: true
matcher:
files: ['packages/eslint-config-appium-ts/**']
- label: '@appium/execute-driver-plugin'
sync: true
matcher:
files: ['packages/execute-driver-plugin/**']
- label: '@appium/fake-driver'
sync: true
matcher:
files: ['packages/fake-driver/**']
- label: '@appium/fake-plugin'
sync: true
matcher:
files: ['packages/fake-plugin/**']
- label: '@appium/images-plugin'
sync: true
matcher:
files: ['packages/images-plugin/**']
- label: '@appium/logger'
sync: true
matcher:
files: ['packages/logger/**']
- label: '@appium/opencv'
sync: true
matcher:
files: ['packages/opencv/**']
- label: '@appium/plugin-test-support'
sync: true
matcher:
files: ['packages/plugin-test-support/**']
- label: '@appium/relaxed-caps-plugin'
sync: true
matcher:
files: ['packages/relaxed-caps-plugin/**']
- label: '@appium/schema'
sync: true
matcher:
files: ['packages/schema/**']
- label: '@appium/support'
sync: true
matcher:
files: ['packages/support/**']
- label: '@appium/strongbox'
sync: true
matcher:
files: ['packages/strongbox/**']
- label: '@appium/test-support'
sync: true
matcher:
files: ['packages/test-support/**']
- label: '@appium/tsconfig'
sync: true
matcher:
files: ['packages/tsconfig/**']
- label: '@appium/types'
sync: true
matcher:
files: ['packages/types/**']
- label: '@appium/universal-xml-plugin'
sync: true
matcher:
files: ['packages/universal-xml-plugin/**']
-26
View File
@@ -1,26 +0,0 @@
# Configuration for Lock Threads - https://github.com/dessant/lock-threads
# Number of days of inactivity before a closed issue or pull request is locked
daysUntilLock: 365
# Skip issues and pull requests created before a given timestamp. Timestamp must
# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
skipCreatedBefore: false
# Issues and pull requests with these labels will be ignored. Set to `[]` to disable
exemptLabels: []
# Label to add before locking, such as `outdated`. Set to `false` to disable
lockLabel: false
# Comment to post before locking. Set to `false` to disable
lockComment: >
This thread has been automatically locked since there has not been
any recent activity after it was closed. Please open a new issue for
related bugs.
# Assign `resolved` as the reason for locking. Set to `false` to disable
setLockReason: false
# Limit to only `issues` or `pulls`
only: issues
-16
View File
@@ -1,16 +0,0 @@
name: Labeler
on:
pull_request_target:
types: [opened, synchronize]
branches: [master]
permissions: read-all
jobs:
labeler:
permissions:
pull-requests: write
name: Auto-Label PRs
runs-on: ubuntu-latest
steps:
- uses: fuxingloh/multi-labeler@v4
-199
View File
@@ -1,199 +0,0 @@
name: Appium Build
on:
push:
branches:
- master
# this list of paths could potentially impact the build
paths:
- '**/tsconfig*.json'
- 'packages/base-driver/static/**/*'
- 'packages/*/test/**'
- 'packages/*/bin'
- 'packages/**/*.ts'
- 'packages/**/*.json'
- 'packages/**/*.js'
- 'package*.json'
- 'lerna.json'
- '.npmrc'
- '.mocharc.js'
- '.github/workflows/build.yml' # this file
- '.eslintrc'
- '.eslintignore'
- '!**/sample-code/**'
- '!packages/*/docs/**'
pull_request:
branches:
- master
paths:
- '**/tsconfig*.json'
- 'packages/base-driver/static/**/*'
- 'packages/*/test/**'
- 'packages/*/bin'
- 'packages/**/*.ts'
- 'packages/**/*.json'
- 'packages/**/*.js'
- 'package*.json'
- 'lerna.json'
- '.npmrc'
- '.mocharc.js'
- '.github/workflows/build.yml' # this file
- '.eslintrc'
- '.eslintignore'
- '!**/sample-code/**'
- '!packages/*/docs/**'
env:
CI: true
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
prepare_matrix:
uses: appium/appium-workflows/.github/workflows/node-lts-matrix.yml@main
prepare_e2e_packages:
runs-on: ubuntu-latest
outputs:
packages: ${{ steps.discover-packages.outputs.packages }}
steps:
- uses: actions/checkout@v6
- name: Discover packages with e2e tests
id: discover-packages
run: |
packages=()
for package_dir in packages/*/; do
package_json="${package_dir}package.json"
if [[ -f "$package_json" ]]; then
# Check if package.json has test:e2e script and it's not a no-op
has_e2e=$(node -e "
try {
const pkg = require('./$package_json');
const script = pkg.scripts && pkg.scripts['test:e2e'];
if (script && !script.includes('echo') && !script.includes('No e2e tests')) {
console.log('true');
}
} catch(e) {
// Ignore errors
}
")
if [[ "$has_e2e" == "true" ]]; then
# Use the directory path without packages/ prefix (remove trailing slash)
package_name="${package_dir%/}"
package_name="${package_name#packages/}"
packages+=("$package_name")
fi
fi
done
# Convert array to JSON array for GitHub Actions matrix
if [[ ${#packages[@]} -eq 0 ]]; then
echo "No packages with e2e tests found"
packages_json="[]"
else
# Use jq to create a compact single-line JSON array
packages_json=$(printf '%s\n' "${packages[@]}" | jq -R '.' | jq -s '.' | jq -c '.')
fi
echo "packages=$packages_json" >> $GITHUB_OUTPUT
echo "Found packages with e2e tests:"
echo "$packages_json" | jq -r '.[]' | sed 's/^/ - /'
test-smoke:
needs:
- prepare_matrix
name: Smoke Tests
strategy:
matrix:
node-version: ${{ fromJSON(needs.prepare_matrix.outputs.versions) }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup, install and build
uses: ./.github/actions/setup-build
with:
node-version: ${{ matrix.node-version }}
install-command: npm ci --foreground-scripts
run-build: 'true'
- name: Run smoke tests
run: npm run test:smoke
test-unit:
needs:
- prepare_matrix
name: Unit Tests
strategy:
matrix:
node-version: ${{ fromJSON(needs.prepare_matrix.outputs.versions) }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup, install and build
uses: ./.github/actions/setup-build
with:
node-version: ${{ matrix.node-version }}
install-command: npm ci --foreground-scripts
run-build: 'true'
- name: Run unit tests
run: npm run test:unit
test-types:
needs:
- prepare_matrix
name: Type Tests
strategy:
matrix:
node-version: ${{ fromJSON(needs.prepare_matrix.outputs.versions) }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup, install and build
uses: ./.github/actions/setup-build
with:
node-version: ${{ matrix.node-version }}
install-command: npm ci --foreground-scripts
run-build: 'true'
- name: Run type tests
run: npm run test:types
test-e2e:
needs:
- prepare_matrix
- prepare_e2e_packages
name: E2E Tests - ${{ matrix.package_dir }} (Node ${{ matrix.node-version }})
if: ${{ github.event_name == 'pull_request' }}
strategy:
fail-fast: false
matrix:
node-version: ${{ fromJSON(needs.prepare_matrix.outputs.versions) }}
package_dir: ${{ fromJSON(needs.prepare_e2e_packages.outputs.packages) }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup, install and build
uses: ./.github/actions/setup-build
with:
node-version: ${{ matrix.node-version }}
install-command: npm ci --foreground-scripts
run-build: 'true'
- name: Run E2E tests for ${{ matrix.package_dir }}
run: |
set -o pipefail
cd "packages/${{ matrix.package_dir }}"
npm run test:e2e
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup and install (no build)
uses: ./.github/actions/setup-build
with:
node-version: lts/*
install-command: npm ci
run-build: 'false'
- name: ESLint
run: npm run lint:ci
-36
View File
@@ -1,36 +0,0 @@
name: Cache Cleanup
# from https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#usage-limits-and-eviction-policy
on:
pull_request:
types:
- closed
jobs:
cleanup:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v6
- name: Cleanup
run: |
gh extension install actions/gh-actions-cache
REPO=${{ github.repository }}
BRANCH="refs/pull/${{ github.event.pull_request.number }}/merge"
echo "Fetching list of cache keys"
cacheKeysForPR=$(gh actions-cache list -R $REPO -B $BRANCH | cut -f 1 )
## Setting this to not fail the workflow while deleting cache keys.
set +e
echo "Deleting caches..."
for cacheKey in $cacheKeysForPR
do
gh actions-cache delete $cacheKey -R $REPO -B $BRANCH --confirm
done
echo "Done"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-44
View File
@@ -1,44 +0,0 @@
# Collects translation statistics from Crowdin for the last calendar month
# and posts them to Slack grouped by project, language, and translator
name: Crowdin Translation Statistics
on:
workflow_dispatch:
schedule:
# Run on the first day of each month at 9:00 AM UTC
- cron: 0 9 1 * *
jobs:
collect-stats:
runs-on: ubuntu-latest
strategy:
matrix:
include:
- project_id_var: CROWDIN_DOCS_PROJECT_ID
project_name: appium-documentation
- project_id_var: CROWDIN_INSPECTOR_PROJECT_ID
project_name: appium-inspector
steps:
- uses: actions/checkout@v6
- name: Use Node.js LTS
uses: actions/setup-node@v6
with:
node-version: lts/*
cache: 'npm'
- name: Install Dependencies
run: npm ci
- name: Collect Crowdin Stats for ${{ matrix.project_name }}
id: crowdin-stats
run: node ./scripts/crowdin-stats.mjs > crowdin-stats-${{ matrix.project_name }}.json
env:
CROWDIN_PROJECT_ID: ${{ vars[matrix.project_id_var] }}
CROWDIN_TOKEN: ${{ secrets.CROWDIN_DOCS_TOKEN }}
- name: Post to Slack for ${{ matrix.project_name }}
uses: slackapi/slack-github-action@v3.0.1
with:
errors: true
webhook: ${{ secrets.SLACK_WEBHOOK_URL }}
webhook-type: incoming-webhook
payload-file-path: crowdin-stats-${{ matrix.project_name }}.json
@@ -1,38 +0,0 @@
# Retrieves non-English translations from Crowdin and creates a PR with new changes
name: Sync Crowdin Docs Translations
on:
workflow_dispatch:
schedule:
- cron: 0 0 * * *
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
persist-credentials: false
- name: Use Node.js LTS
uses: actions/setup-node@v6
with:
node-version: lts/*
cache: 'npm'
- name: Install Dependencies
run: npm ci
- name: Crowdin Sync
run: npm run crowdin-sync-docs-translations
env:
# appium-documentation
CROWDIN_PROJECT_ID: ${{ vars.CROWDIN_DOCS_PROJECT_ID }}
CROWDIN_TOKEN: ${{ secrets.CROWDIN_DOCS_TOKEN }}
- name: Create Pull Request
uses: peter-evans/create-pull-request@v8.1.0
with:
token: ${{ github.token }}
commit-message: 'docs(appium): Update documentation translations'
title: 'docs(appium): Update documentation translations'
branch: crowdin-sync-${{ github.run_id }}
body: 'Automated Update of Documentation Translations: https://crowdin.com/project/appium-documentation'
@@ -1,31 +0,0 @@
# Updates Crowdin with any changes in document files in English
name: Update Crowdin English Docs
on:
push:
branches: [master]
paths:
- 'packages/appium/docs/en/**.md'
- 'packages/appium/docs/mkdocs-en.yml'
- '.github/workflows/crowdin-update-docs-resources.yml' # this file
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Use Node.js LTS
uses: actions/setup-node@v6
with:
node-version: lts/*
cache: 'npm'
- name: Install Dependencies
run: npm ci
- name: Crowdin Update
run: npm run crowdin-update-docs
env:
# appium-documentation
CROWDIN_PROJECT_ID: ${{ vars.CROWDIN_DOCS_PROJECT_ID }}
CROWDIN_TOKEN: ${{ secrets.CROWDIN_DOCS_TOKEN }}
-68
View File
@@ -1,68 +0,0 @@
name: Appium Deploy
on:
push:
tags:
- master
workflow_dispatch:
permissions:
contents: read
jobs:
prepare_matrix:
runs-on: ubuntu-latest
outputs:
versions: ${{ steps.generate-matrix.outputs.lts }}
steps:
- name: Select all current LTS versions of Node.js
id: generate-matrix
uses: msimerson/node-lts-versions@v1
check:
needs:
- prepare_matrix
name: Check
runs-on: ${{ matrix.os }}
strategy:
matrix:
node-version: ${{ fromJSON(needs.prepare_matrix.outputs.versions) }}
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
- name: Install Appium
run: |
if [[ "$GITHUB_REF_TYPE" == tag ]]; then
npm i --location=global $GITHUB_REF_NAME
else
npm i --location=global appium
fi
shell: bash
- name: Install drivers and plugins
run: |
if grep -q macos <<< ${{ matrix.os }}; then
appium driver install xcuitest
fi
appium driver install uiautomator2
appium plugin install images
shell: bash
- name: Verify installation
run: |
installed_drivers=$(appium driver list --installed 2>&1)
if grep -q macos <<< ${{ matrix.os }}; then
grep -q xcuitest <<< $installed_drivers
fi
grep -q uiautomator2 <<< $installed_drivers
installed_plugins=$(appium plugin list --installed 2>&1)
grep -q images <<< $installed_plugins
shell: bash
- name: Verify Appium could be executed
run: |
appium --use-plugins=images &
pid=$(echo $!)
sleep 5
ps -p $pid || exit 1
kill -2 $pid
shell: bash
-53
View File
@@ -1,53 +0,0 @@
name: Build Docs
on:
pull_request:
branches:
- master
paths:
- '**/tsconfig*.json'
- '**/package*.json'
- '**/*mkdocs*.ya?ml'
- 'packages/docutils/requirements.txt'
- 'packages/*/README.md'
- 'packages/*/docs/**'
- 'packages/*/**/*.ts'
- 'packages/*/**/*.js'
- '.github/workflows/docs.yml' # this file
- '!**/test/**'
- '!**/sample-code/**'
push:
branches:
- master
paths:
- '**/tsconfig*.json'
- '**/package*.json'
- '**/*mkdocs*.ya?ml'
- 'packages/docutils/requirements.txt'
- 'packages/*/README.md'
- 'packages/*/docs/**'
- 'packages/*/**/*.ts'
- 'packages/*/**/*.js'
- '.github/workflows/docs.yml' # this file
- '!**/test/**'
- '!**/sample-code/**'
jobs:
docs:
name: Docs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Install dependencies (Node.js)
uses: bahmutov/npm-install@v1
with:
useRollingCache: true
install-command: npm ci
- name: Install dependencies (Python)
run: PIP_BREAK_SYSTEM_PACKAGES=1 pip install -r packages/docutils/requirements.txt
- name: Configure Git User
run: |
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
- name: Build Docs
run: npm run docs:preview
-31
View File
@@ -1,31 +0,0 @@
name: License Checks
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
permissions:
contents: read
jobs:
fossa-check:
name: Run FOSSA Analysis
runs-on: ubuntu-latest
env:
FOSSA_API_KEY: ${{secrets.FOSSA_API_KEY}}
steps:
- uses: actions/checkout@v6
with:
ref: master
- name: Install dependencies
uses: bahmutov/npm-install@v1
- name: Install fossa-cli
run: |
curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install-latest.sh | bash
- name: Run FOSSA analysis
run: |
if [ -n "$FOSSA_API_KEY" ]; then
fossa analyze
fossa test
else
echo "License checks did not run. FOSSA_API_KEY is not defined for this fork."
fi
@@ -1,37 +0,0 @@
# Collects GitHub contribution statistics from the Appium organization for the last calendar month
# and posts it to Slack
name: GitHub Contribution Statistics
on:
workflow_dispatch:
schedule:
# Run on the first day of each month at 09:00 AM UTC
- cron: 0 9 1 * *
jobs:
collect-contrib-stats:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Use Node.js LTS
uses: actions/setup-node@v6
with:
node-version: lts/*
cache: 'npm'
- name: Install Dependencies
run: npm ci
- name: Collect GitHub Contribution Stats
id: github-stats
run: node ./scripts/github-contrib-stats.mjs > github-contrib-stats.json
env:
# GITHUB_TOKEN is optional - if not provided, uses unauthenticated requests (rate limited)
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Post to Slack
uses: slackapi/slack-github-action@v3.0.1
with:
errors: true
webhook: ${{ secrets.SLACK_WEBHOOK_URL }}
webhook-type: incoming-webhook
payload-file-path: github-contrib-stats.json
-55
View File
@@ -1,55 +0,0 @@
name: Appium Server Release
on:
workflow_dispatch:
inputs:
dry_run:
description: 'Dry run (no publishing or tagging)'
required: true
type: boolean
default: true
permissions:
contents: write
pull-requests: write
issues: write
id-token: write
jobs:
release:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/master' && contains(fromJSON('["mykola-mokhnach", "jlipps", "eglitise", "KazuCocoa"]'), github.actor)
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Configure git user
run: |
git config user.name "github-actions"
git config user.email "github-actions@github.com"
- name: Setup Node and install deps (LTS)
uses: ./.github/actions/setup-build
with:
node-version: lts/*
install-command: npm ci
run-build: 'true'
- name: Run Lerna publish
env:
# for lerna createRelease
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DRY_RUN: ${{ inputs.dry_run }}
run: |
set -euo pipefail
if [ "$DRY_RUN" = "true" ]; then
echo "Running lerna publish in dry-run mode"
printf "n\n" | npx lerna version --exact --no-git-tag-version --no-push
else
echo "Running lerna publish for real"
npm run release -- --yes
fi
-15
View File
@@ -1,15 +0,0 @@
name: Disallow "On Hold" PRs
on:
pull_request_target:
types: [opened, labeled, unlabeled, synchronize]
branches: [master]
jobs:
label-check:
runs-on: ubuntu-latest
steps:
- name: Check for "On Hold" label
uses: egmacke/action-check-label@v4
with:
label: On Hold
state: absent
-10
View File
@@ -1,10 +0,0 @@
name: Conventional Commits
on:
pull_request:
types: [opened, edited, synchronize, reopened]
jobs:
lint:
uses: appium/appium-workflows/.github/workflows/pr-title.yml@main
with:
config-preset: angular
-32
View File
@@ -1,32 +0,0 @@
name: Publish docs
on:
workflow_dispatch:
workflow_run:
workflows: ["Appium Server Release"]
types:
- completed
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- run: |
git config user.name github-actions
git config user.email github-actions@github.com
- name: Setup Node and install deps (LTS)
uses: ./.github/actions/setup-build
with:
node-version: lts/*
install-command: npm ci
run-build: 'true'
- name: Install dependencies (Python)
run: npm run install-docs-deps
- name: Fetch gh-pages
run: |
git fetch origin gh-pages:gh-pages || true
- name: Publish docs
run: |
npm run docs:publish
-30
View File
@@ -1,30 +0,0 @@
name: Validate Renovate Configs
on:
push:
branches:
- master
paths:
- '.github/workflows/renovate.yml' # this file
- '.renovaterc.json'
- 'renovate/default.json'
pull_request:
branches:
- master
paths:
- '.github/workflows/renovate.yml' # this file
- '.renovaterc.json'
- 'renovate/default.json'
permissions:
contents: read
jobs:
renovate:
name: Check Renovate Configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Validate Renovate Config
uses: rinchsan/renovate-config-validator@v0.2.0
with:
pattern: '{.renovaterc.json,renovate/default.json}'
+15 -29
View File
@@ -2,20 +2,21 @@
*.swp
.DS_Store
node_modules
package-lock.json
*.trace
xcuserdata
*.sublime-*
test/functional/_joined
*.iml
!examples/java/*.iml
!sample-code/java/*.iml
*.autosave
.idea/
!examples/java/.idea/
!sample-code/java/.idea/
*.log
*.t
artifacts
input
./output
output
lib/devices/android/bootstrap/bin/*
lib/devices/android/bootstrap/local.properties
lib/devices/android/bootstrap/project.properties
@@ -24,45 +25,30 @@ lib/devices/android/bootstrap/target/
.*~
*~
org.eclipse.ltk.core.refactoring.prefs
/selendroid
.appiumconfig*
build/
.idea
*DerivedData
__pycache__
certificate.cert
certificate.key
# csharp
*.pyc
*.pdb
.vs
#vscode
.history
old
.tern-project
coverage
docs/mkdocs.yml
examples/javascript-wd/node_modules
examples/php/vendor
examples/php/composer.lock
examples/java/out/
examples/ruby/Gemfile.lock
examples/python/test/results/
examples/python/test/input
examples/python/.pytest_cache/
examples/csharp/test/bin
examples/csharp/test/obj
examples/csharp/test/bin
examples/csharp/packages
sample-code/javascript-wd/node_modules
sample-code/php/vendor
sample-code/php/composer.lock
sample-code/java/out/
sample-code/python/test/results/
sample-code/python/.pytest_cache/
sample-code/csharp/test/bin
sample-code/csharp/test/obj
sample-code/csharp/test/bin
sample-code/csharp/packages
appium.zip
.vscode/settings.json
.nyc_output
*.lerna_backup
**/build-fixtures/**
*.tsbuildinfo
packages/*/LICENSE
\!packages/*/LICENSE
local_appium_home
*.tgz
-11
View File
@@ -1,11 +0,0 @@
// @ts-check
'use strict';
module.exports = {
require: ['ts-node/register'],
// forbids use of .only() in CI
forbidOnly: Boolean(process.env.CI),
color: true,
timeout: '5s',
};
+1 -3
View File
@@ -1,4 +1,2 @@
# Do not disable package-lock. Disabling package-lock also disables npm-shrinkwrap
package-lock=true
save-exact=true
foreground-scripts=true
package-lock=true
-15
View File
@@ -1,15 +0,0 @@
**/node_modules/**
**/build/**
**/fixtures/**
**/*.min.*
**/*.md
package-lock.json
package.json
**/.vscode/**
**/*.html
**/generated/**
# generated
packages/types/lib/appium-config.ts
**/*.hbs
/.nx/workspace-data
-9
View File
@@ -1,9 +0,0 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["github>appium/appium//renovate/default"],
"schedule": [
"after 10pm",
"before 5:00am"
],
"timezone": "America/Vancouver"
}
+123
View File
@@ -0,0 +1,123 @@
language: node_js
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.8
env:
global:
- CXX=g++-4.8
node_js: "10"
jobs:
include:
- stage: Tests
os: linux
script: npm run test && npm run e2e-test
node_js: "11"
after_script: npm run coverage
- stage:
os: linux
script: npm run test && npm run e2e-test
node_js: "10"
- stage:
os: linux
script: npm run test && npm run e2e-test
node_js: "8"
- stage:
name: test documentation generation
os: linux
before_script:
- npm install
script:
- npm run generate-docs
- stage: Update assets
name: Documentation
os: osx
if: branch = master AND type != pull_request AND !tag
env:
- GITHUB_TOKEN=$TRIAGER_BOT_TOKEN
before_script:
- brew install hub
- hub --version
- git remote set-url origin https://triager:$TRIAGER_BOT_TOKEN@github.com/appium/appium
- git checkout -b generate-docs-$TRAVIS_COMMIT
- npm install
script:
# Generate the docs
- npm run generate-docs
- git add .
# log the status so we know what is going on, on failure
- git status -s
# If docs were generated, make a PR to update the docs
- |
if [[ -n $(git status -s) ]]; then
git commit -a -n -m 'Update generated docs';
git push origin generate-docs-$TRAVIS_COMMIT;
hub pull-request -b "appium:master" -h "appium:generate-docs-$TRAVIS_COMMIT" -m "Update auto-generated docs";
fi
- stage:
name: Bundle
# only want to run this on the main master branch
if: branch = master AND type != pull_request
os:
- osx
- osx_image: xcode9.4
env:
- NODE_ENV=production
- CC=gcc
- CXX=g++
before_install:
- gcc --version
- brew upgrade carthage
install:
# Install prod dependencies
- npm install
# Install only the dev dependencies that we need
- npm install --only=dev gulp
- npm install --only=dev appium-gulp-plugins
# get appium-xcuitest-driver fully built
- pushd node_modules/appium-xcuitest-driver/WebDriverAgent
# do not use build script because Travis _will_ have rate limits
- carthage bootstrap --no-use-binaries
- cp Cartfile.resolved Carthage
- mkdir -p ./Resources/WebDriverAgent.bundle
- popd
before_script:
# Build the assets
- npm run build
# Remove the dev depenedencies
- npm prune
script:
- npm run zip
- npm install --only=dev gulp
- npm install --only=dev appium-gulp-plugins
- npm run upload
- stage: Update appium.io
if: tag
os: osx
env:
- HUB_VERBOSE=true GITHUB_TOKEN=$TRIAGER_BOT_TOKEN
before_script:
- brew install hub
- pip install mkdocs==0.16.3
# Checkout appium.io repository
- git clone https://triager:$TRIAGER_BOT_TOKEN@github.com/appium/appium.io.git --branch=gh-pages && cd appium.io/
- git checkout -b docs-$TRAVIS_TAG
- bundle install
- npm install
script:
# Build the docs and make a PR to get them on appium.io
- npm run build:docs
- git commit -a -n -m 'Updated docs for latest Appium version'
- git push origin docs-$TRAVIS_TAG
- hub pull-request -b "appium:gh-pages" -h "appium:docs-$TRAVIS_TAG" -m "Update documentation for latest version" | exit 0 # The PR command works but always returns non-negative
-5
View File
@@ -1,5 +0,0 @@
{
"recommendations": [
"stateful.runme"
]
}
+45 -49
View File
@@ -1,50 +1,46 @@
{
"configurations": [
{
"args": [
"--log-level=debug"
],
"console": "integratedTerminal",
"cwd": "${workspaceFolder}",
"env": {
"_FORCE_LOGS": "1"
},
"internalConsoleOptions": "openOnSessionStart",
"name": "Run Appium",
"program": "${workspaceFolder}/node_modules/.bin/appium",
"request": "launch",
"skipFiles": [
"<node_internals>/**"
],
"sourceMaps": true,
"type": "node"
},
{
"args": [
"--colors",
"--no-timeout",
"${file}"
],
"autoAttachChildProcesses": true,
"console": "integratedTerminal",
"cwd": "${workspaceFolder}",
"internalConsoleOptions": "openOnSessionStart",
"name": "Test Current File w/ Mocha",
"program": "${workspaceFolder}/node_modules/.bin/mocha",
"request": "launch",
"runtimeArgs": [
"--require",
"ts-node/register"
],
"skipFiles": [
"<node_internals>/**",
"**/node_modules/mocha/**",
"**/node_modules/lodash/**",
"**/node_modules/ts-node/**"
],
"sourceMaps": true,
"type": "node"
}
],
"version": "0.2.0"
}
"version": "0.2.0",
"configurations": [
{
"name": "Debug",
"type": "node",
"request": "launch",
"cwd": "${workspaceFolder}",
"console": "integratedTerminal",
"args": [
"."
]
},
{
"name": "Attach Debug",
"type": "node",
"request": "attach",
"cwd": "${workspaceFolder}",
"port": 9229
},
{
"name": "Test All",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/node_modules/.bin/_mocha",
"args": [
"--require", "babel-core/register",
"--timeout", "999999",
"--colors",
"${workspaceFolder}/test"
]
},
{
"name": "Test Current File",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/node_modules/.bin/_mocha",
"args": [
"--require", "babel-core/register",
"--timeout", "999999",
"--colors",
"${file}"
]
}
]
}
-19
View File
@@ -1,19 +0,0 @@
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "dev",
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": [
"$tsc-watch"
],
"label": "npm: dev",
"detail": "npm run dev",
"isBackground": true
}
]
}
+2979 -38
View File
File diff suppressed because it is too large Load Diff
+48
View File
@@ -0,0 +1,48 @@
## Code of Conduct
### What is this code of conduct for?
Appium is a piece of technology, but **the core of the Appium community is the people in it**. As such, we are committed to providing a friendly, safe and welcoming environment for all, regardless of gender, gender identity and expression, sexual orientation, ability, physical appearance, body size, race, age, socioeconomic status, religion (or lack thereof), or other marginalized aspect of comunity members. We expect all members of the Appium community to abide by this Code of Conduct whenever interacting in Appium venues (pull requests, GitHub issues, 1-1 or group chat, meetups, conferences, etc...)
### Examples of inappropriate behavior
Because we come from a variety of backgrounds, we don't want to assume that everyone has the same assumptions about what is and isn't appropriate. Here are some examples of inappropriate behavior that are incompatible with our community's ethos:
* Spamming, trolling, intentionally disrupting conversations, or irrelevant solicitation or advertisement
* Making demeaning or discriminatory comments
* Making negative assumptions about someone's background, abilities, or intentions
* Harassing or stalking individuals (online or in person)
* Giving someone unwelcome sexual attention or making unwelcome physical contact (in the case of an IRL event)
* Sharing sexual images or using sexually explicit language
In general: treat others how you would like to be treated, were you in their place. Don't be a jerk. _Do_ ask questions. _Do_ keep conflicts productively focused on technical issues. _Do_ think before you speak; remember that what is perceived as a funny witticism in your group of friends might be hurtful or reinforce hurtful stereotypes in the context of our diverse online community. _Do_ remember that we are all people, not robots, and all equally deserving of sensitivity and respect. (If and when robots join our community, let's treat them with respect too!)
### What will organizers do about inappropriate behavior?
If we notice you doing or saying something inappropriate, an organizer will explain why it's inappropriate and ask you to stop. We won't demonize or vilify you. But please do stop the inappropriate behavior so we can get back to writing and discussing code in a safe environment. If you have philosophical disagreements about what's actually inappropriate, please take them to a separate public or private conversation with an Appium maintainer so we don't turn pull requests into an ethics debate.
If you keep doing unacceptable things, we'll likely ban you, report you to GitHub, or take other appropriate action.
### What if I see or am subject to what feels like inappropriate behavior?
Let us know! Please notify a community organizer as soon as possible. Full contact information is listed in the [Contact Info](#contact-info) section of this document. All communications will be kept strictly confidential, unless otherwise required by law. No issue will be considered too inconsequential or unimportant for us to have a conversation about.
### Contact Info
If you need to report an incident, please contact any of the following organizers directly:
* Isaac Murchie [email](mailto:isaac@saucelabs.com) [twitter](https://twitter.com/imurchie)
* Jonathan Lipps [email](mailto:jlipps@saucelabs.com) [twitter](https://twitter.com/jlipps)
### Credit, License, and Attribution
This Code of Conduct is distributed under a [Creative Commons Attribution-ShareAlike license](http://creativecommons.org/licenses/by-sa/3.0/).
It's inspired among other things by:
* [Citizen Code of Conduct](http://citizencodeofconduct.org/)
* [npmjs](https://www.npmjs.com/policies/conduct)
* [Geek Feminism](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy)
* [Ashe Dryden](http://www.ashedryden.com/blog/codes-of-conduct-101-faq)
* [Model View Culture](https://modelviewculture.com/issues/events)
* [Open Source & Feelings](http://osfeels.com/conduct).
+63
View File
@@ -0,0 +1,63 @@
# Contributing to Appium
There are a lot of different ways to contribute to Appium. See below for
everything you can do and the processes to follow for each contribution method.
Note that no matter how you contribute, your participation is governed by our
[Code of Conduct](CONDUCT.md).
### Make changes to the Appium code or docs
Fork the project, make a change, and send a pull request! Please have a look at
our [Style Guide](/docs/en/contributing-to-appium/style-guide.md) before
getting to work. Please make sure the unit and functional tests pass before
sending a pull request; for more information on how to run tests, keep reading!
Make sure you read and follow the setup instructions in the README first. And note
that all participation in the Appium community (including code submissions) is
governed by our [Code of Conduct](CONDUCT.md). Then, have a look at our
[running from source doc](/docs/en/contributing-to-appium/appium-from-source.md) for more
information on how to get set up to run tests and start slinging code.
You will probably also want to have a look at this more in-depth [Developer's
Overview](/docs/en/contributing-to-appium/developers-overview.md) of the Appium
project, how Appium is architected, how to make changes to modules, and so on.
Finally, before we accept your code, you will need to have signed our
[Contributor License
Agreement](https://cla.js.foundation/appium/appium).
### Become an Appium Triager
You can help us manage our issue tracker! All you need is enough familiarity
with Appium to try and reproduce bugs. We triage issues by having conversations
with the issue creator and then either closing the issue or moving it into the
[Bugs](https://github.com/appium/appium/milestones/Bugs) or
[Features](https://github.com/appium/appium/milestones/Features) milestone. We
use these buckets as the backlogs for our upcoming releases.
We use this "algorithm" for triaging issues, which anyone can jump in and follow:
1. If issue is a feature request, discuss amongst Appium devs.
* If we decide to build it, add to the Features milestone.
* If we decide not to build it, just close.
2. If issue is a bug report, attempt to verify
* If it's a duplicate, close with link to bug already reported.
* If it ultimately can't be verified, close until we have enough information to verify (e.g., in most cases we need a full set of Appium logs to help diagnose an issue).
* If the user hasn't provided enough information, keep asking for enough information to verify.
* If it's a verified new bug, add it to the Bugs milestone.
* If we have been waiting for a reply from the user for over 3 weeks, close.
If you're interested in joining our triage rotation, contact
[@jlipps](https://github.com/jlipps) or
[@imurchie](https://github.com/imurchie).
### Help out on our forums
We can always use help on our forums at
[discuss.appium.io](https://discuss.appium.io)! Hop on over and see if there
are any questions that you can answer.
### Submit bug reports or feature requests
Just use the GitHub issue tracker to submit your bug reports and feature
requests. If you are submitting a bug report, please follow the [issue template](https://github.com/appium/appium/issues/new).
+41 -126
View File
@@ -15,8 +15,12 @@ The project is officially led by a Technical Committee (TC), currently
consisting of:
* [@jlipps](https://github.com/jlipps)
* [@bootstraponline](https://github.com/bootstraponline)
* [@penguinho](https://github.com/penguinho)
* [@dandoveralba](https://github.com/dandoveralba)
* [@mykola-mokhnach](https://github.com/mykola-mokhnach)
* [@eglitise](https://github.com/eglitise)
* [@imurchie](https://github.com/imurchie)
* [@TikhomirovSergey](https://github.com/TikhomirovSergey)
* [@KazuCocoa](https://github.com/KazuCocoa)
They all represent different companies and different types of contribution to
@@ -27,7 +31,7 @@ changes to the project's governance processes.
* Membership in the TC is granted by unanimous vote of current TC members.
* TC members can step down at any time.
* No more than 1/3 (or 2, whichever is higher) of TC members may belong to the same company.
* No more than 1/3 of TC members may belong to the same company.
* Changes to project governance require unanimous vote of the TC.
### Project Committers
@@ -46,104 +50,47 @@ and so on.
* Any committer can decide to close a PR or issue if they determine the change doesn't suit the project.
* Appium has a large ecosystem of repositories. Some are 'core' in the sense of being central subpackages with a lot of traffic like `appium/appium` or `appium/appium-ios-driver`. Others are 'peripheral' in the sense of receiving few changes, being maintained by 1 person or no one, etc..., like `appium/ruby_lib` or `appium/appium_thor` For 'core' repos, committers should not merge their own code straightaway. Like all contributors they should open a PR and get a +1 from another committer. For 'peripheral' repos for which they are the sole maintainer or for which they have a good understanding, it is obtuse to insist on another contributor's +1 and this rule should be relaxed in that case. In sum: use good judgment and don't ram code through without a review when you can help it.
The current committers are (along with their primary areas(s) of ownership or maintenance):
The current committers are (in addition to the TC members above):
* [@dan-maor](https://github.com/Dan-Maor) - XCUITest driver and iOS internals
* [@dor-bl](https://github.com/Dor-bl) - DotNet client
* [@eglitise](https://github.com/eglitise) - Appium server, Inspector
* [@jlipps](https://github.com/jlipps) - Appium server, Inspector
* [@kazucocoa](https://github.com/KazuCocoa) - all Appium projects
* [@laolubenson](https://github.com/laolubenson) - DotNet client
* [@mwakizaka](https://github.com/mwakizaka) - XCUITest driver
* [@mykola-mokhnach](https://github.com/mykola-mokhnach) - all Appium projects
* [@rerorero](https://github.com/rerorero) - XCUITest/UIA2 driver
* [@saikrishna321](https://github.com/saikrishna321) - Java client
* [@srinivasantarget](https://github.com/SrinivasanTarget) - Java client
* [@tomriddly](https://github.com/tomriddly) - appium-ios-device
* [@valfirst](https://github.com/valfirst) - Java client
* [@hugs](https://github.com/hugs)
* [@filmaj](https://github.com/filmaj)
* [@aluedeke](https://github.com/aluedeke)
* [@sebv](https://github.com/sebv)
* [@vgrigoruk](https://github.com/vgrigoruk)
* [@DylanLacey](https://github.com/DylanLacey)
* [@maudineormsby](https://github.com/maudineormsby)
* [@titusfortner](https://github.com/titusfortner)
* [@bayandin](https://github.com/bayandin)
* [@jdeff](https://github.com/jdeff)
* [@moizjv](https://github.com/moizjv)
* [@gempesaw](https://github.com/gempesaw)
* [@Jonahss](https://github.com/Jonahss)
* [@JamieEdge](https://github.com/JamieEdge)
* [@saikrishna321](https://github.com/saikrishna321)
* [@sravanmedarapu](https://github.com/sravanmedarapu)
* [@peepa](https://github.com/peepa)
* [@scottdixon](https://github.com/scottdixon)
* [@drpy](https://github.com/drpy)
* [@Astro03](https://github.com/Astro03)
* [@sbonebrake](https://github.com/sbonebrake)
* [@SrinivasanTarget](https://github.com/SrinivasanTarget)
* [@triager](https://github.com/triager)
* [@ddkjin](https://github.com/ddkjin)
* [@stuartbrussell-intuit](https://github.com/stuartbrussell-intuit)
* [@vmaxim](https://github.com/vmaxim)
See [Emeritus Contributors](#emeritus-contributors) below for a list of people who formerly made
significant contributions to the project but are no longer actively committing.
### Contributors
### Other Contributors
Other, less formal, kinds of contribution are outlined in our [Contributing Guide](https://appium.io/docs/en/latest/contributing/).
We also very much appreciate those who spend their valuable time assisting with the [Appium forums](https://discuss.appium.io).
Current high-level forum contributors and mods include:
* [aleksei](https://discuss.appium.io/u/aleksei/summary)
* [wreed](https://discuss.appium.io/u/wreed/summary)
Other, less formal, kinds of contribution are outlined in our
[CONTRIBUTING](/CONTRIBUTING.md) doc.
### Sponsorship
The Appium project welcomes the sponsorship of individuals and organizations. There are two types
of sponsorship: those related to contributions of Appium maintenance and leadership, and those
related to contributions of funds. Both are extremely important to the ongoing health of the
project. Financial sponsorship is mediated through our [OpenCollective page](https://opencollective.com/appium).
Sponsorship tiers and benefits are described below:
- **Development Partners**: The primary need of any open source project is for sustained maintenance and contributorship. Companies that officially sponsor such development with dedicated employee time are recognized as Development Partners, and receive the same benefits as the highest tier of financial sponsorship. To be considered a Development Partner, a company must devote at least 50% of a full-time employee's time to Appium maintenance. This means that the contributors designated by the company must have been appointed as "committers" in good standing of one or more core Appium repositories. (See above for a description of how to become a committer).
- **Strategic Partners**: Representing the highest tier of ongoing financial support for the project, Strategic Partners are what make our compensation scheme for contributors possible, and we thank them for their significant investment into the project! More than financial contribution, Strategic Partners help elevate Appium's position in the industry through marketing and evangelism efforts, and partner with the Appium team to help make Appium better. Along with the Development Partners, Strategic Partners have their logos displayed prominently on our website, and have the ability to link to their Appium-related products in a few relevant places in our documentation.
- **Gold, Silver, and Bronze Sponsors**: these sponsorship levels correspond to different amounts of recurring financial contribution that generously support our contributor compensation scheme. Sponsors at these levels also have the opportunity to display their logo on our website.
- **Backers**: individuals who benefit from the Appium project can also donate on a one-time or recurring basis, at any amount, and will be recognized as Backers for their contribution!
To become a sponsor at one of these levels, follow the process indicated at the [OpenCollective
page](https://opencollective.com/appium).
### Compensation Scheme
With funds received through sponsorship, the Appium project wants to incentivize contributions of
code, documentation efforts, maintenance, and project leadership. We have developed a scheme
(inspired by one developed at the [WebdriverIO](https://github.com/webdriverio/webdriverio)
project) for disbursing funds on a monthly basis to those who contribute to the project, as well as
some other "upstream" open source projects.
Each month, 15% of sponsorship funds received will be donated to upstream projects, based on the
discretion of the current TC. At this point, no attempt will be made to formalize quantitative
notions of relevance. If you manage a project upstream of Appium and would like to be considered as
part of this donation group, give us a shout!
Of the remaining 85% of sponsorship funds, 70% (roughly 60% of the original total) will go to
project Committers (i.e., those in a role of maintenance), and 30% (roughly 25% of the original
total) will go to Contributors (i.e., those making one-off or periodic contributions). The way that
Committers and Contributors are paid for their efforts differs.
For Committers, each Committer will keep a monthly time sheet of hours contributed to the project.
At the end of each month, the hours tracked from all Committers will be totalled, and then the
Committer-allocated funds will be disbursed (via OpenCollective) on a pro rata basis. Within this
scheme, Committers agree not to submit hours worked as part of their employment with a Development
Partner (since this is part of the "sponsorship" contribution of the Development Partner).
For Contributors, when they make contributions which are successfully merged into the project,
a Committer can discretionarily assign a "value tier" to the contribution. The "value tiers" and
corresponding payouts are as follows:
- XS: a trivial change (e.g. a typo change or applying of an automatically suggested security
patch). \$0.
- S: a small but useful change. \$25.
- M: a medium-small or slightly more complex change. \$50.
- L: a very valuable or sizable change. \$100.
- XL: a massive change or set of changes. \$500.
At the end of each month, Committers will total up the number of changes receiving potential
payout. If the total amount of funds allocated for Contributor payout exceeds the total amount to
be paid, then each Contributor will receive an OpenCollective link to claim their funds. If not
enough funds exist to cover all payouts, then the payout amounts will be scaled down in a pro rata
fashion.
The scope for Committer or Contributor payouts is work completed within any "core" Appium
repository (i.e., those officially maintained by the Appium team, residing within the Appium
organization on GitHub, under `https://github.com/appium`).
Some disclaimers: Payments will happen exclusively via OpenCollective. Recipients of funds are
responsible for maintaining their OpenCollective account in a fashion where funds can be disbursed,
and are responsible for any and all tax, financial, or legal consequences of receiving money in
this way. Receipt of funds from this scheme holds the Appium project and the OpenJS Foundation free
of any claim or obligation. While this document exists to clearly and publicly lay out the terms
under which payments are generally made, the TC retains the right to grant or withhold funding on
a discretionary of special basis. Basically, this scheme is run at the project's discretion, and is
not a public service. Making contributions to the project under this scheme does not obligate the
project to pay you for such work, or otherwise compensate you in any way.
The Appium project welcomes sponsorship of various organizations. Specific
details are not yet available but in general we will accept monetary donations,
contribution of code, contribution of dedicated committers, or donations of
other goods or service (internet hosting, etc...). To begin the conversation,
reach out to one of the TC members.
### Raising Issues Related to Governance
@@ -151,35 +98,3 @@ This governance model necessarily leaves many situations unspecified. If
questions arise as to how a given situation should proceed according to the
overall goals of the project, the best thing to do is to open a GitHub issue
and ping the TC members.
### Emeritus Contributors
* [@aluedeke](https://github.com/aluedeke)
* [@astro03](https://github.com/Astro03)
* [@bayandin](https://github.com/bayandin)
* [@boneskull](https://github.com/boneskull)
* [@bootstraponline](https://github.com/bootstraponline)
* [@dandoveralba](https://github.com/dandoveralba)
* [@ddkjin](https://github.com/ddkjin)
* [@drpy](https://github.com/drpy)
* [@dylanLacey](https://github.com/DylanLacey)
* [@filmaj](https://github.com/filmaj)
* [@gempesaw](https://github.com/gempesaw)
* [@hugs](https://github.com/hugs)
* [@imurchie](https://github.com/imurchie)
* [@jamieEdge](https://github.com/JamieEdge)
* [@jdeff](https://github.com/jdeff)
* [@jonahss](https://github.com/Jonahss)
* [@maudineormsby](https://github.com/maudineormsby)
* [@moizjv](https://github.com/moizjv)
* [@peepa](https://github.com/peepa)
* [@penguinho](https://github.com/penguinho)
* [@sbonebrake](https://github.com/sbonebrake)
* [@scottdixon](https://github.com/scottdixon)
* [@sebv](https://github.com/sebv)
* [@sravanmedarapu](https://github.com/sravanmedarapu)
* [@stuartbrussell-intuit](https://github.com/stuartbrussell-intuit)
* [@tikhomirovSergey](https://github.com/TikhomirovSergey)
* [@titusfortner](https://github.com/titusfortner)
* [@vgrigoruk](https://github.com/vgrigoruk)
* [@vmaxim](https://github.com/vmaxim)
+16
View File
@@ -0,0 +1,16 @@
Google Summer of Code Ideas
=====
Appium is excited to participate as a [Google Summer of Code](https://summerofcode.withgoogle.com/) sponsor project. Here's a fun list of ideas that a Summer of Code student participant can use as a foundation for thinking about what to contribute to Appium!
|Idea|Description|
|----|-----------|
|Apple tvOS Support|Our users have been asking for an Appium driver for Apple tvOS apps. Is this possible? We're not entirely sure! Why not be awesome and build it?|
|Test App revamp|Appium uses a number of poorly-designed mobile applications in its own testing. We have to use a variety of apps because we need to test that Appium can automate all the various controls and platform features that mobile vendors provide. Really what we need is one cross-platform app (or one app per platform) that exhibit all and only the features we need to test. This would be a fun project to build some mobile apps used for testing and also demoing Appium at events and in training videos, etc...|
|Tooling and Performance|We haven't instrumented Appium with very many performance metrics, and don't really know if we're missing some low-hanging fruit in terms of performance. Maybe you can help us do that?|
|Babel|We have a lot of repos, and they're all on a really old version of Babel. They all need to stay in sync. How can we make this situation better, and upgrade to the latest and greatest?|
|Unity3d Driver|Historically, Appium hasn't been great at automating games. We don't have any particular support for the frameworks used to create games. Unity is a popular one, for example. What if we could write an Appium driver that talked to an embedded process in a test version of a Unity game, that allowed us to find and interact with 3d elements? It would be amazing! You can also be amazing and lead Appium into this new world.|
|Testing the Internet of Things|Appium's architecture makes it dead simple to integrate drivers for automating new technologies. What about _really_ new technologies like IoT devices? Help to redefine the semantics of the WebDriver protocol for use with IoT, and build a driver for an IoT device to prove it out.|
|Driver for X|Have an idea of something else Appium could automate that it doesn't already? Build a driver for it! This would involve some awesome Node.js code, plus whatever else is needed to integrate with the platform you have in mind.|
Hopefully this gives you some ideas of fun projects that would be substantial and long-lasting contributions to the Appium community.
+1 -1
View File
@@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Copyright JS Foundation and other contributors, https://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+90 -194
View File
@@ -1,221 +1,117 @@
<p align="center">
<a href="https://appium.io/">
<img alt="Appium" src="https://raw.githubusercontent.com/appium/appium/master/packages/appium/docs/overrides/assets/images/appium-logo-horiz.png" width="500">
</a>
</p>
<p align="center">
Cross-platform test automation for native, hybrid, mobile web and desktop apps.
</p>
<div align="center">
## Appium
[![NPM version](https://badge.fury.io/js/appium.svg)](https://npmjs.org/package/appium)
[![Dependency Status](https://david-dm.org/appium/appium.svg)](https://david-dm.org/appium/appium)
[![devDependency Status](https://david-dm.org/appium/appium/dev-status.svg)](https://david-dm.org/appium/appium#info=devDependencies)
[![Monthly Downloads](https://img.shields.io/npm/dm/appium.svg)](https://npmjs.org/package/appium)
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fappium%2Fappium.svg?type=shield)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fappium%2Fappium?ref=badge_shield)
[![StandWithUkraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://github.com/vshymanskyy/StandWithUkraine/)
[![CeasefireInGaza](https://img.shields.io/badge/Ceasefire_Now-%F0%9F%87%B5%F0%9F%87%B8-red?style=flat)](https://www.unrwa.org/)
[![Greenkeeper badge](https://badges.greenkeeper.io/appium/appium.svg)](https://greenkeeper.io/)
</div>
Appium is an open source, cross-platform test automation tool for native,
hybrid and mobile web and desktop apps. We support simulators (iOS), emulators
(Android), and real devices (iOS, Android, Windows, Mac).
***
Want to skip straight to the action? Check out our [getting
started](/docs/en/about-appium/getting-started.md) doc.
<p align="center"><b>
<a href="https://appium.io">Documentation</a> |
<a href="https://appium.io/docs/en/latest/intro/">Get Started</a> |
<a href="https://appium.io/docs/en/latest/ecosystem/">Ecosystem</a> |
<a href="https://github.com/appium/appium/blob/master/packages/appium/CHANGELOG.md">Changelog</a> |
<a href="https://appium.io/docs/en/latest/contributing/">Contributing Guide</a> |
<a href="https://discuss.appium.io">Discussion Forum</a>
</b></p>
### Supported Platforms
***
Appium supports app automation across a variety of platforms, like iOS,
Android, and Windows. Each platform is supported by one or more "drivers",
which know how to automate that particular platform. Choose a driver below for
specific information about how that driver works and how to set it up:
Appium is an open-source automation framework that provides
[WebDriver](https://www.w3.org/TR/webdriver/)-based automation possibilities for a wide range of
different mobile, desktop and IoT platforms. Appium is modular and extensible, and supports multiple
programming languages, which means there is an entire ecosystem of related software:
* [__Drivers__](#drivers) add support for automating specific platforms
* [__Clients__](#clients) allow writing Appium tests in your programming language of choice
* [__Plugins__](#plugins) allow to further extend Appium functionality
* iOS
* The [XCUITest Driver](/docs/en/drivers/ios-xcuitest.md)
* (DEPRECATED) The [UIAutomation Driver](/docs/en/drivers/ios-uiautomation.md)
* Android
* (BETA) The [Espresso Driver](/docs/en/drivers/android-espresso.md)
* The [UiAutomator2 Driver](/docs/en/drivers/android-uiautomator2.md)
* (DEPRECATED) The [UiAutomator Driver](/docs/en/drivers/android-uiautomator.md)
* (DEPRECATED) The [Selendroid Driver](/docs/en/drivers/android-selendroid.md)
* The [Windows Driver](/docs/en/drivers/windows.md) (for Windows Desktop apps)
* The [Mac Driver](/docs/en/drivers/mac.md) (for Mac Desktop apps)
## Upgrading From Older Versions
### Why Appium?
The Appium team only provides support for the most recent version of Appium. If you wish to upgrade from
an older major Appium version, please refer to the migration guides:
* [Appium v2 to v3](https://appium.io/docs/en/latest/guides/migrating-2-to-3/)
* [Appium v1 to v2](https://appium.io/docs/en/latest/guides/migrating-1-to-2/)
## Installation
Appium can be installed using `npm` (other package managers are not currently supported). Please
check the [installation docs](http://appium.io/docs/en/latest/quickstart/install/) for the
system requirements and further information.
If upgrading from Appium 1, make sure Appium 1 is fully uninstalled (`npm uninstall -g appium`).
Unexpected errors might appear if this has not been done.
```bash
npm i -g appium
```
Note that this will only install the core Appium server, which cannot automate anything on its own.
Please install [drivers](#drivers) for your target platforms in order to automate them.
## Drivers
Appium supports app automation across a variety of platforms, like iOS, Android, macOS, Windows,
and more. Each platform is supported by one or more "drivers", which know how to automate that
particular platform. You can find a full list of officially-supported and third-party drivers in
[Appium Ecosystem's Drivers page](http://appium.io/docs/en/latest/ecosystem/drivers/).
Driver management is done using [Appium's Extension command-line interface](http://appium.io/docs/en/latest/cli/extensions/):
```bash
# Install an official driver from npm (see documentation for a list of such drivers)
appium driver install <driver-name>
# Install any driver from npm
appium driver install --source=npm <driver-name>
# See documentation for installation from other sources
# List already installed drivers
appium driver list --installed
# Update a driver (it must be already installed)
# This will NOT update the major version, in order to prevent breaking changes
appium driver update <driver-name>
# Update a driver to the most recent version (may include breaking changes)
appium driver update <driver-name> --unsafe
# Uninstall a driver (it won't last forever, will it?)
appium driver uninstall <driver-name>
```
## Clients
Client libraries enable writing Appium tests in different programming languages. There are
officially-supported clients for Java, Python, Ruby, and .NET C#, as well as third-party clients
for other languages. You can find a full list of clients in
[Appium Ecosystem's Clients page](http://appium.io/docs/en/latest/ecosystem/clients/).
## Plugins
Plugins allow you to extend server functionality without changing the server code. The main
difference between drivers and plugins is that the latter must be explicitly enabled on
Appium server startup (all installed drivers are enabled by default):
```bash
appium --use-plugins=<plugin-name>
```
You can find a full list of officially-supported and third-party plugins in
[Appium Ecosystem's Plugins page](http://appium.io/docs/en/latest/ecosystem/plugins/).
Similarly to drivers, plugin management is also done using
[Appium's Extension command-line interface](http://appium.io/docs/en/latest/cli/extensions/):
```bash
# Install an official plugin from npm (see documentation for a list of such plugins)
appium plugin install <plugin-name>
# Install any plugin from npm
appium plugin install --source=npm <plugin-name>
# See documentation for installation from other sources
# List already installed plugins
appium plugin list --installed
# Update a plugin (it must be already installed)
# This will NOT update the major version, in order to prevent breaking changes
appium plugin update <plugin-name>
# Update a plugin to the most recent version (may include breaking changes)
appium plugin update <plugin-name> --unsafe
# Uninstall a plugin
appium plugin uninstall <plugin-name>
```
## Server Command Line Interface
In order to start sending commands to the Appium server, it must be running on the URL and port
where your client library expects it to listen. [Appium's command-line interface](http://appium.io/docs/en/latest/cli/server/)
is used to launch and configure the server:
```bash
# Start the server on the default host (0.0.0.0) and port (4723)
appium server
# You can also omit the 'server' subcommand
appium
# Start the server on the given host, port and use a custom base path prefix (the default prefix is '/')
appium --address 127.0.0.1 --port 9000 --base-path /wd/hub
```
Appium supports execution of parallel server processes, as well as parallel driver sessions within a
single server process. Refer the corresponding driver documentations regarding which mode is optimal
for the particular driver or whether it supports parallel sessions.
## Why Appium?
1. You usually don't have to recompile your app or modify it in any way, due to the use of standard
automation APIs on all platforms.
2. You can write tests with your favorite dev tools using any WebDriver-compatible language such as
Java, Python, Ruby and C#. There are also third party client implementations for other languages.
1. You don't have to recompile your app or modify it in any way, due
to use of standard automation APIs on all platforms.
2. You can write tests with your favorite dev tools using any
[WebDriver](https://w3c.github.io/webdriver/webdriver-spec.html)-compatible
language such as Java, Objective-C, JavaScript (Node), PHP, Python, Ruby,
C#, Clojure, or Perl with the Selenium WebDriver API and [language-specific
client libraries](/docs/en/about-appium/appium-clients.md).
3. You can use any testing framework.
4. Some drivers like `xcuitest` and `uiautomator2` have built-in mobile web and hybrid app support.
Within the same script, you can switch seamlessly between native app automation and webview
automation, all using the WebDriver model that's already the standard for web automation.
5. You can run your automated tests locally and in a cloud. There are multiple cloud providers that
support various Appium drivers (mostly targeting iOS and Android mobile automation).
6. [Appium Inspector](https://github.com/appium/appium-inspector) can be used to visually inspect
the page source of applications across different platforms, facilitating easier test development.
4. Appium has built-in mobile web and hybrid app support. Within the same
script you can switch seamlessly between native app automation and webview
automation, all using the WebDriver model that's already the standard for
web automation.
Investing in the [WebDriver](https://w3c.github.io/webdriver/webdriver-spec.html) protocol means you
are betting on a single, free, and open protocol for testing that has become a web standard. Don't
lock yourself into a proprietary stack.
Investing in the
[WebDriver](https://w3c.github.io/webdriver/webdriver-spec.html) protocol means
you are betting on a single, free and open protocol for testing that has become
a web standard. Don't lock yourself into a proprietary stack.
For example, if you use Apple's XCUITest library without Appium, you can only write tests using
Obj-C/Swift, and you can only run tests through Xcode. Similarly, with Google's UiAutomator or
Espresso, you can only write tests in Java/Kotlin. Appium opens up the possibility of true
cross-platform native app automation, for mobile and beyond!
For example, if you use Apple's XCUITest library without Appium you can only
write tests using Obj-C/Swift, and you can only run tests through Xcode.
Similarly, with Google's UiAutomator or Espresso you can only write tests in
Java. Appium opens up the possibility of true cross-platform native app
automation, for mobile and beyond. Finally!
If you are looking for a more comprehensive description of what this is all about, please read our
documentation on [How Does Appium Work?](https://appium.io/docs/en/latest/intro/appium/).
If you're new to Appium, or want a fuller description of what this is all
about, please read our [Introduction to Appium
Concepts](/docs/en/about-appium/intro.md).
## Sponsors
### Requirements
Appium has a [Sponsorship Program](GOVERNANCE.md#sponsorship)! If you or your company uses Appium
and wants to give back financially to the project, we use these funds to [encourage development and
contributions](GOVERNANCE.md#compensation-scheme), as well as support other open source projects we
rely on. [Become a sponsor](https://opencollective.com/appium) via our OpenCollective page.
Your environment needs to be set up for the particular platforms that you want
to run tests on. Each of the drivers above documents the requirements for their
particular brand of automation. At a minimum, you will need to be able to run
Node.js 6+.
### Development and Strategic Partners
### Get Started
Appium is incredibly grateful to our Development and Strategic Partners for their sustained
contribution of project development and leadership!
Check out our [Getting Started](/docs/en/about-appium/getting-started.md) guide
to get going with Appium.
<p align="center">
<a href="https://www.browserstack.com/browserstack-appium?utm_campaigncode=701OW00000AoUTQYA3&utm_medium=partnered&utm_source=appium">
<picture>
<source srcset="packages/appium/docs/overrides/assets/images/sponsor-logo-browserstack-dark.png" media="(prefers-color-scheme: dark)"/>
<source srcset="packages/appium/docs/overrides/assets/images/sponsor-logo-browserstack-light.png" media="(prefers-color-scheme: light)"/>
<img src="packages/appium/docs/overrides/assets/images/sponsor-logo-browserstack-dark.png" width="300" alt="Browserstack"/>
</picture>
</a>
</p>
There is also sample code that contains [many examples of tests in a variety
of different languages](https://github.com/appium/sample-code/tree/master/sample-code)!
<p align="center">
<a href="https://www.testmuai.com">
<picture>
<source srcset="packages/appium/docs/overrides/assets/images/sponsor-logo-testmuai-dark.png" media="(prefers-color-scheme: dark)"/>
<source srcset="packages/appium/docs/overrides/assets/images/sponsor-logo-testmuai-light.png" media="(prefers-color-scheme: light)"/>
<img src="packages/appium/docs/overrides/assets/images/sponsor-logo-testmuai-dark.png" width="300" alt="TestMu AI (formerly LambdaTest)"/>
</picture>
</a>
</p>
### Documentation
### Other Sponsors
For prettily-rendered docs, please visit [appium.io](http://appium.io). You can
always find the full list of Appium doc pages at [Appium's GitHub
Repo](https://github.com/appium/appium/tree/master/docs/en/) as well.
A full list of sponsors is available at our [Sponsors page](https://appium.io/docs/en/latest/sponsors/).
### Contributing
## License
Please take a look at our [contribution documentation](CONTRIBUTING.md)
for instructions on how to build, test and run Appium from source.
[Apache-2.0](./LICENSE)
### Roadmap
Interested in where Appium is heading in the future? Check out the [Roadmap](ROADMAP.md)
### Project History, Credits & Inspiration
* [History](http://appium.io/history)
* [Credits](/docs/en/contributing-to-appium/credits.md)
### User Forums
Announcements and debates often take place on the [Discussion
Group](https://discuss.appium.io), be sure to sign up!
### Troubleshooting
We put together a [troubleshooting
guide](/docs/en/writing-running-appium/other/troubleshooting.md). Please have a look
here first if you run into any problems. It contains instructions for checking
a lot of common errors and how to get in touch with the community if you're
stumped.
### License
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fappium%2Fappium.svg?type=large)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fappium%2Fappium?ref=badge_large)
`@appium/logger` package is under [ISC](./packages/logger/LICENSE) License.
+54 -25
View File
@@ -1,30 +1,59 @@
# Roadmap
Appium Roadmap
---------------
This is not a traditional roadmap. We don't have a typical product team with a typical product
manager. The fact that the items below exist on a roadmap is no indication that we will ever have
the opportunity to work on them. Instead this is more like a wishlist of outcomes that the project
thinks would be valuable. If and when we get additional contributions of development work, this is
a set of items that would be great for someone to work on! Ideally, interested devs would find
something on this list and own it from start to finish! Let anyone on the project know if you're
interested and we can help get you going.
This document is designed to be a living record of the current and projected
priorities for the Appium project. It is, of course, always subject to change
and exists solely to give the community an idea of where we're going. The
roadmap is set by the Appium core team. If you have feature suggestions for
Appium, please submit a [GitHub issue](https://github.com/appium/appium/issues)
and, if of sufficient size and approved by the team, it will be added here. If
you have concerns about the roadmap, you can e-mail the Appium devs at
`appium-developers@googlegroups.com` or raise a GitHub issue. Note that
bugfixes and miscellaneous features are not considered "roadmap projects", and
will be addressed in the due course of normal Appium development. This page
exists to outline large-scale future plans for Appium.
### Core projects
- **WebDriver BiDi support in the Appium server**: the WebDriver BiDi spec is underway, which details a different method for communicating with drivers. We should implement handling for these methods in our server so that Appium drivers can take advantage of the BiDi spec without additional work on their part.
- **Redevelop automatically generated command docs**: due to changing TypeDoc support and the departure of one of our team, we were forced to remove our TypeDoc-based automatic docs generation tool. It would be nice to bring this back in a more maintainable form!
## Current Roadmap Projects
### Driver/platform-specific projects
- **Better maintenance for our Android drivers**: we're looking for Android specialists to help maintain our Android drivers (UiAutomator2 and Espresso)
- **Better maintenance for our iOS driver**: we're looking for iOS specialists to help maintain our XCUITest driver
- **Better maintenance for [appium-ios-device](https://github.com/appium/appium-ios-device)**: this project is using outdated approaches and libraries. If it could be improved it would have a big impact on the performance of the XCUITest driver
| Project | Description | ETD | Projected Appium Release |
|---------|-------------|-----|--------------------------|
|[Appium CI + Metrics Improvements](https://github.com/appium/appium/issues/7168)|We have CI servers running via Cloudbees that we don't understand and which break. Let's document and own them so they work reliably. Also, let's implement gathering various metrics about driver performance so we can track this over time and ensure we're not releasing a driver which has decreased in performance or reliability.|Q2 2017|N/A|
### Client library projects
- **Selenium compatibility client updates**: we'd like to rearchitect our flagship Appium clients to extend rather than wrap Selenium clients, reducing the overall surface area of the Appium clients and making them work more closely with existing Selenium client functionality.
## Upcoming Projects (in rough order of priority)
### Appium Inspector projects
- **Full support for web inspection**: currently the Appium Inspector has poor to no support for inspecing web pages (either mobile browsers or web content embedded in webviews). It's a common requirement to inspect web elements as part of writing Appium tests, and at the present time users are required to leave the Inspector and open up a browser's devtools.
- **Record/Playback**: we have a basic record-to-code feature already. It would be nice to be able to save recorded steps and play them back with a little player/editor.
- **Support for more platforms**: currently there is a fair bit of specialized handling for iOS and Android in the Appium inspector. Other platforms either work poorly or not at all with the Inspector. It would be great to establish a way for drivers to report all the information about how they work to the Inspector, so it can support any platform without needing special-cased code for it.
- **Locator analysis and comparison**: it would be nice for users to get more information about the relative suitability of using different locators to find elements, as poor locator performance is a leading cause of Appium test instability.
- **Dark theme**: for true hackers!
- **Export/import of saved gestures**: it's currently not possible to port your saved gestures to other instances of the Inspector (i.e., to share with team members).
- **Bulk export/import saved sessions**: would be nice to take your sessions and capabilities with you or to share with colleagues.
| Project | Description |
|---------|-------------|
|[Appium Client Library Updates](https://github.com/appium/appium/issues/7170)|It's been too long since we ensured that Appium's client libraries were up to date with the server|
|[Test App Overhaul](https://github.com/appium/appium/issues/7172)|Our current test applications (the ones used to test Appium's iOS and Android support) are not ideal. We use too many of them and the ones we use have a random hodgepodge of app SDK features, sometimes not enough to sufficiently test automation support. It'd be great to find a way to ensure our test app(s) have all the features we need to test, and keep in sync with our requirements.|
|[iOS Test Startup Time Improvement](https://github.com/appium/appium/issues/7173)|iOS startup times have gotten progressively longer with each iOS release. In part this is Apple's fault and there's not anything we can do about it. But we should investigate and see if we can be more efficient in how we start, especially given that we can now focus on XCUITest and leave Instruments behind|
|[Appium Dearchitecture](https://github.com/appium/appium/issues/7174)|OK, we went a bit overboard in Appium 1.5 by exploding Appium into 40+ repos and NPM packages. Let's think a little more critically about it and consolidate into the minimal number of repos/packages that make sense for our code and community patterns.|
|[Appium 2.0](https://github.com/appium/appium/issues/7175)|Appium, rather than bundling all the separate drivers by default, becomes a driver management interface (in addition to continuing to play the role of automation frontend server). Appium gets a set of CLI tools for users to pick and choose which drivers and versions of drivers they want to use via Appium|
## Projects Under Consideration (unplanned and unprioritized)
| Project | Description |
|---------|-------------|
|Windows Phone Support|There has been some work done on automating Windows Phone apps. We could take this all the way to integration with Appium in the form of a WindowsDriver.|
|Apple Watch support|Appium should support Apple Watch apps via the Watch simulator|
|Unity3d backend POC|This is a research project to determine whether we can add some kind of support for 3d game automation, probably based on the Unity3d game development platform.|
## Completed Roadmap Projects
| Project | Description | Completed | Appium Release | Notes |
|---------|-------------|-----------|----------------|-------|
|[Sample Code Overhaul](https://github.com/appium/appium/issues/7171)|Our sample code repo has grown tangled and broken. Let's make a new one with minimal examples which are the same across every language, and actually maintain the repo so as not to let it become overgrown.|
|[Onboarding Overhaul](https://github.com/appium/appium/issues/7169)|Have a new site built with MkDocs that documents all of the Selenium and Appium commands with code samples|1/2018|n/a|appium.io|
|[New Appium GUIs](https://github.com/appium/appium/issues/7167)|The current Appium GUIs (Appium.app and Appium.exe) have a number of issues. They aren't maintained by the core Appium team. They're written in Objective-C and C# respectively: two languages, and specifically, two languages other than Appium's core language. Because of this they lag behind the Appium server and are often broken. However, users love them primarily because of the Inspector feature (the thing that lets them graphically navigate their app), so we have to field a ton of complaints about these projects. There's an opportunity to start over. With [Electron](http://electron.atom.io/), we'd be able to take the new version of Appium we're working on and embed it directly inside a Node-based GUI app written using the languages and technologies the core team is experienced with. We'd have one codebase and could distribute the app on Mac, Windows, and Linux. The GUIs would become an official part of Appium's release cycle so they wouldn't be broken.|3/2017|N/A|[Appium Desktop website](https://github.com/appium/appium-desktop)|
|[Android 7.1.1 Support](https://github.com/appium/appium/issues/7165)|Google has released Android 7.1.1 (API Level 25). Ensure it works with UiAutomator 1/2|2/2017|1.6.4||
|[Android 7.0 Support](https://github.com/appium/appium/issues/7156)|Support Android 7 (Nougat)|11/2016|1.6.3||
|[iOS 10.2 Support](https://github.com/appium/appium/issues/7166)|Support iOS 10.2|11/2016|1.6.1||
|[iOS 10.1 Support](https://github.com/appium/appium/issues/7105)|Support iOS 10.1|11/2016|1.6.1||
|UiAutomator2 integration|Google has released [UiAutomator 2](http://developer.android.com/reference/android/support/test/uiautomator/package-summary.html), and it promises to fix some issues and limitations with the previous UiAutomator support. We will build this inside of Selendroid since it requires an instrumentation context.|10/2016?|1.6.0|
|XCUITest integration / iOS 10 support|Instruments + UIAutomation has been working well for many Appium users, but requires crazy workarounds to deal with bugs which remain unfixed on the Apple side. Also, UIAutomation has been removed in favor of XCUITest for iOS 10+. This new backend would exist alongside the UIAutomation backend.|10/2016|1.6.0||
|iOS 9.3 support|Appium should support iOS 9.3 / Xcode 7.3|3/2016|1.5.1||
|[Architecture Overhaul](https://github.com/appium/appium/issues/5169)|Appium's architecture has grown unwieldy enough that adding new features and preventing regressions has become difficult. A rearchitecture is in order to solve these issues as well as migrate the codebase to a form of JS much easier to work in and understand.|2/2015|1.5.0||
|iOS 9.2 support|Appium should support iOS 9.2 / Xcode 7.2|11/2015|1.4.14||
|iOS 9.1 support|Appium should support iOS 9.1 / Xcode 7.1|10/2015|1.4.12||
|iOS 9.0 support|Appium should support iOS 9.0 / Xcode 7.0|10/2015|1.4.11||
|iOS 8.4 support|Appium should support iOS 8.4 / Xcode 6.2|5/2015|1.4.0||
|Appium CI|Appium has unique needs for Continuous Integration because of the highly specialized environments required (iOS simulators, Xcode, Android emulators, the Android SDK, etc...). We therefore need to create a custom CI solution (perhaps sitting underneath Cloudbees or some other OSS-friendly CI server) that can be used for all Appium projects which need integration tests.|5/2015|_N/A_|Usage instructions at [appium/appium-ci](https://github.com/appium/appium-ci)|
-3
View File
@@ -1,3 +0,0 @@
# Sponsors & Backers
Please check [Sponsors & Backers](https://appium.io/docs/en/latest/sponsors/)
+71
View File
@@ -0,0 +1,71 @@
#!/usr/bin/env node
/* eslint no-console:0 */
/*
* Small tool, launching and monitoring ios-web-kit-proxy, and relauching
* on predefined errors.
*
* Usage:
* ./bin/ios-webkit-debug-proxy-launcher.js [args]
* args: ios-webkit-debug-proxy args (they will be passed over)
*
* Example:
* ./bin/ios-webkit-debug-proxy-launcher.js -c <UDID>:27753 -d
*
* Note:
* For iOS8.1 try this first:
* brew install --HEAD ideviceinstaller
*/
"use strict";
const spawn = require('child_process').spawn;
const _ = require('lodash');
const args = process.argv.slice(2);
const RESTART_ON_MESSAGES = [
'Invalid message _rpc_applicationUpdated',
'Invalid message _rpc_applicationSentListing'];
const PROXY_CMD = 'ios_webkit_debug_proxy';
let proxy;
const handleKillProcess = function (exitCode) {
console.log('\nKilling proxy process!');
proxy.kill('SIGTERM');
process.exit((exitCode || 0));
};
const startProxy = function () {
console.log('RUNNING:', PROXY_CMD, args.join(' '));
proxy = spawn(PROXY_CMD, args);
proxy.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
proxy.stderr.on('data', function (data) {
console.log('stderr: ' + data);
const restartMessage = _(RESTART_ON_MESSAGES).find(function (message) {
return ('' + data).indexOf(message) >= 0;
});
if (restartMessage) {
console.log('Detected error message:', restartMessage);
console.log('Killing proxy!');
proxy.kill('SIGTERM');
process.nextTick(startProxy);
}
});
proxy.on('close', function (code) {
console.log('child process exited with code ' + code);
});
};
process.on('SIGINT', handleKillProcess);
process.on('SIGTERM', handleKillProcess);
startProxy();
+85
View File
@@ -0,0 +1,85 @@
/* eslint-disable promise/prefer-await-to-then */
/* eslint-disable promise/prefer-await-to-callbacks */
const octokit = require('@octokit/rest')();
const gulp = require('gulp');
const _ = require('lodash');
const log = require('fancy-log');
const fs = require('fs');
const path = require('path');
const owner = 'appium';
const repo = 'appium-build-store';
const BUILD_NAME = process.env.TRAVIS_TAG || process.env.TRAVIS_COMMIT || `${Date.now()}`; // The random number is for local, throwaway tests
const COMMIT_MESSAGE = process.env.TRAVIS_COMMIT_MESSAGE || 'No commit message provided';
gulp.task('authenticate', function (done) {
const githubToken = process.env.GITHUB_TOKEN;
if (_.isEmpty(githubToken)) {
log.warn('No GitHub token found in GITHUB_ACCESS_TOKEN environment variable');
return;
}
octokit.authenticate({
type: 'token',
token: githubToken,
});
done();
});
gulp.task('upload', function () {
const releaseTag = `appium-build-${BUILD_NAME}`;
const releaseFile = `appium-${BUILD_NAME}.zip`;
let releaseId;
log(`Creating release on '${owner}/${repo}'`);
return octokit.repos.createRelease({
owner,
repo,
tag_name: releaseTag,
name: `Appium build ${BUILD_NAME}`,
body: `Appium build for commit ${BUILD_NAME}\n'${COMMIT_MESSAGE}'`,
})
.then(function (res) {
releaseId = res.data.id;
log(`Created release '${releaseTag}' (id: ${releaseId})`);
return res.data.upload_url;
})
.then(function (url) {
const file = path.resolve(__dirname, '..', 'appium.zip');
log(`Uploading file '${file}'`);
return octokit.repos.uploadReleaseAsset({
headers: {
'content-length': fs.statSync(file).size,
'content-type': 'application/zip',
},
url,
file: fs.createReadStream(file),
name: releaseFile,
});
})
.then(function (/* res */) {
log(`Uploaded release file '${releaseFile}'`);
})
.catch(function (err) {
log.error(`Error uploading release asset: ${err.message}`);
if (err.errors) {
log.error(JSON.stringify(err.errors, 2));
}
log('Deleting release with no asset');
return octokit.repos.deleteRelease({
owner,
repo,
release_id: releaseId,
})
.then(function (/* res */) {
log('Release deleted');
});
});
});
gulp.task('github-upload', gulp.series(['authenticate', 'upload']));
+22
View File
@@ -0,0 +1,22 @@
[//]: # (DO NOT EDIT THIS FILE! This is an auto-generated file.)
## Appium API Documentation
{{#if path}}
### {{path}}
[//]: # (DO NOT EDIT THIS FILE! This is an auto-generated file.)
{{/if}}
[//]: # (DO NOT EDIT THIS FILE! This is an auto-generated file.)
<div class="api-index">
{{#*inline "commands"}}
{{#each commands}}
<li>{{#if commands}}<a href='{{path}}'>{{name}}</a><ul>{{>commands}}</ul>{{else}}<a href='{{path}}'>{{name}}</a>{{/if}}</li>
{{/each}}
{{/inline}}
[//]: # (DO NOT EDIT THIS FILE! This is an auto-generated file.)
<ul>
{{>commands}}
</ul>
</div>
[//]: # (DO NOT EDIT THIS FILE! This is an auto-generated file.)
@@ -0,0 +1,88 @@
---
name: Get Current Context
short_description: Get the current context in which Appium is running
description:
>
Retrieve the current context. This can be either `NATIVE_APP` for the native
context, or a web view context, which will be:
* iOS - `WEBVIEW_<id>`
* Android - `WEBVIEW_<package name>`
For information on contexts, see Appium's [hybrid automation docs](/docs/en/writing-running-appium/web/hybrid.md).
example_usage:
java:
|
String context = driver.getContext();
python:
|
context = driver.current_context
# or
context = driver.context
javascript_wd:
|
let context = await driver.currentContext();
javascript_wdio:
|
let context = driver.context();
ruby:
|
context = current_context
ruby_core:
context = @driver.current_context
php:
|
$context = $driver->context();
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/AppiumDriver.html#getContext--"
python: "https://github.com/appium/python-client/blob/master/README.md#switching-between-native-and-webview"
javascript_wdio: "http://webdriver.io/api/mobile/context.html"
javascript_wd: "https://github.com/admc/wd/blob/master/doc/api.md"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#current_context-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#current_context-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/context
method: 'GET'
url_parameters:
- name: session_id
description: ID of the session to route the command to
response:
- type: String
description: The name of the current context
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md#webviews-and-other-contexts
@@ -0,0 +1,90 @@
---
name: Get All Contexts
short_description: Get all the contexts available to automate
description:
>
Retrieve all the contexts available to be automated. This will include, at
least, the native context. There can also be zero or more web view contexts.
For information on the format of the context names, see the [get context
documentation](/docs/en/commands/context/get-context.md).
On iOS, using the XCUITest driver, one can use the `mobile: getContexts`
[mobile command](/docs/en/commands/mobile-command.md) as an alternative to
the standard method in order to get the title and url associated with each
context as additional metadata.
For information on contexts, see Appium's [hybrid automation docs](/docs/en/writing-running-appium/web/hybrid.md).
example_usage:
java:
|
Set<String> contextNames = driver.getContextHandles();
python:
|
contexts = driver.contexts
javascript_wd:
|
let contexts = await driver.contexts();
javascript_wdio:
|
let contexts = driver.contexts();
ruby:
|
context = available_contexts
ruby_core:
|
context = @driver.available_contexts
php:
|
$contexts = $driver->contexts();
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/AppiumDriver.html#getContextHandles--"
python: "https://github.com/appium/python-client/blob/master/README.md#switching-between-native-and-webview"
javascript_wdio: "http://webdriver.io/api/mobile/contexts.html"
javascript_wd: "https://github.com/admc/wd/blob/master/doc/api.md"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#available_contexts-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#available_contexts-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/contexts
method: 'GET'
url_parameters:
- name: session_id
description: ID of the session to route the command to
response:
- type: Array<String>
description: Array of the names of all available contexts
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md#webviews-and-other-contexts
@@ -0,0 +1,110 @@
---
name: Set Current Context
short_description: Set the context being automated
description:
>
Set the current context to that passed in. If this is moving into a web view
context it will involve attempting to connect to that web view:
* iOS - attempt to connect to the application through the remote debugger
* Android - start a [Chromedriver](/docs/en/writing-running-appium/web/chromedriver.md)
process and begin a session to connect to the web view
For information on contexts, see Appium's [hybrid automation docs](/docs/en/writing-running-appium/web/hybrid.md).
example_usage:
java:
|
Set<String> contextNames = driver.getContextHandles();
driver.context(contextNames.toArray()[1]);
// ...
driver.context("NATIVE_APP");
python:
|
webview = driver.contexts[1]
driver.switch_to.context(webview)
# ...
driver.switch_to.context('NATIVE_APP')
javascript_wd:
|
let contexts = await driver.contexts();
await driver.context(contexts[1]);
// ...
await driver.context('NATIVE_APP');
javascript_wdio:
|
let contexts = driver.contexts();
driver.context(contexts[1]);
// ...
driver.context('NATIVE_APP');
ruby:
|
webview = available_contexts[1]
set_context(webview)
# ...
set_context('NATIVE_APP')
ruby_core:
|
webview = @driver.available_contexts[1]
@driver.set_context(webview)
# ...
@driver.set_context('NATIVE_APP')
php:
|
$contexts = $driver->contexts();
$driver->context($contexts[1]);
// ...
$driver->context('NATIVE_APP');
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/AppiumDriver.html#context-java.lang.String-"
python: "https://github.com/appium/python-client/blob/master/README.md#switching-between-native-and-webview"
javascript_wdio: "http://webdriver.io/api/mobile/context.html"
javascript_wd: "https://github.com/admc/wd/blob/master/doc/api.md"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#set_context-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#set_context-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/context
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: name
type: String
description: The name of the context to which to change
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md#webviews-and-other-contexts
@@ -0,0 +1,77 @@
---
name: Get Current Activity
short_description: Get the name of the current Android activity
example_usage:
java:
|
String activity = driver.currentActivity();
python:
|
activity = self.driver.current_activity;
javascript_wd:
|
let activity = await driver.getCurrentActivity();
javascript_wdio:
|
let activity = driver.currentActivity();
ruby:
|
current_activity
ruby_core:
|
@driver.current_activity
php:
|
$activity = $driver->currentActivity();
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/StartsActivity.html#currentActivity--"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L447"
javascript_wdio: "http://webdriver.io/api/mobile/currentActivity.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2519"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#current_activity-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#current_activity-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/appium/device/current_activity
method: GET
url_parameters:
- name: session_id
description: ID of the session to route the command to
response:
- type: string
description: Name of the current [activity](https://developer.android.com/reference/android/app/Activity.html)
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L366
@@ -0,0 +1,73 @@
---
name: Get Current Package
short_description: Get the name of the current Android package
example_usage:
java:
|
String package = driver.getCurrentPackage();
python:
|
package = self.driver.current_package;
javascript_wd:
|
let package = await driver.getCurrentPackage();
ruby:
|
current_package
ruby_core:
|
@driver.current_package
php:
|
// TODO PHP sample
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/StartsActivity.html#getCurrentPackage--"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L453"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2526"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#current_package-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#current_package-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: false
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/appium/device/current_package
method: GET
url_parameters:
- name: session_id
description: ID of the session to route the command to
response:
- type: string
description: Name of the current [package](https://developer.android.com/reference/java/lang/Package.html)
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L369
@@ -0,0 +1,103 @@
---
name: Start Activity
short_description: Start an Android activity by providing package name and activity name
example_usage:
java:
|
driver.startActivity(new Activity("com.example", "ActivityName"));
python:
|
self.driver.start_activity("com.example", "ActivityName");
javascript_wd:
|
await driver.startActivity({
appPackage: "com.example",
appActivity: "ActivityName"
});
javascript_wdio:
|
driver.startActivity("com.example", "ActivityName");
ruby:
|
start_activity app_package: "com.example", app_activity: "ActivityName"
ruby_core:
|
@driver.start_activity app_package: "com.example", app_activity: "ActivityName"
php:
|
$driver->startActivity(array('appPackage' => 'com.example',
'appActivity' => 'ActivityName'));
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/AndroidMobileCommandHelper.html#startActivityCommand-java.lang.String-java.lang.String-java.lang.String-java.lang.String-java.lang.String-java.lang.String-java.lang.String-java.lang.String-boolean-"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L591"
javascript_wdio: "http://webdriver.io/api/mobile/startActivity.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2948"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Android/Device#start_activity-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Android/Device#start_activity-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/appium/device/start_activity
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: appPackage
type: string
description: Name of the [package](https://developer.android.com/reference/java/lang/Package.html)
- name: appActivity
type: string
description: Name of the [activity](https://developer.android.com/reference/android/app/Activity.html)
- name: appWaitPackage
type: string
description: Automation will begin after this package starts
- name: intentAction
type: string
description: "[Intent](https://developer.android.com/reference/android/content/Intent.html) action which will be used to start activity"
- name: intentCategory
type: string
description: Intent category which will be used to start activity
- name: intentFlags
type: string
description: Flags that will be used to start activity
- name: optionalIntentArguments
type: string
description: Additional intent arguments that will be used to start activity
- name: dontStopAppOnReset
type: boolean
description: Should the app stop on reset
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L411
@@ -0,0 +1,99 @@
---
name: Background App
short_description: Send the currently running app for this session to the background
description:
>
Send the currently active app to the background, and either return after a
certain amount of time, or leave the app deactivated.
There are 3 types of parameters which may be passed to this method:
1. An object that looks like `{"timeout": secs}`, where `secs` is an
integer designating how long, in seconds, to background the app for. -1
means to deactivate the app entirely.
2. `null`, which means to deactivate the app entirely.
3. _Deprecated_ An integer: how long, in seconds, to background the app for. -1 means to
deactivate the app entirely.
iOS tests with XCUITest can also use the `mobile: terminateApp` method to
terminate the current app (see detailed [documentation](/docs/en/writing-running-appium/ios/ios-xctest-mobile-apps-management.md#mobile-terminateapp)),
and the `mobile: activateApp` to activate an existing application on the
device under test and moves it to the foreground (see detailed [documentation](/docs/en/writing-running-appium/ios/ios-xctest-mobile-apps-management.md#mobile-activateapp)).
example_usage:
java:
|
driver.runAppInBackground(Duration.ofSeconds(10));
python:
|
self.driver.background_app(10)
javascript_wd:
|
await driver.backgroundApp(10);
javascript_wdio:
|
driver.background(10);
ruby:
|
background_app(10)
ruby_core:
|
@driver.background_app(10)
php:
|
$driver->backgroundApp(10);
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/InteractsWithApps.html#runAppInBackground-java.time.Duration-"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L529"
javascript_wdio: "http://webdriver.io/api/mobile/background.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2841"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#background_app-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#background_app-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/app/background
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: seconds
type: number
description: How long to run app in background.
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L439
@@ -0,0 +1,73 @@
---
name: Close an App
short_description: Close an app on device
example_usage:
java:
|
driver.closeApp();
python:
|
self.driver.close_app()
javascript_wd:
|
await driver.closeApp();
javascript_wdio:
|
driver.close_app();
ruby:
|
close_app
ruby_core:
|
@driver.close_app
php:
|
$driver->closeApp();
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/InteractsWithApps.html#closeApp--"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L584"
javascript_wdio: "http://webdriver.io/api/mobile/closeApp.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2798"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#close_app-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#close_app-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/app/close
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L433
@@ -0,0 +1,76 @@
---
name: End Test Coverage
short_description: Get test coverage data
example_usage:
java:
|
driver.endTestCoverage("Intent", "/path");
python:
|
self.driver.end_test_coverage("Intent", "/path")
javascript_wd:
|
await driver.endTestCoverageForApp("Intent", "/path");
ruby:
|
end_coverage("Intent", "/path")
ruby_core:
|
@driver.end_coverage("Intent", "/path")
php:
|
$driver->endTestCoverage('Intent', '/path');
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/AndroidDriver.html#endTestCoverage-java.lang.String-java.lang.String-"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L627"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2858"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Android/Device#end_coverage-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Android/Device#end_coverage-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: false
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/app/end_test_coverage
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: intent
type: string
description: Intent to broadcast
- name: path
type: string
description: Path to .ec file
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L442
@@ -0,0 +1,80 @@
---
name: Get App Strings
short_description: Get app strings
example_usage:
java:
|
Map<String, String> appStrings = driver.getAppStringMap("en", "/path/to/file");
python:
|
appStrings = self.driver.app_strings("en", "/path/to/file")
javascript_wd:
|
let appStrings = await driver.getAppStrings();
javascript_wdio:
|
let appStrings = driver.getAppStrings("en");
ruby:
|
app_strings("en")
ruby_core:
|
@driver.app_strings("en")
php:
|
$strings = $driver->appStrings();
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/HasAppStrings.html#getAppStringMap--"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L357"
javascript_wdio: "http://webdriver.io/api/mobile/getAppStrings.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2916"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#app_strings-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#app_strings-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/app/strings
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: language
type: string
description: Language code (optional)
- name: stringFile
type: string
description: Path to the string file (optional)
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L445
@@ -0,0 +1,82 @@
---
name: Install App
short_description: Install the given app onto the device
description:
>
iOS tests with XCUITest can also use the `mobile: installApp` method. See
detailed [documentation](/docs/en/writing-running-appium/ios/ios-xctest-mobile-apps-management.md#mobile-installapp).
example_usage:
java:
|
driver.installApp("/Users/johndoe/path/to/app.apk");
python:
|
self.driver.install_app('/Users/johndoe/path/to/app.apk');
javascript_wd:
|
await driver.installAppOnDevice('/Users/johndoe/path/to/app.apk');
javascript_wdio:
|
driver.installApp('/Users/johndoe/path/to/app.apk')
ruby:
|
install_app('/Users/johndoe/path/to/app.apk')
ruby_core:
|
@driver.install_app('/Users/johndoe/path/to/app.apk')
php:
|
$driver->installApp('/Users/johndoe/path/to/app.apk');
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/InteractsWithApps.html#installApp-java.lang.String-"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L554"
javascript_wdio: "http://webdriver.io/api/mobile/installApp.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2540"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#install_app-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#install_app-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO: Verify this
windows:
windows: false # TODO: Verify this
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/appium/device/install_app
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: appPath
type: string
description: Path of the app being installed
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L372
@@ -0,0 +1,85 @@
---
name: Is App Installed
short_description: Check whether the specified app is installed on the device
description:
>
iOS tests with XCUITest can also use the `mobile: isAppInstalled` method. See
detailed [documentation](/docs/en/writing-running-appium/ios/ios-xctest-mobile-apps-management.md#mobile-isappinstalled).
example_usage:
java:
|
driver.isAppInstalled("com.example.AppName");
python:
|
self.driver.is_app_installed('com.example.AppName');
javascript_wd:
|
await driver.isAppInstalledOnDevice('com.example.AppName');
javascript_wdio:
|
driver.isAppInstalled('com.example.AppName')
ruby:
|
app_installed?('com.example.AppName')
ruby_core:
|
@driver.app_installed?('com.example.AppName')
php:
|
$driver->isAppInstalled('com.example.AppName')
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/InteractsWithApps.html#isAppInstalled-java.lang.String-"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L542"
javascript_wdio: "http://webdriver.io/api/mobile/isAppInstalled.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2586"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#app_installed%3F-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#app_installed%3F-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO: Verify this
windows:
windows: false # TODO: Verify this
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/appium/device/app_installed
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: bundleId
type: string
description: iOS bundleID or Android package name
response:
- type: boolean
description: Return true if installed, false if not
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L378
@@ -0,0 +1,78 @@
---
name: Launch an App
short_description: Launch an app on device
description:
>
iOS tests with XCUITest can also use the `mobile: launchApp` method. See
detailed [documentation](/docs/en/writing-running-appium/ios/ios-xctest-mobile-apps-management.md#mobile-launchapp).
example_usage:
java:
|
driver.launchApp();
python:
|
self.driver.launch_app()
javascript_wd:
|
await driver.launchApp();
javascript_wdio:
|
driver.launch();
ruby:
|
launch_app
ruby_core:
|
@driver.launch_app
php:
|
$driver->launchApp();
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/InteractsWithApps.html#launchApp--"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L578"
javascript_wdio: "http://webdriver.io/api/mobile/launch.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2798"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#launch_app-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#launch_app-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/app/launch
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L430
@@ -0,0 +1,86 @@
---
name: Remove App
short_description: Remove an app from the device
description:
>
iOS tests with XCUITest can also use the `mobile: removeApp` method. See
detailed [documentation](/docs/en/writing-running-appium/ios/ios-xctest-mobile-apps-management.md#mobile-removeapp).
example_usage:
java:
|
driver.removeApp("com.example.AppName");
python:
|
self.driver.remove_app('com.example.AppName');
javascript_wd:
|
await driver.removeAppFromDevice('com.example.AppName');
javascript_wdio:
|
driver.removeApp('com.example.AppName')
ruby:
|
remove_app('com.example.AppName')
ruby_core:
|
@driver.remove_app('com.example.AppName')
php:
|
$driver->removeApp('com.example.AppName');
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/InteractsWithApps.html#removeApp-java.lang.String-"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L566"
javascript_wdio: "http://webdriver.io/api/mobile/removeApp.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2563"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#remove_app-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#remove_app-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO: Verify this
windows:
windows: false # TODO: Verify this
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/appium/device/remove_app
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: appId
type: string
description: The iOS [App ID](https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/AppID.html)
- name: bundleId
type: string
description: iOS bundleID or Android package name
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L375
@@ -0,0 +1,73 @@
---
name: Reset App
short_description: Reset the currently running app for this session
example_usage:
java:
|
driver.resetApp();
python:
|
self.driver.reset()
javascript_wd:
|
await driver.resetApp();
javascript_wdio:
|
driver.reset();
ruby:
|
reset
ruby_core:
|
@driver.reset
php:
|
$driver->reset();
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/InteractsWithApps.html#resetApp--"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L372"
javascript_wdio: "http://webdriver.io/api/mobile/reset.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2827"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#reset-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#reset-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/app/reset
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L436
@@ -0,0 +1,85 @@
---
name: Finger print
short_description: Authenticate users by using their finger print scans on supported emulators.
description:
|
For Android emulator.
Authenticate users by using their finger print scans.
Touch ID by iOS is [here](http://appium.io/docs/en/commands/device/simulator/touch-id/)
example_usage:
java:
|
driver.fingerPrint(1);
python:
|
self.driver.finger_print(1)
javascript_wd:
|
await driver.fingerprint(1);
javascript_wdio:
|
await driver.fingerprint(1);
ruby:
|
finger_print 1
ruby_core:
|
@driver.finger_print 1
php:
|
// PHP Code here
csharp:
|
// CSharp Code here
client_docs:
java: "https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebElement.html#click--"
python: "https://github.com/appium/python-client/blob/07180f7547ffcd13c212de21d027ea0355f9ab96/appium/webdriver/webdriver.py#L1390"
javascript_wdio: "https://github.com/appium/appium-android-driver/blob/d16c7161d92ab6f6c9cec3f22218219ac3659716/lib/commands/actions.js#L260"
javascript_wd: "https://github.com/appium/appium-android-driver/blob/d16c7161d92ab6f6c9cec3f22218219ac3659716/lib/commands/actions.js#L260"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Android/Device#finger_print-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Android/Device#finger_print-instance_method"
php:
csharp:
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: false
csharp: false
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/finger_print
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: fingerprintId
type: number
description: finger prints stored in Android Keystore system (from 1 to 10)
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L379
@@ -0,0 +1,86 @@
---
name: Get Clipboard
short_description: Get the content of the system clipboard
description:
>
Get the content of the system clipboard
example_usage:
java:
|
driver.getClipboard(ClipboardContentType.PLAINTEXT); // get plaintext
driver.getClipboardText();
python:
|
self.driver.get_clipboard()
self.driver.get_clipboard_text()
javascript_wd:
|
await driver.getClipboard();
javascript_wdio:
|
await driver.getClipboard();
ruby:
|
get_clipboard
ruby_core:
|
@driver.get_clipboard
php:
|
// PHP Code here
csharp:
|
// CSharp Code here
client_docs:
java: "https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebElement.html#click--"
python: "https://github.com/appium/python-client"
javascript_wdio: "http://webdriver.io/index.html"
javascript_wd: "https://github.com/admc/wd/releases"
ruby:
- android: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Android/Device#get_clipboard-instance_method"
- ios: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Ios/Device#get_clipboard-instance_method"
ruby_core:
- android: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Android/Device#get_clipboard-instance_method"
- ios: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Ios/Device#get_clipboard-instance_method"
php: "https://github.com/appium/php-client/releases/latest-"
csharp: "https://github.com/appium/appium" # TODO
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: false
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: false
csharp: false
javascript_wd: true
javascript_wdio: true
endpoint:
url: /wd/hub/session/:session_id/appium/device/get_clipboard
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: contentType
type: string
description: The type of the content to get. Plaintext, Image, URL. Android supports only plaintext.
response:
- type: string
description: Clipboard content as base64-encoded string or an empty string if the clipboard is empty
specifications: no
@@ -0,0 +1,93 @@
---
name: Set Clipboard
short_description: Set the content of the system clipboard
description:
>
Set the content of the system clipboard
example_usage:
java:
|
// base64Content is Base64-encoded content
driver.setClipboard("label", ClipboardContentType.PLAINTEXT, base64Content);
driver.setClipboardText("happy testing");
python:
|
self.driver.set_clipboard('happy testing')
self.driver.set_clipboard_text('happy testing')
javascript_wd:
|
await driver.setClipboard('happy testing', 'plaintext')
javascript_wdio:
|
await driver.setClipboard('happy testing', 'plaintext')
ruby:
|
set_clipboard content: 'happy testing'
ruby_core:
|
@driver.set_clipboard content: 'happy testing'
php:
|
// PHP Code here
csharp:
|
// CSharp Code here
client_docs:
java: "https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebElement.html#click--"
python: "https://github.com/appium/python-client"
javascript_wdio: "http://webdriver.io/index.html"
javascript_wd: "https://github.com/admc/wd/releases"
ruby:
- ios: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Ios/Device#set_clipboard-instance_method"
- android: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Android/Device#set_clipboard-instance_method"
ruby_core:
- ios: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Ios/Device#set_clipboard-instance_method"
- android: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Android/Device#set_clipboard-instance_method"
php: "https://github.com/appium/php-client/releases/latest-"
csharp: "https://github.com/appium/appium" # TODO
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: false
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: false
csharp: false
javascript_wd: true
javascript_wdio: true
endpoint:
url: /wd/hub/session/:session_id/appium/device/set_clipboard
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: content
type: String
description: The actual base64 encoded clipboard content.
- name: contentType
type: string
description: The type of the content to get. Plaintext, Image, URL. Android supports only plaintext.
- name: label
type: string
description: Clipboard data label for Android.
response:
- type: string
description: Response from Appium server
specifications: no
@@ -0,0 +1,63 @@
---
name: Emulate power state
short_description: Emulate power state change on the connected emulator.
description:
|
For Android emulator.
To set the state of the battery charger to connected or not.
example_usage:
java:
|
driver.setPowerAC(PowerACState.OFF);
ruby:
|
set_power_ac :on
ruby_core:
|
@driver.set_power_ac :on
client_docs:
java: "https://appium.github.io/java-client/" # TODO: Link
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Android/Device/Emulator#set_power_ac-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Android/Device/Emulator#set_power_ac-instance_method"
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: false
ruby: true
php: false
csharp: false
javascript_wd: false
javascript_wdio: false
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/power_ac
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: state
type: string
description: set the state. on or off
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L381
@@ -0,0 +1,62 @@
---
name: Emulate power capacity
short_description: Emulate power capacity change on the connected emulator.
description:
|
For Android emulator.
To set the battery percentage.
example_usage:
java:
|
driver.setPowerCapacity(100);
ruby:
|
set_power_capacity 50
ruby_core:
|
@driver.set_power_capacity 50
client_docs:
java: "https://appium.github.io/java-client/" # TODO: Link
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Android/Device/Emulator#set_power_capacity-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Android/Device/Emulator#set_power_capacity-instance_method"
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: false
ruby: true
php: false
csharp: false
javascript_wd: false
javascript_wdio: false
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/power_capacity
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: percent
type: integer
description: ercentage value in range [0, 100]
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L378
@@ -0,0 +1,81 @@
---
name: Pull File
short_description: Retrieve a file from the device's file system
example_usage:
java:
|
byte[] fileBase64 = driver.pullFile("/path/to/device/foo.bar");
python:
|
file_base64 = self.driver.pull_file('/path/to/device/foo.bar');
javascript_wd:
|
let fileBase64 = await driver.pullFile('/path/to/device/foo.bar');
javascript_wdio:
|
let data = driver.pullFile('/data/local/tmp/file.txt');
ruby:
|
pull_file('/data/local/tmp/file.txt')
ruby_core:
|
@driver.pull_file('/data/local/tmp/file.txt')
php:
|
$data = $driver->pullFile('data/local/tmp/file.txt');
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/InteractsWithFiles.html#pullFile-java.lang.String-"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L491"
javascript_wdio: "http://webdriver.io/api/mobile/pullFile.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2665"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#pull_file-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#pull_file-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO: Verify this
windows:
windows: false # TODO: Verify this
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/appium/device/pull_file
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: path
type: string
description: Path on the device to pull file from
response:
- type: string
description: Contents of file in base64
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L390
@@ -0,0 +1,81 @@
---
name: Pull Folder
short_description: Retrieve a folder from the device's file system
example_usage:
java:
|
byte[] folder = driver.pullFolder("/path/to/device/foo.bar");
python:
|
folder_base64 = self.driver.pull_folder('/path/to/device/foo.bar');
javascript_wd:
|
let folderBase64 = await driver.pullFolder('/path/to/device/foo.bar');
javascript_wdio:
|
let data = driver.pullFolder('/data/local/tmp/file.txt');
ruby:
|
pull_folder('/data/local/tmp/file.txt')
ruby_core:
|
@driver.pull_folder('/data/local/tmp/file.txt')
php:
|
$folderBase64 = $driver->pullFolder($path);
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/InteractsWithFiles.html#pullFolder-java.lang.String-"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L503"
javascript_wdio: "http://webdriver.io/api/mobile/pullFolder.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2688"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#pull_folder-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#pull_folder-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO: Verify this
windows:
windows: false # TODO: Verify this
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/appium/device/pull_folder
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: path
type: string
description: Path to an entire folder on the device
response:
- type: string
description: A string of Base64 encoded data, representing a zip archive of the contents of the requested folder.
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L393
@@ -0,0 +1,82 @@
---
name: Push File
short_description: Place a file onto the device in a particular place
example_usage:
java:
|
driver.pushFile("/path/to/device/foo.bar", new File("/Users/johndoe/files/foo.bar"));
python:
|
self.driver.push_file('/path/to/device/foo.bar', 'QXJlIHlvdXIgYmVlcnMgb2theT8=');
javascript_wd:
|
await driver.pushFileToDevice('/path/to/device/foo.bar', 'QXJlIHlvdXIgYmVlcnMgb2theT8=');
javascript_wdio:
|
let data = new Buffer("Hello World").toString('base64');
driver.pushFile('/data/local/tmp/file.txt', data);
ruby:
|
push_file('/path/to/device/foo.bar', 'QXJlIHlvdXIgYmVlcnMgb2theT8=')
ruby_core:
|
@driver.push_file('/path/to/device/foo.bar', 'QXJlIHlvdXIgYmVlcnMgb2theT8=')
php:
|
$driver->pushFile('/path/to/device/foo.bar', 'QXJlIHlvdXIgYmVlcnMgb2theT8=');
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/PushesFiles.html#pushFile-java.lang.String-java.io.File-"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L515"
javascript_wdio: "http://webdriver.io/api/mobile/pushFile.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2640"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#push_file-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#push_file-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO: Verify this
windows:
windows: false # TODO: Verify this
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/appium/device/push_file
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: path
type: string
description: Path to install the data to
- name: data
type: string
description: Contents of file in base64
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L387
@@ -0,0 +1,74 @@
---
name: Is Device Locked
short_description: Check whether the device is locked or not
example_usage:
java:
|
boolean isLocked = driver.isDeviceLocked();
javascript_wd:
|
let isLocked = await driver.isLocked();
javascript_wdio:
|
driver.isLocked();
ruby:
|
device_locked?
ruby_core:
|
@driver.device_locked?
php:
|
// TODO PHP sample
csharp:
|
// TODO C# sample
client_docs:
java: "http://appium.github.io/java-client/io/appium/java_client/LocksDevice.html#isDeviceLocked--"
javascript_wdio: "http://webdriver.io/api/mobile/isLocked.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2407"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#device_locked%3F-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#device_locked%3F-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO Confirm this that mouse movements
windows:
windows: true # TODO Confirm this
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/is_locked
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
response:
- type: boolean
description: True if the device is locked, false if not
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L313
@@ -0,0 +1,82 @@
---
name: Lock
short_description: Lock the device
example_usage:
java:
|
driver.lockDevice();
python:
|
self.driver.lock();
javascript_wd:
|
await driver.lock();
javascript_wdio:
|
driver.lock();
ruby:
|
lock
lock(5) # lock 5 seconds
ruby_core:
|
@driver.lock
@driver.lock(5) # lock 5 seconds
php:
|
$driver->lock(5);
csharp:
|
// TODO C# sample
client_docs:
java: "http://appium.github.io/java-client/io/appium/java_client/LocksDevice.html#lockDevice--"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L643"
javascript_wdio: "http://webdriver.io/api/mobile/lock.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2363"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#lock-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#lock-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO Confirm this that mouse movements
windows:
windows: true # TODO Confirm this
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/lock
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: seconds
type: number
description: How long to lock the screen (iOS only).
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L307
@@ -0,0 +1,81 @@
---
name: Rotate
short_description: Rotate the device in three dimensions
example_usage:
java:
|
driver.rotate(new DeviceRotation(10, 10, 10));
javascript_wd:
|
driver.rotateDevice({x: 114, y: 198, duration: 5, radius: 3, rotation: 220, touchCount: 2});
javascript_wdio:
|
driver.rotate(100, 100);
php:
|
// TODO PHP sample
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/AppiumDriver.html#rotate-org.openqa.selenium.DeviceRotation-"
javascript_wdio: "http://webdriver.io/api/mobile/rotate.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2470"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: true
android:
uiautomator2: false
espresso: false
uiautomator: false
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/appium/device/rotate
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: x
type: number
description: x offset to use for the center of the rotate gesture
- name: y
type: number
description: y offset to use for the center of the rotate gesture
- name: radius
type: number
description: The distance in points from the center to the edge of the circular path
- name: rotation
type: number
description: The length of rotation in radians
- name: touchCount
type: number
description: The number of touches to use in the specified gesture. (Effectively, the number of fingers a user would use to make the specified gesture.) Valid values are 1 to 5.
- name: duration
type: number
description: The length of hold time for the specified gesture, in seconds.
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L361
@@ -0,0 +1,75 @@
---
name: Shake
short_description: Perform a shake action on the device
example_usage:
java:
|
driver.shake();
python:
|
self.driver.shake();
javascript_wd:
|
await driver.shake();
javascript_wdio:
|
driver.shake();
ruby:
|
shake
ruby_core:
|
@driver.shake
php:
|
$driver->shake();
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/ios/ShakesDevice.html#shake--"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L655"
javascript_wdio: "http://webdriver.io/api/mobile/shake.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2342"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#shake-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#shake-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true (simulator only)
uiautomation: true
android:
uiautomator2: false
espresso: false
uiautomator: false
mac:
mac: false # TODO Confirm this that mouse movements
windows:
windows: false # TODO Confirm this
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/shake
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L301
@@ -0,0 +1,77 @@
---
name: Unlock
short_description: Unlock the device
example_usage:
java:
|
driver.lockDevice();
driver.unlockDevice();
python:
|
self.driver.lock();
self.driver.unlock();
javascript_wd:
|
await driver.lock();
await driver.unlock();
javascript_wdio:
|
driver.lock()
.unlock();
ruby:
|
unlock
ruby_core:
|
@driver.unlock
php:
|
// TODO PHP sample
csharp:
|
// TODO C# sample
client_docs:
java: "http://appium.github.io/java-client/io/appium/java_client/LocksDevice.html#unlockDevice--"
javascript_wdio: "http://webdriver.io/api/mobile/unlock.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2386"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#unlock-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#unlock-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO Confirm this that mouse movements
windows:
windows: true # TODO Confirm this
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/unlock
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L310
@@ -0,0 +1,90 @@
---
name: Hide Keyboard
short_description: Hide soft keyboard
example_usage:
java:
|
driver.hideKeyboard();
python:
|
self.driver.hide_keyboard()
javascript_wd:
|
await driver.hideDeviceKeyboard();
javascript_wdio:
|
driver.hideDeviceKeyboard();
ruby:
|
hide_keyboard
ruby_core:
|
@driver.hide_keyboard
php:
|
$driver->hideKeyboard();
$driver->hideKeyboard(array(
'keyName' => 'Done'
));
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/HidesKeyboard.html#hideKeyboard--"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L378"
javascript_wdio: "http://webdriver.io/api/mobile/hideDeviceKeyboard.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2723"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#hide_keyboard-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#hide_keyboard-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: true
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/appium/device/hide_keyboard
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: strategy
type: string
description: Hide keyboard strategy (optional, UIAutomation only). Available strategies - 'press', 'pressKey', 'swipeDown', 'tapOut', 'tapOutside', 'default'.
- name: key
type: string
description: Key (optional)
- name: keyCode
type: string
description: Key code (optional)
- name: keyName
type: string
description: Key name (optional)
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L381
@@ -0,0 +1,61 @@
---
name: Is Keyboard Shown
short_description: Whether or not the soft keyboard is shown
example_usage:
java:
|
boolean isKeyboardShown = driver.isKeyboardShown();
javascript_wd:
|
await driver.isKeyboardShown();
ruby:
|
is_keyboard_shown
ruby_core:
|
@driver.is_keyboard_shown
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/HasOnScreenKeyboard.html#isKeyboardShown--"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2638"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#is_keyboard_shown-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#is_keyboard_shown-instance_method"
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: true
client_support:
java: true
python: false
ruby: true
php: false
csharp: false
javascript_wd: true
javascript_wdio: false
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/appium/device/is_keyboard_shown
method: 'GET'
url_parameters:
- name: session_id
description: ID of the session to route the command to
response:
- type: boolean
description: True if the keyboard is shown.
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: routes.js
@@ -0,0 +1,84 @@
---
name: Long Press Key Code
short_description: Press and hold a particular key code on the device
example_usage:
java:
|
driver.longPressKeyCode(AndroidKeyCode.HOME);
python:
|
self.driver.long_press_keycode(10);
javascript_wdio:
|
driver.longPressKeyCode(10);
javascript_wd:
|
await driver.longPressKeyCode(10);
ruby:
|
long_press_keycode(10)
ruby_core:
|
@driver.long_press_keycode(10)
php:
|
// TODO PHP sample
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/windows/PressesKeyCode.html#longPressKeyCode-int-"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L431"
javascript_wdio: "http://webdriver.io/api/mobile/longPressKeycode.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2478"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#long_press_keycode-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#long_press_keycode-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO Confirm this that mouse movements
windows:
windows: false # TODO Confirm this
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/long_press_keycode
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: keycode
type: number
description: Key code pressed on the device. See [Key Event](http://developer.android.com/reference/android/view/KeyEvent.html).
- name: metastate
type: number
description: Metastate for the keypress. See [Key Event](http://developer.android.com/reference/android/view/KeyEvent.html).
- name: flags
type: number
description: Flags for the keypress. See [Key Event](http://developer.android.com/reference/android/view/KeyEvent.html).
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L331
@@ -0,0 +1,84 @@
---
name: Press Key Code
short_description: Press a particular key on the device
example_usage:
java:
|
driver.pressKeyCode(AndroidKeyCode.SPACE, AndroidKeyMetastate.META_SHIFT_ON);
python:
|
self.driver.press_keycode(10);
javascript_wdio:
|
driver.pressKeycode(10);
javascript_wd:
|
await driver.pressKeycode(10);
ruby:
|
press_keycode(10)
ruby_core:
|
@driver.press_keycode(10)
php:
|
// TODO PHP sample
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/windows/PressesKeyCode.html#pressKeyCode-int-"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L415"
javascript_wdio: "http://webdriver.io/api/mobile/longPressKeycode.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2457"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#press_keycode-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#press_keycode-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO Confirm this that mouse movements
windows:
windows: false # TODO Confirm this
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/press_keycode
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: keycode
type: number
description: Key code pressed on the device. See [Key Event](http://developer.android.com/reference/android/view/KeyEvent.html).
- name: metastate
type: number
description: Metastate for the keypress. See [Key Event](http://developer.android.com/reference/android/view/KeyEvent.html).
- name: flags
type: number
description: Flags for the keypress. See [Key Event](http://developer.android.com/reference/android/view/KeyEvent.html).
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L328
@@ -0,0 +1,72 @@
---
name: GSM Call
short_description: Make GSM call (Emulator only)
example_usage:
java:
|
driver.makeGsmCall("5551234567", GsmCallActions.CALL);
javascript_wd:
|
await driver.gsmCall('555-123-4567', 'Phone');
ruby:
|
gsm_call(phone_number: '5551234567', action: :call)
ruby_core:
|
@driver.gsm_call(phone_number: '5551234567', action: :call)
php:
|
// TODO
csharp:
|
// TODO
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/SupportsSpecialEmulatorCommands.html#makeGsmCall-java.lang.String-io.appium.java_client.android.GsmCallActions-"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L3183"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Android/Device/Emulator#gsm_call-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Android/Device/Emulator#gsm_call-instance_method"
php: "https://github.com/appium/php-client/" # TODO
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
uiautomator2: false
espresso: false
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: false
ruby: true
php: false
csharp: false
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/gsm_call
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: phoneNumber
type: string
description: The phone number to call to
- name: action
type: string
description: The action - 'call', 'accept', 'cancel', 'hold'.
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L340
@@ -0,0 +1,69 @@
---
name: GSM Signal
short_description: Set GSM signal strength (Emulator only)
example_usage:
java:
|
driver.setGsmSignalStrength(GsmSignalStrength.GOOD);
javascript_wd:
|
await driver.gsmSignal(3);
ruby:
|
gsm_signal :good
ruby_core:
|
@driver.gsm_signal :good
php:
|
// TODO
csharp:
|
// TODO
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/SupportsSpecialEmulatorCommands.html#setGsmSignalStrength-io.appium.java_client.android.GsmSignalStrength-"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L3221"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Android/Device/Emulator#gsm_signal-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Android/Device/Emulator#gsm_signal-instance_method"
php: "https://github.com/appium/php-client/" # TODO
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
uiautomator2: false
espresso: false
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: false
ruby: true
php: false
csharp: false
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/gsm_signal
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: signalStrengh
type: string
description: Signal strength in the range [0, 4]
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L343
@@ -0,0 +1,69 @@
---
name: GSM Voice
short_description: Set GSM voice state (Emulator only)
example_usage:
java:
|
driver.setGsmVoice(GsmVoiceState.HOME);
javascript_wd:
|
await driver.gsmVoice('Voice state');
ruby:
|
gsm_voice :home
ruby_core:
|
@driver.gsm_voice :home
php:
|
// TODO
csharp:
|
// TODO
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/SupportsSpecialEmulatorCommands.html#setGsmVoice-io.appium.java_client.android.GsmVoiceState-"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L3241"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Android/Device/Emulator#gsm_voice-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Android/Device/Emulator#gsm_voice-instance_method"
php: "https://github.com/appium/php-client/" # TODO
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
uiautomator2: false
espresso: false
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: false
ruby: true
php: false
csharp: false
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/gsm_voice
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: state
type: string
description: State of GSM voice - 'unregistered', 'home', 'roaming', 'searching', 'denied', 'off', 'on'.
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L346
@@ -0,0 +1,72 @@
---
name: Send SMS
short_description: Simulate an SMS message (Emulator only)
example_usage:
java:
|
driver.sendSMS("555-123-4567", "Hey lol");
javascript_wd:
|
await driver.sendSms('555-123-4567', 'Hey lol');
ruby:
|
send_sms(phone_number: '555-123-4567', message: 'Hey lol')
ruby_core:
|
@driver.send_sms(phone_number: '555-123-4567', message: 'Hey lol')
php:
|
// TODO
csharp:
|
// TODO
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/SupportsSpecialEmulatorCommands.html#sendSMS-java.lang.String-java.lang.String-"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L3183"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Android/Device/Emulator#send_sms-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Android/Device/Emulator#send_sms-instance_method"
php: "https://github.com/appium/php-client/" # TODO
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: false
ruby: true
php: false
csharp: false
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/send_sms
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: phoneNumber
type: string
description: The phone number to send the SMS too
- name: message
type: string
description: The SMS message
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L337
@@ -0,0 +1,69 @@
---
name: Toggle Airplane Mode
short_description: Toggle airplane mode on device
example_usage:
java:
|
driver.toggleAirplaneMode();
javascript_wd:
|
await driver.toggleAirplaneMode();
javascript_wdio:
|
driver.toggleAirplaneMode();
ruby:
|
toggle_flight_mode
ruby_core:
|
@driver.toggle_flight_mode
php:
|
// TODO
csharp:
|
// TODO
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/SupportsNetworkStateManagement.html#toggleAirplaneMode--"
javascript_wdio: "http://webdriver.io/api/mobile/toggleAirplaneMode.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2712"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#toggle_flight_mode-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#toggle_flight_mode-instance_method"
php: "https://github.com/appium/php-client/" # TODO
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: false
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/toggle_airplane_mode
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L396
@@ -0,0 +1,69 @@
---
name: Toggle Data
short_description: Switch the state of data service
example_usage:
java:
|
driver.toggleData();
javascript_wd:
|
await driver.toggleData();
javascript_wdio:
|
driver.toggleData();
ruby:
|
toggle_data
ruby_core:
|
@driver.toggle_data
php:
|
// TODO
csharp:
|
// TODO
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/SupportsNetworkStateManagement.html#toggleData--"
javascript_wdio: "http://webdriver.io/api/mobile/toggleData.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2771"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Device#toggle_data-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Device#toggle_data-instance_method"
php: "https://github.com/appium/php-client/" # TODO
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: false
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/toggle_data
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L399
@@ -0,0 +1,73 @@
---
name: Toggle Location Services
short_description: Switch the state of the location service
example_usage:
java:
|
driver.toggleLocationServices();
python:
|
self.driver.toggle_location_services();
javascript_wd:
|
await driver.toggleLocationServices();
javascript_wdio:
|
driver.toggleLocationServices();
ruby:
|
toggle_location_services
ruby_core:
|
@driver.toggle_location_services
php:
|
// TODO
csharp:
|
// TODO
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/AndroidDriver.html#toggleLocationServices--"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L774"
javascript_wdio: "http://webdriver.io/api/mobile/toggleLocationServices.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2758"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Device#toggle_location_services-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Device#toggle_location_services-instance_method"
php: "https://github.com/appium/php-client/" # TODO
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/toggle_location_services
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L405
@@ -0,0 +1,69 @@
---
name: Toggle WiFi
short_description: Switch the state of the wifi service
example_usage:
java:
|
driver.toggleWifi();
javascript_wd:
|
await driver.toggleWiFi();
javascript_wdio:
|
driver.toggleWiFi();
ruby:
|
toggle_wifi
ruby_core:
|
@driver.toggle_wifi
php:
|
// TODO
csharp:
|
// TODO
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/SupportsNetworkStateManagement.html#toggleWifi--"
javascript_wdio: "http://webdriver.io/api/mobile/toggleWiFi.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L2738"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Device#toggle_wifi-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/master/Appium/Core/Device#toggle_wifi-instance_method"
php: "https://github.com/appium/php-client/" # TODO
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: false
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/toggle_wifi
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L402
@@ -0,0 +1,80 @@
---
name: Get Performance Data
short_description: Returns the information of the system state which is supported to read as like cpu, memory, network traffic, and battery
example_usage:
java:
|
List<List<Object>> performanceData = driver.getPerformanceData("my.app.package", "cpuinfo", 5);
javascript_wd:
|
await driver.getPerformanceData('my.app.package', 'cpuinfo', 5);
ruby:
|
get_performance_data package_name: 'io.appium.android.apis', data_type: 'cpuinfo', data_read_timeout: 10
ruby_core:
|
@driver.get_performance_data package_name: 'io.appium.android.apis', data_type: 'cpuinfo', data_read_timeout: 10
php:
|
// TODO PHP sample
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/HasSupportedPerformanceDataType.html#getSupportedPerformanceDataTypes--"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L3412"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Android/Device#get_performance_data-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Android/Device#get_performance_data-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO Confirm this that mouse movements
windows:
windows: false # TODO Confirm this
client_support:
java: true
python: false
ruby: true
php: false
csharp: false
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/getPerformanceData
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: package_name
type: string
description: The package name of the application
- name: data_type
type: string
description: The type of system state which wants to read. It should be one of the supported performance data types.
- name: data_read_timeout
type: number
description: The number of attempts to read (optional)
response:
- type: array<string>
description: The information type of the system state which is supported to read as like cpu, memory, network traffic, and battery
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L325
@@ -0,0 +1,69 @@
---
name: Get Performance Data Types
short_description: Returns the information types of the system state which is supported to read as like cpu, memory, network traffic, and battery
example_usage:
java:
|
List<String> performanceTypes = driver.getSupportedPerformanceDataTypes();
javascript_wd:
|
await driver.getSupportedPerformanceDataTypes();
ruby:
|
get_performance_data_types
ruby_core:
|
@driver.get_performance_data_types
php:
|
// TODO PHP sample
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/HasSupportedPerformanceDataType.html#getSupportedPerformanceDataTypes--"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L3398"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Android/Device#get_performance_data_types-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Android/Device#get_performance_data_types-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO Confirm this that mouse movements
windows:
windows: false # TODO Confirm this
client_support:
java: true
python: false
ruby: true
php: false
csharp: false
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/performanceData/types
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
response:
- type: array<string>
description: The available performance data types (cpuinfo|batteryinfo|networkinfo|memoryinfo)
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L322
@@ -0,0 +1,134 @@
---
name: Start Recording Screen
short_description: Start recording screen
example_usage:
java:
|
driver.startRecordingScreen();
driver.startRecordingScreen(new BaseStartScreenRecordingOptions(....));
javascript_wd:
|
await driver.startRecordingScreen();
ruby:
|
start_recording_screen
start_recording_screen video_size: '1280x720', time_limit: '180', bit_rate: '5000000' # Android
start_recording_screen video_type: 'h264', time_limit: '260' # iOS
ruby_core:
|
@driver.start_recording_screen
@driver.start_recording_screen video_size: '1280x720', time_limit: '180', bit_rate: '5000000' # Android
@driver.start_recording_screen video_type: 'h264', time_limit: '260' # iOS
python:
|
self.driver.start_recording_screen()
php:
|
// TODO PHP sample
csharp:
|
// TODO C# sample
client_docs:
java: "https://static.javadoc.io/io.appium/java-client/6.1.0/io/appium/java_client/screenrecording/CanRecordScreen.html#startRecordingScreen-T-"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L3412"
ruby:
- android: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Android/Device#start_recording_screen-instance_method"
ios: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Ios/Xcuitest/Device#start_recording_screen-instance_method"
ruby_core:
- android: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Android/Device#start_recording_screen-instance_method"
ios: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Ios/Xcuitest/Device#start_recording_screen-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO Confirm this that mouse movements
windows:
windows: false # TODO Confirm this
client_support:
java: true
python: true
ruby: true
php: false
csharp: false
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/start_recording_screen
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: remotePath
type: string
description: The path to the remote location, where the resulting video should be uploaded.
The following protocols are supported http/https, ftp.
Null or empty string value (the default setting) means the content of resulting
file should be encoded as Base64 and passed as the endpount response value.
An exception will be thrown if the generated media file is too big to
fit into the available process memory.
This option only has an effect if there is screen recording process in progreess
and `forceRestart` parameter is not set to `true`.
- name: username
type: string
description: The name of the user for the remote authentication.
- name: password
type: string
description: The password for the remote authentication.
- name: method
type: string
description: The http multipart upload method name. The 'PUT' one is used by default.
- name: forceRestart
type: boolean
description: Whether to try to catch and upload/return the currently running screen recording
(`false`, the default setting on server) or ignore the result of it
and start a new recording immediately (`true`).
- name: timeLimit
type: string
description: Recording time. 180 seconds is by default.
- name: videoType
type: string
description: (iOS Only) The format of the screen capture to be recorded.
Available formats "h264", "mp4" or "fmp4". Default is "mp4".
Only works for Simulator.
- name: videoQuality
type: string
description: (iOS Only) The video encoding quality (low, medium, high, photo - defaults to medium).
- name: videoFps
type: string
description: (iOS Only) The Frames Per Second rate of the recorded video.
Change this value if the resulting video is too slow or too fast. Defaults to 10.
This can decrease the resulting file size.
- name: bitRate
type: string
description: (iOS Only) The video bit rate for the video, in megabits per second.
4 Mbp/s(4000000) is by default for Android API level below 27. 20 Mb/s(20000000) for API level 27 and above.
- name: videoSize
type: string
description: (Android Only) The format is widthxheight.
The default value is the device's native display resolution (if supported),
1280x720 if not. For best results,
use a size supported by your device's Advanced Video Coding (AVC) encoder.
For example, "1280x720"
- name: bugReport
type: string
description: (Android Only) Set it to `true` in order to display additional information on the video overlay,
such as a timestamp, that is helpful in videos captured to illustrate bugs.
This option is only supported since API level 27 (Android O).
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L345
@@ -0,0 +1,86 @@
---
name: Stop Recording Screen
short_description: Stop recording screen
example_usage:
java:
|
driver.stopRecordingScreen();
driver.stopRecordingScreen(new BaseStopScreenRecordingOptions(....));
javascript_wd:
|
await driver.stopRecordingScreen();
ruby:
|
stop_recording_screen
stop_recording_screen remote_path: 'https://example.com', user: 'example', pass: 'pass', method: 'POST'
ruby_core:
|
@driver.stop_recording_screen
@driver.stop_recording_screen remote_path: 'https://example.com', user: 'example', pass: 'pass', method: 'POST'
python:
|
self.driver.stop_recording_screen()
php:
|
// TODO PHP sample
csharp:
|
// TODO C# sample
client_docs:
java: "https://static.javadoc.io/io.appium/java-client/6.1.0/io/appium/java_client/screenrecording/CanRecordScreen.html#stopRecordingScreen--"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L3398"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#stop_recording_screen-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#stop_recording_screen-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false # TODO Confirm this that mouse movements
windows:
windows: false # TODO Confirm this
client_support:
java: true
python: true
ruby: true
php: false
csharp: false
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/stop_recording_screen
method: POST
url_parameters:
- name: remotePath
description: The path to the remote location, where the resulting video should be uploaded.
The following protocols are supported http/https, ftp.
Null or empty string value (the default setting) means the content of resulting
file should be encoded as Base64 and passed as the endpoint response value.
An exception will be thrown if the generated media file is too big to
fit into the available process memory.
- name: username
description: The name of the user for the remote authentication.
- name: password
description: The password for the remote authentication.
- name: method
description: The http multipart upload method name. The 'PUT' one is used by default.
response:
- type: string
description: Base64 encoded string. If remote_path is set, the response is empty string.
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L348
@@ -0,0 +1,85 @@
---
name: Toggle Touch ID Enrollment
short_description: Toggle the simulator being [enrolled](https://support.apple.com/en-ca/ht201371) to accept touchId (iOS Simulator only)
description:
|
To enable this feature, the `allowTouchIdEnroll` desired capability must be set to true. When `allowTouchIdEnroll` is set to true
the Simulator will be enrolled by default, and the 'Toggle Touch ID Enrollment' changes the enrollment state.
This call will only work if the Appium process or its parent application (e.g., Terminal.app or Appium.app) has access to Mac OS accessibility in System Preferences > Security & Privacy > Privacy > Accessibility list
example_usage:
java:
|
driver.toggleTouchIDEnrollment(true);
python:
|
self.driver.toggle_touch_id_enrollment()
javascript_wd:
|
await driver.toggleTouchIdEnrollment();
javascript_wdio:
|
driver.toggleTouchIdEnrollment(true);
ruby:
|
toggle_touch_id_enrollment
ruby_core:
|
@driver.toggle_touch_id_enrollment
php:
|
// TODO PHP sample
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/ios/PerformsTouchID.html#performTouchID-boolean-"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L670"
javascript_wdio: "http://webdriver.io/api/mobile/toggleTouchIdEnrollment.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L3150"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Ios/Device#toggle_touch_id_enrollment-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Ios/Device#toggle_touch_id_enrollment-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: false
android:
uiautomator2: false
espresso: false
uiautomator: false
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/simulator/toggle_touch_id_enrollment
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: enabled
type: boolean
description: If true, enable, if falsey disable, otherwise toggle (optional)
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L427
@@ -0,0 +1,101 @@
---
name: Perform Touch ID
short_description: Simulate a [touch id](https://support.apple.com/en-ca/ht201371) event (iOS Simulator only)
description:
|
To enable this feature, the `allowTouchIdEnroll` desired capability must be set to true and the Simulator
must be [enrolled](https://support.apple.com/en-ca/ht201371).
When you set `allowTouchIdEnroll` to true, it will set the Simulator to be enrolled by default.
The enrollment state can be [toggled](/docs/en/commands/device/simulator/toggle-touch-id-enrollment.md)
This call will only work if Appium process or its parent application (e.g. Terminal.app or Appium.app) has access to Mac OS accessibility in System Preferences > Security & Privacy > Privacy > Accessibility list
Finger Print by Android is [here](http://appium.io/docs/en/commands/device/authentication/finger-print/)
example_usage:
java:
|
driver.performTouchID(false); // Simulates a failed touch
driver.performTouchID(true); // Simulates a passing touch
python:
|
self.driver.touch_id(false); # Simulates a failed touch
self.driver.touch_id(true); # Simulates a passing touch
javascript_wd:
|
await driver.touchId(false); // Simulates a failed touch
await driver.touchId(true); // Simulates a failed touch
javascript_wdio:
|
driver.touchId(false); // Simulates a failed touch
driver.touchId(true); // Simulates a passing touch
ruby:
|
touch_id(false)
touch_id(true)
ruby_core:
|
@driver.touch_id(false) # Simulates a failed touch
@driver.touch_id(true) # Simulates a passing touch
php:
|
// TODO PHP sample
csharp:
|
// TODO C# sample
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/ios/PerformsTouchID.html#performTouchID-boolean-"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L661"
javascript_wdio: "http://webdriver.io/api/mobile/touchId.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L3133"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Ios/Device#touch_id-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Ios/Device#touch_id-instance_method"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: false
android:
uiautomator2: false
espresso: false
uiautomator: false
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/simulator/touch_id
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
json_parameters:
- name: match
type: boolean
description: Are we simulating a successful touch (true) or a failed touch (false)
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L424
links:
- name: Appium Docs
url: https://github.com/appium/appium-xcuitest-driver/blob/master/docs/touch-id.md
@@ -0,0 +1,73 @@
---
name: Open Notifications
short_description: Open Android notifications (Emulator only)
example_usage:
java:
|
driver.openNotifications();
python:
|
self.driver.open_notifications();
javascript_wd:
|
await driver.openNotifications();
javascript_wdio:
|
driver.openNotifications();
ruby:
|
open_notifications();
ruby_core:
|
@driver.open_notifications();
php:
|
$driver->openNotifications();
csharp:
|
// TODO
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/AndroidDriver.html#openNotifications--"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L676"
javascript_wdio: "http://webdriver.io/api/mobile/openNotifications.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L3004"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#open_notifications-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#open_notifications-instance_method"
php: "https://github.com/appium/php-client/" # TODO
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/open_notifications
method: POST
url_parameters:
- name: session_id
description: ID of the session to route the command to
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L408
@@ -0,0 +1,64 @@
---
name: Get System Bars
short_description: Retrieve visibility and bounds information of the status and navigation bars
example_usage:
java:
|
Map<String, String> systemBars = driver.getSystemBars();
ruby:
|
get_system_bars
ruby_core:
|
@driver.get_system_bars
php:
|
// TODO
csharp:
|
// TODO
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/android/HasAndroidDeviceDetails.html#getSystemBars--"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#get_system_bars-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#get_system_bars-instance_method"
php: "https://github.com/appium/php-client/" # TODO
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO
# Driver support by platform
driver_support:
ios:
xcuitest: false
uiautomation: false
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: false
ruby: true
php: false
csharp: false
javascript_wd: false
javascript_wdio: false
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/system_bars
method: GET
url_parameters:
- name: session_id
description: ID of the session to route the command to
response:
- type: array<object>
description: Information about visibility and bounds of status and navigation bar
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L418
@@ -0,0 +1,76 @@
---
name: Get System Time
short_description: Get the time on the device
example_usage:
java:
|
String time = driver.getDeviceTime();
python:
|
time = self.driver.device_time()
javascript_wdio:
|
let time = driver.getDeviceTime();
javascript_wd:
|
let time = await driver.getDeviceTime();
ruby:
|
device_time
ruby_core:
|
@driver.device_time
php:
|
$time = $driver->getDeviceTime();
csharp:
|
// TODO
client_docs:
java: "https://appium.github.io/java-client/io/appium/java_client/HasDeviceTime.html#getDeviceTime--"
python: "https://github.com/appium/python-client/blob/master/appium/webdriver/webdriver.py#L798"
javascript_wdio: "http://webdriver.io/api/mobile/getDeviceTime.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L3119"
ruby: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#device_time-instance_method"
ruby_core: "https://www.rubydoc.info/github/appium/ruby_lib_core/Appium/Core/Device#device_time-instance_method"
php: "https://github.com/appium/php-client/" # TODO
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: false
windows:
windows: false
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /session/:session_id/appium/device/system_time
method: GET
url_parameters:
- name: session_id
description: ID of the session to route the command to
response:
- type: string
description: Time on the device
# Links to specifications. Should link to at least one specification
specifications:
jsonwp: https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js#L304
@@ -0,0 +1,78 @@
---
name: Clear Element
short_description: Clear an element's value
example_usage:
java:
|
MobileElement element = (MobileElement) driver.findElementByAccessibilityId("SomeAccessibilityID");
element.clear();
python:
|
self.driver.find_element_by_accessibility_id('SomeAccessibilityID').clear()
javascript_wd:
|
let element = await driver.elementByAccessibilityId("SomeAccessibilityID");
await element.clear();
javascript_wdio:
|
driver.clearElement("~SomeAccessibilityId");
ruby:
|
find_element(:accessibility_id, "SomeAccessibilityID").clear
ruby_core:
|
@driver.find_element(:accessibility_id, "SomeAccessibilityID").clear
php:
|
// TODO PHP sample
csharp:
|
// TODO C# sample
client_docs:
java: "https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebElement.html#clear--"
python: "http://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webelement.WebElement.clear"
javascript_wdio: "http://webdriver.io/api/action/clearElement.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L1780"
ruby: "https://www.rubydoc.info/gems/selenium-webdriver/Selenium/WebDriver/Element:clear"
ruby_core: "https://www.rubydoc.info/gems/selenium-webdriver/Selenium/WebDriver/Element:clear"
php: "https://github.com/appium/php-client/" # TODO PHP documentation link
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO Dotnet documentation link
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: true
windows:
windows: true
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/element/:element_id/clear
method: 'POST'
url_parameters:
- name: session_id
description: ID of the session to route the command to
- name: element_id
description: ID of the element to clear.
# Links to specifications. Should link to at least one specification
specifications:
w3c: https://www.w3.org/TR/webdriver/#dfn-get-element-tag-name
jsonwp: https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessionidelementidclear
@@ -0,0 +1,85 @@
---
name: Click
short_description: Click element at its center point.
description:
>
Clicks element at its center point. If the element's center point is obscured by another element, an element click intercepted error is returned. If the element is outside the viewport, an element not interactable error is returned.
Not all drivers automatically scroll the element into view and may need to be scrolled to in order to interact with it.
example_usage:
java:
|
MobileElement el = driver.findElementByAccessibilityId("SomeId");
el.click();
python:
|
el = self.driver.find_element_by_accessibility_id('SomeId')
el.click();
javascript_wd:
|
let element = await driver.elementByAccessibilityId('id', 'SomeId');
await element.click();
javascript_wdio:
|
driver.click('#SomeId');
ruby:
|
find_element(:accessibility_id, 'SomeId').click
ruby_core:
|
@driver.find_element(:accessibility_id, 'SomeId').click
php:
|
$driver->byAccessibilityId('SomeId')->click();
csharp:
|
// TODO
client_docs:
java: "https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebElement.html#click--"
python: "http://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webelement.WebElement.click"
javascript_wdio: "http://webdriver.io/api/action/click.html"
javascript_wd: "https://github.com/admc/wd/blob/master/lib/commands.js#L1672"
ruby: "https://www.rubydoc.info/gems/selenium-webdriver/Selenium/WebDriver/Element#click-instance_method"
ruby_core: "https://www.rubydoc.info/gems/selenium-webdriver/Selenium/WebDriver/Element#click-instance_method"
php: "https://github.com/appium/php-client/" # TODO
csharp: "https://github.com/appium/appium-dotnet-driver/" # TODO
# Driver support by platform
driver_support:
ios:
xcuitest: true
uiautomation: true
android:
espresso: true
uiautomator2: true
uiautomator: true
mac:
mac: true
windows:
windows: true
client_support:
java: true
python: true
ruby: true
php: true
csharp: true
javascript_wd: true
javascript_wdio: true
# Information about the HTTP endpoints
endpoint:
url: /wd/hub/session/:session_id/element/:element_id/click
method: 'POST'
url_parameters:
- name: session_id
description: UUID of the session
- name: element_id
description: UUID of the element
# Links to specifications. Should link to at least one specification
specifications:
w3c: https://www.w3.org/TR/webdriver/#element-click
jsonwp: https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessionidelementidclick

Some files were not shown because too many files have changed in this diff Show More