mirror of
https://github.com/appium/appium.git
synced 2026-11-06 01:14:40 +08:00
Compare commits
39
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
603d1e7fb2 | ||
|
|
f800c9d760 | ||
|
|
8f5a6c47a9 | ||
|
|
157108c70c | ||
|
|
7c5e3ee86e | ||
|
|
6e836e0860 | ||
|
|
65492d7f3b | ||
|
|
c07045ea48 | ||
|
|
1f68195ff3 | ||
|
|
fd09d7fa0f | ||
|
|
04f140a4ad | ||
|
|
3f077db410 | ||
|
|
3bda97f3c5 | ||
|
|
7c05f5c213 | ||
|
|
e68757b349 | ||
|
|
f007b46a65 | ||
|
|
f9b51ec526 | ||
|
|
884173f967 | ||
|
|
f3b1f3556c | ||
|
|
ef3d781d88 | ||
|
|
15280b80d2 | ||
|
|
365a7b1770 | ||
|
|
d1e7124d4d | ||
|
|
cb799d7ab8 | ||
|
|
ba4aa394d1 | ||
|
|
a4eda0054b | ||
|
|
dbd0d321e0 | ||
|
|
c6d5383425 | ||
|
|
859f3c430a | ||
|
|
e3560e0bee | ||
|
|
51eea37e93 | ||
|
|
053c105f6f | ||
|
|
0c50504266 | ||
|
|
1766a8d0cf | ||
|
|
dbad59f1ff | ||
|
|
b70ddd50a8 | ||
|
|
bbe04a7ac0 | ||
|
|
a7c9f6198a | ||
|
|
c5723e7655 |
@@ -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
|
||||
+27
-121
@@ -50,150 +50,56 @@ permissions:
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||
cancel-in-progress: true
|
||||
|
||||
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 }}
|
||||
versions: ${{ steps.generate-matrix.outputs.active }}
|
||||
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/^/ - /'
|
||||
- name: Select all active LTS versions of Node.js
|
||||
id: generate-matrix
|
||||
uses: msimerson/node-lts-versions@v1
|
||||
|
||||
test-smoke:
|
||||
test:
|
||||
needs:
|
||||
- prepare_matrix
|
||||
name: Smoke Tests
|
||||
name: Tests
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: ${{ fromJSON(needs.prepare_matrix.outputs.versions) }}
|
||||
runs-on: ubuntu-latest
|
||||
os:
|
||||
- ubuntu-latest
|
||||
# TODO: Windows is not stable and slow to run
|
||||
# - windows-latest
|
||||
# TODO: Enable below envs after all tests have been verified green
|
||||
# - macos-latest
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- name: Setup, install and build
|
||||
uses: ./.github/actions/setup-build
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4
|
||||
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
|
||||
cache: 'npm'
|
||||
- name: Install dependencies
|
||||
uses: bahmutov/npm-install@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
useRollingCache: true
|
||||
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
|
||||
- name: Run smoke, unit & E2E tests
|
||||
run: npm run test:ci
|
||||
|
||||
lint:
|
||||
name: Lint
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- name: Setup and install (no build)
|
||||
uses: ./.github/actions/setup-build
|
||||
- uses: actions/checkout@v4
|
||||
- name: Install dependencies
|
||||
uses: bahmutov/npm-install@v1
|
||||
with:
|
||||
node-version: lts/*
|
||||
useRollingCache: true
|
||||
install-command: npm ci
|
||||
run-build: 'false'
|
||||
- name: ESLint
|
||||
run: npm run lint:ci
|
||||
|
||||
@@ -12,7 +12,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Cleanup
|
||||
run: |
|
||||
|
||||
@@ -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@v2.1.1
|
||||
with:
|
||||
errors: true
|
||||
webhook: ${{ secrets.SLACK_WEBHOOK_URL }}
|
||||
webhook-type: incoming-webhook
|
||||
payload-file-path: crowdin-stats-${{ matrix.project_name }}.json
|
||||
@@ -4,19 +4,19 @@ name: Sync Crowdin Docs Translations
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: 0 0 * * *
|
||||
# TODO: Uncomment the scheduler as soon as we have existing translations
|
||||
# imported to Crowdin
|
||||
# schedule:
|
||||
# - cron: 0 0 * * 0
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js LTS
|
||||
uses: actions/setup-node@v6
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: lts/*
|
||||
cache: 'npm'
|
||||
@@ -29,7 +29,7 @@ jobs:
|
||||
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
|
||||
uses: peter-evans/create-pull-request@v7.0.8
|
||||
with:
|
||||
token: ${{ github.token }}
|
||||
commit-message: 'docs(appium): Update documentation translations'
|
||||
|
||||
@@ -15,9 +15,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js LTS
|
||||
uses: actions/setup-node@v6
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: lts/*
|
||||
cache: 'npm'
|
||||
|
||||
@@ -12,9 +12,9 @@ jobs:
|
||||
prepare_matrix:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
versions: ${{ steps.generate-matrix.outputs.lts }}
|
||||
versions: ${{ steps.generate-matrix.outputs.active }}
|
||||
steps:
|
||||
- name: Select all current LTS versions of Node.js
|
||||
- name: Select all active LTS versions of Node.js
|
||||
id: generate-matrix
|
||||
uses: msimerson/node-lts-versions@v1
|
||||
|
||||
@@ -29,7 +29,7 @@ jobs:
|
||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||
steps:
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v6
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Install Appium
|
||||
|
||||
@@ -37,7 +37,7 @@ jobs:
|
||||
name: Docs
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
- name: Install dependencies (Node.js)
|
||||
uses: bahmutov/npm-install@v1
|
||||
with:
|
||||
|
||||
@@ -13,7 +13,7 @@ jobs:
|
||||
env:
|
||||
FOSSA_API_KEY: ${{secrets.FOSSA_API_KEY}}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: master
|
||||
- name: Install dependencies
|
||||
|
||||
@@ -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@v2.1.1
|
||||
with:
|
||||
errors: true
|
||||
webhook: ${{ secrets.SLACK_WEBHOOK_URL }}
|
||||
webhook-type: incoming-webhook
|
||||
payload-file-path: github-contrib-stats.json
|
||||
@@ -9,7 +9,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check for "On Hold" label
|
||||
uses: egmacke/action-check-label@v4
|
||||
uses: egmacke/action-check-label@v3
|
||||
with:
|
||||
label: On Hold
|
||||
state: absent
|
||||
|
||||
@@ -4,7 +4,12 @@ on:
|
||||
types: [opened, edited, synchronize, reopened]
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
uses: appium/appium-workflows/.github/workflows/pr-title.yml@main
|
||||
with:
|
||||
config-preset: angular
|
||||
conventional:
|
||||
name: PR Title
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: beemojs/conventional-pr-action@v3
|
||||
with:
|
||||
config-preset: angular
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
@@ -17,12 +17,12 @@ jobs:
|
||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
- run: |
|
||||
git config user.name github-actions
|
||||
git config user.email github-actions@github.com
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v6
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Install dependencies (Node.js)
|
||||
|
||||
@@ -23,7 +23,7 @@ jobs:
|
||||
name: Check Renovate Configs
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
- name: Validate Renovate Config
|
||||
uses: rinchsan/renovate-config-validator@v0.2.0
|
||||
with:
|
||||
|
||||
@@ -11,5 +11,3 @@ package.json
|
||||
# generated
|
||||
packages/types/lib/appium-config.ts
|
||||
**/*.hbs
|
||||
|
||||
/.nx/workspace-data
|
||||
+2
-2
@@ -5,7 +5,7 @@ most of which have their own changelogs. Links to these individual changelogs ar
|
||||
|
||||
## Main Appium Module
|
||||
|
||||
* ### [Appium Changelog](packages/appium/CHANGELOG.md)
|
||||
* ### [Appium 2 Changelog](packages/appium/CHANGELOG.md)
|
||||
* [Appium 1.x Changelog](https://github.com/appium/appium/blob/1.x/CHANGELOG.md)
|
||||
|
||||
## Drivers / Clients
|
||||
@@ -16,7 +16,6 @@ to driver/client documentation
|
||||
* [execute-driver-plugin](packages/execute-driver-plugin/CHANGELOG.md)
|
||||
* [images-plugin](packages/images-plugin/CHANGELOG.md)
|
||||
* [relaxed-caps-plugin](packages/relaxed-caps-plugin/CHANGELOG.md)
|
||||
* [storage-plugin](packages/storage-plugin/CHANGELOG.md)
|
||||
* [universal-xml-plugin](packages/universal-xml-plugin/CHANGELOG.md)
|
||||
|
||||
## Other Modules
|
||||
@@ -31,6 +30,7 @@ to driver/client documentation
|
||||
* [opencv](packages/opencv/CHANGELOG.md)
|
||||
* [plugin-test-support](packages/plugin-test-support/CHANGELOG.md)
|
||||
* [schema](packages/schema/CHANGELOG.md)
|
||||
* [storage-plugin](packages/storage-plugin/CHANGELOG.md)
|
||||
* [strongbox](packages/strongbox/CHANGELOG.md)
|
||||
* [support](packages/support/CHANGELOG.md)
|
||||
* [test-support](packages/test-support/CHANGELOG.md)
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
### 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 community 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...)
|
||||
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
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
[](https://vshymanskyy.github.io/StandWithUkraine/)
|
||||
|
||||
<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">
|
||||
@@ -13,7 +15,6 @@
|
||||
[](https://npmjs.org/package/appium)
|
||||
[](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fappium%2Fappium?ref=badge_shield)
|
||||
[](https://github.com/vshymanskyy/StandWithUkraine/)
|
||||
[](https://www.unrwa.org/)
|
||||
|
||||
</div>
|
||||
|
||||
@@ -38,13 +39,18 @@ programming languages, which means there is an entire ecosystem of related softw
|
||||
* [__Clients__](#clients) allow writing Appium tests in your programming language of choice
|
||||
* [__Plugins__](#plugins) allow to further extend Appium functionality
|
||||
|
||||
## Upgrading From Older Versions
|
||||
## Migrating From Appium 1 to Appium 2
|
||||
|
||||
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:
|
||||
As of January 1st, 2022, the Appium team no longer maintains or supports Appium 1. All officially
|
||||
supported platform drivers are only compatible with Appium 2.
|
||||
|
||||
* [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/)
|
||||
__[Please read the Migration Guide](https://appium.io/docs/en/latest/guides/migrating-1-to-2/) if you
|
||||
are still using Appium 1.__
|
||||
|
||||
> [!WARNING]
|
||||
> If you use Appium Desktop or Appium Server GUI, you will not be able to upgrade to Appium 2, as
|
||||
both of these tools have been deprecated. Please use [Appium Inspector](https://github.com/appium/appium-inspector)
|
||||
in combination with a standalone Appium 2 server.
|
||||
|
||||
## Installation
|
||||
|
||||
@@ -133,7 +139,7 @@ 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/)
|
||||
where your client library expects it to listen. [Appium's command-line interface](http://appium.io/docs/en/latest/cli/args/)
|
||||
is used to launch and configure the server:
|
||||
|
||||
```bash
|
||||
@@ -198,16 +204,6 @@ contribution of project development and leadership!
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
|
||||
<picture>
|
||||
<source srcset="packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-dark.png" media="(prefers-color-scheme: dark)"/>
|
||||
<source srcset="packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-light.png" media="(prefers-color-scheme: light)"/>
|
||||
<img src="packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-dark.png" width="300" alt="LambdaTest"/>
|
||||
</picture>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
### Other Sponsors
|
||||
|
||||
A full list of sponsors is available at our [Sponsors page](https://appium.io/docs/en/latest/sponsors/).
|
||||
|
||||
+1
-1
@@ -3,4 +3,4 @@
|
||||
The old Appium 1.x docs used to be in this directory. Now, they are available only on the [1.x
|
||||
branch](https://github.com/appium/appium/tree/1.x/docs).
|
||||
|
||||
Current Appium docs are located in [packages/appium/docs](../packages/appium/docs) in this repo.
|
||||
Appium 2.x docs are located in [packages/appium/docs](../packages/appium/docs) in this repo.
|
||||
|
||||
+20
-27
@@ -4,32 +4,25 @@ This documentation is a note for the opencollective payout.
|
||||
|
||||
<img width="200" alt="Screenshot 2024-09-17 at 11 04 32 PM" src="https://github.com/user-attachments/assets/5d598a46-8aa3-41e0-aadc-ce3f34b10f6b">
|
||||
|
||||
2. Select `Appium` in `Who is paying`
|
||||
3. Select `Invite someone` and fill in a user name to pay payouts for
|
||||
4. Select `Invoice` for `Select the type of expense`
|
||||
5. Check the `I have read and understood the instructions and conditions` agreement
|
||||
6. Select `No, generate an invoice for me`
|
||||
- Keep blank for the `Additional invoice information (optional)`
|
||||
8. Fill in the description in the `Item Description`, date and amount for `Expense Items`
|
||||
- for TCs:
|
||||
- `<year-month> contribution as a TC https://github.com/appium/appium/blob/master/GOVERNANCE.md#the-technical-committee and maintaining Appium project itself (development, review etc)`
|
||||
- i.e. `2024-07 contribution as a TC https://github.com/appium/appium/blob/master/GOVERNANCE.md#the-technical-committee and maintaining Appium project itself (development, review etc)`
|
||||
- for individuals
|
||||
- `PR contribution: <PRs>` for PRs. `Community contribution in Q&A forum at https://discuss.appium.io/` for appium forums
|
||||
- E.g.
|
||||
- `PR contribution: https://github.com/appium/dotnet-client/pull/810, https://github.com/appium/dotnet-client/pull/808`
|
||||
- `PR contribution: https://github.com/appium/java-client/pull/2206, https://github.com/appium/java-client/pull/2203 and a few PRs`
|
||||
- `Community contribution in Q&A forum at https://discuss.appium.io/`
|
||||
- Translations
|
||||
- e.g.
|
||||
- `Translation contributions for https://crowdin.com/project/appium-documentation`
|
||||
- For Date
|
||||
- today
|
||||
- For Amount
|
||||
- Put the payment amount in USD
|
||||
9. Fill in title in `Title` in `Additional details`
|
||||
2. Select `Invoice`
|
||||
3. Type proper account name in `Who is being paid for this expense?`
|
||||
- The form depends on the target user
|
||||
4. Select `Next`
|
||||
5. Input expense info and complete the form. Then, the user will recieve the expense info.
|
||||
- Expense title: `<year-month> contribution payout`
|
||||
- e.g. `2024-07 contribution payout`
|
||||
10. Submit expense
|
||||
11. Update the expense url in our payout sheet
|
||||
12. Approve each expense after getting a response for each expense
|
||||
- Description in "Set invoice details"
|
||||
- for TCs:
|
||||
- `<year-month> contribution as a TC https://github.com/appium/appium/blob/master/GOVERNANCE.md#the-technical-committee and maintaining Appium project itself (development, review etc)`
|
||||
- i.e. `2024-07 contribution as a TC https://github.com/appium/appium/blob/master/GOVERNANCE.md#the-technical-committee and maintaining Appium project itself (development, review etc)`
|
||||
- for individuals
|
||||
- `PR contribution: <PRs>` for PRs. `Community contribution in Q&A forum at https://discuss.appium.io/` for appium forums
|
||||
- E.g.
|
||||
- `PR contribution: https://github.com/appium/dotnet-client/pull/810, https://github.com/appium/dotnet-client/pull/808`
|
||||
- `PR contribution: https://github.com/appium/java-client/pull/2206, https://github.com/appium/java-client/pull/2203 and a few PRs`
|
||||
- `Community contribution in Q&A forum at https://discuss.appium.io/`
|
||||
- Amount
|
||||
- Type the amount in `USD`
|
||||
6. Approve each expense after getting response for each expense
|
||||
|
||||
<img width="500" alt="Screenshot 2024-09-11 at 8 40 35 PM" src="https://github.com/user-attachments/assets/462cda69-1ce7-458c-b319-dda87cf10d65">
|
||||
|
||||
+20
-26
@@ -1,30 +1,24 @@
|
||||
import appiumConfig from '@appium/eslint-config-appium-ts';
|
||||
import {defineConfig, globalIgnores} from 'eslint/config';
|
||||
import tsConfig from '@appium/eslint-config-appium-ts';
|
||||
|
||||
// Create a modified config subset for test support files:
|
||||
// Extract the test file related configs (Mocha plugin and custom rules),
|
||||
// then override their 'files' property
|
||||
const testFileConfigItems = [appiumConfig[8], appiumConfig[9]];
|
||||
const testSupportFiles = [
|
||||
'packages/test-support/lib/**',
|
||||
'packages/driver-test-support/lib/**',
|
||||
'packages/plugin-test-support/lib/**',
|
||||
];
|
||||
const testSupportConfig = testFileConfigItems.map((item) => ({...item, files: testSupportFiles}));
|
||||
|
||||
export default defineConfig([
|
||||
{
|
||||
name: 'Base Config',
|
||||
extends: [appiumConfig],
|
||||
},
|
||||
export default [
|
||||
...tsConfig,
|
||||
{
|
||||
...tsConfig.find(({name}) => name === 'Test Files'),
|
||||
name: 'Test Support',
|
||||
extends: [testSupportConfig],
|
||||
files: [
|
||||
'packages/test-support/lib/**',
|
||||
'packages/driver-test-support/lib/**',
|
||||
'packages/plugin-test-support/lib/**',
|
||||
],
|
||||
},
|
||||
globalIgnores([
|
||||
'**/build-fixtures/**',
|
||||
'packages/appium/docs/**/assets/**',
|
||||
'packages/appium/docs/**/js/**',
|
||||
'packages/appium/sample-code/**',
|
||||
]),
|
||||
]);
|
||||
{
|
||||
name: 'Ignores',
|
||||
ignores: [
|
||||
'**/build-fixtures/**',
|
||||
'packages/appium/docs/**/assets/**',
|
||||
'packages/appium/docs/**/js/**',
|
||||
'packages/appium/sample-code/**',
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
"version": {
|
||||
"conventionalCommits": true,
|
||||
"createRelease": "github",
|
||||
"allowBranch": ["master", "appium3"]
|
||||
"allowBranch": "master"
|
||||
}
|
||||
},
|
||||
"ignoreChanges": ["**/test/**", "**/*.md"],
|
||||
|
||||
Generated
+18040
-6890
File diff suppressed because it is too large
Load Diff
+50
-47
@@ -62,8 +62,8 @@
|
||||
"start": "appium",
|
||||
"sync-pkgs": "run-p sync-pkgs:*",
|
||||
"sync-pkgs:appium-readme": "sync-monorepo-packages --force --no-package-json --packages=packages/appium README.md",
|
||||
"sync-pkgs:common-fields:default": "sync-monorepo-packages --packages=\"!packages/logger\" --fields=author,license,bugs,homepage",
|
||||
"sync-pkgs:common-fields:logger": "sync-monorepo-packages --packages=\"packages/logger\" --fields=author,bugs,homepage",
|
||||
"sync-pkgs:common-fields:default": "sync-monorepo-packages --packages=\"!packages/logger\" --fields=author,license,bugs,homepage,engines",
|
||||
"sync-pkgs:common-fields:logger": "sync-monorepo-packages --packages=\"packages/logger\" --fields=author,bugs,homepage,engines",
|
||||
"sync-pkgs:keywords": "sync-monorepo-packages --field=keywords --packages=\"packages/*\" --packages=\"!packages/types\" --packages=\"!packages/eslint-config-appium-ts\" ",
|
||||
"sync-pkgs:license": "sync-monorepo-packages --force --no-package-json --packages=\"!packages/logger\" LICENSE",
|
||||
"test": "run-s test:quick",
|
||||
@@ -85,79 +85,82 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@colors/colors": "1.6.0",
|
||||
"@eslint/js": "9.39.2",
|
||||
"@stylistic/eslint-plugin": "5.7.1",
|
||||
"@tsconfig/node20": "20.1.8",
|
||||
"@types/archiver": "7.0.0",
|
||||
"@eslint/js": "9.22.0",
|
||||
"@tsconfig/node14": "14.1.3",
|
||||
"@types/argparse": "2.0.17",
|
||||
"@types/archiver": "6.0.3",
|
||||
"@types/async-lock": "1.4.2",
|
||||
"@types/base64-stream": "1.0.5",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"@types/chai": "5.2.3",
|
||||
"@types/chai": "5.2.0",
|
||||
"@types/chai-as-promised": "8.0.2",
|
||||
"@types/express": "5.0.6",
|
||||
"@types/diff": "7.0.1",
|
||||
"@types/express": "5.0.0",
|
||||
"@types/jsftp": "2.1.5",
|
||||
"@types/json-schema": "7.0.15",
|
||||
"@types/klaw": "3.0.7",
|
||||
"@types/klaw": "3.0.6",
|
||||
"@types/lockfile": "1.0.4",
|
||||
"@types/lodash": "4.17.23",
|
||||
"@types/lodash": "4.17.16",
|
||||
"@types/method-override": "3.0.0",
|
||||
"@types/mocha": "10.0.10",
|
||||
"@types/mv": "2.1.4",
|
||||
"@types/ncp": "2.0.8",
|
||||
"@types/node": "24.10.9",
|
||||
"@types/node": "22.13.10",
|
||||
"@types/pluralize": "0.0.33",
|
||||
"@types/semver": "7.7.1",
|
||||
"@types/semver": "7.5.8",
|
||||
"@types/serve-favicon": "2.5.7",
|
||||
"@types/shell-quote": "1.7.5",
|
||||
"@types/sinon": "21.0.0",
|
||||
"@types/sinon": "17.0.4",
|
||||
"@types/sinon-chai": "4.0.0",
|
||||
"@types/source-map-support": "0.5.10",
|
||||
"@types/supports-color": "8.1.3",
|
||||
"@types/teen_process": "2.0.4",
|
||||
"@types/uuid": "10.0.0",
|
||||
"@types/which": "3.0.4",
|
||||
"@types/ws": "8.18.1",
|
||||
"@types/wrap-ansi": "3.0.0",
|
||||
"@types/ws": "8.18.0",
|
||||
"@types/xmldom": "0.1.34",
|
||||
"@types/yargs": "17.0.35",
|
||||
"asyncbox": "6.0.1",
|
||||
"chai": "6.2.2",
|
||||
"chai-as-promised": "8.0.2",
|
||||
"@types/yargs": "17.0.33",
|
||||
"asyncbox": "3.0.0",
|
||||
"chai": "5.2.0",
|
||||
"chai-as-promised": "8.0.1",
|
||||
"conventional-changelog-conventionalcommits": "7.0.2",
|
||||
"cpy-cli": "6.0.0",
|
||||
"cross-env": "10.1.0",
|
||||
"eslint": "9.39.2",
|
||||
"eslint-config-prettier": "10.1.8",
|
||||
"eslint-import-resolver-typescript": "4.4.4",
|
||||
"eslint-plugin-import-x": "4.16.1",
|
||||
"eslint-plugin-mocha": "11.2.0",
|
||||
"eslint-plugin-n": "17.23.2",
|
||||
"cpy-cli": "5.0.0",
|
||||
"cross-env": "7.0.3",
|
||||
"eslint": "9.22.0",
|
||||
"eslint-config-prettier": "10.1.1",
|
||||
"eslint-import-resolver-typescript": "3.9.1",
|
||||
"eslint-plugin-import": "2.31.0",
|
||||
"eslint-plugin-mocha": "10.5.0",
|
||||
"eslint-plugin-promise": "7.2.1",
|
||||
"finalhandler": "2.1.1",
|
||||
"get-port": "7.1.0",
|
||||
"finalhandler": "2.1.0",
|
||||
"get-port": "5.1.1",
|
||||
"json-schema-to-typescript": "15.0.4",
|
||||
"lerna": "9.0.3",
|
||||
"log-symbols": "7.0.1",
|
||||
"lerna": "8.2.1",
|
||||
"log-symbols": "4.1.0",
|
||||
"midnight-smoker": "8.0.0",
|
||||
"mjpeg-consumer": "2.0.0",
|
||||
"mjpeg-server": "0.3.1",
|
||||
"mocha": "11.7.5",
|
||||
"npm-run-all2": "8.0.4",
|
||||
"prettier": "3.8.1",
|
||||
"rewiremock": "3.14.6",
|
||||
"rimraf": "6.1.2",
|
||||
"serve-static": "2.2.1",
|
||||
"sinon": "21.0.1",
|
||||
"sinon-chai": "4.0.1",
|
||||
"mocha": "11.1.0",
|
||||
"npm-run-all2": "6.2.6",
|
||||
"prettier": "3.5.3",
|
||||
"rewiremock": "3.14.5",
|
||||
"rimraf": "5.0.10",
|
||||
"serve-static": "1.16.2",
|
||||
"sinon": "19.0.2",
|
||||
"sync-monorepo-packages": "1.0.2",
|
||||
"teen_process": "4.0.8",
|
||||
"ts-node": "10.9.2",
|
||||
"tsd": "0.33.0",
|
||||
"typescript": "5.9.3",
|
||||
"typescript-eslint": "8.53.1",
|
||||
"webdriverio": "9.23.2",
|
||||
"ws": "8.19.0",
|
||||
"tsd": "0.31.2",
|
||||
"typescript": "5.8.2",
|
||||
"typescript-eslint": "8.26.1",
|
||||
"validate.js": "0.13.1",
|
||||
"webdriverio": "9.12.0",
|
||||
"ws": "8.18.1",
|
||||
"yaml-js": "0.3.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
|
||||
"npm": ">=10"
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
"npm": ">=8"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
@@ -169,6 +172,6 @@
|
||||
"ajv-formats": {
|
||||
"ajv": "8.17.1"
|
||||
},
|
||||
"http-cache-semantics": "4.2.0"
|
||||
"http-cache-semantics": "4.1.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,129 +3,6 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [3.2.0](https://github.com/appium/appium/compare/appium@3.1.2...appium@3.2.0) (2026-01-26)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **appium:** Add repository links to verbose extensions list ([#21813](https://github.com/appium/appium/issues/21813)) ([ce91686](https://github.com/appium/appium/commit/ce91686852b0baab5f46990f5d40db4747922924))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** appium symlink behavior across drivers/plugins installations ([#21837](https://github.com/appium/appium/issues/21837)) ([529aeb4](https://github.com/appium/appium/commit/529aeb48f10419e21555cec05835ff07bb0e2e51))
|
||||
* apply npm run lint:fix ([#21867](https://github.com/appium/appium/issues/21867)) ([5e28714](https://github.com/appium/appium/commit/5e28714442cf59ee35b085e01e82c3f5483891fd))
|
||||
* **docs:** add missing verbose flag for CLI list command ([#21814](https://github.com/appium/appium/issues/21814)) ([dcfaa88](https://github.com/appium/appium/commit/dcfaa88830f6a5c608c92f5ae72445e065261d38))
|
||||
|
||||
|
||||
|
||||
## [3.1.2](https://github.com/appium/appium/compare/appium@3.1.1...appium@3.1.2) (2025-12-04)
|
||||
|
||||
**Note:** Version bump only for package appium
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.1.1](https://github.com/appium/appium/compare/appium@3.1.0...appium@3.1.1) (2025-11-12)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Inject symlinks for all installed extensions ([#21664](https://github.com/appium/appium/issues/21664)) ([8f5aac3](https://github.com/appium/appium/commit/8f5aac3722c9572d61f7e6bef20fe43bb14e0674))
|
||||
|
||||
|
||||
|
||||
## [3.1.0](https://github.com/appium/appium/compare/appium@3.0.2...appium@3.1.0) (2025-10-08)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add 21 WebDriver extension endpoints ([#21577](https://github.com/appium/appium/issues/21577)) ([7f906fc](https://github.com/appium/appium/commit/7f906fcf9a0dd84f348b0b3a79da818281f21835))
|
||||
* add inspector to plugins installed via `appium setup` ([#21578](https://github.com/appium/appium/issues/21578)) ([1753dcd](https://github.com/appium/appium/commit/1753dcd5e9f4ee3a9bd869f2e846a8a1c68b6970))
|
||||
* add W3C printPage endpoint ([#21576](https://github.com/appium/appium/issues/21576)) ([cbea4f2](https://github.com/appium/appium/commit/cbea4f2e97d2d291bd67fd98359b37caab1b21fa))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** fix base path handling in bidi ([#21611](https://github.com/appium/appium/issues/21611)) ([dad0757](https://github.com/appium/appium/commit/dad07575c9d754751160a53e0fb8053bbddac75b))
|
||||
|
||||
|
||||
|
||||
## [3.0.2](https://github.com/appium/appium/compare/appium@3.0.1...appium@3.0.2) (2025-09-09)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Return a non-zero exit code if an extension script execution fails ([#21563](https://github.com/appium/appium/issues/21563)) ([5d73a4f](https://github.com/appium/appium/commit/5d73a4fb49a39bd4b81f51763e62f4e52b650f06))
|
||||
|
||||
|
||||
|
||||
## [3.0.1](https://github.com/appium/appium/compare/appium@3.0.0...appium@3.0.1) (2025-08-20)
|
||||
|
||||
**Note:** Version bump only for package appium
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.0](https://github.com/appium/appium/compare/appium@3.0.0-rc.2...appium@3.0.0) (2025-08-18)
|
||||
|
||||
### Appium 3 Is Here! 🚀
|
||||
|
||||
[See the blog post](https://appium.io/docs/en/latest/blog/2025/08/07/-appium-3/)
|
||||
and [the migration guide](https://appium.io/docs/en/latest/guides/migrating-2-to-3/) for more details.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.0-rc.2](https://github.com/appium/appium/compare/appium@2.16.2...appium@3.0.0-rc.2) (2025-08-14)
|
||||
|
||||
|
||||
### ⚠ BREAKING CHANGES
|
||||
|
||||
* set minimum Node.js version to v20.19.0 (#21394)
|
||||
|
||||
### Features
|
||||
|
||||
* **appium:** add inspector in preset plugin ([#21114](https://github.com/appium/appium/issues/21114)) ([fdb5c7f](https://github.com/appium/appium/commit/fdb5c7fc4a4ec4078195f879d6c1e2e0e3397419))
|
||||
* **base-driver:** Make extension name prefix mandatory ([#21110](https://github.com/appium/appium/issues/21110)) ([9402291](https://github.com/appium/appium/commit/9402291f1c634bcb376ff69aef7a7b4d0628cbd4))
|
||||
* **base-driver:** Migrate errors to typescript ([#21157](https://github.com/appium/appium/issues/21157)) ([d904726](https://github.com/appium/appium/commit/d904726d56353365612c6e0a7dfdb209cc34132b))
|
||||
* **base-driver:** Remove dependency to validate.js ([#21175](https://github.com/appium/appium/issues/21175)) ([661c5d0](https://github.com/appium/appium/commit/661c5d0bd31f65690fe61c0e396833251c5bae84))
|
||||
* **base-driver:** Remove deprecated routes ([#21134](https://github.com/appium/appium/issues/21134)) ([4716f40](https://github.com/appium/appium/commit/4716f40226da0a1743f4e570a99c67ce9d581b50))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Add appium module symlink while installing extensions ([#21389](https://github.com/appium/appium/issues/21389)) ([1859ea1](https://github.com/appium/appium/commit/1859ea1c3efc37a3537f55bbfe06d6532b02d7e9))
|
||||
* use v3 syntax for winston ([#21363](https://github.com/appium/appium/issues/21363)) ([2c94133](https://github.com/appium/appium/commit/2c94133390d04f6160044a1c8bbb31f7925fced8))
|
||||
|
||||
|
||||
### Miscellaneous Chores
|
||||
|
||||
* set minimum Node.js version to v20.19.0 ([#21394](https://github.com/appium/appium/issues/21394)) ([37e22c4](https://github.com/appium/appium/commit/37e22c4f9c9920cea3f340841ab1b7c60e3147e9))
|
||||
|
||||
|
||||
|
||||
## [2.19.0](https://github.com/appium/appium/compare/appium@2.18.0...appium@2.19.0) (2025-06-01)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **appium:** implement GET /appium/sessions and deprecate GET /sessions ([#21233](https://github.com/appium/appium/issues/21233)) ([5f6bdfc](https://github.com/appium/appium/commit/5f6bdfc5dfbddab1782a4a86b450c9654ddbd65f))
|
||||
|
||||
|
||||
|
||||
## [2.18.0](https://github.com/appium/appium/compare/appium@2.17.1...appium@2.18.0) (2025-04-25)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **base-driver:** Accept `x-request-id` as override to generated requestId in `handleLogContext` ([#21154](https://github.com/appium/appium/issues/21154)) ([a82476f](https://github.com/appium/appium/commit/a82476f2fcb4aa3a3c4660d96fdd261a98afa4af))
|
||||
|
||||
|
||||
|
||||
## [2.17.1](https://github.com/appium/appium/compare/appium@2.17.0...appium@2.17.1) (2025-03-17)
|
||||
|
||||
**Note:** Version bump only for package appium
|
||||
|
||||
+13
-17
@@ -1,3 +1,5 @@
|
||||
[](https://vshymanskyy.github.io/StandWithUkraine/)
|
||||
|
||||
<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">
|
||||
@@ -13,7 +15,6 @@
|
||||
[](https://npmjs.org/package/appium)
|
||||
[](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fappium%2Fappium?ref=badge_shield)
|
||||
[](https://github.com/vshymanskyy/StandWithUkraine/)
|
||||
[](https://www.unrwa.org/)
|
||||
|
||||
</div>
|
||||
|
||||
@@ -38,13 +39,18 @@ programming languages, which means there is an entire ecosystem of related softw
|
||||
* [__Clients__](#clients) allow writing Appium tests in your programming language of choice
|
||||
* [__Plugins__](#plugins) allow to further extend Appium functionality
|
||||
|
||||
## Upgrading From Older Versions
|
||||
## Migrating From Appium 1 to Appium 2
|
||||
|
||||
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:
|
||||
As of January 1st, 2022, the Appium team no longer maintains or supports Appium 1. All officially
|
||||
supported platform drivers are only compatible with Appium 2.
|
||||
|
||||
* [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/)
|
||||
__[Please read the Migration Guide](https://appium.io/docs/en/latest/guides/migrating-1-to-2/) if you
|
||||
are still using Appium 1.__
|
||||
|
||||
> [!WARNING]
|
||||
> If you use Appium Desktop or Appium Server GUI, you will not be able to upgrade to Appium 2, as
|
||||
both of these tools have been deprecated. Please use [Appium Inspector](https://github.com/appium/appium-inspector)
|
||||
in combination with a standalone Appium 2 server.
|
||||
|
||||
## Installation
|
||||
|
||||
@@ -133,7 +139,7 @@ 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/)
|
||||
where your client library expects it to listen. [Appium's command-line interface](http://appium.io/docs/en/latest/cli/args/)
|
||||
is used to launch and configure the server:
|
||||
|
||||
```bash
|
||||
@@ -198,16 +204,6 @@ contribution of project development and leadership!
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
|
||||
<picture>
|
||||
<source srcset="packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-dark.png" media="(prefers-color-scheme: dark)"/>
|
||||
<source srcset="packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-light.png" media="(prefers-color-scheme: light)"/>
|
||||
<img src="packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-dark.png" width="300" alt="LambdaTest"/>
|
||||
</picture>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
### Other Sponsors
|
||||
|
||||
A full list of sponsors is available at our [Sponsors page](https://appium.io/docs/en/latest/sponsors/).
|
||||
|
||||
@@ -20,25 +20,13 @@ plugins:
|
||||
'ecosystem/build-drivers.md': 'developing/build-drivers.md'
|
||||
'ecosystem/build-plugins.md': 'developing/build-plugins.md'
|
||||
'ecosystem/build-docs.md': 'developing/build-docs.md'
|
||||
'reference/commands/base-driver.md': 'reference/api/index.md'
|
||||
'reference/commands/execute-driver-plugin.md': 'reference/api/plugins.md#execute-driver-plugin'
|
||||
'reference/commands/images-plugin.md': 'reference/api/plugins.md#images-plugin'
|
||||
'reference/commands/relaxed-caps-plugin.md': 'reference/api/plugins.md#relaxed-caps-plugin'
|
||||
'reference/commands/universal-xml-plugin.md': 'reference/api/plugins.md#universal-xml-plugin'
|
||||
'commands/index.md': 'reference/api/index.md'
|
||||
'commands/base-driver.md': 'reference/api/index.md'
|
||||
'commands/execute-driver-plugin.md': 'reference/api/plugins.md#execute-driver-plugin'
|
||||
'commands/images-plugin.md': 'reference/api/plugins.md#images-plugin'
|
||||
'commands/relaxed-caps-plugin.md': 'reference/api/plugins.md#relaxed-caps-plugin'
|
||||
'commands/storage-plugin.md': 'reference/api/plugins.md#storage-plugin'
|
||||
'commands/universal-xml-plugin.md': 'reference/api/plugins.md#universal-xml-plugin'
|
||||
'cli/index.md': 'reference/cli/index.md'
|
||||
'cli/args.md': 'reference/cli/server.md'
|
||||
'cli/env-vars.md': 'reference/cli/env-vars.md'
|
||||
'cli/extensions.md': 'reference/cli/extensions.md'
|
||||
'cli/setup.md': 'reference/cli/setup.md'
|
||||
'reference/commands/base-driver.md': 'commands/base-driver.md'
|
||||
'reference/commands/execute-driver-plugin.md': 'commands/execute-driver-plugin.md'
|
||||
'reference/commands/images-plugin.md': 'commands/images-plugin.md'
|
||||
'reference/commands/relaxed-caps-plugin.md': 'commands/relaxed-caps-plugin.md'
|
||||
'reference/commands/universal-xml-plugin.md': 'commands/universal-xml-plugin.md'
|
||||
'contributing/config-system.md': 'developing/config-system.md'
|
||||
'contributing/develop.md': 'contributing/index.md'
|
||||
'contributing/develop.md': 'contributing.md'
|
||||
|
||||
extra_css:
|
||||
- assets/stylesheets/extra.css
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
---
|
||||
authors:
|
||||
- sai
|
||||
- srini
|
||||
date: 2025-11-25
|
||||
---
|
||||
|
||||
# Announcing LambdaTest as Appium's Newest Development Partner
|
||||
|
||||
As part of our ongoing effort to recognize organizations that meaningfully support the Appium project through dedicated maintainer time, we are excited to welcome our newest Development Partner: LambdaTest!
|
||||
LambdaTest has long been an active participant in the automated testing ecosystem. Today, they are officially formalizing their commitment by investing people—dedicated engineers who will directly support Appium's development, maintenance, and ecosystem growth.
|
||||
This kind of hands-on contribution is crucial for ensuring Appium continues to evolve. We deeply value partners who empower their engineering teams to contribute code directly to open source rather than just sponsorship.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
<div style="text-align:center;width:100%">
|
||||
<a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-dark.png#only-dark" width="300" />
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-light.png#only-light" width="300" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
LambdaTest engineers are already contributing actively across several key Appium repositories. Their current focus includes:
|
||||
**appium-mcp** – Supporting Appium's implementation of the Model Context Protocol (MCP) to drive forward modern AI-assisted capabilities.
|
||||
**appium-remote-xpc** – Contributing to the native macOS/XPC-based remote execution layer, essential for iOS automation.
|
||||
**appium-tun-tap** – Assisting in the development and maintenance of network virtualization and tunneling components for advanced testing scenarios.
|
||||
|
||||
These contributions strengthen critical infrastructure within the Appium ecosystem and demonstrate LambdaTest's commitment to deep technical involvement in the project's evolution.
|
||||
About LambdaTest
|
||||
|
||||
LambdaTest’s platform already serves a massive community of Appium users. As a GenAI-powered Quality Engineering Platform, they provide a full-stack testing cloud with 10,000+ real mobile devices and 3,000+ browsers.
|
||||
Beyond standard infrastructure, they are pushing the boundaries of test execution with AI-native test management and next-generation agents like KaneAI. By supporting Appium alongside Selenium, Playwright, and other major frameworks, LambdaTest helps teams orchestrate intelligent automation at cloud scale.
|
||||
|
||||
LambdaTest will continue contributing people, code, and development expertise to strengthen Appium's core functionality. Their commitment represents a significant investment into the future of the framework, and we're thrilled to have them collaborating with us at this deeper level.
|
||||
The Appium project is proud to recognize LambdaTest as our newest official Development Partner. We can't wait to see what we'll build together!
|
||||
@@ -1,42 +0,0 @@
|
||||
---
|
||||
authors:
|
||||
- jlipps
|
||||
date: 2025-07-01
|
||||
---
|
||||
|
||||
# Announcing LambdaTest as Appium Strategic Partner
|
||||
|
||||
After recently celebrating the 1-year anniversary of our [Sponsorship Program and Compensation
|
||||
Scheme](https://appium.io/docs/en/latest/blog/2024/05/14/announcing-appiums-sponsorship-program/),
|
||||
the Appium project is very excited to announce that <a
|
||||
href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">LambdaTest</a>
|
||||
is coming on board as one of our Strategic Partners!
|
||||
|
||||
<!-- more -->
|
||||
|
||||
<div style="text-align:center;width:100%">
|
||||
<a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-dark.png#only-dark" width="300" />
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-light.png#only-light" width="300" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Having long been active in the Appium community and the automated testing industry, LambdaTest is
|
||||
now significantly stepping up their investment into these areas. With the decision to come on board
|
||||
as a Strategic Partner, LambdaTest will support the Appium project through financial contribution
|
||||
as well as contribution of code and project maintenance. Obviously, without the generous support of
|
||||
partners like LambdaTest, we would not be able to continue our contributor compensation scheme,
|
||||
which has seen the release of a substantial amount of funds to Appium maintainers and contributors
|
||||
over the last year. Thanks again to LambdaTest, and stay tuned for more collaboration updates
|
||||
throughout the year!
|
||||
|
||||
**About LambdaTest**
|
||||
|
||||
<em>LambdaTest is a GenAI-powered Quality Engineering Platform that empowers teams to test
|
||||
intelligently, smarter, and ship faster. Built for scale, it offers a full-stack testing cloud with
|
||||
10K+ real mobile devices and 3,000+ browsers. With AI-native test management, MCP servers, and
|
||||
agent-based automation, LambdaTest supports Selenium, Appium, Playwright, and all major frameworks.
|
||||
AI Agents like HyperExecute and KaneAI bring the power of AI and cloud into your software testing
|
||||
workflow, enabling seamless automation testing with 120+ integrations. LambdaTest Agents accelerate
|
||||
your testing throughout the entire SDLC, from test planning and authoring to automation,
|
||||
infrastructure, execution, RCA, and reporting.</em>
|
||||
@@ -1,40 +0,0 @@
|
||||
---
|
||||
authors:
|
||||
- sai
|
||||
- srini
|
||||
- jlipps
|
||||
date: 2025-08-07
|
||||
---
|
||||
|
||||
# 🚀 Appium 3
|
||||
|
||||
Appium 3 is here — and while it's not as massive a leap as Appium 2, it introduces a few essential
|
||||
breaking changes that developers and QA engineers should be aware of.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
The main idea behind Appium 3 is to clear out old cruft so that Appium can be leaner moving
|
||||
forward, and rely on newer versions of software with better performance and security
|
||||
characteristics. We're also getting rid of legacy behaviors and protocols that we deprecated as
|
||||
part of Appium 2.
|
||||
|
||||
For you as a user, there's not much to worry about. The breaking changes are minimal:
|
||||
|
||||
- Node.js / NPM minimum version bump (to 20.19 / 10)
|
||||
- Removal of certain deprecated endpoints
|
||||
- Security feature flag prefix requirements (e.g. `adb_shell` to `uiautomator2:adb_shell`)
|
||||
|
||||
In terms of new features, we've been adding them incrementally rather than saving them up for
|
||||
Appium 3. But with this release we are excited to share these new capabilities:
|
||||
|
||||
- `appium plugin install inspector` (Use Appium to host the Inspector rather than downloading it as a separate app)
|
||||
- Clients can set the `X-Appium-Is-Sensitive` HTTP header on requests to direct the server to mask the data in the request in the logs, so that when you send a password into an input box, the password's actual value is not logged in plaintext. ([Learn more](../../developing/sensitive.md))
|
||||
|
||||
Of course, we have a full [Appium 3 migration guide](../../guides/migrating-2-to-3.md) to make sure
|
||||
you know all the details and can deeply understand the consequences of upgrading to Appium 3 in
|
||||
your environment.
|
||||
|
||||
---
|
||||
|
||||
**Ready to make the leap?** Appium 3 is a great step forward in creating more secure, maintainable,
|
||||
and W3C-compliant test automation pipelines. Happy testing!
|
||||
@@ -0,0 +1,70 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Server Command-Line Arguments
|
||||
---
|
||||
|
||||
To start the Appium server, you may either run `appium` or `appium server`. The `server` subcommand
|
||||
is considered to be the default, so if you omit it, Appium will interpret this as your request to
|
||||
run the Appium server.
|
||||
|
||||
The invocation of `appium` (or `appium server`) can take a number of arguments, which are detailed
|
||||
below.
|
||||
|
||||
!!! note
|
||||
|
||||
All of these arguments can be set via a [Configuration File](../guides/config.md) instead if
|
||||
you want. Any arguments set on the command line will override any arguments found in
|
||||
a configuration file.
|
||||
|
||||
|
||||
|<div style="width:12em">Argument</div>|Description|Type|<div style="width:8em">Default</div>|Aliases|
|
||||
|--|--|--|--|--|
|
||||
|`--address`|IP address to listen on|string|`0.0.0.0`|`-a`|
|
||||
|`--allow-cors`|Whether the Appium server should allow web browser connections from any host|boolean|`false`||
|
||||
|`--allow-insecure`|Set which insecure features are allowed to run in this server's sessions. Features are defined on a driver level; see documentation for more details. Note that features defined via `--deny-insecure` will be disabled, even if also listed here. If string, a path to a text file containing policy or a comma-delimited list.|array<string>|`[]`||
|
||||
|`--base-path`|Base path to use as the prefix for all webdriver routes running on the server|string|`""`|`-pa`|
|
||||
|`--callback-address`|Callback IP address (default: same as `--address`)|string||`-ca`|
|
||||
|`--callback-port`|Callback port (default: same as `--port`) (Value must be between `1` and `65535`)|integer|`4723`|`-cp`|
|
||||
|`--config`|Path to an [Appium configuration JSON file](../guides/config.md)|string|||
|
||||
|`--debug-log-spacing`|Add exaggerated spacing in logs to help with visual inspection|boolean|`false`||
|
||||
|`--default-capabilities`|Set the default desired capabilities, which will be set on each session unless overridden by received capabilities. If a string, a path to a JSON file containing the capabilities, or raw JSON.|object||`-dc`|
|
||||
|`--deny-insecure`|Set which insecure features are not allowed to run in this server's sessions. Features are defined on a driver level; see documentation for more details. Features listed here will not be enabled even if also listed in `--allow-insecure`, and even if `--relaxed-security` is enabled. If string, a path to a text file containing policy or a comma-delimited list.|array<string>|`[]`||
|
||||
|`--driver`|Driver-specific configuration. Keys should correspond to driver package names|object|||
|
||||
|`--drivers-import-chunk-size`|The maximum amount of drivers that could be imported in parallel on server startup|number|`3`||
|
||||
|`--keep-alive-timeout`|Number of seconds the Appium server should apply as both the keep-alive timeout and the connection timeout for all requests. Setting this to `0` disables the timeout.|integer|`600`|`-ka`|
|
||||
|`--request-timeout`|Number of seconds the Appium server should apply for receiving the entire HTTP request from the client. A value of 0 disables the timeout. Set it to a non-zero value to protect against potential Denial-of-Service attacks in case the server is deployed without a reverse proxy in front. HTTP requests that are running longer than allowed by this timeout would be rejected with the status code 408.|integer|`3600`||
|
||||
|`--local-timezone`|Use local timezone for timestamps|boolean|`false`||
|
||||
|`--log`|Also send log output to this file|string||`-g`|
|
||||
|`--log-filters`|One or more log filtering rules|array|||
|
||||
|`--log-level`|Log level (console[:file]) (Value must be one of: `info`, `info:debug`, `info:info`, `info:warn`, `info:error`, `warn`, `warn:debug`, `warn:info`, `warn:warn`, `warn:error`, `error`, `error:debug`, `error:info`, `error:warn`, `error:error`, `debug`, `debug:debug`, `debug:info`, `debug:warn`, `debug:error`)|string|`debug`||
|
||||
|`--log-format`|Log format (Value must be to one of: `text`, `json`, `pretty_json`). If logs are printed as JSON then the text coloring is always disabled.|string|`text`||
|
||||
|`--log-no-colors`|Do not use color in console output|boolean|`false`||
|
||||
|`--log-timestamp`|Show timestamps in console output|boolean|`false`||
|
||||
|`--long-stacktrace`|Add long stack traces to log entries. Recommended for debugging only.|boolean|`false`||
|
||||
|`--no-perms-check`|Skip various permission checks on the server startup|boolean|`false`||
|
||||
|`--nodeconfig`|Path to configuration JSON file to register Appium as a node with Selenium Grid 3; otherwise the configuration itself|string|||
|
||||
|`--plugin`|Plugin-specific configuration. Keys should correspond to plugin package names|object|||
|
||||
|`--plugins-import-chunk-size`|The maximum amount of plugins that could be imported in parallel on server startup|number|`7`||
|
||||
|`--port`|Port to listen on (Value must be between `1` and `65535`)|integer|`4723`|`-p`|
|
||||
|`--relaxed-security`|Disable additional security checks, so it is possible to use some advanced features, provided by drivers supporting this option. Only enable it if all the clients are in the trusted network and it's not the case if a client could potentially break out of the session sandbox. Specific features can be overridden by using `--deny-insecure`|boolean|`false`||
|
||||
|`--session-override`|Enables session override (clobbering)|boolean|`false`||
|
||||
|`--ssl-cert-path`|Absolute path to the `.cert` file if TLS is used. Must be provided together with `--ssl-key-path`. See the [SSL/TLS/SPDY Support guide](../guides/tls.md) for details|string|||
|
||||
|`--ssl-key-path`|Absolute path to the `.key` file if TLS is used. Must be provided together with `--ssl-cert-path`. See the [SSL/TLS/SPDY Support guide](../guides/tls.md) for details|string|||
|
||||
|`--strict-caps`|Cause sessions to fail if desired caps are sent in that Appium does not recognize as valid for the selected device|boolean|`false`||
|
||||
|`--tmp`|Absolute path to directory Appium can use to manage temp files|string|Windows: `C:\Windows\Temp`<br>Others: `/tmp`||
|
||||
|`--trace-dir`|Absolute path to directory Appium can use to save iOS instrument traces|string|`<tmp>/appium-instruments`||
|
||||
|`--use-drivers`|A list of drivers to activate. By default, all installed drivers will be activated.|array<string>|`[]`||
|
||||
|`--use-plugins`|A list of plugins to activate. To activate all plugins, the value should be an array with a single item `"all"`.|array<string>|`[]`||
|
||||
|`--webhook`|Also send log output to this http listener|string||`-G`|
|
||||
|
||||
The following arguments are used for information retrieval, after which the server will automatically exit. They are therefore meant for reference or debug purposes.
|
||||
|
||||
|<div style="width:10em">Argument</div>|Description|Alias|
|
||||
|--|--|--|
|
||||
|`--help`|Print instructions on using the Appium command-line. This argument can also be used for any Appium subcommands.|`-h`|
|
||||
|`--show-build-info`|Print detailed information on the Appium server version||
|
||||
|`--show-config`|Print the current Appium server configuration details||
|
||||
|`--show-debug-info`|Print information on the current environment: details about the operating system, Node.js, and Appium itself||
|
||||
|`--version`|Print the Appium server version|`-v`|
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Server Environment Variables
|
||||
---
|
||||
|
||||
The primary way of configuring the Appium server is via [Command-Line Arguments](./args.md). However, some more
|
||||
advanced features are toggled or configured via environment variables. To set environment
|
||||
variables, refer to the documentation for your operating system and terminal. These are the
|
||||
environment variables that the Appium server understands:
|
||||
|
||||
|Variable |Description|
|
||||
|--------|-----------|
|
||||
|`APPIUM_HOME`|By default, Appium creates a directory called `.appium` in the home directory for your system user. You can adjust the directory with this variable, as detailed in the [Managing Extensions](../guides/managing-exts.md) guide.|
|
||||
|`APPIUM_TMP_DIR`|By default, Appium uses a random temporary directory for many of its operations. If you wish to use a specific directory, you may do so by including an absolute path as the value of this variable. The behaviour is equivalent to using the `--tmp` CLI arg.|
|
||||
|`APPIUM_PREFER_SYSTEM_UNZIP`|Set to `0` or `false` to request that Appium not use the `unzip` binary included on your system for unzipping downloaded apps or other artifacts. Instead it will use a JS-based unzip library. This could help on some systems with non-existent or non-standard `unzip` commands. Note that if unzipping fails using the system library, the fallback library will be attempted in any case, so setting this env var merely saves time in the event you know the system unzip will fail.|
|
||||
|`APPIUM_HOST`|Same as the `--address` CLI arg|
|
||||
|`APPIUM_PORT`|Same as the `--port` CLI arg|
|
||||
|`APPIUM_RELOAD_EXTENSIONS`|Set to `1` to cause Appium to re-require extensions when new sessions are created. This is mostly useful for [building extensions](../developing/build-drivers.md)|
|
||||
|`APPIUM_OMIT_PEER_DEPS`|Adds `--omit=peer` to all the NPM commands run internally by Appium. Mostly an internal feature.|
|
||||
|`APPIUM_APPS_CACHE_MAX_AGE`|Allows to set the maximum age (in minutes) for [cached applications](../guides/caching.md). The default value is `60 * 24` (24 hours). Do not set it to a lower number than the duration of a single session startup.|
|
||||
|`APPIUM_APPS_CACHE_MAX_ITEMS`|Allows to set the maximum amount of [cached applications](../guides/caching.md). The default value is `1024`. Do not set it to a lower number than the amount of apps in all parallel sessions per process.|
|
||||
|`APPIUM_APPS_CACHE_IGNORE_URL_QUERY`| If the above option is enabled then the 'search' part of the app URL will be cut off from cache keys. See the corresponding [feature request](https://discuss.appium.io/t/regarding-app-caching-when-using-aws-s3-presigned-urls/42713) for more details. Disabled by default.|
|
||||
@@ -0,0 +1,226 @@
|
||||
---
|
||||
title: Extension Command-Line Usage
|
||||
---
|
||||
|
||||
Appium allows for the flexible installation and management of various _extensions_, such as _drivers_
|
||||
(which provide Appium with the capability to automate a given platform) and _plugins_ (which can
|
||||
augment or alter the way individual Appium commands work). For a conceptual understanding of these
|
||||
entities, please review the [Introduction](../intro/index.md).
|
||||
|
||||
Management of drivers and plugins is handled by Appium's Extension CLI (command-line interface).
|
||||
|
||||
!!! note
|
||||
|
||||
This reference uses placeholders to refer to various options. Anywhere you see one of these
|
||||
placeholders in the reference, ensure you replace it with the correct type of actual content.
|
||||
|
||||
|Placeholder|Meaning|
|
||||
|--|--|
|
||||
|`<ext-type>`|"Extension type". It should be either `driver` or `plugin`. All the Extension CLI commands can be used with either drivers or plugins, so you must specify which type of extension will be used|
|
||||
|`<ext-name>`|"Extension name". This is the short name of the extension found in a call to `appium <ext-type> list`. This is distinct from the NPM package name of the extension or, in general, the "install spec" of the extension.|
|
||||
|`<install-spec>`|"Install specification". This refers to the string used to indicate what extension Appium should install.|
|
||||
|`<install-source>`|This refers to the method that Appium should use to install an extension.|
|
||||
|
||||
## Commands
|
||||
|
||||
All Extension CLI commands begin with `appium <ext-type>`, i.e., either `appium driver` or `appium
|
||||
plugin`.
|
||||
|
||||
All Extension CLI commands can take an optional `--json` argument, which will return the result of
|
||||
the command as a machine-readable JSON string rather than the standard output, which is colourized
|
||||
and tuned for human consumption.
|
||||
|
||||
### `doctor`
|
||||
|
||||
Run doctor checks for the given extension, which validate whether the extension has its prerequisites
|
||||
configured correctly. Note that not all extensions include doctor checks. See the
|
||||
[Building Doctor Checks](../developing/build-doctor-checks.md) tutorial for more details on
|
||||
how to create them.
|
||||
|
||||
Usage:
|
||||
|
||||
```
|
||||
appium <ext-type> doctor <ext-name>
|
||||
```
|
||||
|
||||
Required arguments:
|
||||
|
||||
- `<ext-type>`: must be `driver` or `plugin`
|
||||
- `<ext-name>`: the name of the extension whose doctor checks you want to run
|
||||
|
||||
Optional arguments:
|
||||
|
||||
- `--json`: return the result in JSON format
|
||||
|
||||
Example (run doctor checks for the UiAutomator2 driver):
|
||||
|
||||
```
|
||||
appium driver doctor uiautomator2
|
||||
```
|
||||
|
||||
### `install`
|
||||
|
||||
Install an extension. If successful, respond with the short name of the extension which can be used
|
||||
in other invocations of the Extension CLI. If the extension is a driver, also note which platforms
|
||||
may be used with the driver.
|
||||
|
||||
Usage:
|
||||
|
||||
```
|
||||
appium <ext-type> install <install-spec> [--source=<install-source>] [--package=<package-name>] [--json]
|
||||
```
|
||||
|
||||
Required arguments:
|
||||
|
||||
- `<ext-type>`: must be `driver` or `plugin`
|
||||
- `<install-spec>`: this is the name, location, and/or version of the extension you want to
|
||||
install. Its possible values are dependent on the `<install-source>` (see below).
|
||||
|
||||
Optional arguments:
|
||||
|
||||
- `--source`: this directs Appium where to find your extension. See below for a table of possible
|
||||
source types and corresponding install specification.
|
||||
- `--package`: when `<install-source>` is `git` or `github`, `--package` is required. It should be
|
||||
the Node.js package name of the extension. Without this information, Appium will not be able to
|
||||
find the installed package.
|
||||
- `--json`: return the result in JSON format
|
||||
|
||||
|Install source type|Behaviour|
|
||||
|--|--|
|
||||
|None|This is the default behaviour when no `--source` is used. In this case, Appium will look at `<install-spec>` and match it against the name of extensions available when running `appium <ext-type> list`, i.e., against the officially recognized extension names. If found, it will install that extension at the latest version via NPM|
|
||||
|`npm`|Install an extension based on its NPM package name. Here, `<install-spec>` must be the NPM package name with any additional NPM installation modifiers, like version (see below)|
|
||||
|`github`|Install an extension via a GitHub spec of the form `<org>/<repo>`|
|
||||
|`git`|Install an extension via a Git URL (e.g., `git+ssh://git-host.com/repo.git`)|
|
||||
|`local`|Install an extension via a local path. This must be a path to the directory where the Node.js package information for the driver is located.|
|
||||
|
||||
#### NPM-based `<install-spec>`
|
||||
|
||||
When Appium is installing an extension via NPM (as is the case when `--source` is either omitted or
|
||||
set to `npm`), the `<install-spec>` can be complex, and can include any kind of information allowed
|
||||
by `npm install`:
|
||||
|
||||
- `[@scope]/<name>`
|
||||
- `[@scope]/<name>@<version>`
|
||||
- `[@scope]/<name>@<tag>`
|
||||
- `[@scope]/<name>@<version range>`
|
||||
|
||||
#### Examples
|
||||
|
||||
- Install the latest XCUITest driver:
|
||||
|
||||
```
|
||||
appium driver install xcuitest
|
||||
```
|
||||
|
||||
- Install the XCUITest driver at version 4.11.1:
|
||||
|
||||
```
|
||||
appium driver install xcuitest@4.11.1
|
||||
```
|
||||
|
||||
- Install the `beta` version of the `@appium/fake-driver` from NPM:
|
||||
|
||||
```
|
||||
appium driver install --source=npm @appium/fake-driver@beta
|
||||
```
|
||||
|
||||
- Install a locally-developed plugin:
|
||||
|
||||
```
|
||||
appium plugin install --source=local /path/to/my/plugin
|
||||
```
|
||||
|
||||
### `list`
|
||||
|
||||
List installed and available extensions. "Available" extensions include those which are officially
|
||||
recognized by the Appium team, but you are not limited to installing only the extensions displayed
|
||||
in this list.
|
||||
|
||||
Usage:
|
||||
|
||||
```
|
||||
appium <ext-type> list [--installed] [--updates] [--json]
|
||||
```
|
||||
|
||||
Required arguments:
|
||||
|
||||
- `<ext-type>`: must be `driver` or `plugin`
|
||||
|
||||
Optional arguments:
|
||||
|
||||
- `--installed`: show only installed extensions, not installed plus available extensions
|
||||
- `--updates`: for extensions installed via NPM, display a message if there are any updates
|
||||
- `--json`: return the result in JSON format
|
||||
|
||||
### `run`
|
||||
|
||||
Run a script included in an extension package. Extension authors can include runnable scripts that
|
||||
assist with setup or perform other tasks. These scripts are given names (called the `<script-name>`
|
||||
in this reference) by extension authors and will generally be documented in extension
|
||||
documentation.
|
||||
|
||||
Usage:
|
||||
|
||||
```
|
||||
appium <ext-type> run <ext-name> [--json] <script-name> [script-args]
|
||||
```
|
||||
|
||||
Required arguments:
|
||||
|
||||
- `<ext-type>`: must be `driver` or `plugin`
|
||||
- `<ext-name>`: the name of the extension whose script you want to run
|
||||
- `<script-name>`: the name of the script the extension has published
|
||||
|
||||
Optional arguments:
|
||||
|
||||
- `script-args`: any arguments that Appium does not interpret as belonging to its own set of
|
||||
arguments will be passed along to the extension script
|
||||
- `--json`: return the result in JSON format
|
||||
|
||||
Example (run the `reset` script included with the UiAutomator2 driver):
|
||||
|
||||
```
|
||||
appium driver run uiautomator2 reset
|
||||
```
|
||||
|
||||
### `update`
|
||||
|
||||
Update one or more extensions that have been installed via NPM. By default, Appium will not
|
||||
automatically update any extension past a major version boundary, so as to prevent
|
||||
unintended breaking changes.
|
||||
|
||||
Usage:
|
||||
|
||||
```
|
||||
appium <ext-type> update <ext-name> [--unsafe] [--json]
|
||||
```
|
||||
|
||||
Required arguments:
|
||||
|
||||
- `<ext-type>`: must be `driver` or `plugin`
|
||||
- `<ext-name>`: the name of the extension to update, or the string `installed` (which will update
|
||||
all installed extensions)
|
||||
|
||||
Optional arguments:
|
||||
|
||||
- `--unsafe`: direct Appium to go ahead and update past a major version boundary
|
||||
- `--json`: return the result in JSON format
|
||||
|
||||
### `uninstall`
|
||||
|
||||
Remove an installed extension.
|
||||
|
||||
Usage:
|
||||
|
||||
```
|
||||
appium <ext-type> uninstall <ext-name> [--json]
|
||||
```
|
||||
|
||||
Required arguments:
|
||||
|
||||
- `<ext-type>`: must be `driver` or `plugin`
|
||||
- `<ext-name>`: the name of the extension to uninstall
|
||||
|
||||
Optional arguments:
|
||||
|
||||
- `--json`: return the result in JSON format
|
||||
@@ -0,0 +1,26 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Command-Line Overview
|
||||
---
|
||||
|
||||
Appium provides a command-line executable (`appium`), which will likely be your main way of interacting with
|
||||
the Appium server. This section of the Appium documentation describes how to use this executable.
|
||||
|
||||
To start off, you can run `appium -v` or `appium --version` to return the installed version,
|
||||
or run `appium -h` or `appium --help` to return the help message.
|
||||
|
||||
The main `appium` executable provides the following subcommands:
|
||||
|
||||
1. `appium server` (or simply `appium`) - launch an Appium server
|
||||
- [See here for accepted arguments](./args.md)
|
||||
- For advanced features, [see here for accepted environment variables](./env-vars.md)
|
||||
2. `appium driver` - manage Appium drivers
|
||||
- [See here for details](./extensions.md)
|
||||
3. `appium plugin` - manage Appium plugins
|
||||
- [See here for details](./extensions.md)
|
||||
4. `appium setup` - batch install a preset of drivers and plugins
|
||||
- [See here for details](./setup.md)
|
||||
|
||||
Like the main command, you can also run each subcommand with the `-h` or `--help` flag to learn more about it.
|
||||
@@ -0,0 +1,33 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Setup Command-Line Usage
|
||||
---
|
||||
|
||||
The `setup` command aims to simplify the initial procedure of setting up Appium. It allows to install
|
||||
multiple extensions (drivers/plugins) in one go, without the need to run
|
||||
`appium <ext-name> install <ext-name>` multiple times.
|
||||
|
||||
The command has several presets that can be used to install different sets of extensions.
|
||||
The presets are as follows:
|
||||
|
||||
|Preset|Installation Command|Included Drivers|Included Plugins|
|
||||
|--|--|--|--|
|
||||
|Mobile|`appium setup mobile` or `appium setup`|`uiautomator2`, `xcuitest`[^1], `espresso`|`images`|
|
||||
|Desktop application|`appium setup desktop`|`mac2`[^1], `windows`[^2]|`images`|
|
||||
|Desktop browser|`appium setup browser`|`safari`[^1], `gecko`, `chromium`|`images`|
|
||||
|
||||
Attempting to install a preset while already having one or more of its included extensions installed
|
||||
will only install the missing extensions.
|
||||
|
||||
Refer to the [Ecosystem documentation](../ecosystem/index.md) to learn more about the extensions
|
||||
listed above.
|
||||
|
||||
This commands also supports the functionality that allows to fully reset your Appium server
|
||||
deployment if you experience various configuration issues,
|
||||
for example, due to a failed upgrade attempt from an older Appium version, on server startup.
|
||||
By running `appium setup reset` the server would uninstall all installed drivers, plugins and their related manifest files from the currently used Appium home folder.
|
||||
|
||||
[^1]: Only installed if the host machine is running macOS.
|
||||
[^2]: Only installed if the host machine is running Windows.
|
||||
@@ -0,0 +1,562 @@
|
||||
# Driver: base-driver
|
||||
|
||||
### `createSession`
|
||||
|
||||
`POST` **`/session`**
|
||||
|
||||
Historically the first two arguments were reserved for JSONWP capabilities.
|
||||
Appium 2 has dropped the support of these, so now we only accept capability
|
||||
objects in W3C format and thus allow any of the three arguments to represent
|
||||
the latter.
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#new-session](https://w3c.github.io/webdriver/#new-session)
|
||||
|
||||
<!-- comment source: multiple -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `desiredCapabilities?` | `W3CDriverCaps`<`C`\> | the new session capabilities |
|
||||
| `requiredCapabilities?` | `W3CDriverCaps`<`C`\> | another place the new session capabilities could be sent (typically left undefined) |
|
||||
| `capabilities?` | `W3CDriverCaps`<`C`\> | another place the new session capabilities could be sent (typically left undefined) |
|
||||
|
||||
#### Response
|
||||
|
||||
`CreateResult`
|
||||
|
||||
The capabilities object representing the created session
|
||||
|
||||
### `deleteSession`
|
||||
|
||||
`DELETE` **`/session/:sessionId`**
|
||||
|
||||
Returns capabilities for the session and event history (if applicable)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Response
|
||||
|
||||
`SingularSessionData`<`C`, `SessionData`\>
|
||||
|
||||
A session data object
|
||||
|
||||
### `getSession`
|
||||
|
||||
`GET` **`/session/:sessionId`**
|
||||
|
||||
Returns capabilities for the session and event history (if applicable).
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
Please use `getAppiumSessionCapabilities` to get the session capabilities.
|
||||
Please use `getLogEvents` to get event history.
|
||||
|
||||
|
||||
<!-- comment source: multiple -->
|
||||
|
||||
#### Response
|
||||
|
||||
`SingularSessionData`<`C`, `SessionData`\>
|
||||
|
||||
A session data object
|
||||
|
||||
### `getAppiumSessionCapabilities`
|
||||
|
||||
`GET` **`/session/:sessionId/appium/capabilities`**
|
||||
|
||||
Returns capabilities for the session.
|
||||
|
||||
<!-- comment source: multiple -->
|
||||
|
||||
#### Response
|
||||
|
||||
`AppiumSessionCapabilities`
|
||||
|
||||
A session data object
|
||||
|
||||
### `findElement`
|
||||
|
||||
`POST` **`/session/:sessionId/element`**
|
||||
|
||||
Find a UI element given a locator strategy and a selector, erroring if it can't be found
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#find-element](https://w3c.github.io/webdriver/#find-element)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `using` | `string` | the locator strategy |
|
||||
| `value` | `string` | the selector to combine with the strategy to find the specific element |
|
||||
|
||||
#### Response
|
||||
|
||||
`Element`<`string`\>
|
||||
|
||||
The element object encoding the element id which can be used in element-related
|
||||
commands
|
||||
|
||||
### `findElementFromElement`
|
||||
|
||||
`POST` **`/session/:sessionId/element/:elementId/element`**
|
||||
|
||||
Find a UI element given a locator strategy and a selector, erroring if it can't be found. Only
|
||||
look for elements among the set of descendants of a given element
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#find-element-from-element](https://w3c.github.io/webdriver/#find-element-from-element)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `using` | `string` | the locator strategy |
|
||||
| `value` | `string` | the selector to combine with the strategy to find the specific element |
|
||||
|
||||
#### Response
|
||||
|
||||
`Element`<`string`\>
|
||||
|
||||
The element object encoding the element id which can be used in element-related
|
||||
commands
|
||||
|
||||
### `findElementFromShadowRoot`
|
||||
|
||||
`POST` **`/session/:sessionId/shadow/:shadowId/element`**
|
||||
|
||||
Find an element from a shadow root
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#find-element-from-shadow-root](https://w3c.github.io/webdriver/#find-element-from-shadow-root)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `using` | `string` | the locator strategy |
|
||||
| `value` | `string` | the selector to combine with the strategy to find the specific elements |
|
||||
|
||||
#### Response
|
||||
|
||||
`Element`<`string`\>
|
||||
|
||||
The element inside the shadow root matching the selector
|
||||
|
||||
### `findElements`
|
||||
|
||||
`POST` **`/session/:sessionId/elements`**
|
||||
|
||||
Find a a list of all UI elements matching a given a locator strategy and a selector
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#find-elements](https://w3c.github.io/webdriver/#find-elements)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `using` | `string` | the locator strategy |
|
||||
| `value` | `string` | the selector to combine with the strategy to find the specific elements |
|
||||
|
||||
#### Response
|
||||
|
||||
`Element`<`string`\>[]
|
||||
|
||||
A possibly-empty list of element objects
|
||||
|
||||
### `findElementsFromElement`
|
||||
|
||||
`POST` **`/session/:sessionId/element/:elementId/elements`**
|
||||
|
||||
Find a a list of all UI elements matching a given a locator strategy and a selector. Only
|
||||
look for elements among the set of descendants of a given element
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#find-elements-from-element](https://w3c.github.io/webdriver/#find-elements-from-element)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `using` | `string` | the locator strategy |
|
||||
| `value` | `string` | the selector to combine with the strategy to find the specific elements |
|
||||
|
||||
#### Response
|
||||
|
||||
`Element`<`string`\>[]
|
||||
|
||||
A possibly-empty list of element objects
|
||||
|
||||
### `findElementsFromShadowRoot`
|
||||
|
||||
`POST` **`/session/:sessionId/shadow/:shadowId/elements`**
|
||||
|
||||
Find elements from a shadow root
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#find-element-from-shadow-root](https://w3c.github.io/webdriver/#find-element-from-shadow-root)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `using` | `string` | the locator strategy |
|
||||
| `value` | `string` | the selector to combine with the strategy to find the specific elements |
|
||||
|
||||
#### Response
|
||||
|
||||
`Element`<`string`\>[]
|
||||
|
||||
A possibly empty list of elements inside the shadow root matching the selector
|
||||
|
||||
### `getLog`
|
||||
|
||||
`POST` **`/session/:sessionId/log`**
|
||||
|
||||
Get the log for a given log type.
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
Please use the `/session/:sessionId/se/log` endpoint instead
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `type` | `string` | Name/key of log type as defined in ILogCommands.supportedLogTypes. |
|
||||
|
||||
#### Response
|
||||
|
||||
`any`
|
||||
|
||||
### `getLog`
|
||||
|
||||
`POST` **`/session/:sessionId/se/log`**
|
||||
|
||||
Get the log for a given log type.
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `type` | `string` | Name/key of log type as defined in ILogCommands.supportedLogTypes. |
|
||||
|
||||
#### Response
|
||||
|
||||
`any`
|
||||
|
||||
### `getLogEvents`
|
||||
|
||||
`POST` **`/session/:sessionId/appium/events`**
|
||||
|
||||
Get a list of events that have occurred in the current session
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `type?` | `string` \| `string`[] | filter the returned events by including one or more types |
|
||||
|
||||
#### Response
|
||||
|
||||
`EventHistory` \| `Record`<`string`, `number`\>
|
||||
|
||||
The event history for the session
|
||||
|
||||
### `getLogTypes`
|
||||
|
||||
`GET` **`/session/:sessionId/log/types`**
|
||||
|
||||
Get available log types as a list of strings
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
Please use the `/session/:sessionId/se/log/types` endpoint instead
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Response
|
||||
|
||||
`string`[]
|
||||
|
||||
### `getLogTypes`
|
||||
|
||||
`GET` **`/session/:sessionId/se/log/types`**
|
||||
|
||||
Get available log types as a list of strings
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Response
|
||||
|
||||
`string`[]
|
||||
|
||||
### `getPageSource`
|
||||
|
||||
`GET` **`/session/:sessionId/source`**
|
||||
|
||||
Get the current page/app source as HTML/XML
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#get-page-source](https://w3c.github.io/webdriver/#get-page-source)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Response
|
||||
|
||||
`string`
|
||||
|
||||
The UI hierarchy in a platform-appropriate format (e.g., HTML for a web page)
|
||||
|
||||
### `getSessions`
|
||||
|
||||
`GET` **`/sessions`**
|
||||
|
||||
Get data for all sessions running on an Appium server
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Response
|
||||
|
||||
A list of session data objects.
|
||||
Each session data object will be returned with `id` and the session's capabilities as `capabilities` keys like an example below:
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id":"ba30c6da-c266-4734-8ddb-c16f5bb53e16",
|
||||
"capabilities":{ "platformName":"ios","browserName":"safari","automationName":"xcuitest","platformVersion":"17.2","deviceName":"iPhone 15" }
|
||||
},
|
||||
{
|
||||
"id":"1441110c-1ece-4e45-abbf-ebf404f45f0a",
|
||||
"capabilities":{ "platformName":"ios","browserName":"safari","automationName":"xcuitest","platformVersion":"17.0","deviceName":"iPhone 14" }
|
||||
},
|
||||
...
|
||||
]
|
||||
```
|
||||
|
||||
### `getSettings`
|
||||
|
||||
`GET` **`/session/:sessionId/appium/settings`**
|
||||
|
||||
Update the session's settings dictionary with a new settings object
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Response
|
||||
|
||||
``null``
|
||||
|
||||
### `updateSettings`
|
||||
|
||||
`POST` **`/session/:sessionId/appium/settings`**
|
||||
|
||||
Update the session's settings dictionary with a new settings object
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `settings` | `Settings` | A key-value map of setting names to values. Settings not named in the map will not have their value adjusted. |
|
||||
|
||||
#### Response
|
||||
|
||||
``null``
|
||||
|
||||
### `getStatus`
|
||||
|
||||
`GET` **`/status`**
|
||||
|
||||
**`Summary`**
|
||||
|
||||
Retrieve the server's current status.
|
||||
|
||||
**`Description`**
|
||||
|
||||
Returns information about whether a remote end is in a state in which it can create new sessions and can additionally include arbitrary meta information that is specific to the implementation.
|
||||
|
||||
The readiness state is represented by the ready property of the body, which is false if an attempt to create a session at the current time would fail. However, the value true does not guarantee that a New Session command will succeed.
|
||||
|
||||
Implementations may optionally include additional meta information as part of the body, but the top-level properties ready and message are reserved and must not be overwritten.
|
||||
|
||||
<!-- comment source: builtin-interface -->
|
||||
|
||||
#### Examples
|
||||
|
||||
<!-- BEGIN:EXAMPLES -->
|
||||
##### JavaScript
|
||||
<!-- BEGIN:EXAMPLE lang=JavaScript -->
|
||||
|
||||
```js
|
||||
// webdriver.io example
|
||||
await driver.status();
|
||||
```
|
||||
|
||||
<!-- END:EXAMPLE -->
|
||||
##### Python
|
||||
<!-- BEGIN:EXAMPLE lang=Python -->
|
||||
|
||||
```python
|
||||
driver.get_status()
|
||||
```
|
||||
|
||||
<!-- END:EXAMPLE -->
|
||||
##### Java
|
||||
<!-- BEGIN:EXAMPLE lang=Java -->
|
||||
|
||||
```java
|
||||
driver.getStatus();
|
||||
```
|
||||
|
||||
<!-- END:EXAMPLE -->
|
||||
##### Ruby
|
||||
<!-- BEGIN:EXAMPLE lang=Ruby -->
|
||||
|
||||
```ruby
|
||||
# ruby_lib example
|
||||
remote_status
|
||||
|
||||
# ruby_lib_core example
|
||||
@driver.remote_status
|
||||
```
|
||||
|
||||
<!-- END:EXAMPLE -->
|
||||
<!-- END:EXAMPLES -->
|
||||
|
||||
#### Response
|
||||
|
||||
`Object`
|
||||
|
||||
### `getTimeouts`
|
||||
|
||||
`GET` **`/session/:sessionId/timeouts`**
|
||||
|
||||
Set the various timeouts associated with a session
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#set-timeouts](https://w3c.github.io/webdriver/#set-timeouts)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Response
|
||||
|
||||
``null``
|
||||
|
||||
### `timeouts`
|
||||
|
||||
`POST` **`/session/:sessionId/timeouts`**
|
||||
|
||||
Set the various timeouts associated with a session
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#set-timeouts](https://w3c.github.io/webdriver/#set-timeouts)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `type?` | `string` | used only for the old (JSONWP) command, the type of the timeout |
|
||||
| `ms?` | `string` \| `number` | used only for the old (JSONWP) command, the ms for the timeout |
|
||||
| `script?` | `number` | the number in ms for the script timeout, used for the W3C command |
|
||||
| `pageLoad?` | `number` | the number in ms for the pageLoad timeout, used for the W3C command |
|
||||
| `implicit?` | `string` \| `number` | the number in ms for the implicit wait timeout, used for the W3C command |
|
||||
|
||||
#### Response
|
||||
|
||||
``null``
|
||||
|
||||
### `implicitWait`
|
||||
|
||||
`POST` **`/session/:sessionId/timeouts/implicit_wait`**
|
||||
|
||||
Set the implicit wait timeout
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
Please use the `/session/:sessionId/timeouts` endpoint instead
|
||||
|
||||
Use `timeouts` instead
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `ms` | `string` \| `number` | the timeout in ms |
|
||||
|
||||
#### Response
|
||||
|
||||
``null``
|
||||
|
||||
### `logCustomEvent`
|
||||
|
||||
`POST` **`/session/:sessionId/appium/log_event`**
|
||||
|
||||
Add a custom-named event to the Appium event log
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `vendor` | `string` | the name of the vendor or tool the event belongs to, to namespace the event |
|
||||
| `event` | `string` | the name of the event itself |
|
||||
|
||||
#### Response
|
||||
|
||||
``null``
|
||||
|
||||
### `reset`
|
||||
|
||||
`POST` **`/session/:sessionId/appium/app/reset`**
|
||||
|
||||
Reset the current session (run the delete session and create session subroutines)
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
Please use each driver's launch, activate, terminate or cleanup method.
|
||||
|
||||
Use explicit session management commands instead
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Response
|
||||
|
||||
``null``
|
||||
@@ -0,0 +1,22 @@
|
||||
# Plugin: execute-driver
|
||||
|
||||
### `executeDriverScript`
|
||||
|
||||
`POST` **`/session/:sessionId/appium/execute_driver`**
|
||||
|
||||
Implementation of a command within a plugin
|
||||
|
||||
At minimum, `D` must be `ExternalDriver`, but a plugin can be more narrow about which drivers it supports.
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type |
|
||||
| :------ | :------ |
|
||||
| `script` | [script: string, scriptType: string, timeoutMs: number] |
|
||||
| `type?` | [script: string, scriptType: string, timeoutMs: number] |
|
||||
|
||||
#### Response
|
||||
|
||||
`unknown`
|
||||
@@ -0,0 +1,89 @@
|
||||
# Plugin: images
|
||||
|
||||
### `compareImages`
|
||||
|
||||
`POST` **`/session/:sessionId/appium/compare_images`**
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type |
|
||||
| :------ | :------ |
|
||||
| `mode` | `any`[] |
|
||||
| `options?` | `any`[] |
|
||||
|
||||
#### Response
|
||||
|
||||
`ComparisonResult`
|
||||
|
||||
### `findElement`
|
||||
|
||||
`POST` **`/session/:sessionId/element`**
|
||||
|
||||
Find a UI element given a locator strategy and a selector, erroring if it can't be found
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#find-element](https://w3c.github.io/webdriver/#find-element)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `using` | `any` | the locator strategy |
|
||||
| `value` | `any` | the selector to combine with the strategy to find the specific element |
|
||||
|
||||
#### Response
|
||||
|
||||
`any`
|
||||
|
||||
The element object encoding the element id which can be used in element-related
|
||||
commands
|
||||
|
||||
### `findElements`
|
||||
|
||||
`POST` **`/session/:sessionId/elements`**
|
||||
|
||||
Find a a list of all UI elements matching a given a locator strategy and a selector
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#find-elements](https://w3c.github.io/webdriver/#find-elements)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `using` | `any` | the locator strategy |
|
||||
| `value` | `any` | the selector to combine with the strategy to find the specific elements |
|
||||
|
||||
#### Response
|
||||
|
||||
`any`
|
||||
|
||||
A possibly-empty list of element objects
|
||||
|
||||
### `performActions`
|
||||
|
||||
`POST` **`/session/:sessionId/actions`**
|
||||
|
||||
If the actions contains image elements as origin, convert them to viewport coordinates before sending it to the external driver
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#perform-actions](https://w3c.github.io/webdriver/#perform-actions)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `actions` | `ActionSequence[]` | an array of action sequences |
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
@@ -0,0 +1,25 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Intro to Commands
|
||||
---
|
||||
|
||||
Here you can find various commands exposed by the main Appium module through its base driver, as
|
||||
well as the commands available in several plugins.
|
||||
|
||||
!!! note
|
||||
|
||||
The Appium base driver only exposes a few commands, as it is not meant to be used on its own.
|
||||
Please refer to the documentation of your [Appium driver](../ecosystem/drivers.md) to learn
|
||||
about the commands it exposes, and then check your [Appium client](../ecosystem/clients.md)
|
||||
documentation for the exact syntax of that command.
|
||||
|
||||
The command listings can be found here:
|
||||
|
||||
* [Base Driver](./base-driver.md)
|
||||
* [Execute Driver Plugin](./execute-driver-plugin.md)
|
||||
* [Images Plugin](./images-plugin.md)
|
||||
* [Relaxed Caps Plugin](./relaxed-caps-plugin.md)
|
||||
* [Storage Plugin](./storage-plugin.md)
|
||||
* [Universal XML Plugin](./universal-xml-plugin.md)
|
||||
@@ -0,0 +1,27 @@
|
||||
# Plugin: relaxed-caps
|
||||
|
||||
### `createSession`
|
||||
|
||||
`POST` **`/session`**
|
||||
|
||||
Start a new automation session
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#new-session](https://w3c.github.io/webdriver/#new-session)
|
||||
|
||||
<!-- comment source: multiple -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `desiredCapabilities?` | `any` | the new session capabilities |
|
||||
| `requiredCapabilities?` | `any` | another place the new session capabilities could be sent (typically left undefined) |
|
||||
| `capabilities?` | `any` | another place the new session capabilities could be sent (typically left undefined) |
|
||||
|
||||
#### Response
|
||||
|
||||
`any`
|
||||
|
||||
The capabilities object representing the created session
|
||||
@@ -0,0 +1,113 @@
|
||||
# Plugin: storage
|
||||
|
||||
!!! tip
|
||||
|
||||
All these commands can be invoked without creating a session, allowing you to
|
||||
prepare your test environment in advance.
|
||||
|
||||
### `addStorageItem`
|
||||
|
||||
`POST` **`/storage/add`**
|
||||
|
||||
Add a new file to the storage
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `name` | `string` | the name used to save the file (must not include path separator characters) |
|
||||
| `sha1` | `string` | SHA1 hash of the file to be uploaded |
|
||||
|
||||
#### Example
|
||||
|
||||
```bash
|
||||
curl -X POST --header "Content-Type: application/json" --data '{"name":"app.ipa","sha1":"ccc963411b2621335657963322890305ebe96186"}' http://127.0.0.1:4723/storage/add
|
||||
```
|
||||
|
||||
#### Response
|
||||
|
||||
`AddRequestResult`
|
||||
|
||||
A JSON object in the following format:
|
||||
```json
|
||||
{
|
||||
"ws": {
|
||||
"stream": "/storage/add/ccc963411b2621335657963322890305ebe96186/stream",
|
||||
"events": "/storage/add/ccc963411b2621335657963322890305ebe96186/events"
|
||||
},
|
||||
"ttlMs": 300000
|
||||
}
|
||||
```
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `ws.stream` | `string` | the pathname of the streaming web socket used to upload the file content |
|
||||
| `ws.events` | `string` | the pathname of the events web socket used to notify about upload success or a failure |
|
||||
| `ttlMs` | `number` | the amount of milliseconds both web sockets will be kept active before they expire, or a file payload would be successfully uploaded |
|
||||
|
||||
|
||||
### `listStorageItems`
|
||||
|
||||
`GET` **`/storage/list`**
|
||||
|
||||
List all files present in the storage
|
||||
|
||||
#### Example
|
||||
|
||||
```bash
|
||||
curl http://127.0.0.1:4723/storage/list
|
||||
```
|
||||
|
||||
#### Response
|
||||
|
||||
`List<StorageItem>`
|
||||
|
||||
A list of items, where each item has the following properties:
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `name` | `string` | the name of the file in the storage |
|
||||
| `path` | `string` | full path to the file on the remote file system |
|
||||
| `size` | `number` | file size in bytes |
|
||||
|
||||
### `deleteStorageItem`
|
||||
|
||||
`POST` **`/storage/delete`**
|
||||
|
||||
Deletes a file in the storage with the specified name
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `name` | `string` | the name of the file to be deleted |
|
||||
|
||||
#### Example
|
||||
|
||||
```bash
|
||||
curl -X POST --header "Content-Type: application/json" --data '{"name":"app.ipa"}' http://127.0.0.1:4723/storage/delete
|
||||
```
|
||||
|
||||
#### Response
|
||||
|
||||
`boolean`
|
||||
|
||||
`false` if the file does not exist in the storage, or `true` upon successful file deletion
|
||||
|
||||
### `resetStorage`
|
||||
|
||||
`POST` **`/storage/reset`**
|
||||
|
||||
Deletes all uploaded files and stops any incomplete uploads.
|
||||
If the `APPIUM_STORAGE_KEEP_ALL` flag is enabled, all uploaded files will be preserved,
|
||||
and only the incomplete uploads will be stopped.
|
||||
|
||||
#### Example
|
||||
|
||||
```bash
|
||||
curl -X POST http://127.0.0.1:4723/storage/reset
|
||||
```
|
||||
|
||||
#### Response
|
||||
|
||||
`undefined`
|
||||
@@ -0,0 +1,68 @@
|
||||
# Plugin: universal-xml
|
||||
|
||||
### `findElement`
|
||||
|
||||
`POST` **`/session/:sessionId/element`**
|
||||
|
||||
Find a UI element given a locator strategy and a selector, erroring if it can't be found
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#find-element](https://w3c.github.io/webdriver/#find-element)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `using` | `any`[] | the locator strategy |
|
||||
|
||||
#### Response
|
||||
|
||||
`any`
|
||||
|
||||
The element object encoding the element id which can be used in element-related
|
||||
commands
|
||||
|
||||
### `findElements`
|
||||
|
||||
`POST` **`/session/:sessionId/elements`**
|
||||
|
||||
Find a a list of all UI elements matching a given a locator strategy and a selector
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#find-elements](https://w3c.github.io/webdriver/#find-elements)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :------ | :------ | :------ |
|
||||
| `using` | `any`[] | the locator strategy |
|
||||
|
||||
#### Response
|
||||
|
||||
`any`
|
||||
|
||||
A possibly-empty list of element objects
|
||||
|
||||
### `getPageSource`
|
||||
|
||||
`GET` **`/session/:sessionId/source`**
|
||||
|
||||
Get the current page/app source as HTML/XML
|
||||
|
||||
**`See`**
|
||||
|
||||
[https://w3c.github.io/webdriver/#get-page-source](https://w3c.github.io/webdriver/#get-page-source)
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Response
|
||||
|
||||
`string`
|
||||
|
||||
The UI hierarchy in a platform-appropriate format (e.g., HTML for a web page)
|
||||
@@ -170,7 +170,7 @@ This is the most normal behavior for Appium plugins -- to modify or replace the
|
||||
more commands that would normally be handled by the active driver. To override the default command
|
||||
handling, you need to implement `async` methods in your class with the same name as the Appium
|
||||
commands to be handled (just exactly how [drivers themselves are
|
||||
implemented](./build-drivers.md#implement-webdriver-classic-commands)). Curious what command names there
|
||||
implemented](./build-drivers.md#implement-webdriver-commands)). Curious what command names there
|
||||
are? They are defined in the Appium base driver's
|
||||
[routes.js](https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js) file,
|
||||
and of course you can add more as defined in the next section.
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
title: Appium's Config System
|
||||
---
|
||||
|
||||
Appium includes support for [configuration files](../guides/config.md). A configuration file is
|
||||
intended to have (nearly) 1:1 parity with command-line arguments. An end user can supply Appium with
|
||||
Appium 2 supports [configuration files](../guides/config.md). A configuration file is intended to
|
||||
have (nearly) 1:1 parity with command-line arguments. An end user can supply Appium 2 with
|
||||
a configuration file, CLI args, or both (the args have precedence over the config file).
|
||||
|
||||
This document will be a technical overview of how the configuration system works. It is intended
|
||||
@@ -42,7 +42,7 @@ to its documentation for more information about the search paths. Additionally,
|
||||
support for config files written in YAML via the package [`yaml`](https://npm.im/yaml).
|
||||
|
||||
If a config file is found and successfully [validated](#validation), the result will be merged with
|
||||
a set of defaults and any additional CLI arguments. CLI arguments have precedence over config
|
||||
a set of defaults and any additionall CLI arguments. CLI arguments have precedence over config
|
||||
files, and config files have precedence over defaults.
|
||||
|
||||
## Validation
|
||||
@@ -203,7 +203,7 @@ desired.
|
||||
Any property defined in the schema having type `array` will _automatically_ uses the `csv`
|
||||
transformer. Likewise, a property having type `object` will use the `json` transformer. It's
|
||||
conceivable that `array` may want to use the `json` transformer, but otherwise, the presence of
|
||||
the `appiumCliTransformer` keyword on an `array`-or-`object`-typed property is not strictly
|
||||
the `appiumCliTransformer` keyword on an `array`-or-`object`-typed property is not stricly
|
||||
necessary.
|
||||
|
||||
The adapter (remember the adapter?) creates a pipeline function including a special "CSV
|
||||
@@ -250,7 +250,7 @@ An `ArgSpec` object stores the following metadata:
|
||||
| `dest` | Property name in parsed arguments object (as returned by `argparse`'s `parse_args()`) |
|
||||
| `defaultValue?` | Value of the `default` keyword in schema, if appropriate |
|
||||
|
||||
When a schema is [finalized](#schema-loading), the `Map` is populated with `ArgSpec` objects
|
||||
When a schema is [finalized](#schema-finalization), the `Map` is populated with `ArgSpec` objects
|
||||
for all known arguments.
|
||||
|
||||
So when the adapter is creating the pipeline of functions for the argument's `type`, it already has
|
||||
@@ -323,7 +323,7 @@ One of the design goals of this system is the following:
|
||||
_An extension should be able to register custom CLI arguments with the Appium, and a user should be
|
||||
able to use them like any other argument_.
|
||||
|
||||
Previously, Appium accepted arguments in this manner (via `--driverArgs`), but validation was
|
||||
Previously, Appium 2 accepted arguments in this manner (via `--driverArgs`), but validation was
|
||||
hand-rolled and required extension implementors to use a custom API. It also required the user to
|
||||
awkwardly pass a JSON string as the configuration on the command-line. Further, no contextual help
|
||||
(via `--help`) existed for these arguments.
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Developing Appium Extensions
|
||||
title: Intro to Development
|
||||
---
|
||||
|
||||
Appium is built with a modular structure, which means that Appium extensions (drivers and plugins)
|
||||
Appium 2 is built with a modular structure, which means that Appium extensions (drivers and plugins)
|
||||
are decoupled from the main Appium module, and you only need to install the extensions that you
|
||||
want to use. This modular structure also unlocks the ability to develop entirely new extensions!
|
||||
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Masking Sensitive Log Data
|
||||
---
|
||||
|
||||
Since Appium server version 2.18.0 there is a possibility to mask sensitive
|
||||
values in logs. The below tutorial explains how to use this feature in third-party
|
||||
extensions.
|
||||
|
||||
## Why It Might Be Useful
|
||||
|
||||
It is the right call to hide sensitive information, like passwords, tokens, etc.
|
||||
from server logs, so it does not accidentally leak if these logs end up in wrong hands.
|
||||
Appium server already provides a way to manipulate logs records via
|
||||
[filtering](../guides/log-filters.md), although it has its own limitations.
|
||||
The current approach is more sophisticated though, and requires some fine-tuning
|
||||
on the driver/plugin side.
|
||||
|
||||
## How To
|
||||
|
||||
The assumption is that your extension uses the standard built-in
|
||||
[@appium/logger](https://www.npmjs.com/package/@appium/logger).
|
||||
In order to get some value in logs replaced by a generic mask it is necessary:
|
||||
|
||||
- Change the logging expression to wrap sensitive values and format them, for example:
|
||||
|
||||
```js
|
||||
this.log.info(`Value: ${value}`);
|
||||
```
|
||||
|
||||
becomes
|
||||
|
||||
```js
|
||||
import {logger} from '@appium/support';
|
||||
|
||||
this.log.info('Value: %s', logger.markSensitive(value));
|
||||
```
|
||||
|
||||
The formatting happens via the standard Node.js's
|
||||
[util.format](https://nodejs.org/api/util.html#utilformatformat-args) API.
|
||||
|
||||
- While sending the appropriate server request, where this log line is used and should be masked,
|
||||
add the custom header `X-Appium-Is-Sensitive` with its value set to `1` or `true` (case-insensitive).
|
||||
Without such header the above log value is not going to be masked.
|
||||
This way it is possible to conditionally mask log records depending on which
|
||||
request is being handled by the extension if the log expression is used in the
|
||||
common section.
|
||||
@@ -1,4 +1,7 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Appium Clients
|
||||
---
|
||||
|
||||
@@ -6,127 +9,35 @@ You need a client to write and run Appium scripts. You'll want to become very
|
||||
familiar with your client documentation (as well as the documentation of any Selenium client that
|
||||
the Appium client depends on) since that will be your primary interface to Appium.
|
||||
|
||||
To learn more about clients, check out the [Client Intro](../intro/clients.md).
|
||||
To learn more about clients, read our [Client Intro](../intro/clients.md).
|
||||
|
||||
!!! note
|
||||
|
||||
If you maintain an Appium client that you would like to be listed here, feel free to create a PR!
|
||||
|
||||
## Official Clients
|
||||
### Official Clients
|
||||
|
||||
These clients are currently maintained by the Appium team:
|
||||
|
||||
### [Java Client](https://github.com/appium/java-client)
|
||||
|Client|Language|
|
||||
|-|-|
|
||||
|[Appium Java client](https://github.com/appium/java-client)|Java|
|
||||
|[Appium Python client](https://github.com/appium/python-client)|Python|
|
||||
|[Appium Ruby Core client](https://github.com/appium/ruby_lib_core) (Recommended)<br>[Appium Ruby client](https://github.com/appium/ruby_lib)|Ruby|
|
||||
|[Appium .NET client](https://github.com/appium/dotnet-client)|C#|
|
||||
|
||||
Language: :fontawesome-brands-java: Java
|
||||
### Other Clients
|
||||
|
||||
=== "Setup With Maven"
|
||||
These clients are not maintained by the Appium team and can be used with other languages:
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>io.appium</groupId>
|
||||
<artifactId>java-client</artifactId>
|
||||
<version>${version.you.require}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
```
|
||||
=== "Setup With Gradle"
|
||||
|
||||
```groovy
|
||||
dependencies {
|
||||
testImplementation 'io.appium:java-client:${version.you.require}'
|
||||
}
|
||||
```
|
||||
|
||||
### [Python Client](https://github.com/appium/python-client)
|
||||
|
||||
Language: :fontawesome-brands-python: Python
|
||||
|
||||
```sh title="Install From PyPi"
|
||||
pip install Appium-Python-Client
|
||||
```
|
||||
|
||||
### [Ruby Core Client](https://github.com/appium/ruby_lib_core)
|
||||
|
||||
Language: :material-language-ruby: Ruby
|
||||
|
||||
```sh title="Install From RubyGems"
|
||||
gem install appium_lib_core
|
||||
```
|
||||
|
||||
### [Ruby Client](https://github.com/appium/ruby_lib)
|
||||
|
||||
Language: :material-language-ruby: Ruby
|
||||
|
||||
This client is a wrapper for the Ruby Core Client with several helper methods, though this may
|
||||
add additional complexity, therefore the Ruby Core Client is recommended instead.
|
||||
|
||||
```sh title="Install From RubyGems"
|
||||
gem install appium_lib
|
||||
```
|
||||
|
||||
### [.NET Client](https://github.com/appium/dotnet-client)
|
||||
|
||||
Language: :simple-dotnet: C#
|
||||
|
||||
```sh title="Install Using .NET CLI"
|
||||
dotnet add package Appium.WebDriver
|
||||
```
|
||||
|
||||
## Other Clients
|
||||
|
||||
These clients are not maintained by the Appium team and can be used with other languages.
|
||||
|Client|Language|
|
||||
|-|-|
|
||||
|[WebdriverIO](https://webdriver.io/docs/appium)|Node.js|
|
||||
|[Nightwatch.js](https://nightwatchjs.org/guide/mobile-app-testing/introduction.html)|Node.js|
|
||||
|[RobotFramework](https://github.com/serhatbolsu/robotframework-appiumlibrary)|DSL|
|
||||
|[multicatch's appium-client](https://github.com/multicatch/appium-client)|Rust|
|
||||
|[SwiftAppium](https://github.com/milcgroup/swiftappium)|Swift|
|
||||
|
||||
In general, any W3C WebDriver spec-compatible client will also integrate well with Appium, though
|
||||
some Appium-specific commands may not be implemented in other clients.
|
||||
|
||||
### [WebdriverIO](https://webdriver.io/docs/appium)
|
||||
!!! note
|
||||
|
||||
Language: :material-language-javascript: :material-language-typescript: JavaScript/TypeScript
|
||||
|
||||
```sh title="Setup Using npm"
|
||||
npm init wdio@latest .
|
||||
```
|
||||
|
||||
### [Nightwatch.js](https://nightwatchjs.org/guide/mobile-app-testing/introduction.html)
|
||||
|
||||
Language: :material-language-javascript: :material-language-typescript: JavaScript/TypeScript
|
||||
|
||||
=== "Setup For Android"
|
||||
|
||||
```sh
|
||||
npx @nightwatch/mobile-helper android --appium
|
||||
```
|
||||
|
||||
=== "Setup For iOS"
|
||||
|
||||
```sh
|
||||
npx @nightwatch/mobile-helper ios --appium
|
||||
```
|
||||
|
||||
### [RobotFramework AppiumLibrary](https://github.com/serhatbolsu/robotframework-appiumlibrary)
|
||||
|
||||
Language: :simple-robotframework: Robot Framework
|
||||
|
||||
```sh title="Install From PyPi"
|
||||
pip install robotframework-appiumlibrary
|
||||
```
|
||||
|
||||
### [multicatch's appium-client](https://github.com/multicatch/appium-client)
|
||||
|
||||
Language: :simple-rust: Rust
|
||||
|
||||
```sh title="Install Using Cargo"
|
||||
cargo add appium-client
|
||||
```
|
||||
|
||||
### [SwiftAppium](https://github.com/milcgroup/swiftappium)
|
||||
|
||||
Language: :material-language-swift: Swift
|
||||
|
||||
```sh title="Install and Setup"
|
||||
git clone https://github.com/milcgroup/SwiftAppium.git
|
||||
cd SwiftAppium
|
||||
swift build
|
||||
swift run swiftappium
|
||||
```
|
||||
If you maintain an Appium client that you would like to be listed in the Appium docs, feel free
|
||||
to make a PR to add it to this section with a link to the documentation for the client.
|
||||
|
||||
@@ -1,207 +1,51 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Appium Drivers
|
||||
---
|
||||
|
||||
You can't use Appium without a driver! Here you can find a list of all known Appium drivers,
|
||||
along with their installation commands and links to their documentation.
|
||||
You can't use Appium without at least one driver! Click on the link for each driver to see the
|
||||
specific installation instructions and documentation for that driver.
|
||||
|
||||
Generally, drivers can be installed using their listed installation key, with the following command:
|
||||
```
|
||||
appium driver install <installation key>
|
||||
```
|
||||
|
||||
To learn more about drivers, check out the [Driver Intro](../intro/drivers.md).
|
||||
|
||||
!!! note
|
||||
|
||||
If you maintain an Appium driver that you would like to be listed here, feel free to create a PR!
|
||||
|
||||
## Official Drivers
|
||||
### Official Drivers
|
||||
|
||||
These drivers are currently maintained by the Appium team:
|
||||
|
||||
### [Chromium](https://github.com/appium/appium-chromium-driver)
|
||||
|Driver|Installation Key|Platform(s)|Mode(s)|
|
||||
|--|--|--|--|
|
||||
|[Chromium](https://github.com/appium/appium-chromium-driver)|`chromium`|macOS, Windows, Linux|Web|
|
||||
|[Espresso](https://github.com/appium/appium-espresso-driver)|`espresso`|Android|Native|
|
||||
|[Gecko](https://github.com/appium/appium-geckodriver)|`gecko`|macOS, Windows, Linux, Android|Web|
|
||||
|[Mac2](https://github.com/appium/appium-mac2-driver)|`mac2`|macOS|Native|
|
||||
|[Safari](https://github.com/appium/appium-safari-driver)|`safari`|macOS, iOS|Web|
|
||||
|[UiAutomator2](https://github.com/appium/appium-uiautomator2-driver)|`uiautomator2`|Android|Native, Hybrid, Web|
|
||||
|[Windows](https://github.com/appium/appium-windows-driver)|`windows`|Windows|Native|
|
||||
|[XCUITest](https://github.com/appium/appium-xcuitest-driver)|`xcuitest`|iOS|Native, Hybrid, Web|
|
||||
|
||||
* Target: Desktop and mobile Chromium browsers (Chrome, Microsoft Edge, etc.)
|
||||
* Mode: Web
|
||||
### Other Drivers
|
||||
|
||||
```sh title="Install This Driver"
|
||||
appium driver install chromium
|
||||
```
|
||||
These drivers are not maintained by the Appium team and can be used to target additional platforms:
|
||||
|
||||
### [Espresso](https://github.com/appium/appium-espresso-driver)
|
||||
|Driver|Installation Key|Platform(s)|Mode(s)|Supported By|
|
||||
|--|--|--|--|--|
|
||||
|[Flutter](https://github.com/appium/appium-flutter-driver)|`--source=npm appium-flutter-driver`|iOS, Android|Native|Community|
|
||||
|[Flutter Integration](https://github.com/AppiumTestDistribution/appium-flutter-integration-driver)|`--source=npm appium-flutter-integration-driver`|iOS, Android|Native|Community / `@AppiumTestDistribution`|
|
||||
|[LG WebOS](https://github.com/headspinio/appium-lg-webos-driver)|`--source=npm appium-lg-webos-driver`|LG TV|Web|HeadSpin|
|
||||
|[Linux](https://github.com/fantonglang/appium-linux-driver)|`--source=npm @stdspa/appium-linux-driver`|Linux|Native|`@fantonglang`|
|
||||
|[Roku](https://github.com/headspinio/appium-roku-driver)|`--source=npm @headspinio/appium-roku-driver`|Roku|Native|HeadSpin|
|
||||
|[Tizen](https://github.com/Samsung/appium-tizen-driver)|`--source=npm appium-tizen-driver`|Android|Native|Community / Samsung|
|
||||
|[TizenTV](https://github.com/headspinio/appium-tizen-tv-driver)|`--source=npm appium-tizen-tv-driver`|Samsung TV|Web|HeadSpin|
|
||||
|[Youi](https://github.com/YOU-i-Labs/appium-youiengine-driver)|`--source=npm appium-youiengine-driver`|iOS, Android, macOS, Linux, tvOS|Native|Community / You.i|
|
||||
|
||||
* Target: Android applications
|
||||
* Mode: Native
|
||||
!!! note
|
||||
|
||||
```sh title="Install This Driver"
|
||||
appium driver install espresso
|
||||
```
|
||||
|
||||
### [Gecko](https://github.com/appium/appium-geckodriver)
|
||||
|
||||
* Target: Desktop and mobile Gecko browsers (Firefox)
|
||||
* Mode: Web
|
||||
|
||||
```sh title="Install This Driver"
|
||||
appium driver install gecko
|
||||
```
|
||||
|
||||
### [Mac2](https://github.com/appium/appium-mac2-driver)
|
||||
|
||||
* Target: macOS applications
|
||||
* Mode: Native
|
||||
|
||||
```sh title="Install This Driver"
|
||||
appium driver install mac2
|
||||
```
|
||||
|
||||
### [Safari](https://github.com/appium/appium-safari-driver)
|
||||
|
||||
* Target: Desktop and mobile Safari browsers
|
||||
* Mode: Web
|
||||
|
||||
```sh title="Install This Driver"
|
||||
appium driver install safari
|
||||
```
|
||||
|
||||
### [UiAutomator2](https://github.com/appium/appium-uiautomator2-driver)
|
||||
|
||||
* Target: Android, Android TV, Android Wear applications
|
||||
* Modes: Native, Hybrid, Web
|
||||
|
||||
```sh title="Install This Driver"
|
||||
appium driver install uiautomator2
|
||||
```
|
||||
|
||||
### [Windows](https://github.com/appium/appium-windows-driver)
|
||||
|
||||
!!! warning
|
||||
|
||||
Only the Node.js-based driver part is maintained by the Appium team. The server part
|
||||
(WinAppDriver executable) is provided by Microsoft, but has not been maintained since 2022.
|
||||
|
||||
* Target: Windows applications
|
||||
* Mode: Native
|
||||
|
||||
```sh title="Install This Driver"
|
||||
appium driver install windows
|
||||
```
|
||||
|
||||
### [XCUITest](https://appium.github.io/appium-xcuitest-driver/)
|
||||
|
||||
* Target: iOS, iPadOS, tvOS applications
|
||||
* Modes: Native, Hybrid, Web
|
||||
|
||||
```sh title="Install This Driver"
|
||||
appium driver install xcuitest
|
||||
```
|
||||
|
||||
## Other Drivers
|
||||
|
||||
These drivers are not maintained by the Appium team and can be used to target other platforms:
|
||||
|
||||
### [Flutter](https://github.com/appium/appium-flutter-driver)
|
||||
|
||||
* Target: iOS and Android applications built with Flutter
|
||||
* Mode: Native
|
||||
* Supported by: Appium Team / Community
|
||||
|
||||
```sh title="Install This Driver"
|
||||
appium driver install --source=npm appium-flutter-driver
|
||||
```
|
||||
|
||||
### [Flutter Integration](https://github.com/AppiumTestDistribution/appium-flutter-integration-driver)
|
||||
|
||||
* Target: iOS and Android applications built with Flutter
|
||||
* Mode: Native
|
||||
* Supported by: Community / `@AppiumTestDistribution`
|
||||
|
||||
```sh title="Install This Driver"
|
||||
appium driver install --source=npm appium-flutter-integration-driver
|
||||
```
|
||||
|
||||
### [LG WebOS](https://github.com/headspinio/appium-lg-webos-driver)
|
||||
|
||||
* Target: LG TV web applications
|
||||
* Mode: Web
|
||||
* Supported by: HeadSpin
|
||||
|
||||
```sh title="Install This Driver"
|
||||
appium driver install --source=npm appium-lg-webos-driver
|
||||
```
|
||||
|
||||
### [Linux](https://github.com/fantonglang/appium-linux-driver)
|
||||
|
||||
!!! warning
|
||||
|
||||
This driver has not been maintained since 2022 and requires a custom Appium installation
|
||||
|
||||
* Target: Linux applications
|
||||
* Mode: Native
|
||||
* Supported by: `@fantonglang`
|
||||
|
||||
```sh title="Install This Driver"
|
||||
git clone https://github.com/fantonglang/appium
|
||||
cd appium
|
||||
yarn install
|
||||
node ./
|
||||
```
|
||||
|
||||
### [NovaWindows](https://github.com/AutomateThePlanet/appium-novawindows-driver)
|
||||
|
||||
!!! info
|
||||
|
||||
This driver is recommended as a drop-in replacement for the partially unmaintained
|
||||
[Windows driver](#windows)
|
||||
|
||||
* Target: Windows applications
|
||||
* Mode: Native
|
||||
* Supported by: Community / Automate The Planet
|
||||
|
||||
```sh title="Install This Driver"
|
||||
appium driver install --source=npm appium-novawindows-driver
|
||||
```
|
||||
|
||||
### [Roku](https://github.com/headspinio/appium-roku-driver)
|
||||
|
||||
* Target: Roku channels (applications)
|
||||
* Mode: Native
|
||||
* Supported by: HeadSpin
|
||||
|
||||
```sh title="Install This Driver"
|
||||
appium driver install --source=npm @headspinio/appium-roku-driver
|
||||
```
|
||||
|
||||
### [Tizen](https://github.com/Samsung/appium-tizen-driver)
|
||||
|
||||
!!! warning
|
||||
|
||||
This driver has not been maintained since 2020 and is only compatible with Appium 1
|
||||
|
||||
* Target: Tizen applications
|
||||
* Mode: Native
|
||||
* Supported by: Community / Samsung
|
||||
|
||||
```sh title="Install This Driver"
|
||||
npm install appium-tizen-driver
|
||||
```
|
||||
|
||||
### [TizenTV](https://github.com/headspinio/appium-tizen-tv-driver)
|
||||
|
||||
* Target: Tizen TV web applications
|
||||
* Mode: Web
|
||||
* Supported by: HeadSpin
|
||||
|
||||
```sh title="Install This Driver"
|
||||
appium driver install --source=npm appium-tizen-tv-driver
|
||||
```
|
||||
|
||||
### [You.i Engine](https://github.com/YOU-i-Labs/appium-youiengine-driver)
|
||||
|
||||
!!! warning
|
||||
|
||||
This driver has not been maintained since 2022 and is only compatible with Appium 1
|
||||
|
||||
* Target: iOS, Android, macOS, Linux, tvOS applications built with You.i Engine
|
||||
* Mode: Native
|
||||
* Supported by: Community / You.i
|
||||
|
||||
```sh title="Install This Driver"
|
||||
npm install appium-youiengine-driver
|
||||
```
|
||||
If you maintain an Appium driver that you would like to be listed in the Appium docs, feel free
|
||||
to make a PR to add it to this section with a link to the driver documentation.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: The Appium Ecosystem
|
||||
title: Ecosystem Overview
|
||||
---
|
||||
|
||||
Appium has a wide ecosystem of related software and tools. This section of the Appium documentation
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Appium Plugins
|
||||
---
|
||||
|
||||
@@ -6,133 +9,38 @@ Plugins offer various ways to extend or modify Appium's behaviour. They are _com
|
||||
and are not needed for standard automation functionality, but you may find them to be useful
|
||||
for more specialised automation workflows.
|
||||
|
||||
!!! note
|
||||
Generally, plugins can be installed using their listed installation key, with the following command:
|
||||
```
|
||||
appium plugin install <installation key>
|
||||
```
|
||||
|
||||
If you maintain an Appium plugin that you would like to be listed here, feel free to create a PR!
|
||||
|
||||
## Official Plugins
|
||||
### Official Plugins
|
||||
|
||||
These plugins are are currently maintained by the Appium team:
|
||||
|
||||
### [Execute Driver](https://github.com/appium/appium/tree/master/packages/execute-driver-plugin)
|
||||
|<div style="width:7em">Plugin</div>|<div style="width:8em">Installation Key</div>|Description|
|
||||
|---|---|---|
|
||||
|[Execute Driver](https://github.com/appium/appium/tree/master/packages/execute-driver-plugin)|`execute-driver`|Run entire batches of commands in a single call to the Appium server|
|
||||
|[Images](https://github.com/appium/appium/tree/master/packages/images-plugin)|`images`|Image matching and comparison features|
|
||||
|[Relaxed Caps](https://github.com/appium/appium/tree/master/packages/relaxed-caps-plugin)|`relaxed-caps`|Relax Appium's requirement for vendor prefixes on capabilities|
|
||||
|[Storage](https://github.com/appium/appium/tree/master/packages/storage-plugin)|`storage`|Server-side storage with client-side management|
|
||||
|[Universal XML](https://github.com/appium/appium/tree/master/packages/universal-xml-plugin)|`universal-xml`|Instead of the standard XML format for iOS and Android, use an XML definition that is the same across both platforms|
|
||||
|
||||
Run entire batches of commands in a single call to the Appium server
|
||||
|
||||
```sh title="Install This Plugin"
|
||||
appium plugin install execute-driver
|
||||
```
|
||||
|
||||
### [Images](https://github.com/appium/appium/tree/master/packages/images-plugin)
|
||||
|
||||
Add support for image matching and comparison features
|
||||
|
||||
```sh title="Install This Plugin"
|
||||
appium plugin install images
|
||||
```
|
||||
|
||||
### [Inspector](https://github.com/appium/appium-inspector/tree/main/plugins)
|
||||
|
||||
Integrate the [Appium Inspector](https://appium.github.io/appium-inspector/) directly into your
|
||||
Appium server installation
|
||||
|
||||
```sh title="Install This Plugin"
|
||||
appium plugin install inspector
|
||||
```
|
||||
|
||||
### [Relaxed Caps](https://github.com/appium/appium/tree/master/packages/relaxed-caps-plugin)
|
||||
|
||||
Relax Appium's requirement for vendor prefixes on capabilities
|
||||
|
||||
```sh title="Install This Plugin"
|
||||
appium plugin install relaxed-caps
|
||||
```
|
||||
|
||||
### [Storage](https://github.com/appium/appium/tree/master/packages/storage-plugin)
|
||||
|
||||
Add server-side storage with client-side management
|
||||
|
||||
```sh title="Install This Plugin"
|
||||
appium plugin install storage
|
||||
```
|
||||
|
||||
### [Universal XML](https://github.com/appium/appium/tree/master/packages/universal-xml-plugin)
|
||||
|
||||
Translate the default iOS and Android XML formats into a common format
|
||||
|
||||
```sh title="Install This Plugin"
|
||||
appium plugin install universal-xml
|
||||
```
|
||||
|
||||
## Other Plugins
|
||||
### Other Plugins
|
||||
|
||||
These plugins are not maintained by the Appium team and can provide additional functionality:
|
||||
|
||||
### [AltUnity](https://github.com/headspinio/appium-altunity-plugin)
|
||||
|<div style="width:6em">Plugin</div>|<div style="width:19em">Installation Key</div>|Description|<div style="width:13em">Supported By</div>|
|
||||
|---|---|---|---|
|
||||
|[AltUnity](https://github.com/headspinio/appium-altunity-plugin)|`--source=npm appium-altunity-plugin`|Target Unity games and apps for automation with a new context, via the AltUnityTester framework|HeadSpin|
|
||||
|[Device Farm](https://github.com/AppiumTestDistribution/appium-device-farm)|`--source=npm appium-device-farm`|Manage and create driver sessions on connected Android devices and iOS simulators|`@AppiumTestDistribution`|
|
||||
|[Gestures](https://github.com/AppiumTestDistribution/appium-gestures-plugin)|`--source=npm appium-gestures-plugin`|Perform basic gestures using W3C Actions|`@AppiumTestDistribution`|
|
||||
|[Interceptor](https://github.com/AppiumTestDistribution/appium-interceptor-plugin)|`--source=npm appium-interceptor`|Intercept and mock API requests and responses|`@AppiumTestDistribution`|
|
||||
|[OCR](https://github.com/jlipps/appium-ocr-plugin)|`--source=npm appium-ocr-plugin`|Find elements via OCR text|`@jlipps`|
|
||||
|[Reporter](https://github.com/AppiumTestDistribution/appium-reporter-plugin)|`--source=npm appium-reporter-plugin`|Generate standalone consolidated HTML reports with screenshots|`@AppiumTestDistribution`|
|
||||
|[Wait](https://github.com/AppiumTestDistribution/appium-wait-plugin)|`--source=npm appium-wait-plugin`|Manage global element wait timeouts|`@AppiumTestDistribution`|
|
||||
|
||||
Target Unity games and apps for automation via the AltUnityTester framework
|
||||
!!! note
|
||||
|
||||
Supported by: HeadSpin
|
||||
|
||||
```sh title="Install This Plugin"
|
||||
appium plugin install --source=npm appium-altunity-plugin
|
||||
```
|
||||
|
||||
### [Device Farm](https://github.com/AppiumTestDistribution/appium-device-farm)
|
||||
|
||||
Manage and create driver sessions on connected Android devices and iOS simulators
|
||||
|
||||
Supported by: `@AppiumTestDistribution`
|
||||
|
||||
```sh title="Install This Plugin"
|
||||
appium plugin install --source=npm appium-device-farm
|
||||
```
|
||||
|
||||
### [Gestures](https://github.com/AppiumTestDistribution/appium-gestures-plugin)
|
||||
|
||||
Perform basic gestures using W3C Actions
|
||||
|
||||
Supported by: `@AppiumTestDistribution`
|
||||
|
||||
```sh title="Install This Plugin"
|
||||
appium plugin install --source=npm appium-gestures-plugin
|
||||
```
|
||||
|
||||
### [Interceptor](https://github.com/AppiumTestDistribution/appium-interceptor-plugin)
|
||||
|
||||
Intercept and mock API requests and responses
|
||||
|
||||
Supported by: `@AppiumTestDistribution`
|
||||
|
||||
```sh title="Install This Plugin"
|
||||
appium plugin install --source=npm appium-interceptor
|
||||
```
|
||||
|
||||
### [OCR](https://github.com/jlipps/appium-ocr-plugin)
|
||||
|
||||
Find elements via OCR text
|
||||
|
||||
Supported by: `@jlipps`
|
||||
|
||||
```sh title="Install This Plugin"
|
||||
appium plugin install --source=npm appium-ocr-plugin
|
||||
```
|
||||
|
||||
### [Reporter](https://github.com/AppiumTestDistribution/appium-reporter-plugin)
|
||||
|
||||
Generate standalone consolidated HTML reports with screenshots
|
||||
|
||||
Supported by: `@AppiumTestDistribution`
|
||||
|
||||
```sh title="Install This Plugin"
|
||||
appium plugin install --source=npm appium-reporter-plugin
|
||||
```
|
||||
|
||||
### [Wait](https://github.com/AppiumTestDistribution/appium-wait-plugin)
|
||||
|
||||
Manage global element wait timeouts
|
||||
|
||||
Supported by: `@AppiumTestDistribution`
|
||||
|
||||
```sh title="Install This Plugin"
|
||||
appium plugin install --source=npm appium-wait-plugin
|
||||
```
|
||||
If you maintain an Appium plugin that you would like to be listed in the Appium docs, feel free
|
||||
to make a PR to add it to this section with a link to the documentation for the plugin.
|
||||
|
||||
@@ -1,87 +1,42 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Appium-Related Tools
|
||||
---
|
||||
|
||||
The Appium ecosystem also includes several tools that have been created to assist with things not
|
||||
directly related to running tests, such as Appium installation, test development, and more.
|
||||
There are several Appium tools that have been created to to assist with things not directly related
|
||||
to testing, such as Appium installation, test development, and more.
|
||||
|
||||
!!! note
|
||||
|
||||
If you maintain an Appium tool that you would like to be listed here, feel free to create a PR!
|
||||
|
||||
## Official Tools
|
||||
|
||||
These tools are currently maintained by the Appium team:
|
||||
|
||||
### [Appium Inspector](https://appium.github.io/appium-inspector/)
|
||||
### [Appium Inspector](https://appium.github.io/appium-inspector/latest/)
|
||||
|
||||
Appium has a graphical client which can be used to inspect application screenshots, view the
|
||||
application hierarchy, search for elements, run Appium commands, record app interactions, and more.
|
||||
It can be very useful for Appium test development.
|
||||
application hierarchy, run Appium commands, record app interactions, and more. It is very useful
|
||||
for Appium test development.
|
||||
|
||||
=== "Install as an Appium Plugin"
|
||||
|
||||
```bash
|
||||
appium plugin install inspector
|
||||
```
|
||||
=== "Install Standalone"
|
||||
|
||||
Download the app from the Appium Inspector repo's [GitHub Releases section](https://github.com/appium/appium-inspector/releases).
|
||||
|
||||
### [Appium MCP](https://github.com/appium/appium-mcp)
|
||||
|
||||
Appium MCP is a Model Context Protocol (MCP) server that provides mobile test development and
|
||||
automation capabilities using Appium.
|
||||
|
||||
```json title="Install This Tool"
|
||||
// Add the following to your MCP client configuration
|
||||
{
|
||||
"appium-mcp": {
|
||||
"disabled": false,
|
||||
"timeout": 100,
|
||||
"type": "stdio",
|
||||
"command": "npx",
|
||||
"args": ["appium-mcp@latest"],
|
||||
"env": {
|
||||
"ANDROID_HOME": "/path/to/android/sdk"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Extension Tools
|
||||
|
||||
Appium driver or plugin developers can choose to include these tools in their driver/plugin:
|
||||
Find downloads and more information on its GitHub page: [Appium Inspector](https://github.com/appium/appium-inspector)
|
||||
|
||||
### Appium Doctor
|
||||
|
||||
The Appium Doctor tool can be used to validate whether all prerequisites and other environment
|
||||
details needed for the driver/plugin have been set up correctly. The tool can be accessed via the
|
||||
[`doctor` command in the Appium CLI](../reference/cli/extensions.md#doctor):
|
||||
Appium Doctor is a command-line tool built into Appium drivers and plugins.
|
||||
The command is expected to be used to validate whether a driver or plugin has all of its prerequisites and other environment details set up correctly
|
||||
if the driver/plugin author implemented the `doctor` command.
|
||||
|
||||
```sh
|
||||
appium {driver|plugin} doctor <extension-name>
|
||||
For example, `uiautomator2` driver provides the `doctor` command below.
|
||||
|
||||
```
|
||||
appium driver doctor uiautomator2
|
||||
```
|
||||
|
||||
It shows no results if the driver/plugin does not have such validation checks.
|
||||
It shows no result if the driver/plugin author did not implement them.
|
||||
|
||||
!!! note
|
||||
More information on this command can be found in the [Command-Line Usage documentation](../cli/extensions.md#doctor).
|
||||
For driver/plugin developers, please read [Building Doctor Checks](../developing/build-doctor-checks.md).
|
||||
|
||||
If you maintain an Appium extension and would like to add Appium Doctor support for it, check
|
||||
out the documentation on [Building Doctor Checks](../developing/build-doctor-checks.md).
|
||||
### Other Tools
|
||||
|
||||
## Other Tools
|
||||
These tools are not maintained by the Appium team and can be used to assist with other problems:
|
||||
|
||||
These tools are not maintained by the Appium team:
|
||||
|
||||
### [Appium Installer](https://github.com/AppiumTestDistribution/appium-installer)
|
||||
|
||||
Appium Installer is a command-line tool for simplifying setups of new Appium test environments.
|
||||
It includes commands for installing Appium, its drivers and plugins, as well as validating
|
||||
prerequisites for iOS or Android emulators or real devices.
|
||||
|
||||
Supported by: `@AppiumTestDistribution`
|
||||
|
||||
```sh title="Install This Tool"
|
||||
npm install -g appium-installer
|
||||
```
|
||||
|Name|Description|Supported By|
|
||||
|---|---|---|
|
||||
|[appium-installer](https://github.com/AppiumTestDistribution/appium-installer)|Help set up an Appium environment for Android and iOS|`@AppiumTestDistribution`|
|
||||
|
||||
@@ -56,15 +56,15 @@ on per-process basis, so each test session initialized in scope of the same Appi
|
||||
of it. It is a [LRU Cache](https://www.npmjs.com/package/lru-cache) with the following limitations:
|
||||
|
||||
- Max items: 1024. You may customize it by providing a new value to
|
||||
the [APPIUM_APPS_CACHE_MAX_ITEMS](../reference/cli/env-vars.md) environment variable.
|
||||
the [APPIUM_APPS_CACHE_MAX_ITEMS](../cli/env-vars.md) environment variable.
|
||||
Do not set it to a lower number than the amount of apps in all parallel sessions per process.
|
||||
- Max time to live (TTL) for each entry: 24 hours.
|
||||
You may customize it by providing a new value to the
|
||||
[APPIUM_APPS_CACHE_MAX_AGE](../reference/cli/env-vars.md) environment variable.
|
||||
[APPIUM_APPS_CACHE_MAX_AGE](../cli/env-vars.md) environment variable.
|
||||
Do not set it to a lower number than the duration of a single session startup.
|
||||
- TTL is refreshed for each entry upon access
|
||||
- By default the full application URL is used as cache key. You may change this behavior
|
||||
by enabling the [APPIUM_APPS_CACHE_IGNORE_URL_QUERY](../reference/cli/env-vars.md) environment variable.
|
||||
by enabling the [APPIUM_APPS_CACHE_IGNORE_URL_QUERY](../cli/env-vars.md) environment variable.
|
||||
If the above option is enabled then the 'search' part of the app URL will be cut off from cache keys.
|
||||
See the corresponding [feature request](https://discuss.appium.io/t/regarding-app-caching-when-using-aws-s3-presigned-urls/42713)
|
||||
for more details.
|
||||
|
||||
@@ -42,7 +42,7 @@ Here is a list of all the globally-recognized Appium capabilities:
|
||||
| `appium:app` | `string` | no | The path to an installable application |
|
||||
| `appium:deviceName` | `string` | no | The name of a particular device to automate, e.g., `iPhone 14` (currently only actually useful for specifying iOS simulators, since in other situations it's typically recommended to use a specific device id via the `appium:udid` capability). |
|
||||
| `appium:platformVersion` | `string` | no | The version of a platform, e.g., for iOS, `16.0` |
|
||||
| `appium:newCommandTimeout` | `number` | no | The number of seconds the Appium server should wait for clients to send commands before deciding that the client has gone away and the session should shut down. `60` seconds by default. Setting it to zero disables the timer. |
|
||||
| `appium:newCommandTimeout` | `number` | no | The number of seconds the Appium server should wait for clients to send commands before deciding that the client has gone away and the session should shut down |
|
||||
| `appium:noReset` | `boolean` | no | If true, instruct an Appium driver to avoid its usual reset logic during session start and cleanup (default `false`) |
|
||||
| `appium:fullReset` | `boolean` | no | If true, instruct an Appium driver to augment its usual reset logic with additional steps to ensure maximum environmental reproducibility (default `false`) |
|
||||
| `appium:eventTimings` | `boolean` | no | If true, instruct an Appium driver to collect [Event Timings](./event-timing.md) (default `false`) |
|
||||
@@ -144,7 +144,7 @@ drivers and plugins. It is of course up to each service provider how they wish t
|
||||
discovery, installation, and availability of any official or third party drivers or plugins. But
|
||||
the Appium team does provide several suggestions, for consistency across the industry. _These are
|
||||
recommendations only,_ and not a standard, but adopting it will help users to navigate the increased
|
||||
complexity that working with Appium in a cloud environment may bring.
|
||||
complexity that working with Appium 2 in a cloud environment may bring.
|
||||
|
||||
### Suggested capabilities
|
||||
|
||||
|
||||
@@ -67,7 +67,12 @@ generate various kinds of reports from event timings output:
|
||||
|
||||
## Add a custom event
|
||||
|
||||
!!! warning "TODO"
|
||||
|
||||
The links to the commands in the following paragraph do not yet work since these docs are under
|
||||
construction.
|
||||
|
||||
You can add custom events that will show up in the event timings data. You can send a custom event
|
||||
name to the Appium server using the [Log Custom Event API](../reference/api/appium.md#logcustomevent),
|
||||
and the server will store the timestamp. The [Get Log Events](../reference/api/appium.md#getlogevents)
|
||||
command can be used to retrieve named events' timestamps later on.
|
||||
name to the Appium server using the [Log Event API](#TODO), and the server will store the
|
||||
timestamp. The [Get Events](#TODO) command can be used to retrieve named events' timestamps later
|
||||
on.
|
||||
|
||||
@@ -22,11 +22,9 @@ server:
|
||||
use-drivers:
|
||||
- xcuitest
|
||||
default-capabilities:
|
||||
appium:wdaLocalPort: 8100
|
||||
appium:mjpegServerPort: 9100
|
||||
appium:mjpegScreenshotUrl: "http://localhost:9100"
|
||||
appium:platformVersion: "26.0"
|
||||
appium:deviceName: "iPhone 17"
|
||||
wdaLocalPort: 8100
|
||||
mjpegServerPort: 9100
|
||||
mjpegScreenshotUrl: "http://localhost:9100"
|
||||
```
|
||||
|
||||
In the above YAML config file, we specify the Appium server port, the driver used, and parameters
|
||||
@@ -41,11 +39,9 @@ server:
|
||||
use-drivers:
|
||||
- xcuitest
|
||||
default-capabilities:
|
||||
appium:wdaLocalPort: 8110
|
||||
appium:mjpegServerPort: 9110
|
||||
appium:mjpegScreenshotUrl: "http://localhost:9110"
|
||||
appium:platformVersion: "26.0"
|
||||
appium:deviceName: "iPhone 16"
|
||||
wdaLocalPort: 8110
|
||||
mjpegServerPort: 9110
|
||||
mjpegScreenshotUrl: "http://localhost:9110"
|
||||
```
|
||||
|
||||
### Define the Grid node configs
|
||||
@@ -64,15 +60,11 @@ port = 5555
|
||||
[node]
|
||||
detect-drivers = false
|
||||
|
||||
[events]
|
||||
publish = "tcp://HUB_IP_ADDRESS:4442"
|
||||
subscribe = "tcp://HUB_IP_ADDRESS:4443"
|
||||
|
||||
[relay]
|
||||
url = "http://localhost:4723"
|
||||
status-endpoint = "/status"
|
||||
configs = [
|
||||
"1", "{\"platformName\": \"iOS\", \"appium:automationName\": \"XCUITest\"}"
|
||||
"1", "{\"platformName\": \"iOS\", \"appium:platformVersion\": \"15.5\", \"appium:deviceName\": \"iPhone 13\", \"appium:automationName\": \"XCUITest\"}"
|
||||
]
|
||||
```
|
||||
|
||||
@@ -84,15 +76,11 @@ port = 5565
|
||||
[node]
|
||||
detect-drivers = false
|
||||
|
||||
[events]
|
||||
publish = "tcp://HUB_IP_ADDRESS:4442"
|
||||
subscribe = "tcp://HUB_IP_ADDRESS:4443"
|
||||
|
||||
[relay]
|
||||
url = "http://localhost:4733"
|
||||
status-endpoint = "/status"
|
||||
configs = [
|
||||
"1", "{\"platformName\": \"iOS\", \"appium:automationName\": \"XCUITest\"}"
|
||||
"1", "{\"platformName\": \"iOS\", \"appium:platformVersion\": \"15.5\", \"appium:deviceName\": \"iPhone 12\", \"appium:automationName\": \"XCUITest\"}"
|
||||
]
|
||||
```
|
||||
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
---
|
||||
title: Header Handling
|
||||
---
|
||||
|
||||
# Header Handling
|
||||
|
||||
## Request ID Tracking
|
||||
|
||||
Appium supports setting the request ID for each request through the `x-request-id` header. This is useful for tracing requests through your system, especially in environments where multiple services are involved or when debugging across different requests.
|
||||
|
||||
### Using `x-request-id`
|
||||
|
||||
When making requests to Appium, you can include an `x-request-id` header with a unique identifier. This ID will be:
|
||||
|
||||
- Used to track the request through Appium's logging system
|
||||
- Preserved across the entire request lifecycle
|
||||
- Generated automatically (as a UUID) if not provided
|
||||
@@ -16,7 +16,7 @@ two basic strategies: using Appium's extension CLI interface, or managing extens
|
||||
|
||||
## Using Appium's Extension CLI
|
||||
|
||||
With Appium's [Extension CLI](../reference/cli/extensions.md), you let Appium manage drivers and plugins for
|
||||
With Appium's [Extension CLI](../cli/extensions.md), you let Appium manage drivers and plugins for
|
||||
you. You will use CLI commands to tell Appium which extensions you would like to install, update,
|
||||
or remove. Here's an example of how you might install a driver using the CLI:
|
||||
|
||||
|
||||
@@ -6,74 +6,141 @@ This document is a guide for those who are using Appium 1 and wish to migrate to
|
||||
contains a list of breaking changes and how to migrate your environments or test suites to ensure
|
||||
compatibility with Appium 2.
|
||||
|
||||
Appium 2 is the biggest Appium release in over 5 years. It is _not_ focused on changing the
|
||||
automation behavior for any particular platform, but instead re-envisions Appium into an
|
||||
_ecosystem_ of automation tools:
|
||||
!!! note
|
||||
|
||||
* The core Appium module retains only platform-agnostic functionality
|
||||
* Functionality for automating specific platforms is moved to separate _driver_ modules
|
||||
* Functionality for altering/extending Appium is moved to separate _plugin_ modules
|
||||
Latest Appium drivers/plugins would have update since we created this documentation
|
||||
because we keep developing the ecosystem.
|
||||
|
||||
## Overview of Appium 2
|
||||
|
||||
Appium 2 is the most major new release of Appium in over 5 years. The changes in Appium 2 are _not_
|
||||
primarily related to changes in automation behaviors for specific platforms. Instead, Appium 2
|
||||
reenvisions Appium as a _platform_ where "drivers" (code projects that introduce support for
|
||||
automation of a given platform) and "plugins" (code projects that allow for overriding, altering,
|
||||
extending, or adding behaviors to Appium) can be easily created and shared.
|
||||
|
||||
At the same time, the Appium project is taking the opportunity to remove many old and deprecated
|
||||
bits of functionality.
|
||||
|
||||
Since Appium 2 is a major architectural change, ^^we do not recommend directly updating your
|
||||
Appium 1 installations to Appium 2^^. Instead, please uninstall Appium 1 first, and only install
|
||||
Appium 2 afterwards.
|
||||
Together these do introduce a few breaking changes to how Appium is installed, how drivers and
|
||||
various features are managed, and protocol support. These are detailed below.
|
||||
|
||||
## Breaking Changes
|
||||
|
||||
### Drivers Installed Separately
|
||||
### :bangbang: Default server base path
|
||||
|
||||
When installing Appium 1, all available drivers would be installed alongside the main Appium
|
||||
server. In Appium 2, due to its modular structure, this is no longer the case - by default,
|
||||
installing it only installs the core Appium server, without any drivers.
|
||||
With Appium 1, the server would accept commands by default on `http://localhost:4723/wd/hub`. The
|
||||
`/wd/hub` base path was a legacy convention from the days of migrating from Selenium 1 to Selenium
|
||||
2, and is no longer relevant. As such the default base path for the server is now `/`. If you want
|
||||
to retain the old behaviour, you can set the base path via a command line argument as follows:
|
||||
|
||||
When it comes to installing Appium 2 drivers, there are several approaches you can take:
|
||||
```
|
||||
appium --base-path=/wd/hub
|
||||
```
|
||||
|
||||
You can also set server arguments as [Config file](./config.md) properties.
|
||||
|
||||
### :bangbang: Installing drivers during setup
|
||||
|
||||
When you installed Appium 1, all available drivers would be installed at the same time as the main
|
||||
Appium server. This is no longer the case. Simply installing Appium 2 (e.g., by `npm i -g appium`),
|
||||
will install the Appium server only, but no drivers. To install drivers, you must instead use the
|
||||
new [Appium extension CLI](../cli/extensions.md). For example, to install the latest versions of the
|
||||
XCUITest and UiAutomator2 drivers, after installing Appium you would run the following commands:
|
||||
|
||||
```bash
|
||||
appium driver install uiautomator2 # installs the latest driver version
|
||||
appium driver install xcuitest@4.12.2 # installs a specific driver version
|
||||
```
|
||||
|
||||
At this point, your drivers are installed and ready. There's a lot more you can do with the Appium 2
|
||||
command line, so be sure to check out [its documentation](../cli/index.md). If you're running in a CI
|
||||
environment or want to install Appium along with some drivers all in one step, you can do so using
|
||||
some special flags during install, for example:
|
||||
|
||||
* Add the `--drivers` flag when installing Appium, for example:
|
||||
```bash
|
||||
npm i -g appium --drivers=xcuitest,uiautomator2
|
||||
```
|
||||
* Use the [Appium Extension CLI](../reference/cli/extensions.md), for example:
|
||||
```bash
|
||||
appium driver install uiautomator2
|
||||
```
|
||||
* Use the [Appium Setup CLI command](../reference/cli/setup.md) (added in Appium `2.6`), for example:
|
||||
```bash
|
||||
appium setup mobile
|
||||
```
|
||||
|
||||
Check the [Managing Drivers and Plugins guide](./managing-exts.md) for more information.
|
||||
This will install Appium and the two drivers for you in one go. Please uninstall any existing Appium 1
|
||||
`npm` packages (with `npm uninstall -g appium`) if you get an installation or startup error.
|
||||
|
||||
!!! info "Actions Needed"
|
||||
### :bangbang: Drivers installation path
|
||||
|
||||
When installing Appium 2, use one of the above approaches for installing your desired drivers
|
||||
|
||||
### Driver Installation Path Changed
|
||||
|
||||
When installing Appium 1, all available drivers would be installed as dependencies of the main
|
||||
Appium server, in `/path/to/appium/node_modules`. For example, `appium-webdriveragent` was located
|
||||
When you installed Appium 1, all available drivers would be installed at the same time as the main
|
||||
Appium server, at `/path/to/appium/node_modules`. For example, `appium-webdriveragent` was located
|
||||
at `/path/to/appium/node_modules/appium-xcuitest-driver/node_modules/appium-webdriveragent`.
|
||||
|
||||
In Appium 2, drivers (and plugins) are installed at the path defined by the `APPIUM_HOME`
|
||||
environment variable, whose default value is `~/.appium`. So, `appium-webdriveragent` would now be
|
||||
located at `$APPIUM_HOME/node_modules/appium-xcuitest-driver/node_modules/appium-webdriveragent`.
|
||||
Appium 2 installs such dependencies in the path defined by the `APPIUM_HOME` environment variable.
|
||||
The default path is `~/.appium`. So, `appium-webdriveragent` would now be located at
|
||||
`$APPIUM_HOME/node_modules/appium-xcuitest-driver/node_modules/appium-webdriveragent`.
|
||||
|
||||
!!! info "Actions Needed"
|
||||
### :bangbang: Chromedriver installation flags
|
||||
|
||||
If your code uses paths to Appium driver files, update it to use the `APPIUM_HOME` environment
|
||||
variable
|
||||
In Appium 1, it was possible to customize the way Chromedriver was installed (as part of the
|
||||
UiAutomator2 driver for example), using the following command line flags:
|
||||
|
||||
### Drivers Updated Separately
|
||||
* `--chromedriver-skip-install`
|
||||
* `--chromedriver-version`
|
||||
* `--chromedriver-cdnurl`
|
||||
|
||||
In Appium 1, in order to get updates to your drivers, you would simply wait for those updates to be
|
||||
rolled into a new release of Appium, and then update your Appium version. With Appium 2, since the
|
||||
server and drivers are separate packages, they can release new versions independently from each
|
||||
other - this means that you no longer need to wait for a new Appium server release, but can install
|
||||
the latest driver versions right away.
|
||||
Because Appium 2 now installs drivers for you, and because these flags were implemented as `npm`
|
||||
config flags, they will no longer work. Instead, use the following environment variables during
|
||||
driver installation:
|
||||
|
||||
Checking for driver updates is done by using the [Appium Extension CLI](../reference/cli/extensions.md):
|
||||
* `APPIUM_SKIP_CHROMEDRIVER_INSTALL`
|
||||
* `CHROMEDRIVER_VERSION`
|
||||
* `CHROMEDRIVER_CDNURL`
|
||||
|
||||
For example:
|
||||
|
||||
```bash
|
||||
APPIUM_SKIP_CHROMEDRIVER_INSTALL=1 appium driver install uiautomator2
|
||||
```
|
||||
|
||||
### :bangbang: Driver-specific command line options
|
||||
|
||||
With Appium 1, command-line options specific to particular drivers were all hosted on the main
|
||||
Appium server. So, for example, `--chromedriver-executable` was a CLI parameter you could use with
|
||||
Appium to set the location of a specific Chromedriver version for use with, say, the UiAutomator2 driver.
|
||||
|
||||
With Appium 2, all driver- and platform-specific CLI params have been moved to the drivers themselves.
|
||||
To access the corresponding functionality, you'll need to refer to the driver/plugin documentation.
|
||||
In some cases, the extension will continue to expose CLI parameters. For example, the XCUITest driver
|
||||
used to expose a parameter `--webdriveragent-port`. Now, to access this parameter, it should be
|
||||
prefixed with `driver-xcuitest`, to differentiate it from parameters other drivers might also expose.
|
||||
To use this parameter, you thus need to start Appium with something like:
|
||||
|
||||
```bash
|
||||
appium --driver-xcuitest-webdriveragent-port=5000
|
||||
```
|
||||
|
||||
Some drivers have done away with CLI args entirely in favour of default capabilities. With the
|
||||
above-mentioned `--chromedriver-executable` parameter for example, you now need to take advantage
|
||||
of the `appium:chromedriverExecutable` capability supported by the UiAutomator2 driver. To set this
|
||||
capability from the command line, do the following:
|
||||
|
||||
```bash
|
||||
appium --default-capabilities '{"appium:chromedriverExecutable": "/path/to/chromedriver"}'
|
||||
```
|
||||
|
||||
### :bangbang: Driver-specific automation commands
|
||||
|
||||
The definition of certain commands that pertain only to specific drivers has been moved to those
|
||||
drivers' implementations. For example, `pressKeyCode` is specific to the UiAutomator2 driver and is
|
||||
now understood only by that driver. In practice, the only breaking change here is the kind of error
|
||||
you would encounter if the appropriate driver is not installed. Previously, you would get a `501
|
||||
Not Yet Implemented` error if using a driver that didn't implement the command. Now, you will get
|
||||
a `404 Not Found` error because if a driver that doesn't know about the command is not active, the
|
||||
main Appium server will not define the route corresponding to the command.
|
||||
|
||||
### :bangbang: Driver updates
|
||||
|
||||
In the past, to get updates to your iOS or Android drivers, you'd simply wait for those updates to
|
||||
be rolled into a new release of Appium, and then update your Appium version. With Appium 2, the
|
||||
Appium server and the Appium drivers are versioned and released separately. This means that drivers
|
||||
can be on their own release cadence, and you can get the latest driver version right away, rather
|
||||
than waiting for a new Appium server release. The way to check for driver updates is with the CLI:
|
||||
|
||||
```bash
|
||||
appium driver list --updates
|
||||
@@ -85,283 +152,213 @@ If any updates are available, you can then run the `update` command for any give
|
||||
appium driver update xcuitest
|
||||
```
|
||||
|
||||
Updating the Appium server itself is the same as before:
|
||||
(For a complete description of the update command, check out the
|
||||
[Extension CLI](../cli/extensions.md#update) documentation)
|
||||
|
||||
To update the Appium server itself, you do the same thing as in the past: `npm install -g appium`.
|
||||
Now, installing new versions of the Appium server will leave your drivers intact, so the whole
|
||||
process will be much more quick.
|
||||
|
||||
If you would like to update to a specific driver version, not the latest, please uninstall the driver
|
||||
and install the desired version using the `install` subcommand instead of `update`.
|
||||
|
||||
```bash
|
||||
npm update -g appium
|
||||
appium driver uninstall xcuitest
|
||||
appium driver install xcuitest@4.11.1
|
||||
```
|
||||
|
||||
However, in Appium 2 this process is a lot quicker, since drivers are no longer bundled with the
|
||||
server package.
|
||||
|
||||
!!! info "Actions Needed"
|
||||
|
||||
Make sure to use the [Appium Extension CLI](../reference/cli/extensions.md) to manage your drivers
|
||||
|
||||
### Deprecated Packages No Longer Supported
|
||||
|
||||
The Appium 1 ecosystem included several drivers, clients and other packages that had since been
|
||||
deprecated and replaced with newer packages. Appium 2 no longer includes support for these packages,
|
||||
and it is recommended to migrate to the following replacements:
|
||||
|
||||
|Appium 1 Package|Replacement in Appium 2|
|
||||
|--|--|
|
||||
|iOS Driver|[XCUITest Driver](https://appium.github.io/appium-xcuitest-driver/latest/)|
|
||||
|UiAutomator Driver|[UiAutomator2](https://github.com/appium/appium-uiautomator2-driver/)|
|
||||
|`wd` Client|[WebdriverIO Client](https://webdriver.io/)|
|
||||
|Appium Desktop|[Appium Inspector](https://github.com/appium/appium-inspector)|
|
||||
|
||||
!!! info "Actions Needed"
|
||||
|
||||
If you are using any of the aforementioned package(s), migrate to their recommended replacement(s)
|
||||
|
||||
### Default Server Base Path Changed
|
||||
|
||||
In Appium 1, the default Appium server URL was `http://localhost:4723/wd/hub`, where the `/wd/hub`
|
||||
part (the base path) was a legacy convention from Selenium 1. Appium 2 changes the default base
|
||||
path to `/`, therefore the default server URL is now `http://localhost:4723/`.
|
||||
|
||||
!!! info "Actions Needed"
|
||||
|
||||
In your test scripts, change the base path of the target server URL from `/wd/hub` to `/`.
|
||||
Alternatively, you can retain the Appium 1 base path by launching Appium with the
|
||||
`--base-path=/wd/hub` [command-line argument](../reference/cli/server.md).
|
||||
|
||||
### Server Port 0 No Longer Supported
|
||||
|
||||
In Appium 1, it was possible to specify `--port 0` during server startup, which had the effect of
|
||||
starting Appium on a random free port. Appium 2 no longer allows this, and requires port values to
|
||||
be `1` or higher. If you wish to start Appium on a random port, you must now take care of this on
|
||||
your own prior to launching the server.
|
||||
|
||||
!!! info "Actions Needed"
|
||||
|
||||
If you are launching Appium with `--port 0`, change the port number value to `1` or higher
|
||||
|
||||
### Driver-Specific CLI Options Changed
|
||||
|
||||
With Appium 1, command-line options specific to particular drivers were all hosted on the main
|
||||
Appium server. So, for example, `--chromedriver-executable` was a CLI parameter you could use to
|
||||
set the Chromedriver location for the UiAutomator2 driver.
|
||||
|
||||
In Appium 2, all driver-specific CLI options have been moved to the drivers themselves. However,
|
||||
depending on the driver, these options may now need to be passed in another way:
|
||||
|
||||
* Some options can still be passed as different CLI flags, for example:
|
||||
```bash
|
||||
appium --webdriveragent-port=5000 # Appium 1
|
||||
appium --driver-xcuitest-webdriveragent-port=5000 # Appium 2
|
||||
```
|
||||
* Some options can now be passed as environment variables, for example:
|
||||
```bash
|
||||
appium --chromedriver-version=100 # Appium 1
|
||||
CHROMEDRIVER_VERSION=100 appium # Appium 2
|
||||
```
|
||||
* Some options can now be passed as [capabilities](./caps.md), for example:
|
||||
```
|
||||
appium --chromedriver-executable=/path/to/chromedriver # Appium 1
|
||||
{"appium:chromedriverExecutable": "/path/to/chromedriver"} # Appium 2
|
||||
```
|
||||
|
||||
!!! info "Actions Needed"
|
||||
|
||||
If you are using driver-specific CLI options, refer to that driver's documentation for how to
|
||||
apply them in Appium 2
|
||||
|
||||
### Filepaths No Longer Supported for Some CLI Options
|
||||
|
||||
In Appium 1, some server command-line options could be invoked by passing a filepath as their
|
||||
value, and Appium would then parse the contents of that file as the actual value for that option.
|
||||
There were four options that supported this:
|
||||
|
||||
* `--nodeconfig`
|
||||
* `--default-capabilities`
|
||||
* `--allow-insecure`
|
||||
* `--deny-insecure`
|
||||
|
||||
Appium 2 no longer attempts to parse the contents of filepaths passed to these options, and offers
|
||||
two ways to specify the value for these options:
|
||||
|
||||
* As strings, directly on the command line
|
||||
* `--nodeconfig` / `--default-capabilities`: JSON string
|
||||
* `--allow-insecure` / `--deny-insecure`: comma-separated list
|
||||
* In the [Appium Configuration file](./config.md)
|
||||
|
||||
!!! info "Actions Needed"
|
||||
|
||||
If you are using any of the aforementioned CLI options with a filepath value, update your code
|
||||
to pass the file contents either directly or through the Appium config file
|
||||
|
||||
### Old Protocols Dropped
|
||||
### :bangbang: Protocol changes
|
||||
|
||||
Appium's API is based on the [W3C WebDriver Protocol](https://www.w3.org/TR/webdriver/), and it has
|
||||
supported this protocol for years. Before this protocol was designed as a web standard, the
|
||||
[JSON Wire Protocol](https://www.selenium.dev/documentation/legacy/json_wire_protocol/) (JSONWP)
|
||||
and [Mobile JSON Wire Protocol](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md)
|
||||
(MJSONWP) were used instead.
|
||||
supported this protocol for years. Before the W3C WebDriver Protocol was designed as a web standard,
|
||||
several other protocols were used for both Selenium and Appium. These protocols were the "JSONWP"
|
||||
(JSON Wire Protocol) and "MJSONWP" (Mobile JSON Wire Protocol). The W3C Protocol differs from the
|
||||
(M)JSONWP protocols in a few small ways.
|
||||
|
||||
In Appium 1, all of these protocols were supported, so that older Selenium/Appium clients could
|
||||
still communicate with newer Appium servers. Appium 2 removes support for JSONWP/MJSONWP and is now
|
||||
only compatible with the W3C WebDriver Protocol.
|
||||
Up until Appium 2, Appium supported both protocols, so that older Selenium/Appium clients could
|
||||
still communicate with newer Appium servers. Appium 2 removes support for older protocols and is
|
||||
now only compatible with the W3C WebDriver Protocol.
|
||||
|
||||
!!! info "Actions Needed"
|
||||
### :bangbang: Capabilities must use vendor prefix
|
||||
|
||||
Make sure you are using Selenium/Appium clients compatible with the W3C WebDriver Protocol
|
||||
One significant difference between old and new protocols is in the format of capabilities.
|
||||
Previously called "desired capabilities", and now called simply "capabilities", there is now a
|
||||
requirement for a so-called "vendor prefix" on any non-standard capabilities. The list of standard
|
||||
capabilities is given in the [WebDriver Protocol spec](https://www.w3.org/TR/webdriver/#capabilities),
|
||||
and includes a few commonly used capabilities such as `browserName` and `platformName`.
|
||||
|
||||
### Capabilities Require Vendor Prefix
|
||||
These standard capabilities continue to be used as-is. All other capabilities must include a
|
||||
"vendor prefix" in their name. A vendor prefix is a string followed by a colon, such as `appium:`.
|
||||
Most of Appium's capabilities go beyond the standard W3C capabilities and must therefore include
|
||||
vendor prefixes (we recommend that you use `appium:` unless directed otherwise by documentation).
|
||||
For example:
|
||||
|
||||
In Appium 1, in order to create a session, you had to specify certain desired capabilities, which
|
||||
would indicate session parameters, e.g. the driver you want to use. Appium 2 retains this behavior
|
||||
and continues to accept desired capabilities (now renamed simply to 'capabilities'), but as part of
|
||||
the W3C WebDriver Protocol specification, all non-standard capabilities are now required to use a
|
||||
vendor prefix.
|
||||
- `appium:app`
|
||||
- `appium:noReset`
|
||||
- `appium:deviceName`
|
||||
|
||||
The list of standard capabilities is described in the [WebDriver Protocol specification](https://www.w3.org/TR/webdriver/#capabilities),
|
||||
and includes a few commonly used capabilities like `browserName` and `platformName`. All other
|
||||
capabilities must now start with the vendor name and a colon (the vendor prefix), for example,
|
||||
`moz:` or `goog:`. Since most of Appium's capabilities go beyond the standard W3C capabilities,
|
||||
all of them must include the `appium:` prefix (unless specified otherwise):
|
||||
This requirement may or may not be a breaking change for your test suites when targeting Appium 2.
|
||||
If you're using an updated Appium client (at least one maintained by the Appium team), the client
|
||||
will add the `appium:` prefix for you on all necessary capabilities automatically. New versions of
|
||||
[Appium Inspector](https://github.com/appium/appium-inspector) will also do this. Cloud-based Appium
|
||||
providers may also do this. So simply be aware that if you get any messages to the effect that your
|
||||
capabilities lack a vendor prefix, this is how you solve that problem.
|
||||
|
||||
```
|
||||
deviceName # Appium 1
|
||||
appium:deviceName # Appium 2
|
||||
To make everyone's lives a bit easier, we've also introduced the option of grouping up all
|
||||
Appium-related capabilities into one object capability, `appium:options`. You can bundle together
|
||||
anything that you would normally put an `appium:` prefix on into this one capability. Here's an
|
||||
example (in raw JSON) of how you might start an iOS session on the Safari browser using `appium:options`:
|
||||
|
||||
```json
|
||||
{
|
||||
"platformName": "iOS",
|
||||
"browserName": "Safari",
|
||||
"appium:options": {
|
||||
"platformVersion": "14.4",
|
||||
"deviceName": "iPhone 11",
|
||||
"automationName": "XCUITest"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
This requirement may or may not be a breaking change for your test suites. Up-to-date versions of
|
||||
official Appium clients and the Appium Inspector will automatically add the `appium:` prefix to all
|
||||
non-standard capabilities, and the same may apply to cloud-based Appium providers.
|
||||
(Of course, each client will have a different way of creating structured capabilities like
|
||||
`appium:options` or other ones that you might have seen such as `goog:chromeOptions`).
|
||||
|
||||
Additionally, if you are starting a session with multiple Appium-specific capabilities (which will
|
||||
likely be the case), it may seem repetitive to add the `appium:` prefix to each individual
|
||||
capability. To avoid this, you can optionally group up all these capabilities under a single object
|
||||
capability, `appium:options`, for example:
|
||||
|
||||
=== "Default Approach"
|
||||
|
||||
```json
|
||||
{
|
||||
"platformName": "iOS",
|
||||
"browserName": "Safari",
|
||||
"appium:platformVersion": "14.4",
|
||||
"appium:deviceName": "iPhone 11",
|
||||
"appium:automationName": "XCUITest"
|
||||
}
|
||||
```
|
||||
|
||||
=== "With `appium:options`"
|
||||
|
||||
```json
|
||||
{
|
||||
"platformName": "iOS",
|
||||
"browserName": "Safari",
|
||||
"appium:options": {
|
||||
"platformVersion": "14.4",
|
||||
"deviceName": "iPhone 11",
|
||||
"automationName": "XCUITest"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
!!! warning
|
||||
!!! note
|
||||
|
||||
Capabilities included in the `appium:options` object will overwrite capabilities of the same
|
||||
name that are used outside of this object. Note that cloud provider support for the
|
||||
`appium:options` syntax may vary.
|
||||
name that are used outside of this object. (The `appium:options` syntax support by cloud
|
||||
providers may vary.)
|
||||
|
||||
For more information on capabilities, have a look at the [Capabilities Guide](./caps.md).
|
||||
|
||||
!!! info "Actions Needed"
|
||||
### :bangbang: Removed Commands
|
||||
|
||||
Add the `appium:` prefix to all Appium-specific capabilities used in your tests, or wrap them
|
||||
inside an `appium:options` object
|
||||
In addition to commands which have been moved to driver implementations, commands which were a part
|
||||
of the old JSON Wire Protocol and not a part of the W3C Protocol are no longer available:
|
||||
|
||||
### Advanced Features Moved to Plugins
|
||||
- TODO (these commands are being identified and removed and will be updated here when complete)
|
||||
|
||||
One of the design goals for Appium 2 is to extract non-core features into special extensions called
|
||||
[plugins](../ecosystem/plugins.md). Two such features of Appium 1 have been moved to plugins, and
|
||||
are no longer bundled with Appium 2:
|
||||
If you use a modern Appium or Selenium client, you should no longer have access to these anyway,
|
||||
so any breaking changes should appear on the client side first and foremost.
|
||||
|
||||
|Feature|Plugin Name|
|
||||
|--|--|
|
||||
|Image-related features (comparison, search by image, etc...)|[`images`](https://github.com/appium/appium/tree/master/packages/images-plugin)|
|
||||
|The Execute Driver Script feature|[`execute-driver`](https://github.com/appium/appium/tree/master/packages/execute-driver-plugin)|
|
||||
### :bangbang: Image analysis features moved to plugin
|
||||
|
||||
!!! info "Actions Needed"
|
||||
One of the design goals for Appium 2 is to migrate non-core features into special extensions called
|
||||
[plugins](../ecosystem/plugins.md). This allows people to opt into features which require extra time
|
||||
to download or extra system setup. The various image-related features of Appium (image comparison,
|
||||
finding elements by image, etc...) have been moved into an officially supported plugin called
|
||||
[images](https://github.com/appium/appium/tree/master/packages/images-plugin).
|
||||
|
||||
If you were using the image-related features and/or the execute driver script feature in Appium
|
||||
1, first install their plugin(s):
|
||||
```
|
||||
appium plugin install images
|
||||
appium plugin install execute-driver
|
||||
```
|
||||
Afterwards, make sure to activate the plugin(s) upon launching the Appium server:
|
||||
```
|
||||
appium --use-plugins=images,execute-driver
|
||||
```
|
||||
If you use these image-related methods, to continue accessing them you will need to do two things:
|
||||
|
||||
### Endpoint Changes
|
||||
1. Install the plugin: `appium plugin install images`
|
||||
2. Ensure you start the Appium server with access to run the plugin by including it in the list of
|
||||
plugins designated on the command line, e.g., `appium --use-plugins=images`
|
||||
|
||||
A few server endpoints used in Appium 1 were accepting old or unused parameters. Appium 2 removes
|
||||
support for these parameters. The following is a list of these changed endpoints, along with the
|
||||
parameters they no longer accept, as well as the parameters they continue to accept in Appium 2.
|
||||
Image-related commands will also be removed on the client side of things, which means you will need
|
||||
to follow the instructions on the plugin README for installing client-side plugins to access these features.
|
||||
|
||||
* `POST /session/:sessionId/appium/device/gsm_signal`
|
||||
* :octicons-x-24: `signalStrengh`
|
||||
* :octicons-check-24: `signalStrength`
|
||||
* `POST /session/:sessionId/appium/element/:elementId/value`
|
||||
* :octicons-x-24: `value`
|
||||
* :octicons-check-24: `text`
|
||||
* `POST /session/:sessionId/appium/element/:elementId/replace_value`
|
||||
* :octicons-x-24: `value`
|
||||
* :octicons-check-24: `text`
|
||||
### :bangbang: Execute Driver Script command moved to plugin
|
||||
|
||||
!!! info "Actions Needed"
|
||||
If you use the advanced Execute Driver Script feature (which allows you to send in a WebdriverIO
|
||||
script to have it executed completely on the server instead of command-by-command from the client),
|
||||
this functionality has been moved to a plugin. Here's what to do to keep using it:
|
||||
|
||||
Check your Appium client documentation for the methods using these endpoints, and adjust your
|
||||
code to only use the accepted parameters
|
||||
1. Install the plugin: `appium plugin install execute-driver`
|
||||
2. Ensure you start the Appium server with access to run the plugin by including it in the list of
|
||||
plugins designated on the command line, e.g., `appium --use-plugins=execute-driver`
|
||||
|
||||
### Internal Packages Renamed
|
||||
### :bangbang: External Files No Longer Supported for `--nodeconfig`, `--default-capabilities`, `--allow-insecure` and `--deny-insecure`
|
||||
|
||||
In Appium 1, the internal dependency packages were each located in their own repository. Appium 2
|
||||
moves to a monorepo structure and therefore renames many of these packages, for example:
|
||||
These options can be provided as strings on the command line (a JSON string for `--nodeconfig` and
|
||||
a comma-separated list of strings for `--allow-insecure` and `--deny-insecure`). Arguments provided
|
||||
on the command line will likely need to be quoted or escaped.
|
||||
|
||||
```
|
||||
appium-base-driver # Appium 1
|
||||
@appium/base-driver # Appium 2
|
||||
```
|
||||
The recommended method to provide these options is through a [configuration file](./config.md).
|
||||
|
||||
!!! info "Actions Needed"
|
||||
In summary, if you are using a JSON Appium config file, you can simply cut-and-paste the contents
|
||||
of your "nodeconfig" JSON file into the value of the `server.nodeconfig` property. Any CSV-like
|
||||
files you had previously provided for `--allow-insecure` and `--deny-insecure` become the values
|
||||
of the `server.allow-insecure` and `server.deny-insecure` properties in the Appium config files
|
||||
(respectively); both are arrays of strings.
|
||||
|
||||
If you do not directly import Appium packages into your code - none! However, if you do, make
|
||||
sure to update the names of your Appium package imports!
|
||||
### :bangbang: Old drivers removed
|
||||
|
||||
The old iOS and Android (UiAutomator 1) drivers and related tools (e.g., `authorize-ios`) have been
|
||||
removed. They haven't been relevant for many years anyway.
|
||||
|
||||
### :bangbang: Server can no longer be started with `--port 0`
|
||||
|
||||
In Appium 1, it was possible to specify `--port 0` during server startup. This had the effect of
|
||||
starting Appium on a random free port. In Appium 2, port values must be `1` or higher. The random
|
||||
port assignment was never an intentional feature of Appium 1, but a consequence of how Node's
|
||||
HTTP servers work and the fact that there was no port input validation in Appium 1. If you want
|
||||
to find a random free port to start Appium on, you must now take care of this on your own prior to
|
||||
starting Appium. Starting Appium on an explicit and known port is the correct practice moving
|
||||
forward.
|
||||
|
||||
### :warning: Internal packages renamed
|
||||
|
||||
Some Appium-internal NPM packages have been renamed (for example, `appium-base-driver` is now
|
||||
`@appium/base-driver`). This is not a breaking change for Appium users, only for people who have
|
||||
built software that directly incorporates Appium's code.
|
||||
|
||||
### :warning: `wd` JavaScript client library no longer supported
|
||||
|
||||
For many years, some of Appium's authors maintained the [WD](https://github.com/admc/wd) client
|
||||
library. This library has been deprecated and has not been updated for use with the W3C WebDriver
|
||||
protocol. As such, if you're using this library you'll need to move to a more modern one. We
|
||||
recommend [WebdriverIO](https://webdriver.io).
|
||||
|
||||
### :warning: Appium Desktop replaced with Appium Inspector
|
||||
|
||||
The inspector functionality of Appium Desktop has been moved to its own app:
|
||||
[Appium Inspector](https://github.com/appium/appium-inspector). It is fully compatible with
|
||||
standalone Appium 2 servers, but also works with later versions of Appium 1 servers. Appium Desktop
|
||||
itself has been deprecated and is not compatible with Appium 2.
|
||||
|
||||
In addition to the app, Appium Inspector also has a browser version, accessible at
|
||||
[inspector.appiumpro.com](https://inspector.appiumpro.com). Note that in order to use the
|
||||
browser version with a local Appium server, you'll need to first start the server with the
|
||||
`--allow-cors` flag.
|
||||
|
||||
## Major New Features
|
||||
|
||||
Apart from the breaking changes mentioned above, here are some of the major new features you may
|
||||
wish to take advantage of with Appium 2:
|
||||
Apart from the breaking changes mentioned above, in this section is a list of some of the major new
|
||||
features you may wish to take advantage of with Appium 2.
|
||||
|
||||
### Third-Party Drivers and Plugins
|
||||
### Plugins
|
||||
|
||||
You are no longer limited to official drivers or plugins, or ones that the Appium team even knows
|
||||
about! Developers can now create their own custom drivers or plugins, which can be installed via
|
||||
Appium's [Extension CLI](../reference/cli/extensions.md) from `npm`, `git`, GitHub, or even the local
|
||||
filesystem. Interested in building a driver or plugin? Check out the
|
||||
[Building Drivers](../developing/build-drivers.md) and
|
||||
[Building Plugins](../developing/build-plugins.md) guides.
|
||||
#### :tada: Server Plugins
|
||||
|
||||
### Configuration Files
|
||||
Appium extension authors can now develop their own server plugins, which can intercept and modify
|
||||
any Appium command, or even adjust the way the underlying Appium HTTP server itself works. To learn
|
||||
more about plugins, read the new [Appium Introduction](../intro/index.md). Interested in building
|
||||
a plugin? Check out the [Building Plugins](../developing/build-plugins.md) guide.
|
||||
|
||||
Appium now supports _configuration files_ in addition to command-line arguments. Nearly all options
|
||||
or flags that had to be specified on the CLI in Appium 1, can now also be provided in a
|
||||
configuration file. The file can be in JSON, JS, or YAML format. For more information, refer to
|
||||
the [Config File Guide](./config.md).
|
||||
### :tada: Install drivers and plugins from anywhere
|
||||
|
||||
You're no longer limited to the drivers that come with Appium, or that the Appium team even knows
|
||||
about! Appium extension authors can now develop custom drivers, which can be downloaded or
|
||||
installed via Appium's [Extension CLI](../cli/extensions.md) from `npm`, `git`, GitHub, or even the
|
||||
local filesystem. Interested in building a driver? Check out the [Building
|
||||
Drivers](../developing/build-drivers.md) guide.
|
||||
|
||||
### :tada: Configuration Files
|
||||
|
||||
Appium now supports _configuration files_ in addition to command-line arguments. In a nutshell,
|
||||
nearly all arguments which Appium 1 required to be provided on the CLI are now able to be expressed
|
||||
via a configuration file. Configuration files may be in JSON, JS, or YAML format. See the
|
||||
[Config Guide](./config.md) for a full explanation.
|
||||
|
||||
## Special Notes for Cloud Providers
|
||||
|
||||
Most of this guide has applied to Appium end users or developers, but some of the architectural
|
||||
changes in Appium 2 will constitute breaking changes for different Appium service providers. At the
|
||||
end of the day, the maintainer of the Appium server is responsible for installing and exposing the
|
||||
various Appium drivers and plugins that end users may wish to use.
|
||||
The rest of this document has applied to Appium generally, but some of the architectural changes in
|
||||
Appium 2 will constitute breaking changes for Appium-related service providers, whether a
|
||||
cloud-based Appium host or an internal service. At the end of the day, the maintainer of the Appium
|
||||
server is responsible for installing and making available the various Appium drivers and plugins
|
||||
that end users may wish to use.
|
||||
|
||||
We encourage cloud providers to thoroughly read and understand our [recommendation for cloud
|
||||
provider capabilities](./caps.md#special-notes-for-cloud-providers) in order to support user needs in
|
||||
|
||||
@@ -1,464 +0,0 @@
|
||||
---
|
||||
title: Migrating to Appium 3
|
||||
---
|
||||
<style>
|
||||
.md-typeset .grid {
|
||||
grid-template-columns: repeat(auto-fit,minmax(min(100%,11rem),1fr));
|
||||
}
|
||||
</style>
|
||||
|
||||
This document is a guide for those who are using Appium 2 and would like to upgrade to Appium 3.
|
||||
It contains a list of breaking changes, as well as suggestions for handling them.
|
||||
|
||||
While Appium 2 was a major overhaul of the entire Appium architecture, Appium 3 is a smaller
|
||||
upgrade with fewer breaking changes, which should result in a much simpler migration process.
|
||||
|
||||
## Installation
|
||||
|
||||
The installation method for Appium 3 remains the same as for Appium 2. If you want to upgrade, you
|
||||
can simply install Appium 3 on top of your existing installation:
|
||||
|
||||
```bash
|
||||
# optional: `appium setup reset`
|
||||
npm install -g appium
|
||||
```
|
||||
|
||||
## Breaking Changes
|
||||
|
||||
### Node 20+ Required
|
||||
|
||||
With Appium 2, the minimum required Node version was `14.17.0`. Support for Node 14 had already
|
||||
ended before the release of Appium 2, which meant that even users on outdated Node versions were
|
||||
able to use it.
|
||||
|
||||
Appium 3 drops support for outdated Node versions, and bumps the minimum required version to Node
|
||||
`20.19.0` (with the semver range `^20.19.0 || ^22.12.0 || >=24.0.0`), as well as the minimum `npm`
|
||||
version to `10`.
|
||||
|
||||
!!! info "Actions Needed"
|
||||
|
||||
Upgrade Node.js to `v20.19.0` or newer, and `npm` to `v10` or newer
|
||||
|
||||
### Deprecated Endpoints Removed
|
||||
|
||||
Appium 3 removes many previously deprecated server endpoints. Some of these endpoints have now
|
||||
become specific to one or more drivers, while most others have direct or close-to-direct
|
||||
replacements in other endpoints. All removed endpoints, along with replacements (where applicable)
|
||||
are listed [in the **Removed Endpoints** section](#removed).
|
||||
|
||||
Some W3C endpoints used in Appium also existed in the old JSONWP standard, but required different
|
||||
parameters. With Appium 2, both standards for these endpoints were supported. Appium 3 changes
|
||||
these endpoints by removing support for the JSONWP parameters, and only accepting the W3C
|
||||
parameters. These endpoints are listed [in the **Modified Endpoints** section](#modified).
|
||||
|
||||
!!! info "Actions Needed"
|
||||
|
||||
Check your Appium client documentation for the affected methods, and adjust your code to use
|
||||
their replacements
|
||||
|
||||
### Feature Flag Prefix Required
|
||||
|
||||
With Appium 2, it was possible to opt into certain [insecure features](./security.md) on server
|
||||
startup, which could be enabled using the `--allow-insecure` or `--relaxed-security` flags. Appium
|
||||
`2.13` added the ability to optionally provide a scope prefix to specific features, ensuring that
|
||||
they would only be enabled for the specified driver (or all of them).
|
||||
|
||||
Appium 3 makes the scope prefix mandatory, and will throw an error if features are specified
|
||||
without a scope. Note that the behavior of the `--relaxed-security` flag remains unchanged.
|
||||
|
||||
!!! info "Actions Needed"
|
||||
|
||||
If you use the `--allow-insecure` server flag, add a scope prefix before each feature name.
|
||||
For example, if you use the UiAutomator2 `adb_shell` feature, on Appium 2 you would enable it
|
||||
like this:
|
||||
```
|
||||
appium --allow-insecure=adb_shell
|
||||
```
|
||||
On Appium 3, to ensure this feature is only activated for UiAutomator2, you can run it like so:
|
||||
```
|
||||
appium --allow-insecure=uiautomator2:adb_shell
|
||||
```
|
||||
Alternatively, if you wish to keep the Appium 2 behavior and enable the feature for _all_
|
||||
drivers that support it, you can use the wildcard (`*`) prefix:
|
||||
```
|
||||
appium --allow-insecure=*:adb_shell
|
||||
```
|
||||
Server-scope features like `session_discovery` also require the wildcard prefix.
|
||||
|
||||
|
||||
### Session Discovery Requires Feature Flag
|
||||
|
||||
In Appium 2, it was possible to retrieve all active server sessions via the `GET /sessions`
|
||||
endpoint. This information could then be used, for example, in Appium Inspector, in order to attach
|
||||
to an existing session, instead of creating a new one.
|
||||
|
||||
Appium 3 makes two changes to the session discovery process:
|
||||
|
||||
* The `GET /sessions` endpoint is replaced with `GET /appium/sessions` (see [the Removed Endpoints section](#removed))
|
||||
* The use of the new endpoint requires the `session_discovery` [feature flag](./security.md)
|
||||
|
||||
The return value of `GET /appium/sessions` is largely identical to `GET /sessions`, but additionally
|
||||
includes the `created` field for each session entry, indicating the session creation time as a Unix
|
||||
timestamp. The rest of the result format remains unchanged.
|
||||
|
||||
To reduce migration efforts, the `GET /appium/sessions` endpoint (locked behind the aforementioned
|
||||
feature flag) is also available in Appium `2.19`, allowing you to adjust your code before upgrading
|
||||
to Appium 3. As for Appium Inspector, support for this new endpoint is available starting from
|
||||
version `2025.3.1`.
|
||||
|
||||
!!! info "Actions Needed"
|
||||
|
||||
* If your code uses session retrieval, change the endpoint from `GET /sessions` to
|
||||
`GET /appium/sessions`
|
||||
* If you use Appium Inspector's Attach to Session feature, upgrade to version `2025.3.1` or later
|
||||
* In both cases, ensure your Appium server is launched with the `session_discovery`
|
||||
[feature flag](./security.md)
|
||||
|
||||
### Unzip Logic Removed
|
||||
|
||||
Appium 3 removes the custom unzip logic used when working with files like application packages.
|
||||
Such files are often only relevant to particular platforms, therefore the functionality for
|
||||
handling these operations has been moved to relevant drivers.
|
||||
|
||||
!!! info "Actions Needed"
|
||||
|
||||
Ensure you are using the most recent versions of your drivers
|
||||
|
||||
### Express 5
|
||||
|
||||
Appium 3 upgrades the internally-used `express` dependency from `v4` to `v5`. This should not
|
||||
affect users who use Appium directly, but developers integrating parts of Appium into their own
|
||||
projects may want to check [the Express 5 Migration Guide](https://expressjs.com/en/guide/migrating-5.html).
|
||||
|
||||
!!! info "Actions Needed"
|
||||
|
||||
None! (hopefully)
|
||||
|
||||
## Endpoint Changes
|
||||
### Removed
|
||||
|
||||
The following is a list of all the Appium server endpoints removed in Appium 3. For ease of
|
||||
migration, additional information is provided for each endpoint: drivers that still support the
|
||||
endpoint; suggested replacement endpoints, or, rarely, the lack of any available replacements.
|
||||
|
||||
Icons are used to indicate endpoint support in either certain drivers, or in the core Appium server
|
||||
(applicable to all drivers):
|
||||
|
||||
<div class="grid cards" markdown>
|
||||
|
||||
- :simple-appium:{ .lg } - Appium server
|
||||
- :material-apple:{ .lg } - [XCUITest driver](https://appium.github.io/appium-xcuitest-driver/latest/)
|
||||
- :material-android:{ .lg } - [UiAutomator2 driver](https://github.com/appium/appium-uiautomator2-driver/)
|
||||
- :material-coffee:{ .lg } - [Espresso driver](https://github.com/appium/appium-espresso-driver)
|
||||
- :material-apple-finder:{ .lg } - [Mac2 driver](https://github.com/appium/appium-mac2-driver)
|
||||
- :material-microsoft-windows:{ .lg } - [Windows driver](https://github.com/appium/appium-windows-driver)
|
||||
|
||||
</div>
|
||||
|
||||
* `GET /sessions`
|
||||
* :octicons-arrow-right-24: `GET /appium/sessions` :simple-appium:
|
||||
* `POST /session/:sessionId/accept_alert`
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/alert/accept` :simple-appium:
|
||||
* :octicons-arrow-right-24: `mobile: alert` [execute method](./execute-methods.md) :material-apple:
|
||||
* :octicons-arrow-right-24: `mobile: acceptAlert` execute method :material-android:
|
||||
* `GET /session/:sessionId/alert_text`
|
||||
* :octicons-arrow-right-24: `GET /session/:sessionId/alert/text` :simple-appium:
|
||||
* `POST /session/:sessionId/alert_text`
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/alert/text` :simple-appium:
|
||||
* `POST /session/:sessionId/appium/app/background`
|
||||
* :octicons-arrow-right-24: `mobile: backgroundApp` execute method :material-apple: :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/app/close`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: `mobile: terminateApp` execute method :material-apple: :material-android: :material-coffee:
|
||||
* :octicons-arrow-right-24: `macos: terminateApp` execute method :material-apple-finder:
|
||||
* :octicons-arrow-right-24: `windows: closeApp` execute method :material-microsoft-windows:
|
||||
* `POST /session/:sessionId/appium/app/end_test_coverage`
|
||||
* :octicons-arrow-right-24: `mobile: shell` execute method :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/app/launch`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: `mobile: launchApp` execute method :material-apple:
|
||||
* :octicons-arrow-right-24: `mobile: activateApp` or `mobile: startActivity` execute methods :material-android: :material-coffee:
|
||||
* :octicons-arrow-right-24: `macos: launchApp` or `macos: activateApp` execute methods :material-apple-finder:
|
||||
* :octicons-arrow-right-24: `windows: launchApp` execute method :material-microsoft-windows:
|
||||
* `POST /session/:sessionId/appium/app/reset`
|
||||
* :octicons-arrow-right-24: `mobile: clearApp` execute method :material-apple: [^sim] :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/app/strings`
|
||||
* :octicons-arrow-right-24: `mobile: getAppStrings` execute method :material-apple: :material-android: :material-coffee:
|
||||
* `GET /session/:sessionId/appium/device/app_state`
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/appium/device/app_state` :simple-appium:
|
||||
* :octicons-arrow-right-24: `mobile: queryAppState` execute method :material-apple: :material-android: :material-coffee:
|
||||
* :octicons-arrow-right-24: `macos: queryAppState` execute method :material-apple-finder:
|
||||
* `GET /session/:sessionId/appium/device/current_activity`
|
||||
* :octicons-arrow-right-24: `mobile: getCurrentActivity` execute method :material-android: :material-coffee:
|
||||
* `GET /session/:sessionId/appium/device/current_package`
|
||||
* :octicons-arrow-right-24: `mobile: getCurrentPackage` execute method :material-android: :material-coffee:
|
||||
* `GET /session/:sessionId/appium/device/display_density`
|
||||
* :octicons-arrow-right-24: `mobile: getDisplayDensity` execute method :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/device/finger_print`
|
||||
* :octicons-arrow-right-24: `mobile: fingerPrint` execute method :material-android: [^sim] :material-coffee: [^sim]
|
||||
* `POST /session/:sessionId/appium/device/get_clipboard`
|
||||
* :octicons-check-24: Moved to drivers: :material-android: :material-coffee:
|
||||
* :octicons-arrow-right-24: `mobile: getClipboard` execute method :material-apple: :material-android: :material-coffee:
|
||||
* :octicons-arrow-right-24: `mobile: getPasteboard` execute method :material-apple: [^sim]
|
||||
* :octicons-arrow-right-24: `windows: getClipboard` execute method :material-microsoft-windows:
|
||||
* `POST /session/:sessionId/appium/device/gsm_call`
|
||||
* :octicons-arrow-right-24: `mobile: gsmCall` execute method :material-android: [^sim] :material-coffee: [^sim]
|
||||
* `POST /session/:sessionId/appium/device/gsm_signal`
|
||||
* :octicons-arrow-right-24: `mobile: gsmSignal` execute method :material-android: [^sim] :material-coffee: [^sim]
|
||||
* `POST /session/:sessionId/appium/device/gsm_voice`
|
||||
* :octicons-arrow-right-24: `mobile: gsmVoice` execute method :material-android: [^sim] :material-coffee: [^sim]
|
||||
* `POST /session/:sessionId/appium/device/is_locked`
|
||||
* :octicons-arrow-right-24: `mobile: isLocked` execute method :material-apple: :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/device/keyevent`
|
||||
* :octicons-arrow-right-24: `mobile: keys` execute method :material-apple: (iPadOS only)
|
||||
* :octicons-arrow-right-24: `mobile: pressKey` execute method :material-android: :material-coffee:
|
||||
* :octicons-arrow-right-24: `macos: keys` execute method :material-apple-finder:
|
||||
* :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
|
||||
* `POST /session/:sessionId/appium/device/lock`
|
||||
* :octicons-arrow-right-24: `mobile: lock` execute method :material-apple: :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/device/long_press_keycode`
|
||||
* :octicons-arrow-right-24: `mobile: pressKey` execute method :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/device/network_speed`
|
||||
* :octicons-arrow-right-24: `mobile: networkSpeed` execute method :material-android: [^sim] :material-coffee: [^sim]
|
||||
* `POST /session/:sessionId/appium/device/open_notifications`
|
||||
* :octicons-arrow-right-24: `mobile: statusBar` execute method :material-android: :material-coffee:
|
||||
* :octicons-arrow-right-24: `mobile: openNotifications` execute method :material-android:
|
||||
* `POST /session/:sessionId/appium/device/power_ac`
|
||||
* :octicons-arrow-right-24: `mobile: powerAC` execute method :material-android: [^sim] :material-coffee: [^sim]
|
||||
* `POST /session/:sessionId/appium/device/power_capacity`
|
||||
* :octicons-arrow-right-24: `mobile: powerCapacity` execute method :material-android: [^sim] :material-coffee: [^sim]
|
||||
* `POST /session/:sessionId/appium/device/press_keycode`
|
||||
* :octicons-arrow-right-24: `mobile: keys` execute method :material-apple: (iPadOS only)
|
||||
* :octicons-arrow-right-24: `mobile: pressKey` execute method :material-android: :material-coffee:
|
||||
* :octicons-arrow-right-24: `macos: keys` execute method :material-apple-finder:
|
||||
* :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
|
||||
* `POST /session/:sessionId/appium/device/send_sms`
|
||||
* :octicons-arrow-right-24: `mobile: sendSms` execute method :material-android: [^sim] :material-coffee: [^sim]
|
||||
* `POST /session/:sessionId/appium/device/set_clipboard`
|
||||
* :octicons-arrow-right-24: `mobile: setClipboard` execute method :material-apple: :material-android: :material-coffee:
|
||||
* :octicons-arrow-right-24: `mobile: setPasteboard` execute method :material-apple: [^sim]
|
||||
* :octicons-arrow-right-24: `windows: setClipboard` execute method :material-microsoft-windows:
|
||||
* `POST /session/:sessionId/appium/device/shake`
|
||||
* :octicons-arrow-right-24: `mobile: shake` execute method :material-apple: [^sim]
|
||||
* `POST /session/:sessionId/appium/device/start_activity`
|
||||
* :octicons-arrow-right-24: `mobile: startActivity` execute method :material-android: :material-coffee:
|
||||
* `GET /session/:sessionId/appium/device/system_bars`
|
||||
* :octicons-arrow-right-24: `mobile: deviceScreenInfo` execute method :material-apple:
|
||||
* :octicons-arrow-right-24: `mobile: getSystemBars` execute method :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/device/toggle_airplane_mode`
|
||||
* :octicons-arrow-right-24: `mobile: setConnectivity` execute method :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/device/toggle_data`
|
||||
* :octicons-arrow-right-24: `mobile: setConnectivity` execute method :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/device/toggle_location_services`
|
||||
* :octicons-arrow-right-24: `mobile: toggleGps` execute method :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/device/toggle_wifi`
|
||||
* :octicons-arrow-right-24: `mobile: setConnectivity` execute method :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/device/unlock`
|
||||
* :octicons-arrow-right-24: `mobile: unlock` execute method :material-apple: :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/element/:elementId/value`
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/element/:elementId/value` :simple-appium:
|
||||
* `POST /session/:sessionId/appium/element/:elementId/replace_value`
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/element/:elementId/value` :simple-appium:
|
||||
* `POST /session/:sessionId/appium/getPerformanceData`
|
||||
* :octicons-arrow-right-24: `mobile: getPerformanceData` execute method :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/performanceData/types`
|
||||
* :octicons-arrow-right-24: `mobile: getPerformanceDataTypes` execute method :material-android: :material-coffee:
|
||||
* `POST /session/:sessionId/appium/receive_async_response`
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/execute/async` :simple-appium:
|
||||
* `POST /session/:sessionId/appium/simulator/toggle_touch_id_enrollment`
|
||||
* :octicons-arrow-right-24: `mobile: enrollBiometric` execute method :material-apple: [^sim]
|
||||
* `POST /session/:sessionId/appium/simulator/touch_id`
|
||||
* :octicons-arrow-right-24: `mobile: sendBiometricMatch` execute method :material-apple: [^sim]
|
||||
* `POST /session/:sessionId/appium/start_recording_screen`
|
||||
* :octicons-check-24: Moved to drivers: :material-apple: :material-android: :material-coffee: :material-apple-finder: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: `mobile: startXCTestScreenRecording` execute method :material-apple:
|
||||
* :octicons-arrow-right-24: `mobile: startMediaProjectionRecording` execute method :material-android: :material-coffee:
|
||||
* :octicons-arrow-right-24: `macos: startRecordingScreen` or `macos: startNativeScreenRecording` execute methods :material-apple-finder:
|
||||
* :octicons-arrow-right-24: `windows: startRecordingScreen` execute method :material-microsoft-windows:
|
||||
* `POST /session/:sessionId/appium/stop_recording_screen`
|
||||
* :octicons-check-24: Moved to drivers: :material-apple: :material-android: :material-coffee: :material-apple-finder: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: `mobile: stopXCTestScreenRecording` execute method :material-apple:
|
||||
* :octicons-arrow-right-24: `mobile: stopMediaProjectionRecording` execute method :material-android: :material-coffee:
|
||||
* :octicons-arrow-right-24: `macos: stopRecordingScreen` or `macos: stopNativeScreenRecording` execute methods :material-apple-finder:
|
||||
* :octicons-arrow-right-24: `windows: stopRecordingScreen` execute method :material-microsoft-windows:
|
||||
* `GET /session/:sessionId/application_cache/status`
|
||||
* :octicons-no-entry-24: JSONWP protocol command with no direct replacement
|
||||
* `POST /session/:sessionId/buttondown`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: [W3C Actions API](https://www.selenium.dev/documentation/webdriver/actions_api/) (`pointerDown`) :simple-appium:
|
||||
* :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
|
||||
* `POST /session/:sessionId/buttonup`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: W3C Actions API (`pointerUp`) :simple-appium:
|
||||
* :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
|
||||
* `POST /session/:sessionId/click`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: W3C Actions API (`pointerDown` & `pointerUp`) :simple-appium:
|
||||
* `POST /session/:sessionId/dismiss_alert`
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/alert/dismiss` :simple-appium:
|
||||
* `POST /session/:sessionId/doubleclick`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: W3C Actions API (`pointerDown` & `pointerUp`) :simple-appium:
|
||||
* `POST /session/:sessionId/element/active`
|
||||
* :octicons-arrow-right-24: `GET /session/:sessionId/element/active` :simple-appium:
|
||||
* `GET /session/:sessionId/element/:elementId/equals/:otherId`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* `GET /session/:sessionId/element/:elementId/location`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: `GET /session/:sessionId/element/:elementId/rect` :simple-appium:
|
||||
* `GET /session/:sessionId/element/:elementId/location_in_view`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* `GET /session/:sessionId/element/:elementId/pageIndex`
|
||||
* :octicons-no-entry-24: MJSONWP protocol command with no direct replacement
|
||||
* `GET /session/:sessionId/element/:elementId/size`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: `GET /session/:sessionId/element/:elementId/rect` :simple-appium:
|
||||
* `POST /session/:sessionId/element/:elementId/submit`
|
||||
* :octicons-no-entry-24: JSONWP protocol command with no direct replacement
|
||||
* `POST /session/:sessionId/execute`
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/execute/sync` :simple-appium:
|
||||
* `POST /session/:sessionId/execute_async`
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/execute/async` :simple-appium:
|
||||
* `POST /session/:sessionId/keys`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: W3C Actions API (`keyDown` & `keyUp`) :simple-appium:
|
||||
* Selenium-based clients can also use [Send Keys](https://www.selenium.dev/documentation/webdriver/actions_api/keyboard/#send-keys)
|
||||
* `GET /session/:sessionId/local_storage`
|
||||
* :octicons-no-entry-24: JSONWP protocol command with no direct replacement
|
||||
* `POST /session/:sessionId/local_storage`
|
||||
* :octicons-no-entry-24: JSONWP protocol command with no direct replacement
|
||||
* `DELETE /session/:sessionId/local_storage`
|
||||
* :octicons-no-entry-24: JSONWP protocol command with no direct replacement
|
||||
* `GET /session/:sessionId/local_storage/key/:key`
|
||||
* :octicons-no-entry-24: JSONWP protocol command with no direct replacement
|
||||
* `DELETE /session/:sessionId/local_storage/key/:key`
|
||||
* :octicons-no-entry-24: JSONWP protocol command with no direct replacement
|
||||
* `GET /session/:sessionId/local_storage/size`
|
||||
* :octicons-no-entry-24: JSONWP protocol command with no direct replacement
|
||||
* `POST /session/:sessionId/log`
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/se/log` :simple-appium:
|
||||
* `GET /session/:sessionId/log/types`
|
||||
* :octicons-arrow-right-24: `GET /session/:sessionId/se/log/types` :simple-appium:
|
||||
* `POST /session/:sessionId/moveto`
|
||||
* :octicons-arrow-right-24: W3C Actions API (`pointerMove`) :simple-appium:
|
||||
* Selenium-based clients can also use [Move by Offset](https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#move-by-offset)
|
||||
* `GET /session/:sessionId/screenshot/:elementId`
|
||||
* :octicons-arrow-right-24: `GET /session/:sessionId/element/:elementId/screenshot` :simple-appium:
|
||||
* `GET /session/:sessionId/session_storage`
|
||||
* :octicons-no-entry-24: JSONWP protocol command with no direct replacement
|
||||
* `POST /session/:sessionId/session_storage`
|
||||
* :octicons-no-entry-24: JSONWP protocol command with no direct replacement
|
||||
* `DELETE /session/:sessionId/session_storage`
|
||||
* :octicons-no-entry-24: JSONWP protocol command with no direct replacement
|
||||
* `GET /session/:sessionId/session_storage/key/:key`
|
||||
* :octicons-no-entry-24: JSONWP protocol command with no direct replacement
|
||||
* `DELETE /session/:sessionId/session_storage/key/:key`
|
||||
* :octicons-no-entry-24: JSONWP protocol command with no direct replacement
|
||||
* `GET /session/:sessionId/session_storage/size`
|
||||
* :octicons-no-entry-24: JSONWP protocol command with no direct replacement
|
||||
* `POST /session/:sessionId/timeouts/async_script`
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/timeouts` :simple-appium:
|
||||
* `POST /session/:sessionId/timeouts/implicit_wait`
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/timeouts` :simple-appium:
|
||||
* `POST /session/:sessionId/touch/click`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: W3C Actions API (`pointerDown` & `pointerUp`) :simple-appium:
|
||||
* Selenium-based clients can also use [Click and Release](https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#click-and-release)
|
||||
* :octicons-arrow-right-24: `mobile: tap` or `mobile: tapWithNumberOfTaps` execute methods :material-apple:
|
||||
* :octicons-arrow-right-24: `mobile: clickGesture` execute method :material-android:
|
||||
* :octicons-arrow-right-24: `mobile: clickAction` execute method :material-coffee:
|
||||
* :octicons-arrow-right-24: `macos: click`, `macos: rightClick`, `macos: press` or `macos: tap` execute methods :material-apple-finder:
|
||||
* :octicons-arrow-right-24: `windows: click` execute method :material-microsoft-windows:
|
||||
* `POST /session/:sessionId/touch/doubleclick`
|
||||
* :octicons-arrow-right-24: W3C Actions API (`pointerDown` & `pointerUp`) :simple-appium:
|
||||
* Selenium-based clients can also use [Double Click](https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#double-click)
|
||||
* :octicons-arrow-right-24: `mobile: doubleTap` or `mobile: tapWithNumberOfTaps` execute methods :material-apple:
|
||||
* :octicons-arrow-right-24: `mobile: doubleClickGesture` execute method :material-android:
|
||||
* :octicons-arrow-right-24: `mobile: clickAction` execute method :material-coffee:
|
||||
* :octicons-arrow-right-24: `macos: doubleClick` or `macos: doubleTap` execute methods :material-apple-finder:
|
||||
* :octicons-arrow-right-24: `windows: click` execute method :material-microsoft-windows:
|
||||
* `POST /session/:sessionId/touch/down`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: W3C Actions API (`pointerDown`) :simple-appium:
|
||||
* :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
|
||||
* `POST /session/:sessionId/touch/flick`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: W3C Actions API (`pointerDown`, `pointerMove` & `pointerUp`) :simple-appium:
|
||||
* :octicons-arrow-right-24: `mobile: flingGesture` execute method :material-android:
|
||||
* `POST /session/:sessionId/touch/longclick`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: W3C Actions API (`pointerDown`, `pause` & `pointerUp`) :simple-appium:
|
||||
* :octicons-arrow-right-24: `mobile: touchAndHold` execute method :material-apple:
|
||||
* :octicons-arrow-right-24: `mobile: longClickGesture` execute method :material-android:
|
||||
* :octicons-arrow-right-24: `mobile: clickAction` execute method :material-coffee:
|
||||
* :octicons-arrow-right-24: `macos: press` execute method :material-apple-finder:
|
||||
* :octicons-arrow-right-24: `windows: click` execute method :material-microsoft-windows:
|
||||
* `POST /session/:sessionId/touch/multi/perform`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/actions` :simple-appium:
|
||||
* `POST /session/:sessionId/touch/move`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: W3C Actions API (`pointerMove`) :simple-appium:
|
||||
* Selenium-based clients can also use [Move by Offset](https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#move-by-offset)
|
||||
* `POST /session/:sessionId/touch/perform`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/actions` :simple-appium:
|
||||
* `POST /session/:sessionId/touch/scroll`
|
||||
* :octicons-arrow-right-24: W3C Actions API (`pointerDown`, `pointerMove` & `pointerUp`) :simple-appium:
|
||||
* :octicons-arrow-right-24: `mobile: scroll` or `mobile: swipe` execute methods :material-apple:
|
||||
* :octicons-arrow-right-24: `mobile: scrollGesture` or `mobile: swipeGesture` execute methods :material-android:
|
||||
* :octicons-arrow-right-24: `mobile: swipe` execute method :material-coffee:
|
||||
* :octicons-arrow-right-24: `macos: scroll` or `macos: swipe` execute methods :material-apple-finder:
|
||||
* :octicons-arrow-right-24: `windows: scroll` execute method :material-microsoft-windows:
|
||||
* `POST /session/:sessionId/touch/up`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: W3C Actions API (`pointerUp`) :simple-appium:
|
||||
* :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
|
||||
* `GET /session/:sessionId/window_handle`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: `GET /session/:sessionId/window` :simple-appium:
|
||||
* `GET /session/:sessionId/window_handles`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: `GET /session/:sessionId/window/handles` :simple-appium:
|
||||
* `GET /session/:sessionId/window/handle`
|
||||
* :octicons-arrow-right-24: `GET /session/:sessionId/window` :simple-appium:
|
||||
* `POST /session/:sessionId/window/:windowhandle/maximize`
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/window/maximize` :simple-appium:
|
||||
* :fontawesome-solid-triangle-exclamation: Only supported for the current window
|
||||
* `GET /session/:sessionId/window/:windowhandle/position`
|
||||
* :octicons-arrow-right-24: `GET /session/:sessionId/window/rect` :simple-appium:
|
||||
* :fontawesome-solid-triangle-exclamation: Only supported for the current window
|
||||
* `POST /session/:sessionId/window/:windowhandle/position`
|
||||
* :octicons-arrow-right-24: `POST /session/:sessionId/window/rect` :simple-appium:
|
||||
* :fontawesome-solid-triangle-exclamation: Only supported for the current window
|
||||
* `GET /session/:sessionId/window/:windowhandle/size`
|
||||
* :octicons-check-24: Moved to drivers: :material-microsoft-windows:
|
||||
* :octicons-arrow-right-24: `GET /session/:sessionId/window/rect` :simple-appium:
|
||||
* :fontawesome-solid-triangle-exclamation: Only supported for the current window
|
||||
|
||||
### Modified
|
||||
|
||||
The following are all endpoints modified in Appium 3, by removing handling for old or unused
|
||||
parameters (note that no new parameters have been added). Each endpoint lists the parameters it no
|
||||
longer accepts, as well as the parameters it continues to accept in Appium 3.
|
||||
|
||||
* `POST /session`
|
||||
* :octicons-x-24: `desiredCapabilities`, `requiredCapabilities`
|
||||
* :octicons-check-24: `capabilities`
|
||||
* `POST /session/:sessionId/alert/text`
|
||||
* :octicons-x-24: `value`
|
||||
* :octicons-check-24: `text`
|
||||
* `GET /session/:sessionId/appium/device/system_time`
|
||||
* :octicons-x-24: `format`
|
||||
* :octicons-check-24: None
|
||||
* `POST /session/:sessionId/element/:elementId/value`
|
||||
* :octicons-x-24: `value`
|
||||
* :octicons-check-24: `text`
|
||||
* `POST /session/:sessionId/timeouts`
|
||||
* :octicons-x-24: `type`, `ms`
|
||||
* :octicons-check-24: `script`, `pageLoad`, `implicit`
|
||||
* `POST /session/:sessionId/window`
|
||||
* :octicons-x-24: `name`
|
||||
* :octicons-check-24: `handle`
|
||||
|
||||
[^sim]: Supported in emulators/simulators only
|
||||
@@ -4,7 +4,7 @@ title: Appium Server Security
|
||||
|
||||
The Appium team makes every effort to ensure the security of the Appium server. This is especially
|
||||
important when Appium is run in a multitenant environment, or when multiple users are running
|
||||
sessions on the same Appium server. In general, you can only safely enable all of Appium's features if
|
||||
sessions on the same Appium server. In general, you can only safely enable all Appium's features if
|
||||
all the following are true:
|
||||
|
||||
- You're running your own Appium server locally or within a protected internal network
|
||||
@@ -12,39 +12,28 @@ all the following are true:
|
||||
- You don't expose Appium's port(s) to the wider internet
|
||||
|
||||
But because many Appium users might not be able to guarantee such a safe environment, the Appium
|
||||
team puts many features behind a security protection mechanism, which forces system admins (the
|
||||
people who are in charge of starting the Appium server) to _explicitly opt-in_ to these features.
|
||||
team puts many features behind a security protection mechanism which forces system admins (the
|
||||
people that are in charge of starting the Appium server) to _explicitly opt-in_ to these features.
|
||||
(Third-party driver and plugin authors can also [hide behaviour behind security
|
||||
flags](../developing/build-drivers.md).)
|
||||
|
||||
For security reasons, Appium client sessions can _not_ request feature enablement via capabilities.
|
||||
This is the responsibility of the server admin who configures and launches the Appium server.
|
||||
For security reasons, Appium client sessions can _not_ request feature enablement via capabilities;
|
||||
this is the responsibility of the server admin who configures and launches the Appium server.
|
||||
|
||||
## Security Server Args
|
||||
|
||||
The [Server CLI](../reference/cli/server.md) doc outlines three relevant arguments which may be passed to
|
||||
Appium, when starting it from the command line:
|
||||
The [Server CLI Args](../cli/args.md) doc outlines three relevant arguments which may be passed to
|
||||
Appium when starting it from the command line:
|
||||
|
||||
|<div style="width:10em">Parameter</div>|Description|
|
||||
|---------------------------------------|-----------|
|
||||
|`--relaxed-security`|Turns on _all_ insecure features, except those blocked by `--deny-insecure`|
|
||||
|`--allow-insecure`|Turns on _only_ specified features, except those blocked by `--deny-insecure`. Has no effect when used in combination with `--relaxed-security`|
|
||||
|`--deny-insecure`|Explicitly turns _off_ specified features, overriding `--relaxed-security` and `--allow-insecure`|
|
||||
|
||||
All of the above arguments can also be specified in the [Appium Configuration file](./config.md).
|
||||
|
||||
Features passed to `--allow-insecure`/`--deny-insecure` must be specified as a comma-separated list,
|
||||
and each feature in the list must additionally include a prefix, indicating the driver to which the
|
||||
feature should apply. The prefix can be either the driver's `automationName`, or the wildcard (`*`)
|
||||
symbol, if the feature should be applied to all drivers. The prefix and feature name are separated
|
||||
using the colon character (`:`).
|
||||
|
||||
For example, `first:foo` refers to the `foo` feature for the `first` driver, whereas `*:bar` refers
|
||||
to the `bar` feature for all drivers.
|
||||
|`--relaxed-security` |Setting this flag turns on _all_ insecure features (unless blocked by `--deny-insecure`; see below)|
|
||||
|`--allow-insecure` |Setting this flag to a comma-separated list of feature names or a path to a file containing a feature list (each name on a separate line) will allow _only_ the features listed. For example, `--allow-insecure=adb_shell` will cause _only_ the ADB shell execution feature to be enabled. This is true _unless_ `--relaxed-security` is also used, in which case all features will still be enabled. It makes no sense to combine this flag with `--relaxed-security`.|
|
||||
|`--deny-insecure` |This flag can likewise be set to a comma-separated list of feature names, or a path to a feature file. Any features listed here will be _disabled_, regardless of whether `--relaxed-security` is set and regardless of whether the names are also listed with `--allow-insecure`.|
|
||||
|
||||
## Insecure Features
|
||||
|
||||
Each Appium driver is responsible for its own security, and can create its own feature names. Thus,
|
||||
Each Appium driver is responsible for its own security, and can create its own feature names. Thus
|
||||
you should read through the documentation for a particular driver to know which feature names it
|
||||
might use. Here is an incomplete list of examples from some of Appium's official drivers:
|
||||
|
||||
@@ -53,43 +42,32 @@ might use. Here is an incomplete list of examples from some of Appium's official
|
||||
|`get_server_logs`|Allows retrieving of Appium server logs via the Webdriver log interface|IOS, XCUITest, Android, UiAutomator2, Espresso|
|
||||
|`adb_shell`|Allows execution of arbitrary shell commands via ADB, using the `mobile: shell` command|Android, UiAutomator2, Espresso|
|
||||
|`record_audio`|Allow recording of host machine audio inputs|XCUITest|
|
||||
|`execute_driver_script`| Allows sending a request that has multiple Appium commands.|Execute Driver Plugin|
|
||||
|`execute_driver_script`| Allows to send a request which has multiple Appium commands.|Execute Driver Plugin|
|
||||
|
||||
Some insecure features operate on the server level and do not require a driver session. Enabling
|
||||
these features require using the wildcard prefix:
|
||||
## Driver-scope security
|
||||
|
||||
|<div style="width:12em">Feature Name</div>|Description|
|
||||
|------------|-----------|
|
||||
|`session_discovery`|Allows retrieving the list of active server sessions via `GET /appium/sessions`|
|
||||
Since Appium server version 2.12.3 there is a possibility to prefix each feature name with the corresponding automationName where it is going to be applied. For example, if you provide the following features to allow:
|
||||
`uiautomator2:adb_shell,xcuitest:get_server_logs,*:record_audio`, then the `adb_shell` would only be allowed
|
||||
for the UiAutomator2 driver, `get_server` - for the XCUITest driver and the `record_audio` one - for
|
||||
all installed drivers. Feature names provided without explicit automation name prefix are equivalent to
|
||||
these having the `*:` prefix. The same feature naming rule applies to the list of denied features.
|
||||
|
||||
## Examples
|
||||
|
||||
Turn on the `foo` feature only for the `first` driver:
|
||||
To turn on the `get_server_logs` feature for my Appium server, I could start it like this:
|
||||
|
||||
```bash
|
||||
appium --allow-insecure=first:foo
|
||||
appium --allow-insecure=get_server_logs
|
||||
```
|
||||
|
||||
Turn on the `foo` feature for all drivers:
|
||||
To turn on multiple features:
|
||||
|
||||
```bash
|
||||
appium --allow-insecure='*:foo'
|
||||
appium --allow-insecure=get_server_logs,record_audio
|
||||
```
|
||||
|
||||
Turn on the `foo` feature for all drivers _except_ `first`:
|
||||
To allow all features except one:
|
||||
|
||||
```bash
|
||||
appium --allow-insecure='*:foo' --deny-insecure=first:foo
|
||||
```
|
||||
|
||||
Turn on all features _except_ `foo` for all drivers:
|
||||
|
||||
```bash
|
||||
appium --relaxed-security --deny-insecure='*:foo'
|
||||
```
|
||||
|
||||
Turn on multiple insecure features for specific drivers:
|
||||
|
||||
```bash
|
||||
appium --allow-insecure=uiautomator2:adb_shell,xcuitest:get_server_logs
|
||||
appium --relaxed-security --deny-insecure=adb_shell
|
||||
```
|
||||
|
||||
@@ -12,6 +12,13 @@ title: Welcome
|
||||
}
|
||||
</style>
|
||||
|
||||
<div style="text-align:center;width:100%;background-color:#ec366d;margin-top:-3em;margin-bottom:2em;">
|
||||
<h3 style="color:#ffffff;padding: 8px;">
|
||||
AppiumConf 2025 is partnering with SeleniumConf<br/> <span style="font-size:0.8em;">March 26-28 in Valencia, Spain. Join us to learn and connect with the community!</span><br/>
|
||||
<a style="color:#fcba12" href="https://seleniumconf.com/" target="_blank">Register Now</a>
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div style="text-align: center">
|
||||
<img src="assets/images/appium-logo-horiz.png" style="max-width: 400px;" />
|
||||
</div>
|
||||
@@ -33,12 +40,6 @@ Android TV, Samsung), and more!
|
||||
<img src="assets/images/sponsor-logo-browserstack-light.png#only-light" style="width: 220px;" />
|
||||
</a>
|
||||
</div>
|
||||
<div class="homepageSponsor">
|
||||
<a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
|
||||
<img src="assets/images/sponsor-logo-lambdatest-dark.png#only-dark" style="width: 220px;" />
|
||||
<img src="assets/images/sponsor-logo-lambdatest-light.png#only-light" style="width: 220px;" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -49,11 +50,11 @@ Android TV, Samsung), and more!
|
||||
- Check out the [__Introduction__](./intro/index.md) to make sure you understand the key concepts
|
||||
- Go through the [__Quickstart__](./quickstart/index.md) to get set up and run a basic Android test
|
||||
- Visit the [__Ecosystem__](./ecosystem/index.md) page for a list of drivers, clients and plugins you may want to use
|
||||
- Consult the [__Reference__](./reference/index.md) page for information on the Appium CLI and supported endpoints
|
||||
- Read the different [__Guides__](./guides/migrating-2-to-3.md) for a variety of instructions, tips and tricks
|
||||
- Check out various third-party [__Resources__](./resources/index.md) to explore Appium around the web
|
||||
- Refer to the [__CLI Reference__](./cli/index.md) for using Appium from the command line
|
||||
- See the [__Command Reference__](./commands/index.md) for a list of commands exposed by Appium and plugins
|
||||
- Read the different [__Guides__](./guides/migrating-1-to-2.md) for a variety of instructions, tips and tricks
|
||||
- Check out various third-party [__Resources__](./resources.md) to explore Appium around the web
|
||||
- For creating your own Appium extensions, see the [__Developer__](./developing/index.md) documentation
|
||||
- For contributions to Appium itself, refer to the [__Contributing__](./contributing/index.md) page
|
||||
- Have a look at the [__Appium Blog__](./blog/index.md) to learn what's new in the project
|
||||
- For contributions to Appium itself, refer to the [__Contributing__](./contributing.md) page
|
||||
|
||||
</div>
|
||||
|
||||
@@ -107,7 +107,7 @@ differently from one another. The tools and requirements for building and using
|
||||
different platforms are completely different. And so Appium lets you use just the drivers that you
|
||||
need for your automation tasks. Choosing drivers and installing them so that you can use them with
|
||||
your Appium instance is so important that Appium has its very own [CLI for managing
|
||||
drivers](../reference/cli/extensions.md).
|
||||
drivers](../cli/extensions.md).
|
||||
|
||||
So, to answer our original question, the way that Appium provides access to automation capabilities
|
||||
for a given platform is that the Appium team (or anyone else[^3]) writes a *driver* for that
|
||||
@@ -190,9 +190,9 @@ will never have time to build. And so, with Appium 2, Appium has released a plug
|
||||
enables anyone to build and share modules that change how Appium works!
|
||||
|
||||
In the same way that drivers are easily shareable and consumable via the Appium driver CLI, plugins
|
||||
can be published and consumed via a parallel [Plugin CLI](../reference/cli/extensions.md). Plugins
|
||||
can do all sorts of things, for example adding the ability for Appium to find and interact with
|
||||
screen regions based on a template image (as in the [`images`
|
||||
can be published and consumed via a parallel [Plugin CLI](../cli/extensions.md). Plugins can do all
|
||||
sorts of things, for example adding the ability for Appium to find and interact with screen regions
|
||||
based on a template image (as in the [`images`
|
||||
plugin](https://github.com/appium/appium/tree/master/packages/images-plugin)). There are very few
|
||||
limitations on what you can do with plugins, so you might also be interested in learning how to
|
||||
[Build Plugins](../developing/build-plugins.md) in Node.js that can be used with Appium.
|
||||
|
||||
@@ -157,7 +157,8 @@ it was easy for users or third-party developers to build their own Appium
|
||||
on the Appium codebase, and to see support for new platforms added to Appium by
|
||||
groups other than the core team. That vision has begun to be fulfilled, with
|
||||
groups like Microsoft and Youi.tv adding drivers to Appium for Windows desktop
|
||||
app automation and Youi.tv app automation, respectively.
|
||||
app automation and Youi.tv app automation, respectively. Who knows what
|
||||
platforms will be added next?
|
||||
|
||||
## Appium To The People
|
||||
|
||||
@@ -171,26 +172,11 @@ foundation, we hope that the door will open even more widely for new
|
||||
contributors, either as individuals or representing one of the many companies
|
||||
which now have an interest in seeing Appium move forward.
|
||||
|
||||
Eventually, the JS Foundation merged into the [OpenJS Foundation](https://openjsf.org),
|
||||
and Appium became an Impact Project in the foundation.
|
||||
Eventually, the JS Foundation merged into the [OpenJS Foundation](https://openjsf.org), and Appium
|
||||
is currently an Impact Project in the foundation.
|
||||
|
||||
## Appium 2.0
|
||||
|
||||
Appium 2 was released in 2023 and introduced an entirely revamped architecture, shifting focus to Appium
|
||||
as an ecosystem rather than an all-in-one project. This unlocked the ability for anyone to develop
|
||||
and share their own Appium extensions (drivers and plugins), opening up a world of possibilities
|
||||
for automation-related development for platforms far beyond iOS and Android! As a result,
|
||||
many third-party extensions were created, such as new drivers for Flutter and Windows, plugins for
|
||||
mocking APIs and managing device farms, new Appium clients based on Rust and Swift, and much more.
|
||||
|
||||
Around this time was also when we started a sponsorship program for Appium, which attracted various
|
||||
major and minor sponsors alike. This allowed us to give back to the Appium community, by compensating
|
||||
contributors for their voluntary work on the project.
|
||||
|
||||
## Appium 3.0
|
||||
|
||||
2025 saw the release of Appium 3. This update was a lot smaller than Appium 2 and included only a
|
||||
few behavioral changes, instead focusing on removing deprecated code and updating compatibility for
|
||||
more modern ecosystems. Still, this reduced scope was also to be expected: since Appium 2, the
|
||||
main feature development efforts had shifted to individual drivers and plugins, many of which had
|
||||
gone through multiple major updates during the Appium 2 era.
|
||||
Appium 2 was released in 2023, with a new focus on Appium as an ecosystem rather than a singular
|
||||
project. Drivers and plugins can be developed and shared by anyone, opening up a world of
|
||||
possibilities for automation-related development for platforms far beyond iOS and Android.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Getting Started
|
||||
title: Quickstart Intro
|
||||
---
|
||||
|
||||
Let's get up and running with Appium! To successfully use this quickstart, it's recommended that
|
||||
|
||||
@@ -21,7 +21,7 @@ npm install -g appium
|
||||
|
||||
## Starting Appium
|
||||
|
||||
Appium can be started [using the command line](../reference/cli/index.md):
|
||||
Appium can be started [using the command line](../cli/index.md):
|
||||
|
||||
```
|
||||
appium
|
||||
|
||||
@@ -8,9 +8,9 @@ title: System Requirements
|
||||
The basic requirements for the Appium server are:
|
||||
|
||||
* A macOS, Linux, or Windows operating system
|
||||
* [Node.js](https://nodejs.org) version in the [SemVer](https://semver.org) range `^20.19.0 || ^22.12.0 || >=24.0.0`
|
||||
* [Node.js](https://nodejs.org) version in the [SemVer](https://semver.org) range `^14.17.0 || ^16.13.0 || >=18.0.0`
|
||||
* LTS is recommended
|
||||
* [`npm`](https://npmjs.com) version `>=10` (`npm` is usually bundled with Node.js, but can be upgraded
|
||||
* [`npm`](https://npmjs.com) version `>=8` (`npm` is usually bundled with Node.js, but can be upgraded
|
||||
independently)
|
||||
|
||||
By itself, Appium is relatively lightweight and doesn't have significant disk space or RAM
|
||||
@@ -26,4 +26,4 @@ require the developer toolchain and SDKs for that platform to be installed.
|
||||
|
||||
In order to assist with driver requirements, each (official) driver comes with the Appium Doctor tool,
|
||||
which allows to verify if all requirements have been set up. Learn more about how to use this tool in
|
||||
the [Command-Line Usage documentation](../reference/cli/extensions.md#doctor).
|
||||
the [Command-Line Usage documentation](../cli/extensions.md#doctor).
|
||||
|
||||
@@ -1,105 +1,105 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Write a Test (.NET)
|
||||
---
|
||||
|
||||
The [Appium .NET Client](https://github.com/appium/dotnet-client/) is
|
||||
an official Appium client in C#. This driver is an extension of the Selenium C# client. It has all the functionalities of the regular driver, but add Appium-specific methods on top of this. The driver is available on the public NuGet Gallery as [Appium.WebDriver](https://www.nuget.org/packages/Appium.WebDriver/).
|
||||
|
||||
Now, we get inside the directory and create a new [NUnit](https://nunit.org/) project. We will also add the references to the Appium.Net driver, and other dependencies.
|
||||
|
||||
```bash
|
||||
cd dotnet-client
|
||||
dotnet new nunit --name appiumtest
|
||||
|
||||
cd appiumtest
|
||||
|
||||
# This will install the latest 5.x version
|
||||
dotnet add package Appium.WebDriver --prerelease
|
||||
dotnet add package Newtonsoft.Json --version 13.0.3
|
||||
```
|
||||
|
||||
Once this is done, your project should have a placeholder file `UnitTest1.cs`. We will replace the code to include the OpenQA namespaces, an initialization of the driver, and the actual test.
|
||||
|
||||
```C# title="UnitTest1.cs"
|
||||
using OpenQA.Selenium;
|
||||
using OpenQA.Selenium.Appium;
|
||||
using OpenQA.Selenium.Appium.Android;
|
||||
using OpenQA.Selenium.Appium.Enums;
|
||||
|
||||
namespace appiumtest;
|
||||
|
||||
public class Tests
|
||||
{
|
||||
private AndroidDriver _driver;
|
||||
|
||||
[OneTimeSetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
var serverUri = new Uri(Environment.GetEnvironmentVariable("APPIUM_HOST") ?? "http://127.0.0.1:4723/");
|
||||
var driverOptions = new AppiumOptions() {
|
||||
AutomationName = AutomationName.AndroidUIAutomator2,
|
||||
PlatformName = "Android",
|
||||
DeviceName = "Android Emulator",
|
||||
};
|
||||
|
||||
driverOptions.AddAdditionalAppiumOption("appPackage", "com.android.settings");
|
||||
driverOptions.AddAdditionalAppiumOption("appActivity", ".Settings");
|
||||
// NoReset assumes the app com.google.android is preinstalled on the emulator
|
||||
driverOptions.AddAdditionalAppiumOption("noReset", true);
|
||||
|
||||
_driver = new AndroidDriver(serverUri, driverOptions, TimeSpan.FromSeconds(180));
|
||||
_driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
|
||||
}
|
||||
|
||||
[OneTimeTearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
_driver.Dispose();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestFindApps()
|
||||
{
|
||||
_driver.StartActivity("com.android.settings", ".Settings");
|
||||
_driver.FindElement(By.XPath("//*[@text='Apps']")).Click();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
!!! note
|
||||
|
||||
It's not within the scope of this guide to give a complete run-down on the dotnet client
|
||||
library or everything that's happening here, so we'll leave the code itself unexplained in
|
||||
detail for now. You may want to read up particularly on Appium
|
||||
[Capabilities](../guides/caps.md) in addition to familiarizing yourself with the
|
||||
[dotnet client driver documentation](https://github.com/appium/dotnet-client/) for a fuller explanation
|
||||
of the various API commands you see and what their purpose is.
|
||||
|
||||
Basically, this code is doing the following:
|
||||
|
||||
1. Defining a set of "Capabilities" (parameters) to send to the Appium server so Appium knows what
|
||||
kind of thing you want to automate. Some of these parameters can be overridden using environment variables.
|
||||
1. Starting an Appium session on the built-in Android settings app.
|
||||
1. Finding the "Apps" list item and clicking it.
|
||||
1. Ending the Appium session.
|
||||
|
||||
That's it! Let's give it a try. Before you run the test, make sure that you have an Appium server
|
||||
running in another terminal session, otherwise you'll get an error about not being able to connect
|
||||
to one. Then, you can execute the script:
|
||||
|
||||
```bash
|
||||
dotnet test
|
||||
|
||||
# Example output:
|
||||
# Starting test execution, please wait...
|
||||
# A total of 1 test files matched the specified pattern.
|
||||
|
||||
# Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: 323 ms - appiumtest.dll (net7.0)
|
||||
```
|
||||
|
||||
If all goes well, you'll see the Settings app open up and navigate to the "Apps" view in the emulator before the app closes again.
|
||||
|
||||
Congratulations, you've started your Appium journey! Read on for some [next steps](./next-steps.md) to explore.
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Write a Test (.NET)
|
||||
---
|
||||
|
||||
The [Appium .NET Client](https://github.com/appium/dotnet-client/) is
|
||||
an official Appium client in C#. This driver is an extension of the Selenium C# client. It has all the functionalities of the regular driver, but add Appium-specific methods on top of this. The driver is available on the public NuGet Gallery as [Appium.WebDriver](https://www.nuget.org/packages/Appium.WebDriver/).
|
||||
|
||||
Now, we get inside the directory and create a new [NUnit](https://nunit.org/) project. We will also add the references to the Appium.Net driver, and other dependencies.
|
||||
|
||||
```bash
|
||||
cd dotnet-client
|
||||
dotnet new nunit --name appiumtest
|
||||
|
||||
cd appiumtest
|
||||
|
||||
# This will install the latest 5.x version
|
||||
dotnet add package Appium.WebDriver --prerelease
|
||||
dotnet add package Newtonsoft.Json --version 13.0.3
|
||||
```
|
||||
|
||||
Once this is done, your project should have a placeholder file `UnitTest1.cs`. We will replace the code to include the OpenQA namespaces, an initialization of the driver, and the actual test.
|
||||
|
||||
```C# title="UnitTest1.cs"
|
||||
using OpenQA.Selenium;
|
||||
using OpenQA.Selenium.Appium;
|
||||
using OpenQA.Selenium.Appium.Android;
|
||||
using OpenQA.Selenium.Appium.Enums;
|
||||
|
||||
namespace appiumtest;
|
||||
|
||||
public class Tests
|
||||
{
|
||||
private AndroidDriver _driver;
|
||||
|
||||
[OneTimeSetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
var serverUri = new Uri(Environment.GetEnvironmentVariable("APPIUM_HOST") ?? "http://127.0.0.1:4723/");
|
||||
var driverOptions = new AppiumOptions() {
|
||||
AutomationName = AutomationName.AndroidUIAutomator2,
|
||||
PlatformName = "Android",
|
||||
DeviceName = "Android Emulator",
|
||||
};
|
||||
|
||||
driverOptions.AddAdditionalAppiumOption("appPackage", "com.android.settings");
|
||||
driverOptions.AddAdditionalAppiumOption("appActivity", ".Settings");
|
||||
// NoReset assumes the app com.google.android is preinstalled on the emulator
|
||||
driverOptions.AddAdditionalAppiumOption("noReset", true);
|
||||
|
||||
_driver = new AndroidDriver(serverUri, driverOptions, TimeSpan.FromSeconds(180));
|
||||
_driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
|
||||
}
|
||||
|
||||
[OneTimeTearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
_driver.Dispose();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestBattery()
|
||||
{
|
||||
_driver.StartActivity("com.android.settings", ".Settings");
|
||||
_driver.FindElement(By.XPath("//*[@text='Battery']")).Click();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
!!! note
|
||||
|
||||
It's not within the scope of this guide to give a complete run-down on the dotnet client
|
||||
library or everything that's happening here, so we'll leave the code itself unexplained in
|
||||
detail for now. You may want to read up particularly on Appium
|
||||
[Capabilities](../guides/caps.md) in addition to familiarizing yourself with the
|
||||
[dotnet client driver documentation](https://github.com/appium/dotnet-client/) for a fuller explanation
|
||||
of the various API commands you see and what their purpose is.
|
||||
|
||||
Basically, this code is doing the following:
|
||||
|
||||
1. Defining a set of "Capabilities" (parameters) to send to the Appium server so Appium knows what
|
||||
kind of thing you want to automate. Some of these parameters can be overriden using environment variables.
|
||||
1. Starting an Appium session on the built-in Android settings app.
|
||||
1. Finding the "Battery" list item and clicking it.
|
||||
1. Ending the Appium session.
|
||||
|
||||
That's it! Let's give it a try. Before you run the test, make sure that you have an Appium server
|
||||
running in another terminal session, otherwise you'll get an error about not being able to connect
|
||||
to one. Then, you can execute the script:
|
||||
|
||||
```bash
|
||||
dotnet test
|
||||
|
||||
# Example output:
|
||||
# Starting test execution, please wait...
|
||||
# A total of 1 test files matched the specified pattern.
|
||||
|
||||
# Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: 323 ms - appiumtest.dll (net7.0)
|
||||
```
|
||||
|
||||
If all goes well, you'll see the Settings app open up and navigate to the "Battery" view in the emulator before the app closes again.
|
||||
|
||||
Congratulations, you've started your Appium journey! Read on for some [next steps](./next-steps.md) to explore.
|
||||
|
||||
@@ -57,7 +57,7 @@ Basically, this code is doing the following:
|
||||
1. Defining a set of "Capabilities" (parameters) to send to the Appium server so Appium knows what
|
||||
kind of thing you want to automate.
|
||||
1. Starting an Appium session on the built-in Android settings app.
|
||||
1. Finding the "Apps" list item and clicking it.
|
||||
1. Finding the "Battery" list item and clicking it.
|
||||
1. Pausing for a moment purely for visual effect.
|
||||
1. Ending the Appium session.
|
||||
|
||||
@@ -69,7 +69,7 @@ to one. Then, you can execute the script:
|
||||
node test.js
|
||||
```
|
||||
|
||||
If all goes well, you'll see the Settings app open up and navigate to the "Apps" view before the
|
||||
If all goes well, you'll see the Settings app open up and navigate to the "Battery" view before the
|
||||
app closes again.
|
||||
|
||||
Congratulations, you've started your Appium journey! Read on for some [next steps](./next-steps.md) to explore.
|
||||
|
||||
@@ -42,7 +42,7 @@ Basically, this code is doing the following:
|
||||
1. Defining a set of "Capabilities" (parameters) to send to the Appium server so Appium knows what
|
||||
kind of thing you want to automate.
|
||||
1. Starting an Appium session on the built-in Android settings app.
|
||||
1. Finding the "Apps" list item and clicking it.
|
||||
1. Finding the "Battery" list item and clicking it.
|
||||
1. Pausing for a moment purely for visual effect.
|
||||
1. Ending the Appium session.
|
||||
|
||||
@@ -54,7 +54,7 @@ to one. Then, you can execute the script:
|
||||
python test.py
|
||||
```
|
||||
|
||||
If all goes well, you'll see the Settings app open up and navigate to the "Apps" view before the
|
||||
If all goes well, you'll see the Settings app open up and navigate to the "Battery" view before the
|
||||
app closes again.
|
||||
|
||||
Congratulations, you've started your Appium journey! Read on for some [next steps](./next-steps.md) to explore.
|
||||
|
||||
@@ -64,7 +64,7 @@ Basically, this code is doing the following:
|
||||
1. Defining a set of "Capabilities" (parameters) to send to the Appium server so Appium knows what
|
||||
kind of thing you want to automate.
|
||||
1. Starting an Appium session on the built-in Android settings app.
|
||||
1. Finding the "Apps" list item and clicking it.
|
||||
1. Finding the "Battery" list item and clicking it.
|
||||
1. Pausing for a moment purely for visual effect.
|
||||
1. Ending the Appium session.
|
||||
|
||||
@@ -77,7 +77,7 @@ to one. Then, you can execute the script:
|
||||
bundle exec ruby test.rb
|
||||
```
|
||||
|
||||
If all goes well, you'll see the Settings app open up and navigate to the "Apps" view before the
|
||||
If all goes well, you'll see the Settings app open up and navigate to the "Battery" view before the
|
||||
app closes again.
|
||||
|
||||
Congratulations, you've started your Appium journey! Read on for some [next steps](./next-steps.md) to explore.
|
||||
|
||||
@@ -62,7 +62,7 @@ set up on your system, so you can get busy making Android apps if you want!
|
||||
|
||||
### Standard Install
|
||||
|
||||
Like all Appium drivers, the UiAutomator2 driver is installed via the [Appium Extension CLI](../reference/cli/extensions.md).
|
||||
Like all Appium drivers, the UiAutomator2 driver is installed via the [Appium Extension CLI](../cli/extensions.md).
|
||||
Since UiAutomator2 is maintained by the core Appium team, it has an 'official' driver name
|
||||
(`uiautomator2`), which makes the installation simpler.
|
||||
|
||||
@@ -89,7 +89,7 @@ must be used to select this driver for use during an Appium session (in this cas
|
||||
|
||||
!!! note
|
||||
|
||||
In this quickstart we have used the [Extension CLI](../reference/cli/extensions.md) to install the
|
||||
In this quickstart we have used the [Extension CLI](../cli/extensions.md) to install the
|
||||
UiAutomator2 driver, but if you are incorporating Appium into a Node.js project, you might
|
||||
prefer to use `npm` to manage Appium and its connected drivers. To learn more about this
|
||||
technique, visit the guide on [managing Appium extensions](../guides/managing-exts.md).
|
||||
@@ -108,7 +108,7 @@ Running this will install Appium's mobile-specific drivers: UiAutomator2, [XCUIT
|
||||
(only if running macOS), and [Espresso](https://github.com/appium/appium-espresso-driver).
|
||||
|
||||
You can also use this command to batch install drivers for desktop applications or desktop browsers.
|
||||
For more details on this, refer to the [Setup command documentation](../reference/cli/setup.md).
|
||||
For more details on this, refer to the [Setup command documentation](../cli/setup.md).
|
||||
|
||||
### Validating the Install
|
||||
|
||||
|
||||
@@ -1,394 +0,0 @@
|
||||
---
|
||||
title: Appium Protocol
|
||||
---
|
||||
<style>
|
||||
ul[data-md-component="toc"] .md-nav {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
The following is a list of endpoints supported in Appium, that are defined in the Appium extension
|
||||
of the W3C WebDriver protocol.
|
||||
|
||||
### getAppiumSessions
|
||||
|
||||
```
|
||||
GET /appium/sessions
|
||||
```
|
||||
|
||||
Retrieves information about all active server sessions.
|
||||
|
||||
!!! info
|
||||
|
||||
The `session_discovery` [insecure feature](../../guides/security.md) must be enabled to use this endpoint.
|
||||
|
||||
#### Response
|
||||
|
||||
`TimestampedMultiSessionData[]` - an array of session data objects. Each object has the following properties:
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`capabilities`|Session capabilities|object|
|
||||
|`created`|Session creation time (in milliseconds) as a Unix timestamp|number|
|
||||
|`id`|Session ID|string|
|
||||
|
||||
### getAppiumSessionCapabilities
|
||||
|
||||
```
|
||||
GET /session/:sessionId/appium/capabilities
|
||||
```
|
||||
|
||||
Retrieves the [session capabilities](../../guides/caps.md).
|
||||
|
||||
#### Response
|
||||
|
||||
`SessionCapabilities` - an object with the following properties:
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`capabilities`|Session capabilities|object|
|
||||
|
||||
### getSettings
|
||||
|
||||
```
|
||||
GET /session/:sessionId/appium/settings
|
||||
```
|
||||
|
||||
Retrieves the [current session settings](../../guides/settings.md).
|
||||
|
||||
#### Response
|
||||
|
||||
`Settings` - an object containing setting names and their values
|
||||
|
||||
### updateSettings
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/settings
|
||||
```
|
||||
|
||||
Updates the specified session settings. Any other previously set settings will remain unchanged.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`settings`|Object containing the names and values of the settings to be updated|object|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### listCommands
|
||||
|
||||
```
|
||||
GET /session/:sessionId/appium/commands
|
||||
```
|
||||
|
||||
Retrieves the URL endpoints and WebDriver BiDi commands supported in the current session.
|
||||
|
||||
#### Response
|
||||
|
||||
`ListCommandsResponse` - an object containing all supported endpoints and BiDi commands, grouped by
|
||||
their origin (base Appium, driver-specific, or plugin-specific). Refer to [the type definition file](https://github.com/appium/appium/blob/master/packages/types/lib/command.ts)
|
||||
for a detailed structure of this object.
|
||||
|
||||
### listExtensions
|
||||
|
||||
```
|
||||
GET /session/:sessionId/appium/extensions
|
||||
```
|
||||
|
||||
Retrieves the [execute methods](../../guides/execute-methods.md) supported in the current session.
|
||||
|
||||
#### Response
|
||||
|
||||
`ListExtensionsResponse` - an object containing all supported execute methods, grouped by their
|
||||
origin (driver-specific or plugin-specific). Refer to [the type definition file](https://github.com/appium/appium/blob/master/packages/types/lib/command.ts)
|
||||
for a detailed structure of this object.
|
||||
|
||||
### getLogEvents
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/events
|
||||
```
|
||||
|
||||
Retrieves events that have occurred in the current session. By default, only driver command
|
||||
executions are recorded in the log, but drivers or plugins may define additional event types.
|
||||
Clients can log events by using the [`logCustomEvent`](#logcustomevent) endpoint.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`type?`|One or more types to filter the returned events|string or array<string>|
|
||||
|
||||
#### Response
|
||||
|
||||
`EventHistory` - an object whose keys correspond to the types of logged events. Event types can be
|
||||
grouped into three categories, as shown by the following example response:
|
||||
|
||||
```json
|
||||
{
|
||||
"commands": [
|
||||
{ "cmd": "getStatus", "startTime": 1756887645447, "endTime": 1756887645454 }
|
||||
],
|
||||
"driverevent": [1756887645454],
|
||||
"namespace:event": [1756887645454]
|
||||
}
|
||||
```
|
||||
|
||||
* The `commands` key is always included in the endpoint response. Its value is an array of objects,
|
||||
where each object includes 3 parameters:
|
||||
* `cmd`: name of the executed command
|
||||
* `startTime`: the command execution start time (in milliseconds), as a Unix timestamp
|
||||
* `endTime`: the command execution end time (in milliseconds), as a Unix timestamp
|
||||
* Other non-namespaced keys are specific to driver/plugin implementations. Their value is an array
|
||||
of event times (in milliseconds), as Unix timestamps.
|
||||
* Namespaced keys can be added using the `logCustomEvent` endpoint, but may also be provided by
|
||||
drivers/plugins. Their value is an array of event times (in milliseconds), as Unix timestamps.
|
||||
|
||||
### logCustomEvent
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/log_event
|
||||
```
|
||||
|
||||
Logs a custom event, which can be retrieved using the [`getLogEvents`](#getlogevents) endpoint.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`vendor`|Name of the namespace (vendor) used to prefix the event|string|
|
||||
|`event`|Name of the event|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### getDeviceTime
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/device/system_time
|
||||
```
|
||||
|
||||
Retrieves the current system time of the device under test.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|Default|
|
||||
|--|--|--|--|
|
||||
|`format?`|Format to use for the returned timestamp|string|`YYYY-MM-DDTHH:mm:ssZ`|
|
||||
|
||||
#### Response
|
||||
|
||||
`string` - the device time
|
||||
|
||||
### activateApp
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/device/activate_app
|
||||
```
|
||||
|
||||
Activates an app on the device under test.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`appId` or `bundleId`|App identifier such as Android app package or iOS bundle ID|string|
|
||||
|`options?`|Driver-specific launch options|unknown|
|
||||
|
||||
#### Response
|
||||
|
||||
`void`
|
||||
|
||||
### terminateApp
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/device/terminate_app
|
||||
```
|
||||
|
||||
Terminates an app on the device under test.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`appId` or `bundleId`|App identifier such as Android app package or iOS bundle ID|string|
|
||||
|`options?`|Driver-specific termination options|unknown|
|
||||
|
||||
#### Response
|
||||
|
||||
`void`
|
||||
|
||||
### queryAppState
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/device/app_state
|
||||
```
|
||||
|
||||
Retrieves the state of an app on the device under test.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`appId` or `bundleId`|App identifier such as Android app package or iOS bundle ID|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`number` - an integer value indicating the app state:
|
||||
|
||||
|Number|App State|
|
||||
|--|--|
|
||||
|`0`|Not installed|
|
||||
|`1`|Not running|
|
||||
|`2`|Running in background suspended|
|
||||
|`3`|Running in background|
|
||||
|`4`|Running in foreground|
|
||||
|
||||
### installApp
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/device/install_app
|
||||
```
|
||||
|
||||
Installs an app on the device under test.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`appPath`|Absolute local filepath or URL to an app file|string|
|
||||
|`options?`|Driver-specific install options|unknown|
|
||||
|
||||
#### Response
|
||||
|
||||
`void`
|
||||
|
||||
### removeApp
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/device/remove_app
|
||||
```
|
||||
|
||||
Uninstalls an app from the device under test.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`appId` or `bundleId`|App identifier such as Android app package or iOS bundle ID|string|
|
||||
|`options?`|Driver-specific uninstall options|unknown|
|
||||
|
||||
#### Response
|
||||
|
||||
`boolean` - `true` if uninstall was successful, otherwise `false`
|
||||
|
||||
### isAppInstalled
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/device/app_installed
|
||||
```
|
||||
|
||||
Determines if an app is installed on the device under test.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`appId` or `bundleId`|App identifier such as Android app package or iOS bundle ID|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`boolean` - `true` if app is installed, otherwise `false`
|
||||
|
||||
### hideKeyboard
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/device/hide_keyboard
|
||||
```
|
||||
|
||||
Attempts to hide the virtual keyboard on the device under test.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`key?`|Text of a key to use to hide the keyboard|string|
|
||||
|`keyCode?`|Key code to trigger to hide the keyboard|string|
|
||||
|`keyName?`|Name of a key to use to hide the keyboard|string|
|
||||
|`strategy?`|Driver-specific name of a hiding strategy to follow|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`boolean` - `true` if the operation was successful, otherwise `false`. Note that some platforms
|
||||
may never return a `false` value.
|
||||
|
||||
### isKeyboardShown
|
||||
|
||||
```
|
||||
GET /session/:sessionId/appium/device/is_keyboard_shown
|
||||
```
|
||||
|
||||
Determines if the virtual keyboard is shown on the device under test.
|
||||
|
||||
#### Response
|
||||
|
||||
`boolean` - `true` if the keyboard is shown, otherwise `false`
|
||||
|
||||
### pushFile
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/device/push_file
|
||||
```
|
||||
|
||||
Pushes data to a file on the device under test.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`data`|Base64-encoded data to be written to the file|string|
|
||||
|`path`|Remote path on the device to create the file at|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`void`
|
||||
|
||||
### pullFile
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/device/pull_file
|
||||
```
|
||||
|
||||
Retrieves data from a file on the device under test.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`path`|Remote path of the file on the device|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`string` - the Base64-encoded contents of the file
|
||||
|
||||
### pullFolder
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/device/pull_folder
|
||||
```
|
||||
|
||||
Retrieves data from a directory on the device under test.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`path`|Remote path of the directory on the device|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`string` - the Base64-encoded zip file of the directory contents
|
||||
@@ -1,70 +0,0 @@
|
||||
---
|
||||
title: WebDriver BiDi Protocol
|
||||
---
|
||||
<style>
|
||||
ul[data-md-component="toc"] .md-nav {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
The following is a list of [W3C WebDriver BiDi protocol](https://w3c.github.io/webdriver-bidi/)
|
||||
commands supported in Appium.
|
||||
|
||||
Unlike other protocols that specify URL endpoints, the WebDriver BiDi protocol specifies commands
|
||||
sent as a websocket event, that both drivers and clients can emit or listen to.
|
||||
|
||||
### bidiStatus
|
||||
|
||||
```
|
||||
session.status
|
||||
```
|
||||
|
||||
> WebDriver BiDi documentation: [session.status](https://w3c.github.io/webdriver-bidi/#command-session-status)
|
||||
|
||||
Retrieves the current status of the Appium server.
|
||||
|
||||
#### Response
|
||||
|
||||
[`GetStatusResult`](./webdriver.md#response_2)
|
||||
|
||||
### bidiSubscribe
|
||||
|
||||
```
|
||||
session.subscribe
|
||||
```
|
||||
|
||||
> WebDriver BiDi documentation: [session.subscribe](https://w3c.github.io/webdriver-bidi/#command-session-subscribe)
|
||||
|
||||
Subscribes to one or more BiDi events.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|Default|
|
||||
|--|--|--|--|
|
||||
|`contexts?`|Contexts in which to subscribe to the specified events. By default, the global context scope is applied.|string[]|`['']`|
|
||||
|`events`|Names of events to subscribe to|string[]||
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### bidiUnsubscribe
|
||||
|
||||
```
|
||||
session.unsubscribe
|
||||
```
|
||||
|
||||
> WebDriver BiDi documentation: [session.unsubscribe](https://w3c.github.io/webdriver-bidi/#command-session-unsubscribe)
|
||||
|
||||
Unsubscribes from one or more BiDi events.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|Default|
|
||||
|--|--|--|--|
|
||||
|`contexts?`|Contexts in which to unsubscribe from the specified events. By default, the global scope is applied.|string[]|`['']`|
|
||||
|`events`|Names of events to unsubscribe from|string[]||
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
@@ -1,30 +0,0 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: API Endpoints
|
||||
---
|
||||
|
||||
Here you can find various API endpoints exposed by the main Appium module through its base driver,
|
||||
as well as the endpoints added or modified by official plugins.
|
||||
|
||||
Since all Appium drivers inherit the Appium base driver, they support all of its endpoints as well,
|
||||
but may additionally define endpoints of their own. Refer to the documentation of your
|
||||
[Appium driver](../../ecosystem/drivers.md) to learn about its specific endpoints.
|
||||
|
||||
The recommended way of calling these API endpoints is through your [Appium client](../../ecosystem/clients.md).
|
||||
Refer to the documentation of your client for the exact commands used to invoke specific endpoints.
|
||||
|
||||
All endpoints are grouped by their protocol, with an additional group for plugin endpoints:
|
||||
|
||||
<div class="grid cards" markdown>
|
||||
|
||||
- [__WebDriver Protocol__](./webdriver.md)
|
||||
- [__WebDriver BiDi Protocol__](./bidi.md)
|
||||
- [__JSON Wire Protocol__](./jsonwp.md)
|
||||
- [__Mobile JSON Wire Protocol__](./mjsonwp.md)
|
||||
- [__Appium Protocol__](./appium.md)
|
||||
- [__Other Protocols__](./others.md)
|
||||
- [__Endpoints Used by Official Plugins__](./plugins.md)
|
||||
|
||||
</div>
|
||||
@@ -1,214 +0,0 @@
|
||||
---
|
||||
title: JSON Wire Protocol
|
||||
---
|
||||
<style>
|
||||
ul[data-md-component="toc"] .md-nav {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
The following is a list of legacy [JSON Wire Protocol (JSONWP)](https://www.selenium.dev/documentation/legacy/json_wire_protocol/)
|
||||
endpoints supported in Appium.
|
||||
|
||||
### getSession
|
||||
|
||||
```
|
||||
GET /session/:sessionId
|
||||
```
|
||||
|
||||
> JSONWP documentation: [/session/:sessionId](https://www.selenium.dev/documentation/legacy/json_wire_protocol/#sessionsessionid)
|
||||
|
||||
Retrieves the capabilities of the current session.
|
||||
|
||||
Appium implements a modified version of this endpoint. If the `appium:eventTimings` capability is
|
||||
set to `true`, the returned result will additionally include the `events` key, whose value contains
|
||||
the event history and timings.
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
For retrieving capabilities, please use [`getAppiumSessionCapabilities`](./appium.md#getappiumsessioncapabilities).<br />
|
||||
For retrieving event history, please use [`getLogEvents`](./appium.md#getlogevents).
|
||||
|
||||
#### Response
|
||||
|
||||
`Capabilities` - an object containing the session capabilities, and the event history (if applicable)
|
||||
|
||||
### availableIMEEngines
|
||||
|
||||
```
|
||||
GET /session/:sessionId/ime/available_engines
|
||||
```
|
||||
|
||||
> JSONWP documentation: [/session/:sessionId/ime/available_engines](https://www.selenium.dev/documentation/legacy/json_wire_protocol/#sessionsessionidimeavailable_engines)
|
||||
|
||||
Retrieves all IME (input method editor) engines available on the device under test.
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
In the future, this endpoint will be moved to the [UiAutomator2 and Espresso drivers](../../ecosystem/drivers.md)
|
||||
|
||||
#### Response
|
||||
|
||||
`string[]` - a list of available IME engines
|
||||
|
||||
### getActiveIMEEngine
|
||||
|
||||
```
|
||||
GET /session/:sessionId/ime/active_engine
|
||||
```
|
||||
|
||||
> JSONWP documentation: [/session/:sessionId/ime/active_engine](https://www.selenium.dev/documentation/legacy/json_wire_protocol/#sessionsessionidimeactive_engine)
|
||||
|
||||
Retrieves the name of the active IME engine.
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
In the future, this endpoint will be moved to the UiAutomator2 and Espresso drivers
|
||||
|
||||
#### Response
|
||||
|
||||
`string` - the name of the active IME engine
|
||||
|
||||
### isIMEActivated
|
||||
|
||||
```
|
||||
GET /session/:sessionId/ime/activated
|
||||
```
|
||||
|
||||
> JSONWP documentation: [/session/:sessionId/ime/activated](https://www.selenium.dev/documentation/legacy/json_wire_protocol/#sessionsessionidimeactivated)
|
||||
|
||||
Determines if IME input is available and active.
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
In the future, this endpoint will be moved to the UiAutomator2 and Espresso drivers
|
||||
|
||||
#### Response
|
||||
|
||||
`boolean` - `true` if IME is active, otherwise `false`
|
||||
|
||||
### deactivateIMEEngine
|
||||
|
||||
```
|
||||
POST /session/:sessionId/ime/deactivate
|
||||
```
|
||||
|
||||
> JSONWP documentation: [/session/:sessionId/ime/deactivate](https://www.selenium.dev/documentation/legacy/json_wire_protocol/#sessionsessionidimedeactivate)
|
||||
|
||||
Deactivates the currently active IME engine.
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
In the future, this endpoint will be moved to the UiAutomator2 and Espresso drivers
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### activateIMEEngine
|
||||
|
||||
```
|
||||
POST /session/:sessionId/ime/activate
|
||||
```
|
||||
|
||||
> JSONWP documentation: [/session/:sessionId/ime/activate](https://www.selenium.dev/documentation/legacy/json_wire_protocol/#sessionsessionidimeactivate)
|
||||
|
||||
Activates an IME engine.
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
In the future, this endpoint will be moved to the UiAutomator2 and Espresso drivers
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`engine`|Name of the IME engine to activate|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### getOrientation
|
||||
|
||||
```
|
||||
GET /session/:sessionId/orientation
|
||||
```
|
||||
|
||||
> JSONWP documentation: [/session/:sessionId/orientation](https://www.selenium.dev/documentation/legacy/json_wire_protocol/#sessionsessionidorientation)
|
||||
|
||||
Retrieves the current orientation of the device under test.
|
||||
|
||||
#### Response
|
||||
|
||||
`string` - either `PORTRAIT` or `LANDSCAPE`
|
||||
|
||||
### setOrientation
|
||||
|
||||
```
|
||||
POST /session/:sessionId/orientation
|
||||
```
|
||||
|
||||
> JSONWP documentation: [/session/:sessionId/orientation](https://www.selenium.dev/documentation/legacy/json_wire_protocol/#sessionsessionidorientation)
|
||||
|
||||
Sets the orientation of the device under test.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`orientation`|New device orientation. Supported values are `PORTRAIT` or `LANDSCAPE`.|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### getGeoLocation
|
||||
|
||||
```
|
||||
GET /session/:sessionId/location
|
||||
```
|
||||
|
||||
> JSONWP documentation: [/session/:sessionId/location](https://www.selenium.dev/documentation/legacy/json_wire_protocol/#sessionsessionidlocation)
|
||||
|
||||
Retrieves the current location of the device under test.
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
Please use driver-specific extension methods such as `mobile: getGeoLocation` or
|
||||
`mobile: getSimulatedLocation`
|
||||
|
||||
#### Response
|
||||
|
||||
`Location` - an object with the following properties:
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`altitude`|Altitude of the device location|number|
|
||||
|`latitude`|Latitude of the device location|number|
|
||||
|`longitude`|Longitude of the device location|number|
|
||||
|
||||
### setGeoLocation
|
||||
|
||||
```
|
||||
POST /session/:sessionId/location
|
||||
```
|
||||
|
||||
> JSONWP documentation: [/session/:sessionId/location](https://www.selenium.dev/documentation/legacy/json_wire_protocol/#sessionsessionidlocation)
|
||||
|
||||
Sets the current location of the device under test.
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
Please use driver-specific extension methods such as `mobile: setGeoLocation` or
|
||||
`mobile: setSimulatedLocation`
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`location`|New device latitude, longitude and altitude|[`Location`](#response_6)|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
@@ -1,151 +0,0 @@
|
||||
---
|
||||
title: Mobile JSON Wire Protocol
|
||||
---
|
||||
<style>
|
||||
ul[data-md-component="toc"] .md-nav {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
The following is a list of legacy [Mobile JSON Wire Protocol (MJSONWP)](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md)
|
||||
endpoints supported in Appium.
|
||||
|
||||
### getRotation
|
||||
|
||||
```
|
||||
GET /session/:sessionId/rotation
|
||||
```
|
||||
|
||||
> MJSONWP documentation: [Device Rotation](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md#device-rotation)
|
||||
|
||||
Retrieves the current spatial orientation of the device under test.
|
||||
|
||||
#### Response
|
||||
|
||||
`Rotation` - an object with the following properties:
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`x`|Degrees by which the device is rotated on its X axis|number|
|
||||
|`y`|Degrees by which the device is rotated on its Y axis|number|
|
||||
|`z`|Degrees by which the device is rotated on its Z axis|number|
|
||||
|
||||
### setRotation
|
||||
|
||||
```
|
||||
POST /session/:sessionId/rotation
|
||||
```
|
||||
|
||||
> MJSONWP documentation: [Device Rotation](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md#device-rotation)
|
||||
|
||||
Sets the spatial orientation of the device under test.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`x`|Degrees by which the device is rotated on its X axis|number|
|
||||
|`y`|Degrees by which the device is rotated on its Y axis|number|
|
||||
|`z`|Degrees by which the device is rotated on its Z axis|number|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### getCurrentContext
|
||||
|
||||
```
|
||||
GET /session/:sessionId/context
|
||||
```
|
||||
|
||||
> MJSONWP documentation: [Webviews and Other Contexts](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md#webviews-and-other-contexts)
|
||||
|
||||
Retrieves the active application context.
|
||||
|
||||
#### Response
|
||||
|
||||
`string` - the name of the active context
|
||||
|
||||
### setContext
|
||||
|
||||
```
|
||||
POST /session/:sessionId/context
|
||||
```
|
||||
|
||||
> MJSONWP documentation: [Webviews and Other Contexts](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md#webviews-and-other-contexts)
|
||||
|
||||
Sets an application context as the active context.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`name`|Name of the context to set as the active one|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### getContexts
|
||||
|
||||
```
|
||||
GET /session/:sessionId/contexts
|
||||
```
|
||||
|
||||
> MJSONWP documentation: [Webviews and Other Contexts](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md#webviews-and-other-contexts)
|
||||
|
||||
Retrieves all available application contexts.
|
||||
|
||||
#### Response
|
||||
|
||||
`string[]` - the names of available contexts
|
||||
|
||||
### getNetworkConnection
|
||||
|
||||
```
|
||||
GET /session/:sessionId/network_connection
|
||||
```
|
||||
|
||||
> MJSONWP documentation: [Device Modes](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md#device-modes)
|
||||
|
||||
Retrieves the current state of network types (data, Wi-Fi, airplane mode).
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
Please use driver-specific extension methods such as `mobile: getConnectivity`
|
||||
|
||||
#### Response
|
||||
|
||||
`NetworkConnectionState` - a number indicating the current network state:
|
||||
|
||||
|Value|Data|Wi-Fi|Airplane Mode|
|
||||
|--|--|--|--|
|
||||
|`0`|OFF|OFF|OFF|
|
||||
|`1`|OFF|OFF|ON|
|
||||
|`2`|OFF|ON|OFF|
|
||||
|`4`|ON|OFF|OFF|
|
||||
|`6`|ON|ON|OFF|
|
||||
|
||||
### setNetworkConnection
|
||||
|
||||
```
|
||||
POST /session/:sessionId/network_connection
|
||||
```
|
||||
|
||||
> MJSONWP documentation: [Device Modes](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md#device-modes)
|
||||
|
||||
Sets the state of network types (data, Wi-Fi, airplane mode).
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
Please use driver-specific extension methods such as `mobile: setConnectivity`
|
||||
|
||||
#### Parameters
|
||||
|
||||
|<div style="width:6em">Name</div>|Description|<div style="width:18em">Type</div>|
|
||||
|--|--|--|
|
||||
|`parameters`|Object containing the `type` key, whose value is the desired network state|`{"type": `[`NetworkConnectionState`](#response_5)`}`|
|
||||
|
||||
#### Response
|
||||
|
||||
[`NetworkConnectionState`](#response_5) - the new network state
|
||||
@@ -1,671 +0,0 @@
|
||||
---
|
||||
title: Other Protocols
|
||||
---
|
||||
<style>
|
||||
ul[data-md-component="toc"] .md-nav .md-nav {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
The following is a list of endpoints supported in Appium that are defined in other protocols.
|
||||
|
||||
## Chromedriver Protocol
|
||||
|
||||
The Chromedriver protocol is an extension of the W3C WebDriver protocol, supported in Appium
|
||||
clients using Chromedriver. It specifies both its own extension commands, as well as
|
||||
vendor-agnostic commands.
|
||||
|
||||
!!! warning
|
||||
|
||||
Endpoints specified by this protocol are not officially documented.
|
||||
|
||||
### executeCdp
|
||||
|
||||
```
|
||||
POST /session/:sessionId/:vendor/cdp/execute
|
||||
```
|
||||
|
||||
Executes a Chrome DevTools Protocol (CDP) method, using the implementation of the vendor identified
|
||||
by `:vendor`. Refer to [the CDP documentation](https://chromedevtools.github.io/devtools-protocol/)
|
||||
for a list of available methods and their parameters.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`cmd`|Name of the CDP method to execute|string|
|
||||
|`params`|Parameters passed to the CDP method|object|
|
||||
|
||||
#### Response
|
||||
|
||||
`any` - the result of executing the CDP method
|
||||
|
||||
## Compute Pressure Protocol
|
||||
|
||||
The [Compute Pressure protocol](https://www.w3.org/TR/compute-pressure/) is an extension of the W3C
|
||||
WebDriver protocol.
|
||||
|
||||
### createVirtualPressureSource
|
||||
|
||||
```
|
||||
POST /session/:sessionId/pressuresource
|
||||
```
|
||||
|
||||
> Compute Pressure documentation: [Create Virtual Pressure Source](https://www.w3.org/TR/compute-pressure/#create-virtual-pressure-source)
|
||||
|
||||
Creates a new virtual pressure source.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|<div style="width:6em">Name</div>|Description|Type|Default|
|
||||
|--|--|--|--|
|
||||
|`type`|Type of pressure source to create|string||
|
||||
|`supported?`|Whether the pressure source should be configured as supported|boolean|`true`|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### updateVirtualPressureSource
|
||||
|
||||
```
|
||||
POST /session/:sessionId/pressuresource/:pressureSourceType
|
||||
```
|
||||
|
||||
> Compute Pressure documentation: [Update Virtual Pressure Source](https://www.w3.org/TR/compute-pressure/#update-virtual-pressure-source)
|
||||
|
||||
Updates the state of a virtual pressure source with the type identified by `:pressureSourceType`.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`sample`|Pressure state. Supported values are `nominal`, `fair`, `serious`, or `critical`.|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### deleteVirtualPressureSource
|
||||
|
||||
```
|
||||
DELETE /session/:sessionId/pressuresource/:pressureSourceType
|
||||
```
|
||||
|
||||
> Compute Pressure documentation: [Delete Virtual Pressure Source](https://www.w3.org/TR/compute-pressure/#delete-virtual-pressure-source)
|
||||
|
||||
Deletes the virtual pressure source with the type identified by `:pressureSourceType`.
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
## Custom Handlers Protocol
|
||||
|
||||
The [Custom Handlers protocol](https://html.spec.whatwg.org/multipage/system-state.html#user-agent-automation)
|
||||
is an extension of the W3C WebDriver protocol, defined by the HTML Standard specification.
|
||||
|
||||
### setRPHRegistrationMode
|
||||
|
||||
```
|
||||
POST /session/:sessionId/custom-handlers/set-mode
|
||||
```
|
||||
|
||||
> Custom Handlers documentation: [Set RPH Registration Mode](https://html.spec.whatwg.org/multipage/system-state.html#user-agent-automation)
|
||||
|
||||
Sets the protocol handler automation mode, for processing registrations of custom protocol handlers.
|
||||
By default, this mode is set to `none`.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`mode`|Automation mode to set. Supported values are `autoAccept`, `autoReject`, or `none`.|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
## Device Posture Protocol
|
||||
|
||||
The [Device Posture protocol](https://www.w3.org/TR/device-posture/) is an extension of the W3C
|
||||
WebDriver protocol.
|
||||
|
||||
### setDevicePosture
|
||||
|
||||
```
|
||||
POST /session/:sessionId/deviceposture
|
||||
```
|
||||
|
||||
> Device Posture documentation: [Set Device Posture](https://www.w3.org/TR/device-posture/#set-device-posture)
|
||||
|
||||
Sets the device posture, overriding the posture set by the device hardware.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`posture`|Posture to which the device should be set. Supported values are `continuous` or `folded`.|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### clearDevicePosture
|
||||
|
||||
```
|
||||
DELETE /session/:sessionId/deviceposture
|
||||
```
|
||||
|
||||
> Device Posture documentation: [Clear Device Posture](https://www.w3.org/TR/device-posture/#clear-device-posture)
|
||||
|
||||
Clears the previously set device posture, returning posture control back to the device hardware.
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
## Federated Credential Management Protocol
|
||||
|
||||
The [Federated Credential Management protocol](https://www.w3.org/TR/fedcm-1) (FedCM) is an
|
||||
extension of the W3C WebDriver protocol. Clients can enable this protocol by using the
|
||||
[`fedcm:accounts`](https://www.w3.org/TR/fedcm-1/#webdriver-capability) capability.
|
||||
|
||||
### fedCMCancelDialog
|
||||
|
||||
```
|
||||
POST /session/:sessionId/fedcm/canceldialog
|
||||
```
|
||||
|
||||
> FedCM documentation: [Cancel Dialog](https://www.w3.org/TR/fedcm-1/#webdriver-canceldialog)
|
||||
|
||||
Cancels the currently open FedCM dialog.
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### fedCMSelectAccount
|
||||
|
||||
```
|
||||
POST /session/:sessionId/fedcm/selectaccount
|
||||
```
|
||||
|
||||
> FedCM documentation: [Select Account](https://www.w3.org/TR/fedcm-1/#webdriver-selectaccount)
|
||||
|
||||
Selects an account to use for the currently open FedCM dialog.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`accountIndex`|Index of the account in the list of available accounts|number|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### fedCMClickDialogButton
|
||||
|
||||
```
|
||||
POST /session/:sessionId/fedcm/clickdialogbutton
|
||||
```
|
||||
|
||||
> FedCM documentation: [Click Dialog Button](https://www.w3.org/TR/fedcm-1/#webdriver-clickdialogbutton)
|
||||
|
||||
Clicks a button in the currently open FedCM dialog.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`dialogButton`|Identifier of the button to click. Must be set to `ConfirmIdpLoginContinue`.|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### fedCMGetAccounts
|
||||
|
||||
```
|
||||
GET /session/:sessionId/fedcm/accountlist
|
||||
```
|
||||
|
||||
> FedCM documentation: [Account List](https://www.w3.org/TR/fedcm-1/#webdriver-accountlist)
|
||||
|
||||
Retrieves all accounts that the user can select in the currently open FedCM dialog.
|
||||
|
||||
#### Response
|
||||
|
||||
`FedCMAccount[]` - an array of objects, where each object includes the following properties:
|
||||
|
||||
|<div style="width:10em">Name</div>|Description|Type|
|
||||
|--|--|--|
|
||||
|`accountId`|Account ID|string|
|
||||
|`email`|Account email|string|
|
||||
|`name`|Account name|string|
|
||||
|`givenName?`|Account given name|string|
|
||||
|`pictureUrl?`|Account picture URL|string|
|
||||
|`idpConfigUrl`|URL of the identity provider configuration file|string|
|
||||
|`loginState`|Login state. Set to `SignUp` if the account is not connected, otherwise `SignIn`.|string|
|
||||
|`termsOfServiceUrl?`|Terms of Service URL of the website, if `loginState` is set to `SignUp`|string|
|
||||
|`privacyPolicyUrl?`|Privacy Policy URL of the website, if `loginState` is set to `SignUp`|string|
|
||||
|
||||
### fedCMGetTitle
|
||||
|
||||
```
|
||||
GET /session/:sessionId/fedcm/gettitle
|
||||
```
|
||||
|
||||
> FedCM documentation: [Get Title](https://www.w3.org/TR/fedcm-1/#webdriver-gettitle)
|
||||
|
||||
Retrieves the title and subtitle (if one exists) of the currently open FedCM dialog.
|
||||
|
||||
#### Response
|
||||
|
||||
`FedCMDialogTitle` - an object with the following properties:
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`title`|Dialog title|string|
|
||||
|`subtitle?`|Dialog subtitle|string|
|
||||
|
||||
### fedCMGetDialogType
|
||||
|
||||
```
|
||||
GET /session/:sessionId/fedcm/getdialogtype
|
||||
```
|
||||
|
||||
> FedCM documentation: [Get Dialog Type](https://www.w3.org/TR/fedcm-1/#webdriver-getdialogtype)
|
||||
|
||||
Retrieves the type of the currently open FedCM dialog.
|
||||
|
||||
#### Response
|
||||
|
||||
`string` - can be set to `AutoReauthn`, `AccountChooser`, or `ConfirmIdpLogin`
|
||||
|
||||
### fedCMSetDelayEnabled
|
||||
|
||||
```
|
||||
POST /session/:sessionId/fedcm/setdelayenabled
|
||||
```
|
||||
|
||||
> FedCM documentation: [Set Delay Enabled](https://www.w3.org/TR/fedcm-1/#webdriver-setdelayenabled)
|
||||
|
||||
Sets the state of the promise rejection delay, which is used to prevent information leakage about
|
||||
the logged in state of the user.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`enabled`|Whether to enable the promise rejection delay|boolean|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### fedCMResetCooldown
|
||||
|
||||
```
|
||||
POST /session/:sessionId/fedcm/resetcooldown
|
||||
```
|
||||
|
||||
> FedCM documentation: [Reset Cooldown](https://www.w3.org/TR/fedcm-1/#webdriver-resetcooldown)
|
||||
|
||||
Resets the cooldown delay used after dismissing a FedCM dialog.
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
## Generic Sensor Protocol
|
||||
|
||||
The [Generic Sensor protocol](https://www.w3.org/TR/generic-sensor/) is an extension of the W3C
|
||||
WebDriver protocol.
|
||||
|
||||
### createVirtualSensor
|
||||
|
||||
```
|
||||
POST /session/:sessionId/sensor
|
||||
```
|
||||
|
||||
> Generic Sensor documentation: [Create Virtual Sensor](https://www.w3.org/TR/generic-sensor/#create-virtual-sensor-command)
|
||||
|
||||
Creates a new virtual sensor.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|<div style="width:12em">Name</div>|Description|Type|Default|
|
||||
|--|--|--|--|
|
||||
|`type`|Type of sensor to create|string||
|
||||
|`connected?`|Whether the sensor should be configured as connected|boolean|`true`|
|
||||
|`maxSamplingFrequency?`|Maximum sensor sampling frequency|number||
|
||||
|`minSamplingFrequency?`|Minimum sensor sampling frequency|number||
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### getVirtualSensorInfo
|
||||
|
||||
```
|
||||
GET /session/:sessionId/sensor/:sensorType
|
||||
```
|
||||
|
||||
> Generic Sensor documentation: [Get Virtual Sensor Information](https://www.w3.org/TR/generic-sensor/#get-virtual-sensor-information-command)
|
||||
|
||||
Retrieves information about the virtual sensor with the type identified by `:sensorType`.
|
||||
|
||||
#### Response
|
||||
|
||||
`GetVirtualSensorInfoResponse` - an object containing the `requestedSamplingFrequency` key, whose
|
||||
value is the requested sampling frequency of the sensor type
|
||||
|
||||
### updateVirtualSensorReading
|
||||
|
||||
```
|
||||
POST /session/:sessionId/sensor/:sensorType
|
||||
```
|
||||
|
||||
> Generic Sensor documentation: [Update Virtual Sensor Reading](https://www.w3.org/TR/generic-sensor/#update-virtual-sensor-reading-command)
|
||||
|
||||
Updates the virtual sensor with the type identified by `:sensorType` with a new reading.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`reading`|Object containing reading properties specific to the sensor type|object|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### deleteVirtualSensor
|
||||
|
||||
```
|
||||
DELETE /session/:sessionId/sensor/:sensorType
|
||||
```
|
||||
|
||||
> Generic Sensor documentation: [Delete Virtual Sensor](https://www.w3.org/TR/generic-sensor/#delete-virtual-sensor-command)
|
||||
|
||||
Deletes the virtual sensor with the type identified by `:sensorType`.
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
## Permissions Protocol
|
||||
|
||||
The [Permissions protocol](https://www.w3.org/TR/permissions/) is an extension of the W3C WebDriver
|
||||
protocol.
|
||||
|
||||
### setPermissions
|
||||
|
||||
```
|
||||
POST /session/:sessionId/permissions
|
||||
```
|
||||
|
||||
> Permissions documentation: [Set Permission](https://www.w3.org/TR/permissions/#webdriver-command-set-permission)
|
||||
|
||||
Simulates user modification of the permission state of a PermissionDescriptor (a permissible feature
|
||||
with optional additional properties).
|
||||
|
||||
#### Parameters
|
||||
|
||||
|<div style="width:6em">Name</div>|Description|Type|
|
||||
|--|--|--|
|
||||
|`descriptor`|Object specifying the feature name in its `name` key, along with any other keys for additional properties|object|
|
||||
|`state`|New permission state for this descriptor. Supported values are: `granted`, `denied`, or `prompt`.|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
## Reporting Protocol
|
||||
|
||||
The [Reporting protocol](https://www.w3.org/TR/reporting-1/) is an extension of the W3C WebDriver
|
||||
protocol.
|
||||
|
||||
### generateTestReport
|
||||
|
||||
```
|
||||
POST /session/:sessionId/reporting/generate_test_report
|
||||
```
|
||||
|
||||
> Reporting documentation: [Generate Test Report](https://www.w3.org/TR/reporting-1/#generate-test-report-command)
|
||||
|
||||
Simulates the generation of a test report, which can be retrieved by registered reporting observers.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|Default|
|
||||
|--|--|--|--|
|
||||
|`message`|Message displayed in the report|string||
|
||||
|`group?`|Destination group to deliver the report to|string|`default`|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
## Secure Payment Confirmation Protocol
|
||||
|
||||
The [Secure Payment Confirmation protocol](https://www.w3.org/TR/secure-payment-confirmation) (SPC)
|
||||
is an extension of the W3C WebDriver protocol.
|
||||
|
||||
### setSPCTransactionMode
|
||||
|
||||
```
|
||||
POST /session/:sessionId/secure-payment-confirmation/set-mode
|
||||
```
|
||||
|
||||
> SPC documentation: [Set SPC Transaction Mode](https://www.w3.org/TR/secure-payment-confirmation/#sctn-automation-set-spc-transaction-mode)
|
||||
|
||||
Sets the transaction automation mode, for automated handling of transaction confirmation prompts.
|
||||
By default, this mode is set to `none`.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`mode`|Automation mode to set. Supported values are `autoAccept`, `autoChooseToAuthAnotherWay`, `autoReject`, or `autoOptOut`.|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
## Selenium Protocol
|
||||
|
||||
The Selenium protocol is an extension of the W3C WebDriver protocol, supported in Appium clients
|
||||
based on Selenium.
|
||||
|
||||
!!! warning
|
||||
|
||||
Endpoints specified by this protocol are not officially documented.
|
||||
|
||||
### getLog
|
||||
|
||||
```
|
||||
POST /session/:sessionId/se/log
|
||||
```
|
||||
|
||||
Retrieves the logs for a given log type. Supported log types depend on the driver, and can be
|
||||
retrieved using the [`getLogTypes`](#getlogtypes) endpoint.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`type`|Type of log to retrieve|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`GetLogEntry[]` - an array of log entries.
|
||||
|
||||
Typically a log entry is an object with the following properties:
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`level`|Level at which the message was logged|string|
|
||||
|`message`|Contents of the actual log message|string|
|
||||
|`timestamp`|Message timestamp (in milliseconds) in Unix format|number|
|
||||
|
||||
### getLogTypes
|
||||
|
||||
```
|
||||
GET /session/:sessionId/se/log/types
|
||||
```
|
||||
|
||||
Retrieves the available log types that can be used to call the [`getLog`](#getlog) endpoint.
|
||||
|
||||
#### Response
|
||||
|
||||
`string[]` - an array of log types
|
||||
|
||||
## Web Authentication Protocol
|
||||
|
||||
The [Web Authentication protocol](https://w3c.github.io/webauthn/) (WebAuthn) is an extension of
|
||||
the W3C WebDriver protocol. Clients can enable this protocol by using the
|
||||
[`webauthn:virtualAuthenticators`](https://w3c.github.io/webauthn/#sctn-automation-webdriver-capability)
|
||||
capability.
|
||||
|
||||
### addVirtualAuthenticator
|
||||
|
||||
```
|
||||
POST /session/:sessionId/webauthn/authenticator
|
||||
```
|
||||
|
||||
> WebAuthn documentation: [Add Virtual Authenticator](https://w3c.github.io/webauthn/#add-virtual-authenticator)
|
||||
|
||||
Creates a software [virtual authenticator](https://w3c.github.io/webauthn/#virtual-authenticators).
|
||||
|
||||
#### Parameters
|
||||
|
||||
|<div style="width:11em">Name</div>|Description|Type|Default|
|
||||
|--|--|--|--|
|
||||
|`isUserConsenting?`|Whether to always grant user consent|boolean|true|
|
||||
|`isUserVerified?`|Whether to always succeed in user verification. Ignored if `hasUserVerification` is set to `false`.|boolean|false|
|
||||
|`hasResidentKey?`|Whether client-side discoverable credentials are supported|boolean|false|
|
||||
|`hasUserVerification?`|Whether user verification is supported|boolean|false|
|
||||
|`protocol`|Protocol of this authenticator. Supported values are: `ctap1/u2f`, `ctap2`, or `ctap2_1`.|string||
|
||||
|`transport`|Type of transport used to communicate with clients. Supported values are: `ble`, `hybrid`, `internal`, `nfc`, `smart-card`, or `usb`.|string||
|
||||
|
||||
#### Response
|
||||
|
||||
`string` - the ID of the created authenticator
|
||||
|
||||
### removeVirtualAuthenticator
|
||||
|
||||
```
|
||||
DELETE /session/:sessionId/webauthn/authenticator/:authenticatorId
|
||||
```
|
||||
|
||||
> WebAuthn documentation: [Remove Virtual Authenticator](https://w3c.github.io/webauthn/#remove-virtual-authenticator)
|
||||
|
||||
Removes the virtual authenticator identified by `:authenticatorId`.
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### addAuthCredential
|
||||
|
||||
```
|
||||
POST /session/:sessionId/webauthn/authenticator/:authenticatorId/credential
|
||||
```
|
||||
|
||||
> WebAuthn documentation: [Add Credential](https://w3c.github.io/webauthn/#add-credential)
|
||||
|
||||
Injects a [Public Key Credential Source](https://w3c.github.io/webauthn/#public-key-credential-source)
|
||||
into the virtual authenticator identified by `:authenticatorId`.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|<div style="width:11em">Name</div>|Description|Type|
|
||||
|--|--|--|
|
||||
|`credentialId`|Credential ID, in Base64url encoding|string|
|
||||
|`isResidentCredential`|Whether to create a client-side discoverable credential. If set to `false`, a server-side credential is created instead.|boolean|
|
||||
|`privateKey`|Asymmetric key package containing a single private key, in Base64url encoding|string|
|
||||
|`rpId`|Relying Party ID the credential is scoped to|string|
|
||||
|`signCount?`|Initial value for the signature counter. Set to `0` if omitted.|number|
|
||||
|`userHandle?`|User handle associated with the credential, in Base64url encoding. Set to `null` if omitted.|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### getAuthCredential
|
||||
|
||||
```
|
||||
GET /session/:sessionId/webauthn/authenticator/:authenticatorId/credentials
|
||||
```
|
||||
|
||||
> WebAuthn documentation: [Get Credentials](https://w3c.github.io/webauthn/#get-credentials)
|
||||
|
||||
Retrieves all Public Key Credential Sources stored in the virtual authenticator identified by
|
||||
`:authenticatorId`.
|
||||
|
||||
#### Response
|
||||
|
||||
`Credential[]` - an array of credential objects. Each object has the following properties:
|
||||
|
||||
|<div style="width:11em">Name</div>|Description|Type|Default|
|
||||
|--|--|--|--|
|
||||
|`credentialId`|Credential ID, in Base64url encoding|string||
|
||||
|`isResidentCredential`|Whether the credential is client-side discoverable (`true`) or server-side (`false`)|boolean||
|
||||
|`largeBlob`|Large, per-credential blog, in Base64url encoding|string|`null`|
|
||||
|`privateKey`|Asymmetric key package containing a single private key, in Base64url encoding|string||
|
||||
|`rpId`|Relying Party ID the credential is scoped to|string||
|
||||
|`signCount`|Initial value for the signature counter|number|`0`|
|
||||
|`userHandle`|User handle associated with the credential, in Base64url encoding|string|`null`|
|
||||
|
||||
### removeAuthCredential
|
||||
|
||||
```
|
||||
DELETE /session/:sessionId/webauthn/authenticator/:authenticatorId/credentials/:credentialId
|
||||
```
|
||||
|
||||
> WebAuthn documentation: [Remove Credential](https://w3c.github.io/webauthn/#remove-credential)
|
||||
|
||||
Removes the Public Key Credential Source identified by `:credentialId` from the virtual authenticator
|
||||
identified by `:authenticatorId`.
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### removeAllAuthCredentials
|
||||
|
||||
```
|
||||
DELETE /session/:sessionId/webauthn/authenticator/:authenticatorId/credentials
|
||||
```
|
||||
|
||||
> WebAuthn documentation: [Remove All Credentials](https://w3c.github.io/webauthn/#remove-all-credentials)
|
||||
|
||||
Removes all Public Key Credential Sources from the virtual authenticator identified by
|
||||
`:authenticatorId`.
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
|
||||
### setUserAuthVerified
|
||||
|
||||
```
|
||||
POST /session/:sessionId/webauthn/authenticator/:authenticatorId/uv
|
||||
```
|
||||
|
||||
> WebAuthn documentation: [Set User Verified](https://w3c.github.io/webauthn/#set-user-verified)
|
||||
|
||||
Sets the `isUserVerified` property of the virtual authenticator identified by `:authenticatorId`.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`isUserVerified`|Whether to always succeed in user verification|boolean|
|
||||
|
||||
#### Response
|
||||
|
||||
`null`
|
||||
@@ -1,289 +0,0 @@
|
||||
---
|
||||
title: Plugin Endpoints
|
||||
---
|
||||
<style>
|
||||
ul[data-md-component="toc"] .md-nav .md-nav {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
The following is a list of endpoints added or modified by official Appium plugins.
|
||||
|
||||
## Execute Driver Plugin
|
||||
|
||||
### executeDriverScript
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/execute_driver
|
||||
```
|
||||
|
||||
Executes a driver script in a child process.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|Default|
|
||||
|--|--|--|--|
|
||||
|`script`|Script to be executed|string||
|
||||
|`type?`|Name of the library executing the script|string|`webdriverio`|
|
||||
|`timeout?`|Timeout (in milliseconds) for the script process|number|`3600000`|
|
||||
|
||||
#### Response
|
||||
|
||||
`RunScriptResult` - an object with the following properties:
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`result`|Result returned by the script|any|
|
||||
|`logs`|Logs generated during script execution|object|
|
||||
|
||||
## Images Plugin
|
||||
|
||||
### compareImages
|
||||
|
||||
```
|
||||
POST /session/:sessionId/appium/compare_images
|
||||
```
|
||||
|
||||
Compares two images using the specified mode of comparison:
|
||||
|
||||
* `matchFeatures`: whether `firstImage` is a rotated, scaled, or otherwise modified version of `secondImage`
|
||||
* `matchTemplate`: whether `firstImage` contains one or more occurrences of `secondImage`
|
||||
* `getSimilarity`: calculate similarity score between two images of equal size
|
||||
|
||||
#### Parameters
|
||||
|
||||
|<div style="width:7em">Name</div>|Description|Type|Default|
|
||||
|--|--|--|--|
|
||||
|`mode`|Mode of comparison. Supported values are: `matchFeatures`, `getSimilarity`, or `matchTemplate`.|string||
|
||||
|`firstImage`|Base64-encoded image file|string or Buffer||
|
||||
|`secondImage`|Base64-encoded image file|string or Buffer||
|
||||
|`options?`|Options specific to the `mode` value (see below)|object|`{}`|
|
||||
|
||||
**`options` for `mode=matchFeatures`**
|
||||
|
||||
|<div style="width:10em">Name</div>|Description|Type|<div style="width:6em">Default</div>|
|
||||
|--|--|--|--|
|
||||
|`detectorName?`|Name of the OpenCV feature detector to use. Supported values are: `AKAZE`, `AgastFeatureDetector`, `BRISK`, `FastFeatureDetector`, `GFTTDetector`, `KAZE`, `MSER`, or `ORB`.|string|`ORB`|
|
||||
|`goodMatchesFactor?`|Maximum number of 'good' matches; or a function accepting current distance, min distance and max distance, and returning a boolean indicating whether the match should be included or not.|number or function||
|
||||
|`matchFunc?`|Name of the OpenCV descriptor matcher to use. Supported values are: `FlannBased`, `BruteForce`, `BruteForce-L1`, `BruteForce-Hamming`, `BruteForce-HammingLUT`, or `BruteForce-SL2`.|string|`BruteForce`|
|
||||
|`visualize?`|Whether to include an image of the matcher visualization in the response|boolean|`false`|
|
||||
|
||||
**`options` for `mode=matchTemplate`**
|
||||
|
||||
|<div style="width:13em">Name</div>|Description|Type|<div style="width:9em">Default</div>|
|
||||
|--|--|--|--|
|
||||
|`matchNeighbourThreshold?`|Maximum pixel distance between two matches to consider them the same match|number|`10`|
|
||||
|`method?`|Name of the OpenCV template matching method to use. Supported values are: `TM_CCOEFF`, `TM_CCOEFF_NORMED`, `TM_CCORR`, `TM_CCORR_NORMED`, `TM_SQDIFF`, or `TM_SQDIFF_NORMED`.|string|`TM_CCOEFF_NORMED`|
|
||||
|`multiple?`|Whether to look for multiple occurrences of the image|boolean|`false`|
|
||||
|`threshold?`|Threshold to use for accepting/rejecting a match|number|`0.5`|
|
||||
|`visualize?`|Whether to include an image of the matcher visualization in the response|boolean|`false`|
|
||||
|
||||
**`options` for `mode=getSimilarity`**
|
||||
|
||||
|<div style="width:6em">Name</div>|Description|Type|<div style="width:9em">Default</div>|
|
||||
|--|--|--|--|
|
||||
|`method?`|Name of the OpenCV template matching method to use. Supported values are: `TM_CCOEFF`, `TM_CCOEFF_NORMED`, `TM_CCORR`, `TM_CCORR_NORMED`, `TM_SQDIFF`, or `TM_SQDIFF_NORMED`.|string|`TM_CCOEFF_NORMED`|
|
||||
|`visualize?`|Whether to include an image of the matcher visualization in the response|boolean|`false`|
|
||||
|
||||
#### Response
|
||||
|
||||
`ComparisonResult` - an object whose properties depend on the `mode` input parameter:
|
||||
|
||||
**`ComparisonResult` for `mode=matchFeatures`**
|
||||
|
||||
|<div style="width:8em">Name</div>|Description|Type|
|
||||
|--|--|--|
|
||||
|`count`|Number of matched edges on both images, after applying `goodMatchesFactor` (if specified).|number|
|
||||
|`points1`|Array of matching points on `firstImage`|`{x, y}[]`|
|
||||
|`points2`|Array of matching points on `secondImage`|`{x, y}[]`|
|
||||
|`rect1`|Bounding rectangle for `points1`|`{x, y, width, height}`|
|
||||
|`rect2`|Bounding rectangle for `points2`|`{x, y, width, height}`|
|
||||
|`totalCount`|Total number of matched edges on both images, before applying `goodMatchesFactor` (if specified)|number|
|
||||
|`visualization?`|Image of the matcher visualization. Only included if the `visualize` input option was enabled.|Buffer|
|
||||
|
||||
**`ComparisonResult` for `mode=matchTemplate`**
|
||||
|
||||
|<div style="width:8em">Name</div>|Description|Type|
|
||||
|--|--|--|
|
||||
|`rect`|Region of `firstImage` where a match was found for `secondImage`|`{x, y, width, height}`|
|
||||
|`multiple?`|Array of all comparison results. Only included if the `multiple` input option was enabled.|`{rect, score, visualization?}`|
|
||||
|`score`|Similarity score between both images in the range `[0.0, 1.0]`|number|
|
||||
|`visualization?`|Image of the matcher visualization. Only included if the `visualize` input option was enabled.|Buffer|
|
||||
|
||||
**`ComparisonResult` for `mode=getSimilarity`**
|
||||
|
||||
|<div style="width:8em">Name</div>|Description|Type|
|
||||
|--|--|--|
|
||||
|`score`|Similarity score between both images in the range `[0.0, 1.0]`|number|
|
||||
|`visualization?`|Image of the matcher visualization. Only included if the `visualize` input option was enabled.|Buffer|
|
||||
|
||||
### findElement
|
||||
|
||||
```
|
||||
POST /session/:sessionId/element
|
||||
```
|
||||
|
||||
Modifies the [`findElement`](./webdriver.md#findelement) endpoint:
|
||||
|
||||
* Adds `-image` to the supported values for the `using` parameter (the location strategy)
|
||||
|
||||
### findElements
|
||||
|
||||
```
|
||||
POST /session/:sessionId/elements
|
||||
```
|
||||
|
||||
Modifies the [`findElements`](./webdriver.md#findelements) endpoint:
|
||||
|
||||
* Adds `-image` to the supported values for the `using` parameter (the location strategy)
|
||||
|
||||
### performActions
|
||||
|
||||
```
|
||||
POST /session/:sessionId/actions
|
||||
```
|
||||
|
||||
Modifies the [`performActions`](./webdriver.md#performactions) endpoint:
|
||||
|
||||
* If any action in `actions` includes `origin`, whose value is an image element:
|
||||
* Removes the `origin` property
|
||||
* Increments the `x` and `y` properties by the center coordinates of the image element
|
||||
|
||||
## Relaxed Caps Plugin
|
||||
|
||||
### createSession
|
||||
|
||||
```
|
||||
POST /session
|
||||
```
|
||||
|
||||
Modifies the [`createSession`](./webdriver.md#createsession) endpoint:
|
||||
|
||||
* Adds the `appium:` prefix to all keys in `capabilities`, unless they match a standard W3C
|
||||
capability, or already have any prefix
|
||||
|
||||
## Storage Plugin
|
||||
|
||||
!!! tip
|
||||
|
||||
All endpoints for this plugin can be invoked without creating a session, allowing you to prepare
|
||||
your test environment in advance.
|
||||
|
||||
### addStorageItem
|
||||
|
||||
```
|
||||
POST /storage/add
|
||||
```
|
||||
|
||||
Adds a new file to the storage.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`name`|Name used for saving the file (must not include path separator characters)|string|
|
||||
|`sha1`|SHA1 hash of the file to be uploaded|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`AddRequestResult` - an object with the following properties:
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`ttlMs`|Timeout (in milliseconds) for both web sockets to remain active, or for a file payload to be successfully uploaded|number|
|
||||
|`ws.events`|Path for the events web socket used to notify about upload success or failure|string|
|
||||
|`ws.stream`|Path for the streaming web socket used to upload the file content|string|
|
||||
|
||||
Example:
|
||||
```json
|
||||
{
|
||||
"ws": {
|
||||
"stream": "/storage/add/ccc963411b2621335657963322890305ebe96186/stream",
|
||||
"events": "/storage/add/ccc963411b2621335657963322890305ebe96186/events"
|
||||
},
|
||||
"ttlMs": 300000
|
||||
}
|
||||
```
|
||||
|
||||
### deleteStorageItem
|
||||
|
||||
```
|
||||
POST /storage/delete
|
||||
```
|
||||
|
||||
Deletes a file in the storage.
|
||||
|
||||
#### Parameters
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`name`|Name of the file to be deleted|string|
|
||||
|
||||
#### Response
|
||||
|
||||
`boolean` - `true` upon successful file deletion, or `false` if the file does not exist in
|
||||
the storage
|
||||
|
||||
### listStorageItems
|
||||
|
||||
```
|
||||
GET /storage/list
|
||||
```
|
||||
|
||||
List all files present in the storage.
|
||||
|
||||
#### Response
|
||||
|
||||
`List<StorageItem>` - a list of items, where each item has the following properties:
|
||||
|
||||
|Name|Description|Type|
|
||||
|--|--|--|
|
||||
|`name`|Name of the file in the storage|string|
|
||||
|`path`|Full path to the file on the remote file system|string|
|
||||
|`size`|File size in bytes|number|
|
||||
|
||||
### resetStorage
|
||||
|
||||
```
|
||||
POST /storage/reset
|
||||
```
|
||||
|
||||
Deletes all uploaded files and stops any incomplete uploads.
|
||||
If the [`APPIUM_STORAGE_KEEP_ALL` flag](../cli/env-vars.md) is set, all uploaded files will be
|
||||
preserved, and only the incomplete uploads will be stopped.
|
||||
|
||||
#### Response
|
||||
|
||||
`void`
|
||||
|
||||
## Universal XML Plugin
|
||||
|
||||
### findElement
|
||||
|
||||
```
|
||||
POST /session/:sessionId/element
|
||||
```
|
||||
|
||||
Modifies the [`findElement`](./webdriver.md#findelement) endpoint:
|
||||
|
||||
* Adds support for universal node/attribute names for the `value` parameter (the selector)
|
||||
|
||||
### findElements
|
||||
|
||||
```
|
||||
POST /session/:sessionId/elements
|
||||
```
|
||||
|
||||
Modifies the [`findElements`](./webdriver.md#findelements) endpoint:
|
||||
|
||||
* Adds support for universal node/attribute names for the `value` parameter (the selector)
|
||||
|
||||
### getPageSource
|
||||
|
||||
```
|
||||
GET /session/:sessionId/source
|
||||
```
|
||||
|
||||
Modifies the [`getPageSource`](./webdriver.md#getpagesource) endpoint:
|
||||
|
||||
* After retrieving the result, translates node/attribute names to their universal names
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,31 +0,0 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Environment Variables
|
||||
---
|
||||
|
||||
The primary ways of configuring the Appium server are via [Command-Line Arguments](./server.md) or
|
||||
the [Config File](../../guides/config.md). However, some more advanced features are toggled or
|
||||
configured via environment variables. To set environment variables, refer to the documentation for
|
||||
your operating system and terminal.
|
||||
|
||||
These are the environment variables that the Appium server understands:
|
||||
|
||||
|<div style="width:18em">Variable</div>|Description|
|
||||
|--------|-----------|
|
||||
|`APPIUM_APPS_CACHE_IGNORE_URL_QUERY`|Set this to a truthy value to remove any query part of a URL when using it as a cache key. See the corresponding [feature request](https://discuss.appium.io/t/regarding-app-caching-when-using-aws-s3-presigned-urls/42713) for more details.|
|
||||
|`APPIUM_APPS_CACHE_MAX_AGE`|Set the maximum age (in minutes) for [cached applications](../../guides/caching.md). Do not set it to a lower number than the duration of a single session startup. Default: `60 * 24` (24 hours)|
|
||||
|`APPIUM_APPS_CACHE_MAX_ITEMS`|Set the maximum amount of [cached applications](../../guides/caching.md). Do not set it to a lower number than the amount of apps in all parallel sessions per process. Default: `1024`|
|
||||
|`APPIUM_HOME`|Set the path to the Appium home directory, which is used for [Managing Extensions](../../guides/managing-exts.md). Default: `.appium` in the home directory of the current user|
|
||||
|`APPIUM_OMIT_PEER_DEPS`|Set this to `1` to add `--omit=peer` to all the NPM commands run internally by Appium. Mostly an internal feature.|
|
||||
|`APPIUM_RELOAD_EXTENSIONS`|Set this to a truthy value to cause Appium to re-require extensions when new sessions are created. This feature is mostly useful for [building extensions](../../developing/build-drivers.md).|
|
||||
|`APPIUM_TMP_DIR`|Set the path to the directory used for temporary files. Same as the `--tmp` command line argument.|
|
||||
|
||||
Appium drivers and plugins may define additional environment variables. The following variables are
|
||||
used by official plugins:
|
||||
|
||||
|<div style="width:13em">Variable</div>|Plugin|Description|
|
||||
|--------|-----------|-----------|
|
||||
|`APPIUM_STORAGE_KEEP_ALL`|`storage`|Set this to `1`, `true` or `yes` to preserve files in the storage after the server process is terminated. By default, stopping the server process also deletes all files in the storage.|
|
||||
|`APPIUM_STORAGE_ROOT`|`storage`|Set the path to the directory used for storage. If set to an existing folder, all files in it will be retained after terminating the server, unless specified otherwise using `APPIUM_STORAGE_KEEP_ALL`.|
|
||||
@@ -1,240 +0,0 @@
|
||||
---
|
||||
title: appium driver/plugin
|
||||
---
|
||||
<style>
|
||||
ul[data-md-component="toc"] .md-nav {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
Provides management options for a specific extension (driver or plugin). Both the `appium driver` and
|
||||
`appium plugin` subcommands support the same options.
|
||||
|
||||
The following sub-subcommands are supported: `doctor`, `install`, `list`, `run`, `update`,
|
||||
and `uninstall`.
|
||||
|
||||
## `doctor`
|
||||
|
||||
Runs doctor checks for an installed extension, which validate whether the extension has its prerequisites
|
||||
configured correctly. Note that not all extensions include doctor checks.
|
||||
|
||||
!!! note
|
||||
|
||||
If you maintain an Appium extension and would like to add Appium Doctor support for it, check
|
||||
out the documentation on [Building Doctor Checks](../../developing/build-doctor-checks.md).
|
||||
|
||||
#### Usage
|
||||
|
||||
```
|
||||
appium {driver|plugin} doctor <extension-name>
|
||||
```
|
||||
|
||||
|Argument|Description|
|
||||
|--|--|
|
||||
|`extension-name`|The short name of the installed extension|
|
||||
|
||||
#### Options
|
||||
|
||||
|Argument|Description|Type|
|
||||
|--|--|--|
|
||||
|`--json`|Return the result in JSON format|boolean|
|
||||
|
||||
#### Example
|
||||
|
||||
- Run doctor checks for the UiAutomator2 driver:
|
||||
|
||||
```
|
||||
appium driver doctor uiautomator2
|
||||
```
|
||||
|
||||
## `install`
|
||||
|
||||
Installs an extension.
|
||||
|
||||
#### Usage
|
||||
|
||||
```
|
||||
appium {driver|plugin} install <install-spec>
|
||||
```
|
||||
|
||||
|<div style="width:7em">Argument</div>|Description|
|
||||
|--|--|
|
||||
|`install-spec`|The short name of an official extension, with optional `npm` version or tag modifier. If using the `--source` option, the expected format of this argument will change ([see below](#source-vs-install-spec)).|
|
||||
|
||||
#### Options
|
||||
|
||||
|Argument|Description|Type|
|
||||
|--|--|--|
|
||||
|`--json`|Return the result in JSON format|boolean|
|
||||
|`--package`|The Node.js package name of the extension. Required if `--source` is set to `git` or `github`.|string|
|
||||
|`--source`|The location where Appium should look for the given extension. Supported values are `git`, `github`, `local`, or `npm`. Changes the expected format of `install-spec` ([see below](#source-vs-install-spec)).|string|
|
||||
|
||||
#### Source vs Install Spec
|
||||
|
||||
|`source`|Format of `<install-spec>`|
|
||||
|--|--|
|
||||
|None|The short name of an official extension, with optional modifiers as supported by `npm install` (e.g. version or tag)|
|
||||
|`git`|The Git URL of the extension|
|
||||
|`github`|The GitHub repository URL of the extension|
|
||||
|`local`|The local path to the extension containing its `package.json` file|
|
||||
|`npm`|The name of the `npm` package, with optional modifiers as supported by `npm install` (e.g. version or tag)|
|
||||
|
||||
#### Examples
|
||||
|
||||
- Install the latest XCUITest driver:
|
||||
|
||||
```
|
||||
appium driver install xcuitest
|
||||
```
|
||||
|
||||
- Install the XCUITest driver at version 9.0.0:
|
||||
|
||||
```
|
||||
appium driver install xcuitest@9.0.0
|
||||
```
|
||||
|
||||
- Install the `beta` version of `@appium/fake-driver` from `npm`:
|
||||
|
||||
```
|
||||
appium driver install @appium/fake-driver@beta --source=npm
|
||||
```
|
||||
|
||||
- Install a locally-developed plugin:
|
||||
|
||||
```
|
||||
appium plugin install /path/to/my/plugin --source=local
|
||||
```
|
||||
|
||||
- Install the XCUITest driver from GitHub:
|
||||
|
||||
```
|
||||
appium driver install https://github.com/appium/appium-xcuitest-driver --source=github --package=appium-xcuitest-driver
|
||||
```
|
||||
|
||||
- Install the XCUITest driver using a Git URL:
|
||||
|
||||
```
|
||||
appium driver install git://github.com/appium/appium-xcuitest-driver.git --source=git --package=appium-xcuitest-driver
|
||||
```
|
||||
|
||||
## `list`
|
||||
|
||||
Lists all installed extensions, plus all official extensions that are not installed.
|
||||
|
||||
#### Usage
|
||||
|
||||
```
|
||||
appium {driver|plugin} list
|
||||
```
|
||||
|
||||
#### Options
|
||||
|
||||
|<div style="width:7em">Argument</div>|Description|Type|
|
||||
|--|--|--|
|
||||
|`--installed`|Only list all installed extensions|boolean|
|
||||
|`--json`|Return the result in JSON format|boolean|
|
||||
|`--updates`|List all extensions along with information on whether newer versions are available. Only supported for extensions installed via `npm`.|boolean|
|
||||
|`--verbose`|Show additional details for each extension|boolean|
|
||||
|
||||
#### Example
|
||||
|
||||
- List all installed drivers and check if they have newer versions available:
|
||||
|
||||
```
|
||||
appium driver list --installed --updates
|
||||
```
|
||||
|
||||
## `run`
|
||||
|
||||
Runs an extension script, which can assist with setup or perform other tasks. Note that not all
|
||||
extensions include scripts.
|
||||
|
||||
#### Usage
|
||||
|
||||
```
|
||||
appium {driver|plugin} run <extension-name> <script-name> [script-args]
|
||||
```
|
||||
|
||||
|Argument|Description|
|
||||
|--|--|
|
||||
|`extension-name`|The short name of the installed extension|
|
||||
|`script-name`|The name of the script to be run|
|
||||
|`script-args`|Any additional arguments passed to the script|
|
||||
|
||||
#### Options
|
||||
|
||||
|Argument|Description|Type|
|
||||
|--|--|--|
|
||||
|`--json`|Return the result in JSON format|boolean|
|
||||
|
||||
#### Example
|
||||
|
||||
- Run the `reset` script included in the UiAutomator2 driver:
|
||||
|
||||
```
|
||||
appium driver run uiautomator2 reset
|
||||
```
|
||||
|
||||
## `update`
|
||||
|
||||
Updates one or more extensions. Only supported for extensions installed via `npm`. By default,
|
||||
Appium will only update minor and patch versions, in order to prevent any breaking changes.
|
||||
|
||||
#### Usage
|
||||
|
||||
```
|
||||
appium {driver|plugin} update <extension-name>
|
||||
```
|
||||
|
||||
|Argument|Description|
|
||||
|--|--|
|
||||
|`extension-name`|The short name of the installed extension, or `installed` to update all installed extensions|
|
||||
|
||||
#### Options
|
||||
|
||||
|Argument|Description|Type|
|
||||
|--|--|--|
|
||||
|`--json`|Return the result in JSON format|boolean|
|
||||
|`--unsafe`|Allow updates of major versions, which may cause breaking changes|boolean|
|
||||
|
||||
#### Examples
|
||||
|
||||
- Update the UiAutomator2 driver to its latest major version:
|
||||
|
||||
```
|
||||
appium driver update uiautomator2 --unsafe
|
||||
```
|
||||
|
||||
- Update all installed plugins:
|
||||
|
||||
```
|
||||
appium plugin update installed
|
||||
```
|
||||
|
||||
## `uninstall`
|
||||
|
||||
Removes an installed extension.
|
||||
|
||||
#### Usage
|
||||
|
||||
```
|
||||
appium {driver|plugin} uninstall <extension-name>
|
||||
```
|
||||
|
||||
|Argument|Description|
|
||||
|--|--|
|
||||
|`extension-name`|The short name of the installed extension|
|
||||
|
||||
#### Options
|
||||
|
||||
|Argument|Description|Type|
|
||||
|--|--|--|
|
||||
|`--json`|Return the result in JSON format|boolean|
|
||||
|
||||
#### Example
|
||||
|
||||
- Remove the `images` plugin:
|
||||
|
||||
```
|
||||
appium plugin uninstall images
|
||||
```
|
||||
@@ -1,35 +0,0 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Command Line Interface
|
||||
---
|
||||
|
||||
Appium provides a command-line executable (`appium`), which can be used to configure and launch
|
||||
the Appium server, as well as manage Appium extensions (drivers and plugins).
|
||||
|
||||
The executable has four main subcommands: `server`, `driver`, `plugin`, and `setup`. All subcommands
|
||||
(and sub-subcommands) can be run with the `--help`/`-h` option for usage instructions.
|
||||
|
||||
<div class="grid cards" markdown>
|
||||
|
||||
- [__`appium server`__](./server.md) (or simply `appium`)
|
||||
|
||||
Start an Appium server
|
||||
|
||||
- [__`appium driver`__](./extensions.md)
|
||||
|
||||
Manage individual drivers
|
||||
|
||||
- [__`appium plugin`__](./extensions.md)
|
||||
|
||||
Manage individual plugins
|
||||
|
||||
- [__`appium setup`__](./setup.md)
|
||||
|
||||
Manage multiple drivers/plugins
|
||||
|
||||
</div>
|
||||
|
||||
Appium also recognizes several [environment variables](./env-vars.md), which may be used for
|
||||
advanced configuration.
|
||||
@@ -1,76 +0,0 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: appium server
|
||||
---
|
||||
|
||||
Launches an Appium server.
|
||||
|
||||
```
|
||||
appium server
|
||||
```
|
||||
|
||||
You can also omit the `server` subcommand:
|
||||
|
||||
```
|
||||
appium
|
||||
```
|
||||
|
||||
### Options
|
||||
|
||||
!!! note
|
||||
|
||||
All of these options can also be set via a [Configuration File](../../guides/config.md). Options
|
||||
set on the command line will override any options found in a configuration file.
|
||||
|
||||
|<div style="width:15em">Argument</div>|Description|Type|<div style="width:7em">Default</div>|
|
||||
|--|--|--|--|
|
||||
|`--address`, `-a`|IPv4/IPv6 address to listen on|string|`0.0.0.0`|
|
||||
|`--allow-cors`|Allow web browser connections from any host|boolean|`false`|
|
||||
|`--allow-insecure`|List of [insecure features](../../guides/security.md) that should be allowed in this server's sessions. Individual features can be overridden by `--deny-insecure`. Has no effect in combination with `--relaxed-security`.|array<string>|`[]`|
|
||||
|`--base-path`, `-pa`|Base path to use as the prefix for all webdriver routes running on the server|string|`""`|
|
||||
|`--callback-address`, `-ca`|Callback IP address|string|`0.0.0.0`|
|
||||
|`--callback-port`, `-cp`|Callback port|integer|`4723`|
|
||||
|`--config`|Path to an [Appium configuration JSON file](../../guides/config.md)|string||
|
||||
|`--debug-log-spacing`|Add exaggerated spacing in logs to help with visual inspection|boolean|`false`|
|
||||
|`--default-capabilities`, `-dc`|Capabilities that will be used for each session, unless overridden by received capabilities|object||
|
||||
|`--deny-insecure`|List of [insecure features](../../guides/security.md) that should be disabled in this server's sessions. Since all insecure features are disabled by default, this argument has no effect without either `--allow-insecure` or `--relaxed-security`, and is applied after both.|array<string>|`[]`|
|
||||
|`--driver`|Driver-specific configuration. Keys should correspond to driver package names|object||
|
||||
|`--drivers-import-chunk-size`|Maximum number of drivers that can be imported in parallel on server startup|number|`3`|
|
||||
|`--keep-alive-timeout`, `-ka`|Timeout (in seconds) to use as both the keep-alive timeout and the connection timeout for all client requests. Disabled if set to `0`.|integer|`600`|
|
||||
|`--request-timeout`|Timeout (in seconds) for waiting to receive the entire HTTP request from the client. Disabled if set to `0`. Requests exceeding this timeout will be rejected with the code `HTTP 408`.|integer|`3600`|
|
||||
|`--local-timezone`|Use local timezone for log timestamps|boolean|`false`|
|
||||
|`--log`, `-g`|Path to a file where the server logs should be output. This does not affect output on the console.|string||
|
||||
|`--log-filters`|List of log filtering rules. See the [log filtering guide](../../guides/log-filters.md) for details.|array||
|
||||
|`--log-level`|The log level for the server logs. Supported values are `debug`, `info`, `warn`, or `error`. Combining two supported values using a colon (e.g. `warn:debug`) allows to set separate log levels for the console and file outputs, respectively.|string|`debug`|
|
||||
|`--log-format`|The log format of the server logs. Supported values are `text`, `json`, or `pretty_json`. Setting the value to `json` disables colors.|string|`text`|
|
||||
|`--log-no-colors`|Disable colors in the server log|boolean|`false`|
|
||||
|`--log-timestamp`|Show timestamps in the server log|boolean|`false`|
|
||||
|`--long-stacktrace`|Add long stack traces to log entries. Recommended for debugging only.|boolean|`false`|
|
||||
|`--no-perms-check`|Skip various permission checks on the server startup|boolean|`false`|
|
||||
|`--nodeconfig`|JSON configuration for registering Appium as a node with Selenium Grid 3|object||
|
||||
|`--plugin`|Plugin-specific configuration. Keys should correspond to plugin package names|object||
|
||||
|`--plugins-import-chunk-size`|Maximum number of plugins that can be imported in parallel on server startup|number|`7`|
|
||||
|`--port`, `-p`|Port to listen on|integer|`4723`|
|
||||
|`--relaxed-security`|Allow all [insecure features](../../guides/security.md). Only use this if all clients are in a trusted network and could not potentially break out of the session sandbox. Specific features can be overridden by using `--deny-insecure`.|boolean|`false`|
|
||||
|`--session-override`|Enable session override (clobbering)|boolean|`false`|
|
||||
|`--shutdown-timeout`|Timeout (in milliseconds) for waiting on all active connections to close, when shutting down the server|number|`5000`|
|
||||
|`--ssl-cert-path`|Absolute path to the `.cert` file if TLS is used. Must be provided together with `--ssl-key-path`. See the [SSL/TLS/SPDY Support guide](../../guides/tls.md) for details.|string||
|
||||
|`--ssl-key-path`|Absolute path to the `.key` file if TLS is used. Must be provided together with `--ssl-cert-path`. See the [SSL/TLS/SPDY Support guide](../../guides/tls.md) for details.|string||
|
||||
|`--strict-caps`|Prevent creation of new client sessions that use unsupported capabilities|boolean|`false`|
|
||||
|`--tmp`|Absolute path to the directory used for temporary files|string|[`os.tmpdir()`](https://nodejs.org/api/os.html#ostmpdir)|
|
||||
|`--use-drivers`|List of drivers to activate. By default, all installed drivers are activated.|array<string>|`[]`|
|
||||
|`--use-plugins`|List of plugins to activate. By default, no plugins are activated. Set to `["all"]` to activate all installed plugins.|array<string>|`[]`|
|
||||
|`--webhook`, `-G`|URL for an HTTP listener where the server logs should be output. This does not affect output on the console.|string||
|
||||
|
||||
### Info Options
|
||||
|
||||
The following options are used for reference or debug purposes. They are only supported for the base `appium` command (not `appium server`), and will not launch the server.
|
||||
|
||||
|<div style="width:10em">Argument</div>|Description|
|
||||
|--|--|
|
||||
|`--show-build-info`|Print detailed information on the Appium server version|
|
||||
|`--show-config`|Print the current Appium server configuration details|
|
||||
|`--show-debug-info`|Print information on the current environment: details about the operating system, Node.js, and Appium itself|
|
||||
|`--version`, `-v`|Print the Appium server version|
|
||||
@@ -1,76 +0,0 @@
|
||||
---
|
||||
title: appium setup
|
||||
---
|
||||
<style>
|
||||
ul[data-md-component="toc"] .md-nav {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
Installs a specific preset of extensions (drivers and plugins), or uninstalls all extensions.
|
||||
When installing a preset, any already installed extensions are kept intact.
|
||||
|
||||
The following sub-subcommands are supported: `browser`, `desktop`, `mobile`, and `reset`.
|
||||
|
||||
Refer to the [Ecosystem documentation](../../ecosystem/index.md) to learn more about the extensions
|
||||
mentioned below.
|
||||
|
||||
## `browser`
|
||||
|
||||
Installs the following extensions for browser webview testing:
|
||||
|
||||
* Drivers: `safari`[^1], `gecko`, `chromium`
|
||||
* Plugins: `images`, `inspector`
|
||||
|
||||
#### Usage
|
||||
|
||||
```
|
||||
appium setup browser
|
||||
```
|
||||
|
||||
## `desktop`
|
||||
|
||||
Installs the following extensions for desktop application testing:
|
||||
|
||||
* Drivers: `mac2`[^1], `windows`[^2]
|
||||
* Plugins: `images`, `inspector`
|
||||
|
||||
#### Usage
|
||||
|
||||
```
|
||||
appium setup desktop
|
||||
```
|
||||
|
||||
## `mobile`
|
||||
|
||||
Installs the following extensions for mobile testing:
|
||||
|
||||
* Drivers: `uiautomator2`, `xcuitest`[^1], `espresso`
|
||||
* Plugins: `images`, `inspector`
|
||||
|
||||
#### Usage
|
||||
|
||||
```
|
||||
appium setup mobile
|
||||
```
|
||||
|
||||
You can also omit the `mobile` sub-subcommand:
|
||||
|
||||
```
|
||||
appium setup
|
||||
```
|
||||
|
||||
## `reset`
|
||||
|
||||
Uninstalls all installed extensions, along with their manifest files, from the Appium home
|
||||
directory. This can be useful if you experience configuration issues on server startup, for
|
||||
example, due to a failed upgrade attempt from an older Appium version.
|
||||
|
||||
#### Usage
|
||||
|
||||
```
|
||||
appium setup reset
|
||||
```
|
||||
|
||||
[^1]: Only installed if the host machine is running macOS.
|
||||
[^2]: Only installed if the host machine is running Windows.
|
||||
@@ -1,25 +0,0 @@
|
||||
---
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: Reference
|
||||
---
|
||||
|
||||
This section of the Appium documentation provides a reference to the two main interfaces within the
|
||||
Appium server: the command-line executable, and the supported API endpoints.
|
||||
|
||||
<div class="grid cards" markdown>
|
||||
|
||||
- :octicons-command-palette-16: [__Command Line Interface__](./cli/index.md)
|
||||
|
||||
---
|
||||
|
||||
Learn how to use the Appium command-line executable
|
||||
|
||||
- :material-cloud-braces: [__API Endpoints__](./api/index.md)
|
||||
|
||||
---
|
||||
|
||||
View endpoints supported by the Appium server
|
||||
|
||||
</div>
|
||||
@@ -18,11 +18,3 @@ maintainers, Jonathan Lipps, with lots of useful guides
|
||||
- [Appium and Selenium Fundamentals](https://ui.headspin.io/university/learn/appium-selenium-fundamentals-2020) - a comprehensive video course on learning Python, Selenium, and Appium by Jonathan Lipps
|
||||
- [Mobile Test Automation with Appium](https://testautomationu.applitools.com/appium-java-tutorial/) - a video course by Moataz Nabil
|
||||
- [Advanced Appium](https://www.linkedin.com/learning/advanced-appium) - a video course by Jonathan Lipps
|
||||
|
||||
## Conference Archives
|
||||
|
||||
- [AppiumConf 2018](https://www.youtube.com/playlist?list=PLhr2WKNPXcZOmOf1k2aqkbMZwnZb2pSZL)
|
||||
- [AppiumConf 2019](https://www.youtube.com/playlist?list=PL9Z-JgiTsOYSfJh9YKI9Stj3FMwHERw6w)
|
||||
- [AppiumConf 2021](https://www.youtube.com/playlist?list=PL9Z-JgiTsOYRCcJhDfmKAah9XmAp2b903)
|
||||
- [AppiumConf 2024](https://www.youtube.com/playlist?list=PL9Z-JgiTsOYQaU5i5LJtAWlh5WVZPi3If)
|
||||
- [SeleniumConf & AppiumConf 2025](https://www.youtube.com/playlist?list=PLRdSclUtJDYV2R92TLbmwxws6clruuTjH)
|
||||
@@ -22,11 +22,6 @@ Hub](https://opencollective.com/appium).
|
||||
We are very grateful for the support of our Development Partners, who donate Appium development and
|
||||
maintenance as part of their employees' core job duties!
|
||||
|
||||
<a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-dark.png#only-dark" width="250" alt="LambdaTest" />
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-light.png#only-light" width="250" alt="LambdaTest" />
|
||||
</a>
|
||||
|
||||
## Strategic Partners
|
||||
|
||||
We are very grateful for the financial and marketing support of our exclusive Strategic Partners,
|
||||
@@ -34,36 +29,31 @@ who contribute a significant ongoing investment of funds to help the project att
|
||||
contributors!
|
||||
|
||||
<a href="https://www.browserstack.com/browserstack-appium?utm_campaigncode=701OW00000AoUTQYA3&utm_medium=partnered&utm_source=appium">
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-browserstack-dark.png#only-dark" width="250" alt="BrowserStack" />
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-browserstack-light.png#only-light" width="250" alt="BrowserStack" />
|
||||
</a>
|
||||
|
||||
<a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-dark.png#only-dark" width="250" alt="LambdaTest" />
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-light.png#only-light" width="250" alt="LambdaTest" />
|
||||
<picture>
|
||||
<source srcset="../assets/images/sponsor-logo-browserstack-dark.png" media="(prefers-color-scheme: dark)"/>
|
||||
<source srcset="../assets/images/sponsor-logo-browserstack-light.png" media="(prefers-color-scheme: light)"/>
|
||||
<img src="../assets/images/sponsor-logo-browserstack-dark.png" width="250" alt="Browserstack"/>
|
||||
</picture>
|
||||
</a>
|
||||
|
||||
## Gold Sponsors
|
||||
|
||||
<div class="sponsor-section">
|
||||
<a href="https://jetify.com/" target="_blank"><img src="https://images.opencollective.com/jetify/415824c/avatar/64.png" alt="Jetify" /></a>
|
||||
</div>
|
||||
<a href="https://opencollective.com/appium" target="_blank"><img src="https://opencollective.com/appium/tiers/gold-sponsor.svg?avatarHeight=100&button=false&random=1"/></a>
|
||||
|
||||
[Become a Gold Sponsor](https://opencollective.com/appium/contribute/gold-sponsor-72877/checkout?interval=month&amount=500&contributeAs=me)
|
||||
|
||||
## Silver Sponsors
|
||||
|
||||
<div class="sponsor-section">
|
||||
<a href="https://magicpod.com/" target="_blank"><img src="https://images.opencollective.com/magicpod/722b7e4/avatar/64.png" alt="MagicPod" /></a>
|
||||
</div>
|
||||
<a href="https://opencollective.com/appium" target="_blank"><img src="https://opencollective.com/appium/tiers/silver-sponsor.svg?avatarHeight=80&button=false&random=1"/></a>
|
||||
|
||||
[Become a Silver Sponsor](https://opencollective.com/appium/contribute/silver-sponsor-72876/checkout?interval=month&amount=250&contributeAs=me)
|
||||
|
||||
## Bronze Sponsors
|
||||
|
||||
<div class="sponsor-section">
|
||||
<a href="https://route4me.com/" target="_blank"><img src="https://images.opencollective.com/route4me/71fb6fa/avatar/64.png" alt="Route4Me" /></a>
|
||||
<a href="https://webdriver.io/" target="_blank"><img src="https://images.opencollective.com/webdriverio/bbdd6c3/avatar/64.png" alt="WebdriverIO" /></a>
|
||||
<a href="https://magicpod.com/" target="_blank"><img src="https://images.opencollective.com/magicpod/722b7e4/avatar/64.png" alt="MagicPod" /></a>
|
||||
<a href="https://route4me.com/" target="_blank"><img src="../assets/images/sponsor-logo-route4me.png" alt="Route Planning and Route Mapping" /></a>
|
||||
<a href="https://webdriver.io/" target="_blank"><img src="https://images.opencollective.com/webdriverio/bbdd6c3/logo/64.png" alt="WebdriverIO" /></a>
|
||||
</div>
|
||||
|
||||
[Become a Bronze Sponsor](https://opencollective.com/appium/contribute/sponsors-70690/checkout?interval=month&amount=100&contributeAs=me)
|
||||
@@ -1,19 +0,0 @@
|
||||
authors:
|
||||
jlipps:
|
||||
name: 'Jonathan Lipps'
|
||||
description: 'Appium project lead. Learn more about Jonathan at https://jlipps.com'
|
||||
avatar: 'https://gravatar.com/avatar/fdaadd825d92709bcf7fe76dffa12c40681c6108c67bcddf19478b2d00e3794b.jpg'
|
||||
slug: 'jlipps'
|
||||
url: 'https://jlipps.com'
|
||||
srini:
|
||||
name: 'Srinivasan Sekar'
|
||||
description: 'Appium Maintainer'
|
||||
avatar: 'https://avatars.githubusercontent.com/u/8896549?v=4'
|
||||
slug: 'srini'
|
||||
url: 'https://srini.codes'
|
||||
sai:
|
||||
name: 'Sai krishna'
|
||||
description: 'Appium Maintainer'
|
||||
avatar: 'https://avatars.githubusercontent.com/u/4045041?v=4'
|
||||
slug: 'sai'
|
||||
url: 'https://saikrishna.tech'
|
||||
@@ -1,2 +1,2 @@
|
||||
# Appium Blog
|
||||
# Blog
|
||||
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
---
|
||||
authors:
|
||||
- srini
|
||||
- sai
|
||||
date: 2024-07-13
|
||||
---
|
||||
|
||||
# Appium Conf 2024: Call for Proposals Now Open!
|
||||
|
||||
We're thrilled to announce that Appium Conf is back and going online for 2024! This is the official Appium conference where you can learn all about what's new in Appium 2.0 and explore the latest in automating tests for devices, mobile apps, and desktop applications.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
<div style="text-align:center;width:100%">
|
||||
<a href="https://confengine.com/conferences/appium-conf-2024/proposals?utm_medium=referal&utm_source=appium.io&utm_campaign=launch">
|
||||
<img id="image-36-42" alt="Appium Conf logo" src="https://appiumconf.com/wp-content/uploads/2021/06/Appium-Conf-Logo.svg" data-src="https://appiumconf.com/wp-content/uploads/2021/06/Appium-Conf-Logo.svg" decoding="async">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
## Mark Your Calendars: September 13, 2024
|
||||
|
||||
Join us on September 13, 2024, for a full day of inspiring and practical talks from the Appium team and the world's top mobile testing and automation experts. With Appium 2.0 now well-established, this is your opportunity to dive deep and learn how to maximize its potential.
|
||||
|
||||
## Why Attend Appium Conf 2024?
|
||||
|
||||
1. **Gain Insights**: Hear interesting insights and inspiring case studies from global experts and the core Appium team.
|
||||
2. **Improve Your Strategy**: Gain valuable knowledge to enhance your own automation strategy.
|
||||
3. **Network**: Make connections with Appium users from around the globe.
|
||||
4. **Learn from Specialists**: Benefit from Appium specialists' expertise on a variety of topics.
|
||||
|
||||
## Call for Proposals: Share Your Knowledge!
|
||||
|
||||
We're looking for a diverse range of speakers from around the globe who are eager to share innovative ideas and use-cases of mobile test automation. If you have experience with Appium and insights that could benefit the community of test practitioners, we want to hear from you!
|
||||
|
||||
Don't miss this chance to contribute to the Appium community and showcase your expertise on a global stage.
|
||||
|
||||
## How to Submit Your Proposal
|
||||
|
||||
Visit our website at [https://appiumconf.com/](https://appiumconf.com/) and [Submit a Proposal](https://confengine.com/conferences/appium-conf-2024/proposals?utm_medium=referal&utm_source=appium.io&utm_campaign=launch). We're excited to see your innovative ideas and experiences with Appium!
|
||||
|
||||
## Stay Tuned
|
||||
|
||||
Keep an eye on our website and social media channels for updates on the conference schedule, keynote speakers, and more exciting details about Appium Conf 2024.
|
||||
|
||||
Join us in shaping the future of mobile and device test automation. Submit your proposal today and be part of this exciting event!
|
||||
@@ -1,46 +0,0 @@
|
||||
---
|
||||
authors:
|
||||
- jlipps
|
||||
date: 2024-06-10
|
||||
---
|
||||
|
||||
# Announcing BrowserStack as Appium's Strategic Partner
|
||||
|
||||
We have another exciting announcement for you! As part of our recently-announced sponsorship and
|
||||
contributor compensation
|
||||
program,
|
||||
we are obviously in need of significant funding to support giving back to our contributor
|
||||
community. We are therefore extremely happy to announce one of our brand new exclusive Strategic Partners: <a
|
||||
href="https://www.browserstack.com/browserstack-appium?utm_campaigncode=701OW00000AoUTQYA3&utm_medium=partnered&utm_source=appium">BrowserStack</a>!
|
||||
|
||||
<!-- more -->
|
||||
|
||||
<div style="text-align:center;width:100%">
|
||||
<a href="https://www.browserstack.com/browserstack-appium?utm_campaigncode=701OW00000AoUTQYA3&utm_medium=partnered&utm_source=appium">
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-browserstack-dark.png#only-dark" width="300" />
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-browserstack-light.png#only-light" width="300" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
BrowserStack has long been recognized in the industry as having extensive support for Appium,
|
||||
allowing you to run functional and visual regression tests for your native and hybrid apps at scale
|
||||
across a variety of devices and platforms.
|
||||
|
||||
As a token of this collaboration, BrowserStack is extending a special premium access of
|
||||
BrowserStack App Automate product to Appium users. Discover more about this special offer at
|
||||
[browserstack.com](https://www.browserstack.com/browserstack-appium?utm_campaigncode=701OW00000AoUTQYA3&utm_medium=partnered&utm_source=appium&utm_term=partannouncement)
|
||||
|
||||
With the decision to come on board as Strategic Partner, BrowserStack is making a huge investment
|
||||
in Appium and the Appium community. BrowserStack is very interested in supporting the development
|
||||
of the Appium contributor base, and is proud to be a key part of our contributor compensation
|
||||
scheme. Without Strategic Partners like BrowserStack, we would not be able to maintain such
|
||||
a program! We welcome them with gratitude!
|
||||
|
||||
**About BrowserStack**
|
||||
|
||||
<em>BrowserStack is the world’s leading software testing platform powering over two million tests every
|
||||
day across 19 global data centers. BrowserStack helps Tesco, Shell, NVIDIA, Discovery, Wells Fargo,
|
||||
and over 50,000 customers deliver quality software at speed by moving testing to their Cloud.
|
||||
BrowserStack’s platform provides instant access to 20,000+ real mobile devices on a highly reliable
|
||||
cloud infrastructure that effortlessly scales as testing needs grow. With BrowserStack, Dev and QA
|
||||
teams can move fast while delivering an amazing experience for every customer.</em>
|
||||
@@ -1,47 +0,0 @@
|
||||
---
|
||||
authors:
|
||||
- jlipps
|
||||
date: 2024-06-06
|
||||
---
|
||||
|
||||
# Announcing HeadSpin as Appium's Development Partner
|
||||
|
||||
Recently, we announced a new [sponsorship and contributor compensation program](https://appium.io/docs/en/latest/blog/2024/05/14/announcing-appiums-sponsorship-program/) for the Appium
|
||||
project. As part of this program, we felt it was important to have a place to recognize those
|
||||
companies who make an extremely valuable kind of contribution to the project: dedicated maintainer
|
||||
time. Appium only survives because of the tireless efforts of the core maintainers, and some of us
|
||||
are only able to do this work because it is donated on behalf of our day jobs. We're therefore very
|
||||
excited to announce our first Development Partner: <a
|
||||
href="https://www.headspin.io/solutions/appium-mobile-test-automation">HeadSpin</a>!
|
||||
|
||||
<!-- more -->
|
||||
|
||||
<div style="text-align:center;width:100%">
|
||||
<a href="https://www.headspin.io/solutions/appium-mobile-test-automation"><img
|
||||
src="/docs/en/latest/assets/images/sponsor-logo-headspin.png" style="width: 300px"/></a>
|
||||
</div>
|
||||
|
||||
HeadSpin is a real device performance and UX analysis cloud, with full support for Appium. When you
|
||||
run your Appium tests on HeadSpin, you get access to comprehensive performance reports about your
|
||||
app, including potential network, system resource, or user experience issues. HeadSpin supports
|
||||
a variety of complex testing modes, including hooking up your own devices to the cloud, injecting
|
||||
and receiving video and audio to/from devices, working with media (streaming) platforms, and more.
|
||||
|
||||
HeadSpin has been one of the Appium project's biggest supporters for a long time, and currently
|
||||
employs two of Appium's core maintainers, donating a significant portion of their time towards the
|
||||
development, maintenance, support, and leadership of open source Appium repos. HeadSpin has also
|
||||
worked hard towards Appium's vision of a robust Appium ecosystem, contributing several
|
||||
HeadSpin-maintained Appium drivers and plugins to the community:
|
||||
|
||||
- A [Roku TV driver](https://github.com/headspinio/appium-roku-driver)
|
||||
- A [Tizen TV driver](https://github.com/headspinio/appium-tizen-tv-driver/)
|
||||
- A [LG webOS TV driver](https://github.com/headspinio/appium-lg-webos-driver/)
|
||||
- A [Unity game automation plugin](https://github.com/headspinio/appium-altunity-plugin)
|
||||
|
||||
These are all free and open source Appium components that HeadSpin has donated to the community
|
||||
with the goal of fostering collaboration in these areas of media app automation.
|
||||
|
||||
Looking to the future, HeadSpin plans to continue supporting Appium in significant ways, both as
|
||||
a Development Partner and a significant contributor to the Appium ecosystem. The Appium project is
|
||||
deeply indebted to HeadSpin for all of its support, and is proud to take this moment to recognize
|
||||
HeadSpin as our first official Development Partner!
|
||||
@@ -1,34 +0,0 @@
|
||||
---
|
||||
authors:
|
||||
- sai
|
||||
- srini
|
||||
date: 2025-11-25
|
||||
---
|
||||
|
||||
# Announcing LambdaTest as Appium's Newest Development Partner
|
||||
|
||||
As part of our ongoing effort to recognize organizations that meaningfully support the Appium project through dedicated maintainer time, we are excited to welcome our newest Development Partner: LambdaTest!
|
||||
LambdaTest has long been an active participant in the automated testing ecosystem. Today, they are officially formalizing their commitment by investing people—dedicated engineers who will directly support Appium's development, maintenance, and ecosystem growth.
|
||||
This kind of hands-on contribution is crucial for ensuring Appium continues to evolve. We deeply value partners who empower their engineering teams to contribute code directly to open source rather than just sponsorship.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
<div style="text-align:center;width:100%"><a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-dark.png#only-dark" width="300" />
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-light.png#only-light" width="300" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
LambdaTest engineers are already contributing actively across several key Appium repositories. Their current focus includes:
|
||||
**appium-mcp** – Supporting Appium's implementation of the Model Context Protocol (MCP) to drive forward modern AI-assisted capabilities.
|
||||
**appium-remote-xpc** – Contributing to the native macOS/XPC-based remote execution layer, essential for iOS automation.
|
||||
**appium-tun-tap** – Assisting in the development and maintenance of network virtualization and tunneling components for advanced testing scenarios.
|
||||
|
||||
These contributions strengthen critical infrastructure within the Appium ecosystem and demonstrate LambdaTest's commitment to deep technical involvement in the project's evolution.
|
||||
About LambdaTest
|
||||
|
||||
LambdaTest’s platform already serves a massive community of Appium users. As a GenAI-powered Quality Engineering Platform, they provide a full-stack testing cloud with 10,000+ real mobile devices and 3,000+ browsers.
|
||||
Beyond standard infrastructure, they are pushing the boundaries of test execution with AI-native test management and next-generation agents like KaneAI. By supporting Appium alongside Selenium, Playwright, and other major frameworks, LambdaTest helps teams orchestrate intelligent automation at cloud scale.
|
||||
|
||||
LambdaTest will continue contributing people, code, and development expertise to strengthen Appium's core functionality. Their commitment represents a significant investment into the future of the framework, and we're thrilled to have them collaborating with us at this deeper level.
|
||||
The Appium project is proud to recognize LambdaTest as our newest official Development Partner. We can't wait to see what we'll build together!
|
||||
@@ -1,41 +0,0 @@
|
||||
---
|
||||
authors:
|
||||
- jlipps
|
||||
date: 2025-07-01
|
||||
---
|
||||
|
||||
# Announcing LambdaTest as Appium Strategic Partner
|
||||
|
||||
After recently celebrating the 1-year anniversary of our Sponsorship Program and Compensation
|
||||
Scheme,
|
||||
the Appium project is very excited to announce that <a
|
||||
href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">LambdaTest</a>
|
||||
is coming on board as one of our Strategic Partners!
|
||||
|
||||
<!-- more -->
|
||||
|
||||
<div style="text-align:center;width:100%"><a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-dark.png#only-dark" width="300" />
|
||||
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-light.png#only-light" width="300" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Having long been active in the Appium community and the automated testing industry, LambdaTest is
|
||||
now significantly stepping up their investment into these areas. With the decision to come on board
|
||||
as a Strategic Partner, LambdaTest will support the Appium project through financial contribution
|
||||
as well as contribution of code and project maintenance. Obviously, without the generous support of
|
||||
partners like LambdaTest, we would not be able to continue our contributor compensation scheme,
|
||||
which has seen the release of a substantial amount of funds to Appium maintainers and contributors
|
||||
over the last year. Thanks again to LambdaTest, and stay tuned for more collaboration updates
|
||||
throughout the year!
|
||||
|
||||
**About LambdaTest**
|
||||
|
||||
<em>LambdaTest is a GenAI-powered Quality Engineering Platform that empowers teams to test
|
||||
intelligently, smarter, and ship faster. Built for scale, it offers a full-stack testing cloud with
|
||||
10K+ real mobile devices and 3,000+ browsers. With AI-native test management, MCP servers, and
|
||||
agent-based automation, LambdaTest supports Selenium, Appium, Playwright, and all major frameworks.
|
||||
AI Agents like HyperExecute and KaneAI bring the power of AI and cloud into your software testing
|
||||
workflow, enabling seamless automation testing with 120+ integrations. LambdaTest Agents accelerate
|
||||
your testing throughout the entire SDLC, from test planning and authoring to automation,
|
||||
infrastructure, execution, RCA, and reporting.</em>
|
||||
@@ -1,36 +0,0 @@
|
||||
---
|
||||
authors:
|
||||
- jlipps
|
||||
date: 2024-06-10
|
||||
---
|
||||
|
||||
# Announcing Sauce Labs as Appium's Strategic Partner
|
||||
|
||||
The good news surrounding our new sponsorship and contributor compensation
|
||||
program
|
||||
just keeps coming! Effective immediately we are fortunate and excited to be able to welcome a new Strategic Partner to
|
||||
the Appium project: <a href="https://saucelabs.com/resources/blog/appium-strategic-partner">Sauce Labs</a>!
|
||||
|
||||
<!-- more -->
|
||||
|
||||
<div style="text-align:center;width:100%">
|
||||
<a href="https://saucelabs.com/resources/blog/appium-strategic-partner"><img src="/docs/en/latest/assets/images/sponsor-logo-sauce.png" style="width: 300px"/></a>
|
||||
</div>
|
||||
|
||||
Sauce Labs has a long history of support for the Appium project. In fact, Appium was initially
|
||||
incubated at Sauce Labs under the direction of [@jlipps](https://github.com/jlipps), in the early
|
||||
days of mobile automation. Sauce Labs always envisioned Appium as being a project for and by the
|
||||
community, and cemented this perspective in 2016 with the donation of Appium to the JS Foundation
|
||||
(now the [OpenJS Foundation](https://openjsf.org/)). To this day, developers associated with Sauce
|
||||
Labs continue to help maintain various parts of the Appium project.
|
||||
|
||||
Now, Sauce Labs is making a further commitment to support Appium financially as a way to enable
|
||||
our new contributor compensation program. We're very excited about this program as a vehicle for
|
||||
getting more people involved in Appium's development and maintenance. With the help of Strategic
|
||||
Partners like Sauce Labs, our project will be better able to meet the needs of our constantly
|
||||
growing userbase, and attract new developers (like you?) to build the Appium ecosystem together.
|
||||
Needless to say, we are extremely grateful for Sauce Labs's support!
|
||||
|
||||
**About Sauce Labs**
|
||||
|
||||
<em>Sauce Labs is the leader in continuous quality. Our Platform for Test helps organizations transform software testing from a chore to a competitive advantage. With decades of expertise and deep roots in the Selenium and Appium open source communities, high performing software teams use our platform to execute any testing workload across thousands of different devices, browsers, and operating systems—anywhere, any time, and at any scale. For more information, please visit [saucelabs.com](https://saucelabs.com).</em>
|
||||
@@ -1,48 +0,0 @@
|
||||
---
|
||||
authors:
|
||||
- jlipps
|
||||
date: 2024-05-14
|
||||
---
|
||||
|
||||
# Announcing Appium's Sponsorship Program
|
||||
|
||||
Over the last several months, the Appium team has been working on a sponsorship program that is
|
||||
designed to help give back to Appium's contributors as well as to recognize important partner
|
||||
individuals or companies in the industry. This program is now officially launching! Let's dive into
|
||||
some of the details.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
First of all, the details and fine print will always be available at Appium's Governance
|
||||
document, which outlines how the
|
||||
project is run, who makes project decisions, etc... This document will be kept up to date with the
|
||||
latest details of the program, so that's the place to bookmark for reference!
|
||||
|
||||
As of now, Appium has opened up sponsorship opportunities via our OpenCollective
|
||||
page. OpenCollective is a service which allows people to donate
|
||||
to open source groups. We've defined a number of giving tiers for donations, within a very wide
|
||||
range, and welcome any financial amount with gratitude! Based on the donation tier, sponsorship
|
||||
comes with a variety of benefits, including recognition at different places in the Appium repo,
|
||||
docs, and website. In addition to financial sponsorship, the project has decided to recognize
|
||||
significant donations of project leadership and maintenance efforts from companies who have
|
||||
invested heavily into Appium with their employees' time (we call these "Development Partners").
|
||||
|
||||
What will the project do with the funds raised through this sponsorship program? We aim to give it
|
||||
all back to the Appium community! With the details again available at our [Governance document](https://github.com/appium/appium/blob/master/GOVERNANCE.md),
|
||||
we have implemented a scheme very much inspired by our friends at [WebdriverIO](https://webdriver.io/blog/2024/02/15/new-contributor-stipend-program) (thanks WDIO
|
||||
friends!) There are three groups of contributors to Appium that this scheme supports: (1) project
|
||||
maintainers (those who devote consistent time to leading the project), (2) project contributors
|
||||
(anyone in the wider community that contributes code or documentation), and (3) upstream projects
|
||||
(other open source projects Appium relies heavily on to work well). Each month, the funds raised
|
||||
via sponsorship will be distributed in different amounts to each of these groups. So if you
|
||||
make a valuable contribution to Appium moving forward, you'll be eligible to get some cash as
|
||||
a thank-you! (You'll need to have your own OpenCollective account in good standing to receive
|
||||
funds).
|
||||
|
||||
We're very excited about this new program, and hope that it helps existing and new contributors to
|
||||
feel even better about donating their time to making Appium better. And of course, none of this
|
||||
would be possible without the amazing Partners and Sponsors we hope to attract! On that note, stay
|
||||
tuned over the next few weeks as we unveil some of our initial program launch Partners! And if you
|
||||
or your company would like to participate by supporting Appium financially, you are most welcome.
|
||||
Just head over to our OpenCollective page and choose the tier that reflects your desired
|
||||
contribution level.
|
||||
@@ -1,40 +0,0 @@
|
||||
---
|
||||
authors:
|
||||
- sai
|
||||
- srini
|
||||
- jlipps
|
||||
date: 2025-08-07
|
||||
---
|
||||
|
||||
# 🚀 Appium 3
|
||||
|
||||
Appium 3 is here — and while it's not as massive a leap as Appium 2, it introduces a few essential
|
||||
breaking changes that developers and QA engineers should be aware of.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
The main idea behind Appium 3 is to clear out old cruft so that Appium can be leaner moving
|
||||
forward, and rely on newer versions of software with better performance and security
|
||||
characteristics. We're also getting rid of legacy behaviors and protocols that we deprecated as
|
||||
part of Appium 2.
|
||||
|
||||
For you as a user, there's not much to worry about. The breaking changes are minimal:
|
||||
|
||||
- Node.js / NPM minimum version bump (to 20.19 / 10)
|
||||
- Removal of certain deprecated endpoints
|
||||
- Security feature flag prefix requirements (e.g. `adb_shell` to `uiautomator2:adb_shell`)
|
||||
|
||||
In terms of new features, we've been adding them incrementally rather than saving them up for
|
||||
Appium 3. But with this release we are excited to share these new capabilities:
|
||||
|
||||
- `appium plugin install inspector` (Use Appium to host the Inspector rather than downloading it as a separate app)
|
||||
- Clients can set the `X-Appium-Is-Sensitive` HTTP header on requests to direct the server to mask the data in the request in the logs, so that when you send a password into an input box, the password's actual value is not logged in plaintext. ([Learn more](../../developing/sensitive.md))
|
||||
|
||||
Of course, we have a full [Appium 3 migration guide](../../guides/migrating-2-to-3.md) to make sure
|
||||
you know all the details and can deeply understand the consequences of upgrading to Appium 3 in
|
||||
your environment.
|
||||
|
||||
---
|
||||
|
||||
**Ready to make the leap?** Appium 3 is a great step forward in creating more secure, maintainable,
|
||||
and W3C-compliant test automation pipelines. Happy testing!
|
||||
@@ -1,15 +0,0 @@
|
||||
---
|
||||
authors:
|
||||
- jlipps
|
||||
date: 2024-03-07
|
||||
---
|
||||
|
||||
# Hello World!
|
||||
|
||||
This is the first post in the Appium blog. There's not much to see here yet. We're creating this
|
||||
space so we can make announcements or post other news, or information about events, that don't
|
||||
really fit inside the documentation itself.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
Stay tuned for more!
|
||||
@@ -1,158 +0,0 @@
|
||||
---
|
||||
hide:
|
||||
- navigation
|
||||
|
||||
title: Contributing to Appium
|
||||
---
|
||||
|
||||
The Appium project would not exist without the many contributions of code, documentation,
|
||||
maintenance, and support from companies and volunteers. As such, we welcome contributions!
|
||||
|
||||
There are a lot of different ways to help the project - 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](https://github.com/appium/appium/blob/master/CONDUCT.md).
|
||||
|
||||
## Join the Discussion Forum
|
||||
|
||||
You don't need to know the internals of Appium to be able to contribute! If you have experience with
|
||||
using Appium and feel like sharing your knowledge with others, consider helping out users on the
|
||||
Appium forums at [discuss.appium.io](https://discuss.appium.io/). Hop on over and see if there are
|
||||
any questions that you can answer.
|
||||
|
||||
## Report Bugs or Feature Requests
|
||||
|
||||
If you've encountered a bug, or have a cool feature in mind that you think Appium should support,
|
||||
make sure to let us know at our [GitHub issue tracker](https://github.com/appium/appium/issues).
|
||||
Please use the appropriate issue form template when creating your issue.
|
||||
|
||||
## Triage Issues
|
||||
|
||||
In addition to creating issues, you can also help us investigate already reported issues. All you
|
||||
need is enough familiarity with Appium to try and reproduce bugs.
|
||||
|
||||
You can get started by checking our [GitHub issue tracker](https://github.com/appium/appium/issues)
|
||||
for issues with labels such as `Needs Triage` or `Needs Info`, and leaving relevant comments:
|
||||
|
||||
- If the issue is a duplicate, drop a link to the original issue
|
||||
- If the user has not provided enough information (such as Appium logs), ask them for more details
|
||||
- If you can reproduce the problem on your own environment, provide all the information that you think
|
||||
would help us track down the cause of the issue
|
||||
|
||||
For further information on triaging Appium issues (for any Appium project repository), please contact
|
||||
any member of the [Technical Committee](https://github.com/appium/appium/blob/master/GOVERNANCE.md#the-technical-committee).
|
||||
|
||||
## Contribute Code
|
||||
|
||||
We are always open to pull requests for improving the Appium code or documentation!
|
||||
|
||||
!!! info
|
||||
|
||||
Developer information may not be kept up to date as frequently as user-facing information, or
|
||||
it may be most relevant in its current form on the online repository, not in this published
|
||||
version. Make sure to check the repo or discuss with maintainers. We would be glad to help
|
||||
new contributors get started!
|
||||
|
||||
Start by cloning the repository (we recommend [forking](https://github.com/appium/appium/fork)
|
||||
it first):
|
||||
|
||||
```sh
|
||||
git clone https://github.com/appium/appium.git
|
||||
cd appium
|
||||
```
|
||||
|
||||
!!! info
|
||||
|
||||
If you are VS Code user, you can easily check out the project using [Runme](https://runme.dev/api/runme?repository=https%3A%2F%2Fgithub.com%2Fappium%2Fappium.git&fileToOpen=packages%2Fappium%2Fdocs%2Fen%2Fcontributing%2Findex.md).
|
||||
|
||||
Install dependencies:
|
||||
|
||||
```sh
|
||||
npm install
|
||||
```
|
||||
|
||||
From here on there are several things you can do.
|
||||
|
||||
Build the project:
|
||||
|
||||
```sh
|
||||
npm run build
|
||||
```
|
||||
|
||||
Build the project and watch for changes:
|
||||
|
||||
```sh
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Start the locally built Appium server:
|
||||
|
||||
```sh
|
||||
npm start
|
||||
```
|
||||
|
||||
Run various tests:
|
||||
|
||||
```sh
|
||||
npm run lint
|
||||
npm run test:unit
|
||||
npm run test:types
|
||||
npm run test:smoke
|
||||
npm run test:e2e
|
||||
npm run test:quick # unit and types
|
||||
npm run test:slow # everything
|
||||
```
|
||||
|
||||
You can also run tests for specific workspaces, e.g.:
|
||||
|
||||
```sh
|
||||
export APPIUM_WORKSPACE=@appium/base-driver
|
||||
npm run test:unit -w $APPIUM_WORKSPACE
|
||||
```
|
||||
|
||||
### Documentation
|
||||
|
||||
The documentation for this project is [available in the project repository itself](https://github.com/appium/appium/tree/master/packages/appium/docs).
|
||||
It is contained in Markdown files, which are built by our documentation system in the
|
||||
`@appium/docutils` module. This module is based on [MkDocs](https://www.mkdocs.org/) and therefore
|
||||
requires [Python](https://www.python.org/) to be installed on your system.
|
||||
|
||||
Install Python dependencies:
|
||||
|
||||
```sh
|
||||
npm run install-docs-deps
|
||||
```
|
||||
|
||||
After making your changes, you can run the documentation server in dev mode:
|
||||
|
||||
```sh
|
||||
npm run dev:docs
|
||||
```
|
||||
|
||||
You can then view the documentation at `http://127.0.0.1:8000/docs/en`.
|
||||
|
||||
## Translating Appium Documentation
|
||||
|
||||
The process of Appium documents localization into languages other than English is automated and is done via
|
||||
the [Crowdin Translations Management System](https://crowdin.com). Do not edit any translated documents
|
||||
directly in the GitHub Appium repository as they are going to be replaced with ones exported from Crowdin
|
||||
during an upcoming sync.
|
||||
|
||||
### Where To Start
|
||||
|
||||
If you would like to contribute to the translation of Appium documents into your language then simply join
|
||||
the translators group for the [Appium Documentation](https://crowdin.com/project/appium-documentation)
|
||||
Crowdin project, and start translating documents there. If you see that your language is missing from
|
||||
the list of available Crowdin languages then simply let us know by creating an
|
||||
[issue](https://github.com/appium/appium/issues).
|
||||
|
||||
### Source Language Updates
|
||||
|
||||
Changes in documents are synchronized to Crowdin automatically via the `Update Crowdin English Docs` GitHub action.
|
||||
This action is triggered automatically as soon as there are any changes under `packages/appium/docs/en/**.md`
|
||||
or `packages/appium/docs/mkdocs-en.yml`.
|
||||
|
||||
### Fetching Translated Documents
|
||||
|
||||
In order to fetch translated files from Crowdin to the GitHub repository it is necessary to trigger
|
||||
the `Sync Crowdin Docs Translations` action. This action should also automatically create a PR with
|
||||
corresponding translated resources included.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user