Compare commits

..
Author SHA1 Message Date
Jonathan Lipps 284da50353 chore: publish
- appium@3.0.0
 - @appium/base-driver@10.0.0
 - @appium/base-plugin@3.0.0
 - @appium/docutils@2.0.0
 - @appium/driver-test-support@1.0.0
 - @appium/eslint-config-appium-ts@2.0.0
 - @appium/execute-driver-plugin@5.0.0
 - @appium/fake-driver@6.0.0
 - @appium/fake-plugin@4.0.0
 - @appium/images-plugin@4.0.0
 - @appium/logger@2.0.0
 - @appium/opencv@4.0.0
 - @appium/plugin-test-support@1.0.0
 - @appium/relaxed-caps-plugin@2.0.0
 - @appium/schema@1.0.0
 - @appium/storage-plugin@1.0.0
 - @appium/strongbox@1.0.0
 - @appium/support@7.0.0
 - @appium/test-support@4.0.0
 - @appium/tsconfig@1.0.0
 - @appium/types@1.0.0
 - @appium/universal-xml-plugin@2.0.0
2025-08-18 11:28:40 -07:00
Jonathan Lipps 9678952f89 chore: remove rc tags in prep for appium 3 gm publish (#21491) 2025-08-18 11:25:38 -07:00
github-actions[bot]andmykola-mokhnach fd5ac8d7a2 docs(appium): Update documentation translations (#21488)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2025-08-17 10:52:53 +09:00
renovate[bot] 0761fd35c4 chore(support): update dependency teen_process to v3 (#21487)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-16 20:52:58 +09:00
07881ce897 docs: add Appium3 announcement blog (#21472)
* Added blog on appium3

Co-authored-by: SrinivasanTarget <srinivasan.sekar1990@gmail.com>

* fixup: make appium 3 blog more simple and generic

---------

Co-authored-by: Sai Krishna V <saikrishna321@yahoo.com>
Co-authored-by: SrinivasanTarget <srinivasan.sekar1990@gmail.com>
2025-08-16 20:12:45 +09:00
renovate[bot] 193dbeb750 chore(docutils): update dependency mkdocs-material to v9.6.17 (#21486)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-16 08:32:27 +00:00
renovate[bot] 2da283f599 chore(deps): update dependency @types/node to v22.17.2 (#21484)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-15 13:39:54 +00:00
Jonathan Lipps 157425ce6a chore: publish
- appium@3.0.0-rc.2
 - @appium/base-driver@10.0.0-rc.2
 - @appium/base-plugin@3.0.0-rc.2
 - @appium/docutils@2.0.0-rc.1
 - @appium/driver-test-support@1.0.0-rc.1
 - @appium/eslint-config-appium-ts@2.0.0-rc.1
 - @appium/execute-driver-plugin@5.0.0-rc.1
 - @appium/fake-driver@6.0.0-rc.1
 - @appium/fake-plugin@4.0.0-rc.1
 - @appium/images-plugin@4.0.0-rc.1
 - @appium/logger@2.0.0-rc.1
 - @appium/opencv@4.0.0-rc.1
 - @appium/plugin-test-support@1.0.0-rc.1
 - @appium/relaxed-caps-plugin@2.0.0-rc.1
 - @appium/schema@1.0.0-rc.1
 - @appium/storage-plugin@1.0.0-rc.1
 - @appium/strongbox@1.0.0-rc.1
 - @appium/support@7.0.0-rc.1
 - @appium/test-support@4.0.0-rc.1
 - @appium/tsconfig@1.0.0-rc.1
 - @appium/types@1.0.0-rc.1
 - @appium/universal-xml-plugin@2.0.0-rc.1
2025-08-15 07:01:26 +09:00
Edgars Eglītis f7f8e405db chore: bump all non-rc packages to rc (#21477)
* chore: bump all non-rc packages to rc

* chore: change peerDeps to 3.0.0-beta.0
2025-08-14 18:52:07 +03:00
renovate[bot] 321ab5a9d6 chore(workflows): update actions/checkout action to v5 (#21483)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-13 15:55:17 +03:00
renovate[bot] f1d44c2fb7 chore(deps): update dependency cpy-cli to v6 (#21482)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-13 12:02:10 +03:00
renovate[bot] 026ea0d058 chore(execute-driver-plugin): update dependency webdriverio to v9.19.1 (#21481)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-12 17:07:24 +00:00
renovate[bot] 8cb6778421 chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.39.1 (#21480)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-12 12:50:02 +00:00
renovate[bot] e1b61402c6 chore(execute-driver-plugin): update dependency webdriverio to v9.19.0 (#21478)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-11 08:28:11 +00:00
dependabot[bot] c06a62413f chore(deps): bump the npm_and_yarn group across 1 directory with 2 updates (#21475)
Bumps the npm_and_yarn group with 2 updates in the / directory: [tmp](https://github.com/raszi/node-tmp) and [inquirer](https://github.com/SBoudrias/Inquirer.js).


Updates `tmp` from 0.2.3 to 0.2.5
- [Changelog](https://github.com/raszi/node-tmp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/raszi/node-tmp/compare/v0.2.3...v0.2.5)

Updates `inquirer` from 8.2.6 to 8.2.7
- [Release notes](https://github.com/SBoudrias/Inquirer.js/releases)
- [Commits](https://github.com/SBoudrias/Inquirer.js/compare/inquirer@8.2.6...inquirer@8.2.7)

---
updated-dependencies:
- dependency-name: tmp
  dependency-version: 0.2.5
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: inquirer
  dependency-version: 8.2.7
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-09 21:20:44 +03:00
renovate[bot] bc4294ee7e chore(eslint-config-appium-ts): update eslint-related packages (#21474)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-09 13:31:23 +00:00
renovate[bot] 7220ad910c chore(deps): update dependency @types/node to v22.17.1 (#21473)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-09 08:32:40 +00:00
Kazuaki Matsuo 727c44130e chore(appium): do not send message for the close in BiDi (#21468) 2025-08-08 18:09:23 +09:00
renovate[bot] 4e8b944d19 chore(deps): update dependency typescript to v5.9.2 (#21452)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-06 13:15:30 +00:00
renovate[bot] f2989cb834 chore(deps): update dependency tsd to v0.33.0 (#21462)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-06 14:34:26 +03:00
Puja Jagani c410201baa fix(base-driver,types): For extension commands that use prefix "mobile", ensure logEvents() has the name of executed script (#21416)
* fix(appium): For extension commands that use prefix "mobile", ensure logEvents() has the name of executed script

Related to https://github.com/appium/java-client/issues/2219

* Fix linting

* Address comments

* Update method name

* Address comments

* Address comments

* Address comments

* Add check for accessing method

* Addressing comments
2025-08-06 18:46:26 +09:00
renovate[bot] 1943f5a2c4 chore(docutils): update dependency yaml to v2.8.1 (#21463)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-06 09:39:07 +00:00
renovate[bot] 3b11b102f4 chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.39.0 (#21459)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-05 09:53:42 +00:00
Kazuaki Matsuo 63f852b60c chore: change bidi log to debug level (#21458) 2025-08-05 15:47:32 +09:00
github-actions[bot]andmykola-mokhnach 7103126a1b docs(appium): Update documentation translations (#21455)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2025-08-03 18:49:55 +09:00
Mykola Mokhnach e54dc381b1 feat(support): Drop the usage of the obsolete "mv" package (#21454) 2025-08-02 16:23:34 +02:00
renovate[bot] df56c667e8 chore(deps): update dependency @types/node to v22.17.0 (#21451)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-31 16:47:09 +00:00
renovate[bot] 70f22a4b9f chore(eslint-config-appium-ts): update dependency @eslint/compat to v1.3.1 (#21447)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-27 13:47:07 +00:00
renovate[bot] a4ab7b17f8 chore(eslint-config-appium-ts): pin dependencies (#21445)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-27 12:57:14 +03:00
renovate[bot] b1bacec17a chore(docutils): update dependency mkdocs-material to v9.6.16 (#21446)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-27 08:56:09 +00:00
Edgars Eglītis e3f05cf961 fix(eslint-config-appium-ts): adjust dependency configuration (#21444) 2025-07-26 23:58:08 +03:00
renovate[bot] 00f0e7efe5 chore(deps): update dependency cross-env to v10 (#21443)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-26 14:50:20 +03:00
renovate[bot] 98ed92772e chore(deps): update eslint-related packages to v9.32.0 (#21442)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-26 08:48:24 +00:00
dependabot[bot] 947bb06283 chore(deps): bump axios in the npm_and_yarn group across 1 directory (#21440)
Bumps the npm_and_yarn group with 1 update in the / directory: [axios](https://github.com/axios/axios).


Updates `axios` from 1.8.4 to 1.11.0
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.8.4...v1.11.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.11.0
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-24 07:59:46 +02:00
renovate[bot] 73a248a728 chore(support): update dependency axios to v1.11.0 (#21439)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-24 08:44:03 +03:00
renovate[bot] 47af57475e chore(execute-driver-plugin): update dependency webdriverio to v9.18.4 (#21435)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-23 16:52:54 +00:00
renovate[bot] 39a726812e chore(deps): update dependency typescript-eslint to v8.38.0 (#21436)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-23 12:58:13 +00:00
dependabot[bot] c8ea786650 chore(deps): bump @eslint/plugin-kit (#21430)
Bumps the npm_and_yarn group with 1 update in the / directory: [@eslint/plugin-kit](https://github.com/eslint/rewrite/tree/HEAD/packages/plugin-kit).


Updates `@eslint/plugin-kit` from 0.3.1 to 0.3.3
- [Release notes](https://github.com/eslint/rewrite/releases)
- [Changelog](https://github.com/eslint/rewrite/blob/main/packages/plugin-kit/CHANGELOG.md)
- [Commits](https://github.com/eslint/rewrite/commits/plugin-kit-v0.3.3/packages/plugin-kit)

---
updated-dependencies:
- dependency-name: "@eslint/plugin-kit"
  dependency-version: 0.3.3
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-20 21:36:58 +03:00
renovate[bot] b61330d8a3 chore(deps): update dependency eslint-config-prettier to v10.1.8 (#21432)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 12:55:39 +00:00
renovate[bot] 6e067f550f chore(deps): update dependency @types/node to v22.16.5 (#21431)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 10:38:11 +00:00
renovate[bot] c0a27cf417 chore(base-driver): update dependency morgan to v1.10.1 (#21428)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-18 13:13:10 +00:00
renovate[bot] aa37e26f0f chore(execute-driver-plugin): update dependency webdriverio to v9.18.1 (#21425)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-18 02:51:43 +00:00
renovate[bot] 262efe3aa7 chore(support): update dependency form-data to v4.0.4 (#21424)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-17 12:59:45 +00:00
renovate[bot] a1d0ab40b4 chore(deps): update dependency typescript-eslint to v8.37.0 (#21422)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-15 20:13:25 +00:00
renovate[bot] 07e07ecfb1 chore(deps): update dependency @types/node to v22.16.4 (#21421)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-15 14:06:33 +00:00
renovate[bot] 21fe03ba66 chore(deps): update eslint-related packages to v9.31.0 (#21417)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-12 09:30:30 +00:00
renovate[bot] 851c2cced0 chore(deps): update dependency @types/node to v22.16.3 (#21415)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-11 11:43:46 +00:00
renovate[bot] dc969a50bc chore(support): update dependency sharp to v0.34.3 (#21414)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-10 19:12:53 +03:00
renovate[bot] 5297c44250 chore(execute-driver-plugin): update dependency webdriverio to v9.17.0 (#21412)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-09 22:34:51 +00:00
renovate[bot] bfbf4248d6 chore(driver-test-support): update dependency chai to v5.2.1 (#21411)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-09 17:36:48 +00:00
renovate[bot] 4f211c78c7 chore(deps): update dependency @types/node to v22.16.2 (#21410)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-09 11:48:40 +00:00
renovate[bot] ca43f32f8a chore(deps): update dependency typescript-eslint to v8.36.0 (#21409)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-08 18:01:55 +00:00
renovate[bot] d6eda41ac8 chore(docutils): update dependency mkdocs-material to v9.6.15 (#21407)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-03 11:41:27 +00:00
renovate[bot] b99e8a75e2 chore(deps): update eslint-related packages to v9.30.1 (#21405)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-02 22:47:12 +00:00
renovate[bot] 36cd5c14bd chore(deps): update definitelytyped (#21404)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-02 17:52:05 +00:00
github-actions[bot]andmykola-mokhnach 4cba106134 docs(appium): Update documentation translations (#21402)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2025-07-01 18:20:02 -07:00
Jonathan Lipps 6ea9306076 docs: add lambdatest as strategic partner (#21400) 2025-07-01 10:13:44 -07:00
renovate[bot] 6f264bfc61 chore(deps): update dependency typescript-eslint to v8.35.1 (#21401)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-01 12:33:59 +00:00
renovate[bot] 2baba52cbe chore(deps): update dependency lerna to v8.2.3 (#21397)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-30 13:47:42 +00:00
Edgars Eglītis 37e22c4f9c chore!: set minimum Node.js version to v20.19.0 (#21394) 2025-06-29 12:53:55 +03:00
renovate[bot] 182d356a8b chore(storage-plugin): update dependency ws to v8.18.3 (#21396)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-29 08:45:59 +00:00
Edgars Eglītis a75bb2ca9b chore(deps): bump brace-expansion to fix vulnerability (#21395) 2025-06-28 21:35:19 +03:00
renovate[bot] ab0453999b chore(deps): update dependency @types/node to v22.15.34 (#21393)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-28 14:06:33 +00:00
renovate[bot] cafb4d4241 chore(deps): update eslint-related packages to v9.30.0 (#21392)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-28 10:31:28 +00:00
dependabot[bot] 95c6c56d01 chore(deps-dev): bump pbkdf2 (#21379)
Bumps the npm_and_yarn group with 1 update in the / directory: [pbkdf2](https://github.com/crypto-browserify/pbkdf2).


Updates `pbkdf2` from 3.1.2 to 3.1.3
- [Changelog](https://github.com/browserify/pbkdf2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/crypto-browserify/pbkdf2/compare/v3.1.2...v3.1.3)

---
updated-dependencies:
- dependency-name: pbkdf2
  dependency-version: 3.1.3
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-27 16:47:07 +02:00
renovate[bot] 47121abd0d chore(deps): update dependency prettier to v3.6.2 (#21390)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-27 10:49:47 +00:00
Mykola Mokhnach 1859ea1c3e fix(appium): Add appium module symlink while installing extensions (#21389) 2025-06-27 08:15:50 +02:00
renovate[bot] 81a08f2ca3 chore(deps): update dependency prettier to v3.6.1 (#21387)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-26 17:05:17 +00:00
renovate[bot] d951ea293c chore(deps): update dependency eslint-import-resolver-typescript to v4.4.4 (#21386)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-26 10:59:09 +00:00
renovate[bot] 2f58714bc7 chore(deps): update definitelytyped (#21370)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-26 05:06:09 +00:00
renovate[bot] 89da93e6b6 chore(deps): update dependency mocha to v11.7.1 (#21383)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-25 12:28:25 +00:00
renovate[bot] 7b4b0dfd84 chore(execute-driver-plugin): update dependency webdriverio to v9.16.2 (#21382)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-24 15:50:09 +00:00
renovate[bot] ab6b166b29 chore(deps): update dependency typescript-eslint to v8.35.0 (#21381)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-24 10:35:05 +00:00
kkb912002 34eb1c25c7 fix: change cache logic (#21380) 2025-06-24 07:54:57 +02:00
renovate[bot] 931c13f673 chore(deps): update dependency prettier to v3.6.0 (#21376)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-23 14:28:25 +00:00
renovate[bot] 57a584972f chore(deps): update dependency eslint-plugin-import to v2.32.0 (#21375)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-21 12:24:51 +00:00
renovate[bot] b5b221d2c6 chore(deps): update dependency mocha to v11.7.0 (#21371)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-18 16:34:54 +00:00
renovate[bot] c22d1214a7 chore(tsconfig): update dependency @tsconfig/node14 to v14.1.4 (#21368)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-17 17:24:41 +00:00
renovate[bot] 1068f48f90 chore(deps): update dependency typescript-eslint to v8.34.1 (#21367)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-17 11:59:51 +00:00
renovate[bot] e6ac03a487 chore(deps): update dependency @types/node to v22.15.32 (#21365)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-16 16:07:40 +00:00
renovate[bot] c6bee04141 chore(support): update dependency axios to v1.10.0 (#21364)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-15 09:45:37 +00:00
Kazuaki Matsuo 2c94133390 fix: use v3 syntax for winston (#21363)
* fix: use v3 syntax for winston

* tweak

* remove unused new lines

* remove format

* remove name also

* another approach

* fix typo
2025-06-15 01:12:48 -07:00
renovate[bot] cd5479d466 chore(deps): update eslint-related packages to v9.29.0 (#21362)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-14 09:33:53 +00:00
renovate[bot] bfb5299636 chore(test-support): update dependency sinon to v21 (#21360)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-13 11:04:24 +03:00
renovate[bot] f8cd26b1dc chore(support): update dependency glob to v11.0.3 (#21359)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-13 10:45:26 +03:00
Noritaka Kobayashi 0d59bf81cf refactor: change if in else to else if (#21353) 2025-06-12 23:11:33 -07:00
renovate[bot] 88e3a3cbe2 chore(deps): update dependency typescript-eslint to v8.34.0 (#21356)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-11 23:30:20 +00:00
renovate[bot] f68dd4be5c chore(support): update dependency teen_process to v2.3.3 (#21355)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-11 17:13:47 +00:00
renovate[bot] 5e9e079c47 chore(base-driver): update dependency serve-favicon to v2.5.1 (#21354)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-11 11:48:04 +00:00
renovate[bot] 5bcfafaaf9 chore(deps): update dependency mocha to v11.6.0 (#21352)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-10 23:05:45 +00:00
renovate[bot] 38fb6cd5e7 chore(deps): update dependency @types/node to v22.15.31 (#21351)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-10 16:43:47 +00:00
Noritaka Kobayashi 414227be06 refactor: use an object spread instead of Object.assign (#21349) 2025-06-09 21:34:48 +02:00
renovate[bot] 0e53118d51 chore(universal-xml-plugin): update dependency fast-xml-parser to v5.2.5 (#21348)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-09 19:58:21 +03:00
github-actions[bot]andmykola-mokhnach 66080eded7 docs(appium): Update documentation translations (#21346)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2025-06-07 17:10:35 -07:00
Edgars Eglītis 73a1b1a050 chore(deps): fix old ws import (#21345) 2025-06-07 21:48:25 +03:00
Edgars Eglītis 700279e8a9 docs: add minor Appium 3-related adjustments & fix MkDocs warnings (#21344)
* docs: remove commands removed in Appium 3

* docs: adjust node/npm requirements in quickstart

* docs: fix mkdocs link warnings
2025-06-07 21:46:19 +03:00
renovate[bot] 8597f49fd9 chore(deps): update dependency eslint-import-resolver-typescript to v4.4.3 (#21342)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-07 17:56:21 +00:00
renovate[bot] ec4031e076 chore(docutils): update dependency yargs-parser to v22 (#21325)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-07 15:24:05 +03:00
renovate[bot] 0e1f18e18b chore(docutils): update dependency yargs to v18 (#21323)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-07 15:10:15 +03:00
renovate[bot] a8058fa143 chore(universal-xml-plugin): update dependency fast-xml-parser to v5.2.4 (#21343)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-07 14:40:29 +03:00
renovate[bot] eb9fefe1cf chore(deps): update dependency @types/express to v5.0.3 (#21341)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-07 10:40:03 +00:00
github-actions[bot]andmykola-mokhnach 0888972c4a docs(appium): Update documentation translations (#21340)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2025-06-06 19:27:14 -07:00
github-actions[bot]andmykola-mokhnach aadcd8e6c0 docs(appium): Update documentation translations (#21339)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2025-06-05 18:32:30 -07:00
github-actions[bot]andmykola-mokhnach 3a12a867e0 docs(appium): Update documentation translations (#21321)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2025-06-05 22:07:24 +02:00
renovate[bot] f2472e555b chore(support): update dependency form-data to v4.0.3 (#21338)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-05 21:57:38 +02:00
renovate[bot] a2f5b13ab5 chore(storage-plugin): update dependency ws to v8.18.2 (#21337)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-05 22:42:56 +03:00
Mykola Mokhnach 34dd304f7c chore(base-driver): Update body-parser (#21336) 2025-06-05 21:34:52 +02:00
renovate[bot] 6d03f9092b chore(deps): update dependency @types/node to v22.15.30 (#21335)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-05 22:31:34 +03:00
renovate[bot] f5e9d54944 chore(deps): update dependency npm-run-all2 to v8 (#21332)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-05 21:15:17 +02:00
dependabot[bot] 8a9e09ba28 chore(deps): bump ws in the npm_and_yarn group across 1 directory (#21334)
Bumps the npm_and_yarn group with 1 update in the / directory: [ws](https://github.com/websockets/ws).


Updates `ws` from 8.14.2 to 8.17.1
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.14.2...8.17.1)

---
updated-dependencies:
- dependency-name: ws
  dependency-version: 8.17.1
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-05 21:14:33 +02:00
renovate[bot] 7e7b4955c3 chore(deps): update dependency serve-static to v2 (#21333)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-05 22:06:59 +03:00
dependabot[bot] 81be3aef91 chore(deps): bump the npm_and_yarn group across 1 directory with 6 updates (#21324)
Bumps the npm_and_yarn group with 6 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [ws](https://github.com/websockets/ws) | `8.14.2` | `8.17.1` |
| [braces](https://github.com/micromatch/braces) | `3.0.2` | `3.0.3` |
| [elliptic](https://github.com/indutny/elliptic) | `6.5.4` | `6.6.1` |
| [micromatch](https://github.com/micromatch/micromatch) | `4.0.5` | `4.0.8` |
| [tar-fs](https://github.com/mafintosh/tar-fs) | `3.0.8` | `3.0.9` |
| [undici](https://github.com/nodejs/undici) | `6.21.0` | `6.21.3` |



Updates `ws` from 8.14.2 to 8.17.1
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.14.2...8.17.1)

Updates `braces` from 3.0.2 to 3.0.3
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

Updates `elliptic` from 6.5.4 to 6.6.1
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.4...v6.6.1)

Updates `micromatch` from 4.0.5 to 4.0.8
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.5...4.0.8)

Updates `tar-fs` from 3.0.8 to 3.0.9
- [Commits](https://github.com/mafintosh/tar-fs/compare/v3.0.8...v3.0.9)

Updates `undici` from 6.21.0 to 6.21.3
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v6.21.0...v6.21.3)

---
updated-dependencies:
- dependency-name: ws
  dependency-version: 8.17.1
  dependency-type: direct:production
  dependency-group: npm_and_yarn
- dependency-name: braces
  dependency-version: 3.0.3
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: elliptic
  dependency-version: 6.6.1
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: micromatch
  dependency-version: 4.0.8
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: tar-fs
  dependency-version: 3.0.9
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: undici
  dependency-version: 6.21.3
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-05 21:53:02 +03:00
renovate[bot] 0020de3843 chore(appium): update dependency @sidvind/better-ajv-errors to v4 (#21330)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-05 20:32:41 +03:00
renovate[bot] 1fb007b41d chore(storage-plugin): update dependency lru-cache to v11 (#21329)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-05 20:25:32 +03:00
renovate[bot] 4bfbebe4f8 chore(storage-plugin): update dependency rimraf to v6 (#21328)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-05 20:14:48 +03:00
renovate[bot] e80b017f23 chore(support): update dependency glob to v11 (#21327)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-05 20:06:09 +03:00
renovate[bot] 2656166cc9 chore(support): update dependency which to v5 (#21326)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-05 19:53:09 +03:00
renovate[bot] 166388603e chore(deps): update definitelytyped (#21317) 2025-06-04 21:27:21 +02:00
David Prevost aa5d794ff3 feat(base-driver): Use markSensitive to mask password input field value (#21118) 2025-06-04 21:26:50 +02:00
Mykola Mokhnach 282e3bc459 ci: Enable automatic sync of translated docs (#21315) 2025-06-04 20:24:11 +02:00
renovate[bot] 48bae93eb2 chore(base-driver): update dependency express to v5.1.0 (#21320)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-04 19:56:47 +02:00
Mykola Mokhnach dae86f540c ci: Remove obsolete localized documents (#21316) 2025-06-04 19:56:30 +02:00
renovate[bot] 8d2c3583a2 chore(support): update dependency shell-quote to v1.8.3 (#21319)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-04 16:43:39 +00:00
renovate[bot] 13f8932c22 chore(deps): update dependency typescript-eslint to v8.33.1 (#21318)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-04 06:55:12 +00:00
Jonathan Lipps 92680d9b4a chore: bump versions for appium 3 rc 2025-06-03 12:09:44 -07:00
Mykola Mokhnach 9c6a0b6e80 chore: Revert changes to security.md (#21312) 2025-06-03 20:28:17 +02:00
Mykola Mokhnach 2b6b8dd42a chore: Bump recent changes from master (#21311) 2025-06-03 20:11:29 +02:00
Mykola Mokhnach 3ef48f18f0 chore: Bump minimum node.js version (#21309) 2025-06-02 08:19:44 +02:00
Mykola Mokhnach 942bf73b37 chore: Bump latest changes from master (#21304) 2025-05-31 22:21:45 +02:00
Edgars Eglītis 7ba271546e chore: remove leftover getSessions code & update docs (#21266) 2025-05-19 10:19:40 +03:00
Mykola Mokhnach 1acf45fc8c chore(appium): Exclude engines from the list of package fields to sync (#21265) 2025-05-17 10:53:34 +02:00
Mykola Mokhnach 68543ef513 chore: Bump latest changes from master (#21264) 2025-05-15 07:37:23 +02:00
Jonathan Lipps dc5ef8d5f6 chore: bump versions for appium 3 beta.1 2025-05-12 10:21:57 -07:00
Mykola Mokhnach 748c7e0c6d fix(base-driver): Drop unknown method arguments (#21245) 2025-05-11 10:16:29 +02:00
Mykola Mokhnach 023cd43a58 feat(base-driver): Migrate protocol.js to typescript (#21241) 2025-05-10 19:43:44 +02:00
Edgars Eglītis a0666b725f chore(docutils): remove tsconfig-related code (#21242)
* chore(docutils): remove tsconfig validation

* chore(docutils): remove ts validation

* chore(docutils): remove npm validation

* chore(docutils): remove more unused validation code

* chore(docutils): remove obsolete validate CLI options

* chore(docutils): remove ts/tsconfig usage

* chore(docutils): remove unused var
2025-05-10 20:22:08 +03:00
Edgars Eglītis 60965aa4f5 docs: add session retrieval changes to migration guide (#21243) 2025-05-10 17:20:30 +03:00
Mykola Mokhnach c7a20d8d7d fix(base-driver): /timeouts API arguments (#21238) 2025-05-08 10:26:03 +02:00
Jonathan Lipps 9bb5f3f706 chore: bump beta versions of breaking change appium 3 packages 2025-04-28 11:34:54 -07:00
Edgars Eglītis e597372397 docs: update Appium 3 migration guide (#21226)
* docs: remove mentions of deprecated XCUITest replacements

* docs: remove mentions of deprecated Android replacements
2025-04-28 19:38:05 +03:00
b7b8840afe chore: add latest changes from master (#21227)
* chore(tsconfig): update dependency @tsconfig/node14 to v14.1.3 (#21065)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(workflows): update peter-evans/create-pull-request action to v7.0.8 (#21066)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency typescript-eslint to v8.26.0 (#21068)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update definitelytyped (#21067)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(docutils): update dependency typescript to v5.8.2 (#21057)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(docutils): update dependency mkdocs-git-revision-date-localized-plugin to v1.4.1 (#21071)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* feat(images-plugin): supports image elements included in actions. (#21055)

* chore(types): update dependency type-fest to v4.37.0 (#21073)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency finalhandler to v2 (#21074)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* test: Update tests of images plugin (#21078)

* test(images-plugin): Fix test host (#21079)

* chore(support): update dependency axios to v1.8.2 (#21080)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency eslint-config-prettier to v10.1.1 (#21081)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(fake-driver): accept 3.0.0-beta.0 as well (#21076)

* feat: Add storage plugin (#21075)

* chore(deps): update dependency @types/node to v22.13.10 (#21084)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* docs(base-driver): remove outdated READMEs (#21083)

* chore(deps): update eslint-related packages to v9.22.0 (#21085)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* feat(storage-plugin): Tune the files keeping behaviour (#21086)

* docs(appium): fix a broken character that caused incorrect rendering of mkdocs (#21090) (#21091)

* chore(storage-plugin): Simplify add to storage logic (#21092)

* chore(docutils): update dependency mkdocs-git-revision-date-localized-plugin to v1.4.4 (#21093)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* docs: add storage-plugin documentation (#21096)

* chore: fix typo

* chore: list storage-plugin as a known plugin

* docs: align storage-plugin docs with other plugins

* chore: address comments

* chore(deps): update eslint-related packages (#21097)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(base-driver): Fix proxy url generation (#21099)

* chore: publish

 - appium@2.17.0
 - @appium/base-driver@9.16.3
 - @appium/base-plugin@2.3.4
 - @appium/docutils@1.0.33
 - @appium/driver-test-support@0.7.7
 - @appium/execute-driver-plugin@4.0.3
 - @appium/fake-driver@5.7.2
 - @appium/fake-plugin@3.2.4
 - @appium/images-plugin@3.1.0
 - @appium/plugin-test-support@0.3.52
 - @appium/storage-plugin@0.1.0
 - @appium/support@6.0.7
 - @appium/test-support@3.1.7
 - @appium/tsconfig@0.3.5
 - @appium/types@0.25.2
 - @appium/universal-xml-plugin@1.0.31

* chore(deps): update dependency eslint-import-resolver-typescript to v3.8.5 (#21101)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(support): update dependency axios to v1.8.3 (#21102)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(execute-driver-plugin): update dependency webdriverio to v9.12.0 (#21072)

* chore(deps): update dependency eslint-import-resolver-typescript to v3.8.6 (#21103)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency eslint-import-resolver-typescript to v3.8.7 (#21107)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(docutils): update dependency mkdocs-material to v9.6.8 (#21108)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(universal-xml-plugin): update dependency fast-xml-parser to v5 (#21109)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency eslint-import-resolver-typescript to v3.9.0 (#21113)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(docutils): update dependency mkdocs-git-revision-date-localized-plugin to v1.4.5 (#21112)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency eslint-import-resolver-typescript to v3.9.1 (#21115)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(docutils): update dependency mkdocs-material to v9.6.9 (#21121)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(base-driver): Exclude proxied headers from the server response (#21120)

* chore: publish

 - appium@2.17.1
 - @appium/base-driver@9.16.4
 - @appium/base-plugin@2.3.5
 - @appium/docutils@1.0.34
 - @appium/driver-test-support@0.7.8
 - @appium/execute-driver-plugin@4.0.4
 - @appium/fake-plugin@3.2.5
 - @appium/images-plugin@3.1.1
 - @appium/storage-plugin@0.1.1
 - @appium/support@6.0.8
 - @appium/test-support@3.1.8
 - @appium/universal-xml-plugin@1.0.32

* docs: update zh contributing documentation (#21117)

* Translate Validation of Individual Arguments via AJV section

* Complete the translation of the config system file

* chore(docutils): update dependency consola to v3.4.2 (#21124)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency @types/express to v5.0.1 (#21126)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(support): update dependency axios to v1.8.4 (#21127)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(execute-driver-plugin): update dependency webdriverio to v9.12.1 (#21129)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency typescript-eslint to v8.27.0 (#21131)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(eslint-config-appium-ts): update dependency eslint-import-resolver-typescript to v4 (#21119)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(test-support): update dependency sinon to v19.0.4 (#21130)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency @types/node to v22.13.11 (#21135)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* feat: Add a possibility to mask sensitive log values depending on request headers (#21123)

* chore(deps): update eslint-related packages to v9.23.0 (#21138)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(types): update dependency type-fest to v4.38.0 (#21140)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update definitelytyped (#21139)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(test-support): update dependency sinon to v19.0.5 (#21141)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update eslint-related packages (#21142)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(test-support): update dependency sinon to v20 (#21143)

* chore(test-support): update dependency sinon to v20

* remove usingPromise

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Mykola Mokhnach <mokhnach@gmail.com>

* chore(deps): update dependency eslint-import-resolver-typescript to v4.2.5 (#21146)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update definitelytyped (#21147)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(storage-plugin): Use base driver import for W3C error response creation (#21153)

* chore(deps): update dependency eslint-import-resolver-typescript to v4.2.7 (#21155)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(execute-driver-plugin): update dependency webdriverio to v9.12.2 (#21151)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(docutils): update dependency yaml to v2.7.1 (#21158)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency eslint-import-resolver-typescript to v4.3.1 (#21159)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* feat(base-driver): Accept `x-request-id` as override to generated requestId in `handleLogContext` (#21154)

* chore(docutils): update dependency mkdocs-material to v9.6.10 (#21161)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency typescript-eslint to v8.29.0 (#21165)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update definitelytyped (#21164)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(docutils): update dependency mkdocs-material to v9.6.11 (#21167)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(types): update dependency type-fest to v4.39.0 (#21168)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(docutils): add & adjust various log messages (#21160)

* fix(docutils): add & adjust various log messages

* fix: use npm from support package for npm calls

* chore(deps): update dependency @types/node to v22.14.0 (#21172)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(types): update dependency type-fest to v4.39.1 (#21173)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(logger): Error stack logging (#21176)

* chore(execute-driver-plugin): update dependency webdriverio to v9.12.3 (#21177)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(universal-xml-plugin): update dependency fast-xml-parser to v5.2.0 (#21178)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(docutils): update dependency typescript to v5.8.3 (#21179)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(execute-driver-plugin): update dependency webdriverio to v9.12.4 (#21180)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update eslint-related packages to v9.24.0 (#21182)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(support): update dependency sharp to v0.34.0 (#21183)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* feat(docutils): add MkDocs Material codeblock & text format features (#21184)

* chore(docutils): reorder Markdown extensions alphabetically

* feat(docutils): add MkDocs Material codeblock features

* chore(docutils): explicitly add Markdown tables support

* feat(docutils): add MkDocs Material linked tabs

* feat(docutils): add MkDocs Material text format features

* feat(docutils): add MkDocs Material task list

* fix(ci): run on all Node LTS versions instead of only active (#21185)

* fix(ci): run on LTS versions instead of only active

* chore: address comments

* chore(deps): update dependency eslint-import-resolver-typescript to v4.3.2 (#21186)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency typescript-eslint to v8.29.1 (#21189)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(support): update dependency sharp to v0.34.1 (#21191)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency tsd to v0.32.0 (#21194)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency eslint-config-prettier to v10.1.2 (#21195)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency lerna to v8.2.2 (#21197)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency @types/node to v22.14.1 (#21199)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(execute-driver-plugin): update dependency webdriverio to v9.12.5 (#21200)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(base-driver): Mark IME commands and receive_async_response as deprecated (#21201)

* docs(appium): add NovaWindows driver to Appium other drivers list (#21202)

* chore(deps): update dependency typescript-eslint to v8.30.1 (#21206)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(types): update dependency type-fest to v4.40.0 (#21208)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(base-driver): Mark /session/:sessionId/network_connection deprecated (#21209)

* chore(execute-driver-plugin): update dependency webdriverio to v9.12.6 (#21210)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(docutils): update dependency mkdocs-material to v9.6.12 (#21211)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update eslint-related packages (#21214)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update eslint-related packages (#21216)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(execute-driver-plugin): update dependency webdriverio to v9.12.7 (#21218)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* docs: update Appium 2 migration guide (#21215)

* docs: rewrite Appium 2 migration guide

* docs: reorder breaking changes

* docs: identify changed endpoints

* docs: improve code example

* docs: address comments

* chore(universal-xml-plugin): update dependency fast-xml-parser to v5.2.1 (#21220)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* docs: remove SeleniumConf banner (#21221)

* docs(appium): address default timeout in newCommandTimeout (#21222)

* chore: publish

 - appium@2.18.0
 - @appium/base-driver@9.17.0
 - @appium/base-plugin@2.3.6
 - @appium/docutils@1.1.0
 - @appium/driver-test-support@0.7.9
 - @appium/eslint-config-appium-ts@1.0.4
 - @appium/execute-driver-plugin@4.0.5
 - @appium/fake-plugin@3.2.6
 - @appium/images-plugin@3.1.2
 - @appium/logger@1.7.0
 - @appium/opencv@3.0.9
 - @appium/plugin-test-support@0.3.53
 - @appium/storage-plugin@0.1.2
 - @appium/support@6.1.0
 - @appium/test-support@3.1.9
 - @appium/types@0.25.3
 - @appium/universal-xml-plugin@1.0.33

* chore(deps): update dependency @types/node to v22.15.2 (#21223)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(support): update dependency axios to v1.9.0 (#21225)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: kkb912002 <57607392+kkb912002@users.noreply.github.com>
Co-authored-by: Mykola Mokhnach <mokhnach@gmail.com>
Co-authored-by: Kazuaki Matsuo <fly.49.89.over@gmail.com>
Co-authored-by: Sakura Nene <blade1565@outlook.com>
Co-authored-by: Jonathan Lipps <jonathan.lipps@sony.com>
Co-authored-by: zhangxh075 <zhangxh075@163.com>
Co-authored-by: Regan Karlewicz <regan@karlewr.net>
Co-authored-by: Teodor Nikolov <teo8447@gmail.com>
2025-04-27 01:20:13 +03:00
Edgars Eglītis 9a823cea0c docs: update Appium 3 migration guide (#21212)
* docs: minor rewrites in Appium 3 guide

* docs: simplify execute method listings & add Appium icons

* docs: fix indentation

* docs: simplify W3C Actions listings

* docs: improve wording

* docs: add drivers that still support removed endpoints
2025-04-18 19:30:10 +03:00
Mykola Mokhnach 52ea7ae211 chore: Remove deprecated JWP timeout handlers (#21207) 2025-04-15 21:17:12 +02:00
Mykola Mokhnach 22e3d89736 chore: Remove more deprecated methods from base driver (#21204) 2025-04-15 18:34:23 +02:00
Mykola Mokhnach 80865c43bd chore: Remove various deprecated driver methods (#21198) 2025-04-14 20:53:51 +02:00
Mykola Mokhnach c11a1bcd4a chore: Bump recent changes from mainstream (#21196) 2025-04-11 11:08:14 +02:00
Edgars Eglītis d3a9d611e3 docs: add Appium 3 migration guide (#21174)
* docs: start Appium 3 migration guide

* docs: add most of the removed endpoints

* docs: add the remaining removed endpoints

* docs: reduce extra lines

* docs: add more endpoint options

* docs: use icons instead of footnotes

* docs: add remaining gesture actions

* docs: improve wording

* docs: add /keys replacement endpoint

* docs: add links to Selenium Actions

* docs: further improve wording

* docs: address comments

* docs: update endpoints without replacements
2025-04-06 20:04:46 +03:00
Mykola Mokhnach 661c5d0bd3 feat(base-driver): Remove dependency to validate.js (#21175) 2025-04-04 22:28:53 +02:00
Mykola Mokhnach d904726d56 feat(base-driver): Migrate errors to typescript (#21157) 2025-03-30 17:41:09 +02:00
Mykola Mokhnach c5d64bb961 chore: Bump latest changes from master (#21156) 2025-03-29 07:23:54 +01:00
Mykola Mokhnach 33073c0e5f chore(base-driver): Remove the legacy JWP-related stuff (#21150) 2025-03-29 07:01:17 +01:00
Edgars Eglītis 2cb3a31252 fix: adjust parameter for W3C element send keys endpoint (#21149)
* fix: adjust parameter for W3C element send keys endpoint

* fix: update hash
2025-03-27 21:23:27 +02:00
Mykola Mokhnach 4716f40226 feat(base-driver): Remove deprecated routes (#21134) 2025-03-24 08:07:12 +01:00
Mykola Mokhnach 7e5184564a chore: Remove obsolete dependencies (#21128) 2025-03-20 12:21:41 +01:00
Mykola Mokhnach 476b22f0eb Merge branch 'appium3' of https://github.com/mykola-mokhnach/appium into appium3
# Conflicts:
#	package-lock.json
#	packages/base-driver/package.json
2025-03-20 08:52:03 +01:00
Mykola Mokhnach 9402291f1c feat(base-driver): Make extension name prefix mandatory (#21110) 2025-03-16 16:19:14 +01:00
Kazuaki Matsuo fdb5c7fc4a feat(appium): add inspector in preset plugin (#21114)
* chore(appium): add inspector in preset plugin

* add inspector in the doc

* add link into index.md

* Update index.md

* Update plugins.md

* Update plugins.md

* Update constants.js
2025-03-15 21:12:19 -07:00
Mykola Mokhnach ad330eaacb chore: Merge recent changes from master (#21111) 2025-03-14 19:25:03 +01:00
Mykola Mokhnach 45c6c42e8f feat(base-driver): Drop the unzip logic from basedriver helpers (#21105) 2025-03-14 08:31:11 +01:00
Jonathan Lipps 16d16dd0f3 chore: create beta versions of breaking change appium 3 packages (#21070) 2025-03-11 15:33:54 -07:00
Mykola Mokhnach 949f26ef5a chore: Merge branch 'master' of https://github.com/appium/appium into appium3 2025-03-04 22:14:20 +01:00
Kazuaki Matsuo ed56b74c13 Merge branch 'master' into appium3 2024-12-27 23:15:42 -08:00
Jonathan Lipps 71641f1761 chore: configure monorepo for appium3 (#20790)
* chore(appium): configure lerna/appium to publish appium 3 beta

* chore(appium)!: bump required node engine to latest
2024-12-16 12:37:23 -08:00
Mykola Mokhnach e1e00ed97a fix(base-driver): Make it work with Express5 (#20789) 2024-12-06 19:38:08 +01:00
Mykola Mokhnach 57fb71cc7a Merge branch 'master' of https://github.com/mykola-mokhnach/appium into appium3 2024-11-29 18:36:52 +01:00
Mykola Mokhnach 3adb0ed435 feat(base-driver): Bump express to v5 2024-11-29 13:01:16 +01:00
282 changed files with 13043 additions and 10076 deletions
+4 -2
View File
@@ -3,6 +3,7 @@ on:
push:
branches:
- master
- appium3
# this list of paths could potentially impact the build
paths:
- '**/tsconfig*.json'
@@ -24,6 +25,7 @@ on:
pull_request:
branches:
- master
- appium3
paths:
- '**/tsconfig*.json'
- 'packages/base-driver/static/**/*'
@@ -77,7 +79,7 @@ jobs:
# - macos-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
@@ -95,7 +97,7 @@ jobs:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Install dependencies
uses: bahmutov/npm-install@v1
with:
+1 -1
View File
@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Cleanup
run: |
@@ -4,17 +4,15 @@ name: Sync Crowdin Docs Translations
on:
workflow_dispatch:
# TODO: Uncomment the scheduler as soon as we have existing translations
# imported to Crowdin
# schedule:
# - cron: 0 0 * * 0
schedule:
- cron: 0 0 * * *
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Use Node.js LTS
uses: actions/setup-node@v4
with:
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Use Node.js LTS
uses: actions/setup-node@v4
with:
+1 -1
View File
@@ -37,7 +37,7 @@ jobs:
name: Docs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Install dependencies (Node.js)
uses: bahmutov/npm-install@v1
with:
+1 -1
View File
@@ -13,7 +13,7 @@ jobs:
env:
FOSSA_API_KEY: ${{secrets.FOSSA_API_KEY}}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
ref: master
- name: Install dependencies
+1 -1
View File
@@ -17,7 +17,7 @@ jobs:
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- run: |
git config user.name github-actions
git config user.email github-actions@github.com
+1 -1
View File
@@ -23,7 +23,7 @@ jobs:
name: Check Renovate Configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Validate Renovate Config
uses: rinchsan/renovate-config-validator@v0.2.0
with:
+10
View File
@@ -204,6 +204,16 @@ 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
View File
@@ -14,7 +14,7 @@
"version": {
"conventionalCommits": true,
"createRelease": "github",
"allowBranch": "master"
"allowBranch": ["master", "appium3"]
}
},
"ignoreChanges": ["**/test/**", "**/*.md"],
+4905 -3399
View File
File diff suppressed because it is too large Load Diff
+31 -31
View File
@@ -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,engines",
"sync-pkgs:common-fields:logger": "sync-monorepo-packages --packages=\"packages/logger\" --fields=author,bugs,homepage,engines",
"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: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,26 +85,26 @@
},
"devDependencies": {
"@colors/colors": "1.6.0",
"@eslint/js": "9.28.0",
"@tsconfig/node14": "14.1.3",
"@eslint/js": "9.33.0",
"@tsconfig/node14": "14.1.4",
"@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.1",
"@types/chai": "5.2.2",
"@types/chai-as-promised": "8.0.2",
"@types/express": "5.0.1",
"@types/express": "5.0.3",
"@types/jsftp": "2.1.5",
"@types/json-schema": "7.0.15",
"@types/klaw": "3.0.6",
"@types/klaw": "3.0.7",
"@types/lockfile": "1.0.4",
"@types/lodash": "4.17.16",
"@types/lodash": "4.17.20",
"@types/method-override": "3.0.0",
"@types/mocha": "10.0.10",
"@types/mv": "2.1.4",
"@types/ncp": "2.0.8",
"@types/node": "22.15.2",
"@types/node": "22.17.2",
"@types/pluralize": "0.0.33",
"@types/semver": "7.7.0",
"@types/serve-favicon": "2.5.7",
@@ -121,45 +121,45 @@
"@types/xmldom": "0.1.34",
"@types/yargs": "17.0.33",
"asyncbox": "3.0.0",
"chai": "5.2.0",
"chai": "5.2.1",
"chai-as-promised": "8.0.1",
"conventional-changelog-conventionalcommits": "7.0.2",
"cpy-cli": "5.0.0",
"cross-env": "7.0.3",
"eslint": "9.28.0",
"eslint-config-prettier": "10.1.5",
"eslint-import-resolver-typescript": "4.4.2",
"eslint-plugin-import": "2.31.0",
"cpy-cli": "6.0.0",
"cross-env": "10.0.0",
"eslint": "9.33.0",
"eslint-config-prettier": "10.1.8",
"eslint-import-resolver-typescript": "4.4.4",
"eslint-plugin-import": "2.32.0",
"eslint-plugin-mocha": "10.5.0",
"eslint-plugin-promise": "7.2.1",
"finalhandler": "2.1.0",
"get-port": "5.1.1",
"json-schema-to-typescript": "15.0.4",
"lerna": "8.2.2",
"lerna": "8.2.3",
"log-symbols": "4.1.0",
"midnight-smoker": "8.0.0",
"mjpeg-consumer": "2.0.0",
"mjpeg-server": "0.3.1",
"mocha": "11.5.0",
"npm-run-all2": "6.2.6",
"prettier": "3.5.3",
"mocha": "11.7.1",
"npm-run-all2": "8.0.4",
"prettier": "3.6.2",
"rewiremock": "3.14.6",
"rimraf": "5.0.10",
"serve-static": "1.16.2",
"sinon": "20.0.0",
"rimraf": "6.0.1",
"serve-static": "2.2.0",
"sinon": "21.0.0",
"sync-monorepo-packages": "1.0.2",
"teen_process": "3.0.0",
"ts-node": "10.9.2",
"tsd": "0.32.0",
"typescript": "5.8.3",
"typescript-eslint": "8.33.0",
"validate.js": "0.13.1",
"webdriverio": "9.15.0",
"ws": "8.18.2",
"tsd": "0.33.0",
"typescript": "5.9.2",
"typescript-eslint": "8.39.1",
"webdriverio": "9.19.1",
"ws": "8.18.3",
"yaml-js": "0.3.1"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
"npm": ">=8"
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
"npm": ">=10"
},
"publishConfig": {
"access": "public"
+36
View File
@@ -3,6 +3,42 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.0.0](https://github.com/appium/appium/compare/appium@3.0.0-rc.2...appium@3.0.0) (2025-08-18)
**Note:** Version bump only for package appium
## [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)
+10
View File
@@ -204,6 +204,16 @@ 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/).
@@ -0,0 +1,42 @@
---
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>
@@ -0,0 +1,40 @@
---
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!
+14 -84
View File
@@ -233,28 +233,6 @@ 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.
@@ -293,22 +271,6 @@ 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
@@ -337,9 +299,9 @@ Get the current page/app source as HTML/XML
The UI hierarchy in a platform-appropriate format (e.g., HTML for a web page)
### `getSessions`
### `getAppiumSessions`
`GET` **`/sessions`**
`GET` **`/appium/sessions`**
Get data for all sessions running on an Appium server
@@ -347,17 +309,27 @@ Get data for all sessions running on an Appium server
#### 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:
A list of session data objects, where each object contains 3 keys:
* `id`: the session ID
* `created`: the session creation time as a Unix timestamp in milliseconds
* `capabilities`: the session capabilities
Data is only returned if the `session_discovery` [insecure feature](../guides/security.md)
is enabled on the server.
#### Example
```json
[
{
"id":"ba30c6da-c266-4734-8ddb-c16f5bb53e16",
"created": 1736092760555,
"capabilities":{ "platformName":"ios","browserName":"safari","automationName":"xcuitest","platformVersion":"17.2","deviceName":"iPhone 15" }
},
{
"id":"1441110c-1ece-4e45-abbf-ebf404f45f0a",
"created": 1736092760555,
"capabilities":{ "platformName":"ios","browserName":"safari","automationName":"xcuitest","platformVersion":"17.0","deviceName":"iPhone 14" }
},
...
@@ -500,30 +472,6 @@ Set the various timeouts associated with a session
``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`**
@@ -542,21 +490,3 @@ Add a custom-named event to the Appium event log
#### 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``
@@ -20,6 +20,7 @@ The command listings can be found here:
* [Base Driver](./base-driver.md)
* [Execute Driver Plugin](./execute-driver-plugin.md)
* [Images Plugin](./images-plugin.md)
* [Inspector](https://github.com/appium/appium-inspector/tree/main/plugins)
* [Relaxed Caps Plugin](./relaxed-caps-plugin.md)
* [Storage Plugin](./storage-plugin.md)
* [Universal XML Plugin](./universal-xml-plugin.md)
@@ -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-commands)). Curious what command names there
implemented](./build-drivers.md#implement-webdriver-classic-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.
@@ -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-finalization), the `Map` is populated with `ArgSpec` objects
When a schema is [finalized](#schema-loading), 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
@@ -22,6 +22,7 @@ These plugins are are currently maintained by the Appium team:
|---|---|---|
|[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|
|[Inspector](https://github.com/appium/appium-inspector/tree/main/plugins)|`inspector`|Integrate the [Appium Inspector](https://github.com/appium/appium-inspector) directly into your Appium server installation, providing a web-based interface for inspecting and interacting with your application under test.|
|[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|
@@ -67,12 +67,7 @@ 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 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.
name to the Appium server using the [Log Custom Event API](../commands/base-driver.md#logcustomevent),
and the server will store the timestamp. The [Get Log Events](../commands/base-driver.md#getlogevents)
command can be used to retrieve named events' timestamps later on.
@@ -0,0 +1,463 @@
---
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`, 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
+24 -32
View File
@@ -27,9 +27,20 @@ Appium when starting it from the command line:
|<div style="width:10em">Parameter</div>|Description|
|---------------------------------------|-----------|
|`--relaxed-security`|Turns on _all_ insecure features (unless blocked by `--deny-insecure`; see below)|
|`--allow-insecure`|Turns on _only_ specified features. Features can be provided as a comma-separated list of feature names, or in the [Appium Configuration file](./config.md). For example, `--allow-insecure=adb_shell` will cause _only_ the ADB shell execution feature to be enabled. Has no effect when used in combination with `--relaxed-security`.|
|`--deny-insecure`|Explicitly turns _off_ specified features, overriding `--relaxed-security` and any features specified using `--allow-insecure`. Like `--allow-insecure`, features can be provided as a comma-separated list of feature names, or in the [Appium Configuration file](./config.md).|
|`--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.
## Insecure Features
@@ -44,7 +55,8 @@ might use. Here is an incomplete list of examples from some of Appium's official
|`record_audio`|Allow recording of host machine audio inputs|XCUITest|
|`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:
Some insecure features operate on the server level, and do not require a driver session. Enabling
these features requires using the wildcard prefix:
|<div style="width:12em">Feature Name</div>|Description|
|------------|-----------|
@@ -52,46 +64,26 @@ Some insecure features operate on the server level, and do not require a driver
## Examples
To turn on the `get_server_logs` feature, the Appium server could be started like this:
Turn on the `foo` feature only for the `first` driver:
```bash
appium --allow-insecure=get_server_logs
appium --allow-insecure=first:foo
```
To turn on multiple features:
Turn on the `foo` feature for all drivers:
```bash
appium --allow-insecure=get_server_logs,record_audio
appium --allow-insecure=*:foo
```
To allow all features except one:
Turn on the `foo` feature for all drivers _except_ `first`:
```bash
appium --relaxed-security --deny-insecure=adb_shell
appium --allow-insecure=*:foo --deny-insecure=first:foo
```
## Driver-scope security
Turn on all features _except_ `foo` for all drivers:
Since Appium server version `2.13`, it is possible to apply features on a per-driver basis. This
can be achieved by prefixing each feature name with the `automationName` of the driver for which
the feature should be applied. To apply a feature for all drivers, or to apply a server-level
feature, the wildcard (`*`) prefix should be used.
For example, the server could be started as follows:
```bash
appium --allow-insecure=uiautomator2:adb_shell,xcuitest:get_server_logs,*:record_audio
appium --relaxed-security --deny-insecure=*:foo
```
This would result in the following:
* The `adb_shell` feature would be enabled only for the UiAutomator2 driver
* The `get_server_logs` feature would be enabled only for the XCUITest driver
* The `record_audio` feature would be enabled for all drivers
Feature provided without an explicit prefix are equivalent to having the wildcard prefix.
These prefix rules apply to both the `--allow-insecure` and `--deny-insecure` server arguments.
!!! warning
Starting from Appium 3, the scope prefix is required, and features provided without a scope will
raise an error. Note that the behavior of the `--relaxed-security` flag remains unchanged.
+6
View File
@@ -33,6 +33,12 @@ 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>
@@ -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 `^14.17.0 || ^16.13.0 || >=18.0.0`
* [Node.js](https://nodejs.org) version in the [SemVer](https://semver.org) range `^20.19.0 || ^22.12.0 || >=24.0.0`
* LTS is recommended
* [`npm`](https://npmjs.com) version `>=8` (`npm` is usually bundled with Node.js, but can be upgraded
* [`npm`](https://npmjs.com) version `>=10` (`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
+5
View File
@@ -33,6 +33,11 @@ contributors!
<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" />
</a>
## Gold Sponsors
<div class="sponsor-section">
@@ -36,7 +36,7 @@ Don't miss this chance to contribute to the Appium community and showcase your e
## How to Submit Your Proposal
Visit our website at [https://appiumconf.com/](https://appiumconf.com/) and Submit a Proposal. We're excited to see your innovative ideas and experiences with Appium!
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
@@ -0,0 +1,41 @@
---
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>
@@ -0,0 +1,40 @@
---
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
View File
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Server Command-Line Arguments
---
+1
View File
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Server Environment Variables
---
+1
View File
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Command-Line Overview
---
+1
View File
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Setup Command-Line Usage
---
+14 -92
View File
@@ -234,30 +234,6 @@ 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.
@@ -296,24 +272,6 @@ 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
@@ -342,9 +300,9 @@ Get the current page/app source as HTML/XML
The UI hierarchy in a platform-appropriate format (e.g., HTML for a web page)
### `getSessions`
### `getAppiumSessions`
`GET` **`/sessions`**
`GET` **`/appium/sessions`**
Get data for all sessions running on an Appium server
@@ -352,17 +310,27 @@ Get data for all sessions running on an Appium server
#### 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:
A list of session data objects, where each object contains 3 keys:
- `id`: the session ID
- `created`: the session creation time as a Unix timestamp in milliseconds
- `capabilities`: the session capabilities
Data is only returned if the `session_discovery` [insecure feature](../guides/security.md)
is enabled on the server.
#### Example
```json
[
{
"id":"ba30c6da-c266-4734-8ddb-c16f5bb53e16",
"created": 1736092760555,
"capabilities":{ "platformName":"ios","browserName":"safari","automationName":"xcuitest","platformVersion":"17.2","deviceName":"iPhone 15" }
},
{
"id":"1441110c-1ece-4e45-abbf-ebf404f45f0a",
"created": 1736092760555,
"capabilities":{ "platformName":"ios","browserName":"safari","automationName":"xcuitest","platformVersion":"17.0","deviceName":"iPhone 14" }
},
...
@@ -514,32 +482,6 @@ Set the various timeouts associated with a session
`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`**
@@ -558,23 +500,3 @@ Add a custom-named event to the Appium event log
#### 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`
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Intro to Commands
---
@@ -21,6 +22,7 @@ The command listings can be found here:
- [Base Driver](./base-driver.md)
- [Execute Driver Plugin](./execute-driver-plugin.md)
- [Images Plugin](./images-plugin.md)
- [Inspector](https://github.com/appium/appium-inspector/tree/main/plugins)
- [Relaxed Caps Plugin](./relaxed-caps-plugin.md)
- [Storage Plugin](./storage-plugin.md)
- [Universal XML Plugin](./universal-xml-plugin.md)
+1
View File
@@ -1,6 +1,7 @@
---
hide:
- navigation
title: Contributing to Appium
---
@@ -21,13 +21,13 @@ The interface defines the following methods and properties:
- `diagnose(): Promise<DoctorCheckResult>`: Contains the code to diagnose a possible issue
- `fix(): Promise<string|null>`: Either fixes the actual problem if `hasAutofix()` returns true or
returns a string description for possible manual fixes. If this method throws an exception named
`FixSkippedError` and `hasAutofix()` returns true then the result of the method invocation
is going to be ignored.
returns a string description for possible manual fixes. If this method throws an exception named
`FixSkippedError` and `hasAutofix()` returns true then the result of the method invocation
is going to be ignored.
- `hasAutofix(): boolean`: Whether calling `fix()` would resolve the found issue
- `isOptional(): boolean`: Whether the found issue can be ignored and is not a showstopper
- `log: AppiumLogger`: May be used for logging. This property may be assigned
by the instance itself or by the Appium server if it is left unassigned.
by the instance itself or by the Appium server if it is left unassigned.
The `DoctorCheckResult` object returned by the `diagnose()` method must contain the following properties:
@@ -209,7 +209,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 stricly
the `appiumCliTransformer` keyword on an `array`-or-`object`-typed property is not strictly
necessary.
```
@@ -261,7 +261,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-finalization), the `Map` is populated with `ArgSpec` objects
When a schema is [finalized](#schema-loading), 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
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Intro to Development
---
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Masking Sensitive Log Data
---
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Appium Clients
---
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Appium Drivers
---
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Ecosystem Overview
---
+9 -7
View File
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Appium Plugins
---
@@ -18,13 +19,14 @@ appium plugin install <installation key>
These plugins are are currently maintained by the Appium team:
| <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 |
| <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 |
| [Inspector](https://github.com/appium/appium-inspector/tree/main/plugins) | `inspector` | Integrate the [Appium Inspector](https://github.com/appium/appium-inspector) directly into your Appium server installation, providing a web-based interface for inspecting and interacting with your application under test. |
| [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 |
### Other Plugins
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Appium-Related Tools
---
+37 -62
View File
@@ -2,89 +2,65 @@
title: Session Capabilities
---
"Capabilities" is the name given to the set of parameters used to start an Appium session. The
information in the set describes what sort of "capabilities" you want your session to have, for
example, a certain mobile operating system or a certain version of a device. Capabilities are
represented as key-value pairs, with values allowed to be any valid JSON type, including
other objects.
「Capabilities」は、Appiumセッションを開始するために使用されるパラメータセットに付けられた名前です。 セット内の情報は、セッションにどのような「Capabilities」を持たせたいかを表します。たとえば、特定のモバイルオペレーティングシステムや特定のデバイスバージョンなどです。 Capabilities はキーと値のペアとして表され、値には他のオブジェクトを含む任意の有効な JSON 型を使用できます。
The W3C WebDriver spec's [section on Capabilities](https://w3c.github.io/webdriver/#capabilities)
identifies a small set of 10 standard capabilities, including the following:
W3C WebDriver 仕様の [Capabilities に関するセクション](https://w3c.github.io/webdriver/#capabilities) では、以下の機能を含む 10 個の標準機能のセットが定義されています:
| Capability Name | Type | Description |
| ---------------- | -------- | ---------------------------------------------- |
| `browserName` | `string` | The name of the browser to launch and automate |
| `browserVersion` | `string` | The specific version of the browser |
| `platformName` | `string` | The type of platform hosting the browser |
| Capability 名 | 型 | 説明 |
| ---------------- | -------- | --------------------- |
| `browserName` | `string` | 起動して自動化するブラウザの名前 |
| `browserVersion` | `string` | ブラウザのバージョン |
| `platformName` | `string` | ブラウザをホストするプラットフォームの種類 |
## Common Appium Capabilities
## 一般的なAppiumのCapabilities
Appium understands these browser-focused capabilities, but introduces a number of additional
capabilities. According to the WebDriver spec, any
non-standard "extension capabilities" must include a namespace prefix (signifying the vendor
introducing the capability), ending in a `:`. Appium's vendor prefix is
`appium:`, and so any Appium-specific capabilities must include this prefix. Depending on which
client you are using, the prefix may be added automatically or in conjunction with certain
interfaces, but it is always a good practice to explicitly include it for clarity.
Appium はこれらのブラウザに焦点を当てた capabilities を理解しますが、いくつかの capabilities も追加導入しています。 WebDriver 仕様によれば、非標準の「拡張 capabilities」には、capabilities を導入したベンダーを示す名前空間となる接頭辞(末尾に「:」)を含める必要があります。 Appium の接頭辞は「appium:」であるため、Appium 固有の capabilities には必ずこの接頭辞を含める必要があります。 使用しているクライアントによっては接頭辞が自動的に追加される場合もあれば、特定のインターフェースと組み合わせて追加される場合もありますが、明確にするために明示的に追加することをお勧めします。
Here is a list of all the globally-recognized Appium capabilities:
以下は様々なドライバーで認識される Appium の capabilities の一覧です:
!!! info
```
Individual drivers and plugins can support other capabilities, so refer to their documentation
for lists of specific capability names. Some drivers may also not support all of these capabilities
個々のドライバやプラグインは独自の capabilities をサポートしている場合があるため、具体的な capability 名のリストについては、それぞれのドキュメントを参照してください。また、一部のドライバはこれらの capabilities をすべてサポートしていない場合があります
```
| <div style="width:12em">Capability</div> | Type | Required? | Description |
| ---------------------------------------- | --------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `platformName` | `string` | yes | The type of platform hosting the app or browser |
| `appium:automationName` | `string` | yes | The name of the Appium driver to use |
| `browserName` | `string` | no | The name of the browser to launch and automate, if the driver supports web browsers as a special case |
| `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: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`) |
| `appium:printPageSourceOnFindFailure` | `boolean` | no | If true, collect the page source and print it to the Appium log whenever a request to find an element fails (default `false`) |
| <div style="width:12em">Capability 名</div> | 型 | 必須か | 説明 |
| ------------------------------------------ | --------- | --- | ------------------------------------------------------------------------------------------------------------------------- |
| `platformName` | `string` | はい | アプリまたはブラウザをホストするプラットフォームの種類 |
| `appium:automationName` | `string` | はい | 使用するAppiumドライバの名前 |
| `browserName` | `string` | いいえ | ドライバーが特別なケースとしてWebブラウザーをサポートしている場合、起動して自動化するブラウザーの名前 |
| `appium:app` | `string` | いいえ | インストール可能なアプリケーションへのパス |
| `appium:deviceName` | `string` | いいえ | 自動化する特定のデバイスの名前、例:`iPhone 14`(現在のところ、iOS シミュレーターを指定する場合にのみ役立ちます。他の状況では通常、`appium:udid` 機能を使用して特定のデバイス Id を使用することをお勧めします)。 |
| `appium:platformVersion` | `string` | いいえ | プラットフォームのバージョン(例:iOS の場合は `16.0`) |
| `appium:newCommandTimeout` | `number` | いいえ | クライアントがこれ以上コマンドを送信してこないと判断しセッションを終了する前に、Appium サーバーがクライアントからのコマンド送信を待機する秒数。 デフォルトは `60` 秒。 ゼロに設定するとタイマーが無効になります。 |
| `appium:noReset` | `boolean` | いいえ | true の場合、セッションの開始とクリーンアップ中に通常のリセット処理を回避するように Appium ドライバーに指示します (デフォルトは `false`) |
| `appium:fullReset` | `boolean` | いいえ | true の場合、Appium ドライバーに通常のリセット処理に追加の手順を追加して、環境の再現性を最大限に高めるように指示します (デフォルトは `false`) |
| `appium:eventTimings` | `boolean` | いいえ | true の場合、Appium ドライバーに [Event Timings](./event-timing.md) を収集するように指示します (デフォルトは `false`) |
| `appium:printPageSourceOnFindFailure` | `boolean` | いいえ | true の場合、要素の検索リクエストが失敗するたびにページソースを収集し、Appium ログに出力します (デフォルトは `false`) |
Some drivers place more complex constraints on capabilities as a group. For example, while the
`appium:app` and `browserName` capabilities are listed above as optional, if you want to launch
a session with a specific app, the XCUITest driver requires that at least one of `appium:app`,
`browserName`, or `appium:bundleId` are included in the capabilities (otherwise it will not know
what app to install and/or launch and will simply open a session on the home screen). Each driver
will document how it interprets these capabilities and any other platform-specific requirements.
ドライバーの中には、capabilitiesのより複雑な制約をグループとして設定しているものもあります。 たとえば、`appium:app` および `browserName` capabilities は上記では必須ではないと記載していますが、特定のアプリでセッションを開始する場合、XCUITest ドライバーは、`appium:app`、`browserName`、または `appium:bundleId` の少なくとも1 つが capabilities に含まれていることが必要です (含まれていない場合、どのアプリをインストールまたは起動すればよいか判断できないため、ホーム画面からセッションが開かれます)。 各ドライバーは、これらの capabilities やその他のプラットフォーム固有の要件をどのように解釈するかを記述しています。
!!! note
```
Capabilities are like parameters used when starting a session. After the capabilities are sent
and the session is started, they cannot be changed. If a driver supports updating aspects of
its behaviour in the course of a session, it will provide a [Setting](./settings.md) for this
purpose instead of, or in addition to, a capability.
Capabilitiesは、セッション開始時に使用されるパラメータのようなものです。Capabilitiesが送信され、セッションが開始された後変更できません。ドライバーがセッション中に動作の一部を更新する場合、capabilitiesの代わりに、またはcapabilitiesに加えて、[Settings](./settings.md)も利用可能です。
```
Each Appium client has its own way of constructing capabilities and starting a session. For
examples of doing this in each client library, head to the [Ecosystem](../ecosystem/index.md) page
and click through to the appropriate client documentation.
各 Appium クライアントには、capabilities を構築し、セッションを開始する独自の方法があります。 各クライアントライブラリでこれを行う例については、[エコシステム](../ecosystem/index.md) ページにアクセスし、適切なクライアントドキュメントをクリックしてください。
## BiDi Protocol Support
## BiDi プロトコルのサポート
Appium supports [WebDriver BiDi](https://w3c.github.io/webdriver-bidi/) protocol since base–driver 9.5.0.
The actual behavior depends on individual drivers while the Appium and the baseーdriver support the protocol.
Please make sure if a driver supports the protocol and what kind of commands/events it supports in the documentation.
Appiumは、base-driver 9.5.0以降で[WebDriver BiDi](https://w3c.github.io/webdriver-bidi/)プロトコルをサポートしています。
実際の動作は個々のドライバーによって異なりますが、Appium と base-driver はプロトコルをサポートしています。
ドライバーが BiDi プロトコルをサポートしているかどうか、また、どのようなコマンド/イベントをサポートしているかはドキュメントで確認してください。
| Capability Name | Type | Description |
| --------------- | --------- | ------------------------------------------------------- |
| `webSocketUrl` | `boolean` | To enable BiDi protocol in the session. |
| Capability 名 | 型 | 説明 |
| -------------- | --------- | ------------------------- |
| `webSocketUrl` | `boolean` | セッションで BiDi プロトコルを有効にします。 |
## Using `appium:options` to Group Capabilities
## `appium:options` を使用して機能をグループ化する
If you use a lot of `appium:` capabilities in your tests, it can get a little repetitive. You can
combine all capabilities as an object value of a single `appium:options` capability instead, in
which case you don't need to use prefixes on the capabilities inside the object. For example:
テストで `appium:` 機能を多用すると、繰り返しが多くなる可能性があります。 代わりに、すべての機能を単一の `appium:options` 機能のオブジェクト値として組み合わせることもできます。その場合、オブジェクト内の機能にプレフィックスを使用する必要はありません。 例:
```json
{
@@ -99,8 +75,7 @@ which case you don't need to use prefixes on the capabilities inside the object.
}
```
Note that constructing a capability value which is itself an object differs by language; refer to
your client documentation for further examples on how to achieve this.
機能値自体がオブジェクトである場合の構築方法は言語によって異なることに注意してください。これを実現する方法の詳細な例については、クライアントのドキュメントを参照してください。
!!! warning
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Managing Contexts
---
+4 -10
View File
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Retrieving Event Timings
---
@@ -68,14 +69,7 @@ In the past, events were available as a part of `GET /session/:id` response
## 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 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.
name to the Appium server using the [Log Custom Event API](../commands/base-driver.md#logcustomevent),
and the server will store the timestamp. The [Get Log Events](../commands/base-driver.md#getlogevents)
command can be used to retrieve named events' timestamps later on.
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Execute Methods
---
@@ -0,0 +1,457 @@
---
title: Appium 3 へ移行する
---
<style>
.md-typeset .grid {
grid-template-columns: repeat(auto-fit,minmax(min(100%,11rem),1fr));
}
</style>
このドキュメントは既にAppium 2 を利用している人がAppium 3 に移行するための手引きです。
破壊的変更と、それらを処理するためのヒントが含まれています。
Appium 2 はAppiumアーキテクチャ全体の大きな見直しをしました。 Appium 3 は限られた破壊的変更のみの比較的小さな更新であり、移行プロセスがはるかに簡易になります。
## 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
```
\## 破壊的変更
### 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`, 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
+26 -37
View File
@@ -25,11 +25,22 @@ this is the responsibility of the server admin who configures and launches the A
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 (unless blocked by `--deny-insecure`; see below) |
| `--allow-insecure` | Turns on _only_ specified features. Features can be provided as a comma-separated list of feature names, or in the [Appium Configuration file](./config.md). For example, `--allow-insecure=adb_shell` will cause _only_ the ADB shell execution feature to be enabled. Has no effect when used in combination with `--relaxed-security`. |
| `--deny-insecure` | Explicitly turns _off_ specified features, overriding `--relaxed-security` and any features specified using `--allow-insecure`. Like `--allow-insecure`, features can be provided as a comma-separated list of feature names, or in the [Appium Configuration file](./config.md). |
| <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.
## Insecure Features
@@ -44,7 +55,8 @@ might use. Here is an incomplete list of examples from some of Appium's official
| `record_audio` | Allow recording of host machine audio inputs | XCUITest |
| `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:
Some insecure features operate on the server level, and do not require a driver session. Enabling
these features requires using the wildcard prefix:
| <div style="width:12em">Feature Name</div> | Description |
| ------------------------------------------ | ------------------------------------------------------------------------------- |
@@ -52,49 +64,26 @@ Some insecure features operate on the server level, and do not require a driver
## Examples
To turn on the `get_server_logs` feature, the Appium server could be started like this:
Turn on the `foo` feature only for the `first` driver:
```bash
appium --allow-insecure=get_server_logs
appium --allow-insecure=first:foo
```
To turn on multiple features:
Turn on the `foo` feature for all drivers:
```bash
appium --allow-insecure=get_server_logs,record_audio
appium --allow-insecure=*:foo
```
To allow all features except one:
Turn on the `foo` feature for all drivers _except_ `first`:
```bash
appium --relaxed-security --deny-insecure=adb_shell
appium --allow-insecure=*:foo --deny-insecure=first:foo
```
## Driver-scope security
Since Appium server version `2.13`, it is possible to apply features on a per-driver basis. This
can be achieved by prefixing each feature name with the `automationName` of the driver for which
the feature should be applied. To apply a feature for all drivers, or to apply a server-level
feature, the wildcard (`*`) prefix should be used.
For example, the server could be started as follows:
Turn on all features _except_ `foo` for all drivers:
```bash
appium --allow-insecure=uiautomator2:adb_shell,xcuitest:get_server_logs,*:record_audio
```
This would result in the following:
- The `adb_shell` feature would be enabled only for the UiAutomator2 driver
- The `get_server_logs` feature would be enabled only for the XCUITest driver
- The `record_audio` feature would be enabled for all drivers
Feature provided without an explicit prefix are equivalent to having the wildcard prefix.
These prefix rules apply to both the `--allow-insecure` and `--deny-insecure` server arguments.
!!! warning
```
Starting from Appium 3, the scope prefix is required, and features provided without a scope will
raise an error. Note that the behavior of the `--relaxed-security` flag remains unchanged.
appium --relaxed-security --deny-insecure=*:foo
```
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Session Settings
---
+1
View File
@@ -1,6 +1,7 @@
---
hide:
- toc
title: SSL/TLS/SPDY Support
---
+8 -1
View File
@@ -2,6 +2,7 @@
hide:
- navigation
- toc
title: ようこそ
---
@@ -28,6 +29,12 @@ Appiumのドキュメントにようこそ! Appiumはオープンソースプ
<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>
@@ -35,7 +42,7 @@ Appiumのドキュメントにようこそ! Appiumはオープンソースプ
<div class="grid cards" markdown>
- [**Introduction**](./intro/index.md) を読んでして、主要なコンセプトを理解してください
- [**Introduction**](./intro/index.md) を読んで、主要なコンセプトを理解してください
- [**Quickstart**](./quickstart/index.md) を通して、基本的なAndroidテストを用意、実行します。
- 使用するドライバ、クライアント、プラグインの一覧については、 [**Ecosystem**](./ecosystem/index.md) ページを参照してください。
- コマンドラインからAppiumを使用する場合、[**CLI リファレンス**](./cli/index.md)を参照してください。
+1
View File
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Intro to Appium Clients
---
+1
View File
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Appium in a Nutshell
---
@@ -1,6 +1,7 @@
---
hide:
- toc
title: "クイックスタート: はじめに"
---
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Appiumをインストールする
---
@@ -1,22 +1,19 @@
---
hide:
- toc
title: Next Steps
title: 次のステップ
---
Now that you've successfully set up your system for Android automation and run a simple test,
you'll want to continue exploring this documentation. In particular, these are good guides and
reference materials especially for beginners:
Android自動化用のシステムの設定と簡単なテストの実行が完了したら、このドキュメントを引き続き参照してください。 特に初心者にとって、これらは優れたガイドと参考資料です:
- The [Ecosystem](../ecosystem/index.md) page: browse the available drivers, clients, plugins, and tools
- [Managing Appium Drivers and Plugins](../guides/managing-exts.md)
- [エコシステム](../ecosystem/index.md) ページ: 利用可能なドライバー、クライアント、プラグイン、ツールを見る
- [Appium ドライバーとプラグインの管理](../guides/managing-exts.md)
- [Capabilities](../guides/caps.md)
- [Settings](../guides/settings.md)
You'll also find that the [Appium Inspector](https://github.com/appium/appium-inspector) is an
indispensable tool for writing Appium tests, as it enables visual inspection of apps and
helps you to discover element locators for use in your test scripts.
また、[Appium Inspector](https://github.com/appium/appium-inspector) は、アプリの視覚的な検査を可能にし、テストスクリプトで使用する要素ロケーターを見つけるのに役立つ、Appium テストの作成に不可欠なツールです。
You might also take advantage of one of the many online Appium courses available to you.
また、多くのオンライン Appium コースもご活用いただけます。
Good luck and have fun!
頑張って楽しんでください!
@@ -1,15 +1,16 @@
---
hide:
- toc
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 `^14.17.0 || ^16.13.0 || >=18.0.0`
- [Node.js](https://nodejs.org) version in the [SemVer](https://semver.org) range `^20.19.0 || ^22.12.0 || >=24.0.0`
- LTS is recommended
- [`npm`](https://npmjs.com) version `>=8` (`npm` is usually bundled with Node.js, but can be upgraded
- [`npm`](https://npmjs.com) version `>=10` (`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
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Write a Test (.NET)
---
@@ -82,7 +83,7 @@ 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.
kind of thing you want to automate. Some of these parameters can be overridden using environment variables.
2. Starting an Appium session on the built-in Android settings app.
3. Finding the "Battery" list item and clicking it.
4. Ending the Appium session.
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Write a Test (Java)
---
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Write a Test (JS)
---
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Write a Test (Python)
---
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Write a Test (Ruby)
---
+1
View File
@@ -2,6 +2,7 @@
hide:
- navigation
- toc
title: Additional Resources
---
+13 -12
View File
@@ -2,6 +2,7 @@
hide:
- navigation
- toc
title: Sponsors & Backers
---
@@ -10,9 +11,7 @@ title: Sponsors & Backers
.sponsor-section img { height: 64px; padding-right: 1em; }
</style>
Appium is an Apache-2 licensed open source project whose development is made possible entirely by
donations of time and money by individuals and companies who benefit from our software and our
mission. If you'd like to join this amazing group and help ensure Appium's continued development
If you'd like to join this amazing group and help ensure Appium's continued development
and maintenance, you can contribute via Appium's OpenCollective
Hub.
@@ -23,21 +22,23 @@ maintenance as part of their employees' core job duties!
## Strategic Partners
We are very grateful for the financial and marketing support of our exclusive Strategic Partners,
who contribute a significant ongoing investment of funds to help the project attract and reward
contributors!
私たちは、プロジェクトが貢献者を惹きつけ、報いることができるよう、継続的に多大な資金を投資してくださっている戦略的パートナーの皆さまからの財政的およびマーケティング面での支援に、心より感謝しています!
<a href="https://www.browserstack.com/browserstack-appium?utm_campaigncode=701OW00000AoUTQYA3&utm_medium=partnered&utm_source=appium">
<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>
<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" />
</a>
## Gold Sponsors
<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>
<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>
[Become a Gold Sponsor](https://opencollective.com/appium/contribute/gold-sponsor-72877/checkout?interval=month&amount=500&contributeAs=me)
+1
View File
@@ -50,6 +50,7 @@ nav:
- commands/universal-xml-plugin.md
- Guides:
- Migration:
- guides/migrating-2-to-3.md
- guides/migrating-1-to-2.md
- Server/Driver Configuration:
- guides/managing-exts.md
+1
View File
@@ -50,6 +50,7 @@ nav:
- commands/universal-xml-plugin.md
- ガイド:
- 移行:
- guides/migrating-2-to-3.md
- guides/migrating-1-to-2.md
- サーバ/ドライバの設定:
- guides/managing-exts.md
+14 -10
View File
@@ -1,13 +1,13 @@
INHERIT: ./base-mkdocs.yml
site_url: https://appium.io/docs/zh
edit_uri: edit/master/packages/appium/docs/zh
site_description: The Appium automation project documentation
site_description: Appium自动化项目文档
docs_dir: zh
site_dir: site/docs/zh
theme:
language: zh
nav:
- 首页: index.md
- 欢迎使用: index.md
- 博客: blog/index.md
- 简介:
- intro/index.md
@@ -21,7 +21,7 @@ nav:
- quickstart/requirements.md
- quickstart/install.md
- quickstart/uiauto2-driver.md
- Write a Test:
- 写一个测试:
- quickstart/test-js.md
- quickstart/test-py.md
- quickstart/test-java.md
@@ -46,20 +46,23 @@ nav:
- commands/execute-driver-plugin.md
- commands/images-plugin.md
- commands/relaxed-caps-plugin.md
- commands/storage-plugin.md
- commands/universal-xml-plugin.md
- 指南:
- Migration:
- 迁移:
- guides/migrating-2-to-3.md
- guides/migrating-1-to-2.md
- Server/Driver Configuration:
- 服务器/驱动程序配置:
- guides/managing-exts.md
- guides/branch-testing.md
- guides/config.md
- guides/security.md
- guides/log-filters.md
- guides/headers.md
- guides/grid.md
- guides/caching.md
- guides/tls.md
- Session Configuration:
- 会话配置:
- guides/caps.md
- guides/settings.md
- guides/execute-methods.md
@@ -72,7 +75,8 @@ nav:
- developing/build-plugins.md
- developing/build-docs.md
- developing/build-doctor-checks.md
- 贡献:
- contributing/index.md
- contributing/develop.md
- contributing/config-system.md
- developing/sensitive.md
- 开发者参考:
- developing/config-system.md
- 贡献: contributing.md
- 赞助商: sponsors.md
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

@@ -4,4 +4,8 @@
<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" />
</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" />
</a>
</div>
+1 -1
View File
@@ -1,2 +1,2 @@
# 博客
# Appium 博客
@@ -10,13 +10,13 @@ date: 2024-07-13
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.
@@ -36,7 +36,7 @@ Don't miss this chance to contribute to the Appium community and showcase your e
## 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!
Visit our website at [https://appiumconf.com/](https://appiumconf.com/) and Submit a Proposal. We're excited to see your innovative ideas and experiences with Appium!
## Stay Tuned
@@ -6,9 +6,9 @@ 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
We have another exciting announcement for you! As part of our recently-announced sponsorship and
contributor compensation
program](https://appium.io/docs/en/latest/blog/2024/05/14/announcing-appiums-sponsorship-program/),
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>!
@@ -0,0 +1,41 @@
---
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>
@@ -6,8 +6,8 @@ date: 2024-06-10
# Announcing Sauce Labs as Appium's Strategic Partner
The good news surrounding our new [sponsorship and contributor compensation
program](https://appium.io/docs/en/latest/blog/2024/05/14/announcing-appiums-sponsorship-program/)
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>!
@@ -13,13 +13,13 @@ some of the details.
<!-- more -->
First of all, the details and fine print will always be available at Appium's [Governance
document](https://github.com/appium/appium/blob/master/GOVERNANCE.md), which outlines how the
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](https://opencollective.com/appium). OpenCollective is a service which allows people to donate
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,
@@ -0,0 +1,40 @@
---
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!
+60 -53
View File
@@ -1,63 +1,70 @@
---
hide:
- toc
title: 服务器命令行参数
title: Server Command-Line Arguments
---
要启动Appium服务器,您可以运行`appium`或`appium server`。`server`子命令是他的默认命令,因此如果省略它,Appium会将认为您想要运行Appium服务器。
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.
`appium`(或`appium server`)的调用可以接受多个参数,详细信息如下。
The invocation of `appium` (or `appium server`) can take a number of arguments, which are detailed
below.
!!! 注意
!!! note
如果您愿意,所有这些参数都可以通过[配置文件](../guides/config.md)设置。命令行上设置的任何参数都将覆盖配置文件中的参数。
|<div style="width:12em">参数</div>|描述|类型|<div style="width:8em">默认值</div>|别名|
|--|--|--|--|--|
|`--address`|要监听的IP地址|string|`0.0.0.0`|`-a`|
|`--allow-cors`|Appium服务器是否允许来自任何主机的web浏览器连接|boolean|`false`||
|`--allow-insecure`|设置允许在此服务器的会话中运行哪些不安全功能。功能是在驱动程序层定义的;有关更多详细信息,请参阅文档。请注意,通过`--deny-insecure`指定的功能即使在这里列出也将被禁用。如果值是字符串,则表示是包含策略或逗号分隔列表的文本文件的路径。|array<string>|`[]`||
|`--base-path`|用作服务器上运行的所有WebDriver路由的前置路径|string|`""`|`-pa`|
|`--callback-address`|回调IP地址(默认值:与`--address`相同)|string||`-ca`|
|`--callback-port`|回调端口(默认值:与`--port`相同)(值必须介于`1`和`65535`)|integer|`4723`|`-cp`|
|`--config`|[Appium JSON格式配置文件](../guides/config.md)的路径|string|||
|`--debug-log-spacing`|在日志中添加夸张的间距以便于进行查看。|boolean|`false`||
|`--default-capabilities`|设置默认的所需功能,将在每个会话上设置这些功能,除非被新的配置覆盖。如果值是字符串,则表示包含功能的JSON文件的路径,或原始JSON字符串。|object||`-dc`|
|`--deny-insecure`|设置禁止在此服务器的会话中运行的哪些不安全功能。功能是在驱动程序层定义的;有关更多详细信息,请参阅文档。即使在`--allow-insecure`中列出,并且启用了`--relaxed-securities`,此处列出的功能也会被禁用。如果值是字符串,则表示是包含策略或逗号分隔列表的文本文件的路径。|array<string>|`[]`||
|`--driver`|驱动程序特定配置。键名应与驱动程序包名称相对应|object|||
|`--drivers-import-chunk-size`|服务器启动时可以并行导入的最大驱动程序数量|number|`3`||
|`--keep-alive-timeout`|Appium服务器应该将所有请求的保持活跃超时(keep-alive timeout)和连接超时(connection timeout)都设置为多少秒。如果将其设置为0,则会禁用超时设置。|integer|`600`|`-ka`|
|`--local-timezone`|使用本地时区来记录时间戳|boolean|`false`||
|`--log`|同时将日志输出发送到文件|string||`-g`|
|`--log-filters`|一个或多个日志过滤规则|array|||
|`--log-level`|日志级别(console[:file]),值必须是以下之一:`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`|日志格式(值必须是以下之一:`text`, `json`, `pretty_json`)。如果日志以JSON格式打印,则会始终禁用文本着色。|string|`text`||
|`--log-no-colors`|不要在控制台输出中使用颜色|boolean|`false`||
|`--log-timestamp`|在控制台输出中显示时间戳|boolean|`false`||
|`--long-stacktrace`|在日志条目中添加长堆栈跟踪,建议仅用于调试|boolean|`false`||
|`--no-perms-check`|跳过服务器启动时的各种权限检查|boolean|`false`||
|`--nodeconfig`|将Appium注册为Selenium Grid 3节点的JSON配置文件的路径;否则配置本身|string|||
|`--plugin`|插件特定配置,键名应与插件包名称相对应|object|||
|`--plugins-import-chunk-size`|服务器启动时可以并行导入的插件的最大数量|number|`7`||
|`--port`|要监听的端口(值必须介于`1`和`65535`之间)|integer|`4723`|`-p`|
|`--relaxed-security`|禁用附加的安全检查,以便使用支持此选项的驱动程序提供的一些高级功能。只有当所有客户端都在受信任的网络中时才启用它,如果客户端有可能脱离会话沙盒,则不会启用它。可以使用`--deny-insecure`覆盖特定功能|boolean|`false`||
|`--session-override`|启用会话覆盖(覆盖现有会话)|boolean|`false`||
|`--ssl-cert-path`|如果使用TLS,则指向`.cert`文件的绝对路径。必须与`--ssl-key-path`一起使用。有关详细信息,请参阅[SSL/TLS/SPDY支持指南](../guides/tls.md)|string|||
|`--ssl-key-path`|如果使用TLS,则指向`.key`文件的绝对路径。必须与`--ssl-cert-path`一起使用。有关详细信息,请参阅[SSL/TLS/SPDY支持指南](../guides/tls.md)|string|||
|`--strict-caps`|如果发送了Appium认为对于选定设备无效的能力则使会话失败。|boolean|`false`||
|`--tmp`|Appium可用于管理临时文件的目录的绝对路径|string|Windows: `C:\Windows\Temp`<br>其他: `/tmp`||
|`--trace-dir`|Appium用于保存iOS Instruments跟踪数据的目录的绝对路径|string|`<tmp>/appium-instruments`||
|`--use-drivers`|要激活的驱动程序列表,默认情况下,所有已安装的驱动程序都将被激活|array<string>|`[]`||
|`--use-plugins`|要激活的插件列表,要激活所有插件,该值应该是一个包含单个项`"all"`的数组|array<string>|`[]`||
|`--webhook`|同时将日志输出发送到此http侦听器|string||`-G`|
```
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](../guides/security.md) are allowed to run in this server's sessions. Most features are defined on a driver level; see driver documentation for more details. Individual features can be overridden by `--deny-insecure`. Has no effect in combination with `--relaxed-security`. | 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](../guides/security.md) are not allowed to run in this server's sessions. Most features are defined on a driver level; see driver documentation for more details. 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` | 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` | 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` | 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` |
|<div style="width:10em">Argument</div>|Description|Alias|
|--|--|--|
|`--help`|打印使用Appium命令行的说明,此参数也可用于Appium子命令|`-h`|
|`--show-build-info`|打印Appium服务器版本的详细信息||
|`--show-config`|打印当前Appium服务器配置详细信息||
|`--show-debug-info`|打印当前环境的信息:操作系统、Node.js和Appium本身的详细信息||
|`--version`|打印Appium服务器版本|`-v`|
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` |
+17 -16
View File
@@ -1,22 +1,23 @@
---
hide:
- toc
title: 服务器环境变量
title: Server Environment Variables
---
配置Appium服务器的主要方式是通过[命令行参数](./args.md)。然而,一些更高级的功能是通过环境变量切换或配置的。
要设置环境变量,请参阅操作系统和终端的文档。这些是Appium服务器能够理解的环境变量:
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:
|变量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|描述|
|--------|-----------|
|`APPIUM_HOME`|默认情况下,Appium会在系统用户的主目录中创建一个名为`.appium`的目录。您可以使用此变量调整目录,详见[管理扩展](../guides/managing-exts.md)指南。|
|`APPIUM_TMP_DIR`|默认情况下,Appium的许多操作都使用随机临时目录。如果您希望使用特定目录,可以通过将绝对路径作为此变量的值来实现。该行为相当于使用`--tmp`CLI参数。|
|`APPIUM_PREFER_SYSTEM_UNZIP`|设置为0或false,以要求Appium不要使用系统中包含的unzip二进制文件来解压下载的应用程序或其他文件,而去使用基于JS的unzip库;这有助于解决一些系统中不存在或存在非标准的unzip命令的问题。请注意,如果使用系统库解压失败,无论如何都会尝试回退库,所以设置这个环境变量只是在你知道系统unzip会失败的情况下节省时间。|
|`APPIUM_HOST`|与`--address`CLI参数相同|
|`APPIUM_PORT`|与`--port`CLI参数相同|
|`APPIUM_RELOAD_EXTENSIONS`|设置为1可使Appium在创建新会话时重新加载扩展,这主要适用于[构建扩展](../developing/build-drivers.md)|
|`APPIUM_OMIT_PEER_DEPS`|将`--omit=peer`添加到Appium内部运行的所有NPM命令中,主要是内部特征。|
|`APPIUM_APPS_CACHE_MAX_AGE`|允许设置[缓存应用程序](../guides/caching.md)的最长使用时间(以分钟为单位),默认值为60*24(24小时);不要将其设置为低于单个会话启动持续时间的数字。|
|`APPIUM_APPS_CACHE_MAX_ITEMS`|允许设置[缓存应用程序](../guides/caching.md)的最大数量,默认值为`1024`;不要将其设置为低于每个进程所有并行会话中的应用程序数量。|
|`APPIUM_APPS_CACHE_IGNORE_URL_QUERY`|如果启用此选项,则应用程序URL中的“搜索”部分将被忽略;有关更多详细信息,请参阅相应的[内容](https://discuss.appium.io/t/regarding-app-caching-when-using-aws-s3-presigned-urls/42713);默认情况下禁用。|
| Variable&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 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. |
+120 -93
View File
@@ -1,50 +1,60 @@
---
title: 扩展命令行用法
title: Extension Command-Line Usage
---
Appium允许灵活安装和管理各种扩展,例如驱动程序(为Appium提供自动化给定平台的能力)和插件(可以增强或改变单个Appium命令的工作方式)。
要从概念上理解这些实体,请查看[引言](../intro/index.md)。
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).
驱动程序和插件的管理由Appium的扩展命令行处理。
Management of drivers and plugins is handled by Appium's Extension CLI (command-line interface).
!!! 注意
!!! note
这篇文档使用了占位符来指代各种选项。在参考文档中,任何时候你看到这些占位符,确保你用正确的实际内容替换它们。
|占位符|含义|
|--|--|
|`<ext-type>`|"Extension type",它应该是`driver`或`plugin`;所有的扩展命令行都可以与驱动程序或插件一起使用,因此您必须指定将使用哪种类型的扩展。|
|`<ext-name>`|"Extension name",这是对`appium <ext-type> list`的调用中找到的扩展名的简称;这与扩展的NPM包名不同,或者通常来说,与扩展的“安装规范”是有所区别的。|
|`<install-spec>`|"Install specification",这是指用于指示Appium应安装什么扩展的字符串。|
|`<install-source>`|这是指Appium安装扩展程序应该使用的方法。|
```
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. |
所有扩展命令行都以`appium <ext-type>`开头,即 `appium driver`或`appium plugin`。
## Commands
所有扩展命令行都可以接受一个可选的`--json`参数,这个参数会让命令的输出结果以机器可读的JSON字符串形式返回,而不是标准的、为人类阅读优化的、带颜色的输出。
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`
运行给定扩展的医生检查,以验证扩展的先决条件是否配置正确。请注意,并非所有的扩展都包含医生检查工具。
有关如何创建它们的更多详细信息,请参阅[构建检查工具](../developing/build-doctor-checks.md)教程。
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>`:必须为`driver`或`plugin`
- `<ext-name>`:您要运行医生检查的扩展名
- `<ext-type>`: must be `driver` or `plugin`
- `<ext-name>`: the name of the extension whose doctor checks you want to run
可选的参数:
Optional arguments:
- `--json`:以JSON格式返回结果
- `--json`: return the result in JSON format
示例(运行UiAutomator2驱动程序的医生检查):
Example (run doctor checks for the UiAutomator2 driver):
```
appium driver doctor uiautomator2
@@ -52,110 +62,124 @@ 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>`:必须为`driver`或`plugin`
- `<install-spec>`:这是您要安装的扩展的名称、位置或版本。其可能的值取决于`<install-source>`(见下文)。
- `<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`:告诉Appium如何定位您的扩展;查看下面的表格,了解可能的来源类型和相应的安装规范。
- `--package`:当`<install-source>`的值为`git`或`github`,`--package`参数是必须的. 它必须是扩展的Node.js包名称。缺少这些信息的话,Appium将无法定位到已安装的包。
- `--json`:以JSON格式返回结果
- `--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
|安装源类型|行为|
|--|--|
|None|如果不使用`--source`选项,Appium将执行默认操作。此时,Appium会检查`<install-spec>`并将其与执行`appium <ext-type> list`命令时列出的扩展名称进行匹配,也就是与官方认可的扩展名称进行匹配。如果匹配成功,Appium将通过NPM安装该扩展的最新版本。|
|`npm`|根据扩展的NPM包名来安装扩展。在这里,`<install-spec>`必须包含NPM包名以及任何附加的NPM安装修饰符,例如版本号(参见下文)。|
|`github`|通过`<org>/<repo>`格式的GitHub规范安装扩展|
|`git`|通过Git URL安装扩展(例如:`git+ssh://git-host.com/repo.git`)|
|`local`|通过本地路径安装扩展。这必须是驱动程序的Node.js包信息所在目录的路径。|
| 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安装 `<install-spec>`
#### NPM-based `<install-spec>`
当Appium通过NPM安装扩展(即当`--source`参数被省略或设置为`npm`时),`<install-spec>`可以非常复杂,并且可以包括`npm install`所允许的任何形式的信息:
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
- 安装最新的XCUITest驱动程序:
- Install the latest XCUITest driver:
```
appium driver install xcuitest
```
```
appium driver install xcuitest
```
- 安装4.11.1版本的XCUITest驱动程序:
- Install the XCUITest driver at version 4.11.1:
```
appium driver install xcuitest@4.11.1
```
```
appium driver install xcuitest@4.11.1
```
- 从NPM安装`beta`版本的`@appium/fake-driver`:
- Install the `beta` version of the `@appium/fake-driver` from NPM:
```
appium driver install --source=npm @appium/fake-driver@beta
```
```
appium driver install --source=npm @appium/fake-driver@beta
```
- 安装本地开发的插件:
- Install a locally-developed plugin:
```
appium plugin install --source=local /path/to/my/plugin
```
```
appium plugin install --source=local /path/to/my/plugin
```
### `list`
列出已安装和可用的扩展。可用扩展包括Appium团队正式认可的扩展,但您不仅限于安装此列表中显示的扩展。
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>`:必须为`driver`或`plugin`
- `<ext-type>`: must be `driver` or `plugin`
可选的参数:
Optional arguments:
- `--installed`:仅显示已安装的扩展程序,而不是已安装和可用的扩展程序
- `--updates`:对于通过NPM安装的扩展,如果有任何更新,则显示一条消息
- `--json`:以JSON格式返回结果
- `--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`
运行扩展包中包含的脚本。扩展作者可以包含可运行的脚本,以协助设置或执行其他任务。这些脚本由扩展作者命名(本指南中称为`<script-name>`),通常会在扩展文档中加以说明。
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>`:必须为`driver`或`plugin`
- `<ext-name>`:要运行脚本的扩展名
- `<script-name>`:扩展发布的脚本的名称
- `<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`:任何Appium无法识别为其自身参数集的参数,都将传递给扩展脚本
- `--json`:以JSON格式返回结果
- `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
示例(运行UiAutomator2驱动程序附带的`reset`脚本):
Example (run the `reset` script included with the UiAutomator2 driver):
```
appium driver run uiautomator2 reset
@@ -163,39 +187,42 @@ appium driver run uiautomator2 reset
### `update`
更新通过NPM安装的一个或多个扩展。默认情况下,Appium不会自动更新超过主要版本边界的任何扩展,以防止意外的破坏性更改。
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>`:必须为`driver`或`plugin`
- `<ext-name>`:要更新的扩展名或已安装的字符串(将更新所有已安装的扩展)
- `<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`:允许Appium更新到超越主要版本界限的版本
- `--json`:以JSON格式返回结果
- `--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>`:必须为`driver`或`plugin`
- `<ext-name>`:要卸载的扩展程序的名称
- `<ext-type>`: must be `driver` or `plugin`
- `<ext-name>`: the name of the extension to uninstall
可选的参数:
Optional arguments:
- `--json`:以JSON格式返回结果
- `--json`: return the result in JSON format
+16 -15
View File
@@ -1,24 +1,25 @@
---
hide:
- toc
title: 命令行概述
title: Command-Line Overview
---
Appium提供了一个命令行可执行文件(`appium`),这可能是您与Appium服务器交互的主要方式。这一部分的文档描述了如何使用此可执行文件。
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.
首先,您可以运行`appium -v`或`appium --version`返回已安装的版本信息,或运行`appium -h`或`appium --help`返回帮助信息。
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.
主命令`appium`可提供以下子命令:
The main `appium` executable provides the following subcommands:
1. `appium server` (或 `appium`) - 启动appium服务器
- [请查看此处了解可接受的参数](./args.md)
- 有关高级功能,[请查看此处了解支持的环境变量](./env-vars.md)
2. `appium driver` - 管理Appium驱动
- [详情请查看此处](./extensions.md)
3. `appium plugin` - 管理Appium插件
- [详情请查看此处](./extensions.md)
4. `appium setup` - 批量安装预设的驱动程序和插件
- [详情请查看此处](./setup.md)
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)
与主命令一样,您也可以使用`-h`或`--help`标志运行每个子命令以了解更多信息。
Like the main command, you can also run each subcommand with the `-h` or `--help` flag to learn more about it.
+23 -13
View File
@@ -1,23 +1,33 @@
---
hide:
- toc
title: 设置命令行用法
title: Setup Command-Line Usage
---
`setup`命令旨在简化Appium的初始设置过程。它允许一次性安装多个扩展(驱动程序/插件),而无需多次运行`appium <ext-name> install <ext-name>`。
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:
|预设|安装命令|包含的驱动|包含的插件|
|--|--|--|--|
|手机端应用程序|`appium setup mobile` or `appium setup`|`uiautomator2`, `xcuitest`[^1], `espresso`|`images`|
|桌面端应用程序|`appium setup desktop`|`mac2`[^1], `windows`[^2]|`images`|
|桌面端浏览器|`appium setup browser`|`safari`[^1], `gecko`, `chromium`|`images`|
| 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.
请参阅[生态系统](../ecosystem/index.md)文档,了解有关扩展的更多信息。
Refer to the [Ecosystem documentation](../ecosystem/index.md) to learn more about the extensions
listed above.
[^1]: 仅在主机运行macOS时才安装。
[^2]: 仅在主机运行Windows时才安装。
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.
+185 -218
View File
@@ -1,247 +1,252 @@
# 驱动: base-driver
# Driver: base-driver
### `createSession`
`POST` **`/session`**
从历史上看,前两个参数是专门用于JSONWP功能的,但是Appium2已经放弃了对这些参数的支持。
现在我们只接受W3C格式的功能对象,这种对象可以通过三个参数中的任意一个来传递。
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
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `desiredCapabilities?` | `W3CDriverCaps`<`C`\> | 新的会话功能 |
| `requiredCapabilities?` | `W3CDriverCaps`<`C`\> | 另一个可以发送新会话功能的地方(通常未定义) |
| `capabilities?` | `W3CDriverCaps`<`C`\> | 另一个可以发送新会话功能的地方(通常未定义) |
| 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`**
在给定定位策略和选择器的情况下查找UI元素,如果找不到则报错
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
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `string` | 定位策略 |
| `value` | `string` | 选择器与策略相结合,找到特定元素 |
| 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`\>
对元素id进行编码的元素对象,可用于元素相关命令
The element object encoding the element id which can be used in element-related
commands
### `findElementFromElement`
`POST` **`/session/:sessionId/element/:elementId/element`**
在给定定位策略和选择器的情况下查找UI元素,如果找不到则会报错,仅在给定元素的子元素中查找。
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
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `string` | 定位策略 |
| `value` | `string` | 选择器与策略相结合,找到特定元素 |
| 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`\>
对元素id进行编码的元素对象,可用于元素相关命令
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
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `string` | 定位策略 |
| `value` | `string` | 选择器与策略相结合,找到特定元素 |
| 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`**
查找与给定定位策略和选择器匹配的所有UI元素的列表
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
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `string` | 定位策略 |
| `value` | `string` | 选择器与策略相结合,找到特定元素 |
| 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`**
查找与给定定位策略和选择器匹配的所有UI元素的列表,仅在给定元素的子元素中查找。
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
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `string` | 定位策略 |
| `value` | `string` | 选择器与策略相结合,找到特定元素 |
| 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
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `string` | 定位策略 |
| `value` | `string` | 选择器与策略相结合,找到特定元素 |
| 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`\>[]
在阴影根内与选择器匹配的可能为空的元素列表。
### `getLog`
`POST` **`/session/:sessionId/log`**
获取给定日志类型的日志。
!!! warning "已弃用"
请使用`/session/:sessionId/se/log`代替
<!-- comment source: method-signature -->
#### 参数
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `type` | `string` | ILogCommands.supportedLogTypes中定义的日志类型的名称/密钥。 |
#### 响应
`any`
A possibly empty list of elements inside the shadow root matching the selector
### `getLog`
`POST` **`/session/:sessionId/se/log`**
获取给定日志类型的日志。
Get the log for a given log type.
<!-- comment source: method-signature -->
#### 参数
#### Parameters
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `type` | `string` | ILogCommands.supportedLogTypes中定义的日志类型的名称/密钥。 |
| Name | Type | Description |
| :----- | :------- | :------------------------------------------------------------------------------------------------- |
| `type` | `string` | Name/key of log type as defined in ILogCommands.supportedLogTypes. |
#### 响应
#### Response
`any`
@@ -249,47 +254,31 @@
`POST` **`/session/:sessionId/appium/events`**
获取当前会话中发生的事件列表。
Get a list of events that have occurred in the current session
<!-- comment source: method-signature -->
#### 参数
#### Parameters
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `type?` | `string` \| `string`[] | 通过包含一个或多个类型筛选返回的事件 |
| Name | Type | Description |
| :------ | :--------------------------------------------------------------------------- | :-------------------------------------------------------- |
| `type?` | `string` \\| `string`[] | filter the returned events by including one or more types |
#### 响应
#### Response
`EventHistory` \| `Record`<`string`, `number`\>
会话的事件历史记录。
### `getLogTypes`
`GET` **`/session/:sessionId/log/types`**
以字符串列表的形式获取可用日志类型。
!!! warning "已弃用"
请使用`/session/:sessionId/se/log/types`代替
<!-- comment source: method-signature -->
#### 响应
`string`[]
The event history for the session
### `getLogTypes`
`GET` **`/session/:sessionId/se/log/types`**
以字符串列表的形式获取可用日志类型。
Get available log types as a list of strings
<!-- comment source: method-signature -->
#### 响应
#### Response
`string`[]
@@ -297,40 +286,51 @@
`GET` **`/session/:sessionId/source`**
以HTML/XML格式获取当前页面/应用程序源代码。
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`
以适合平台的格式呈现的用户界面层次结构(例如,对于网页使用HTML)。
The UI hierarchy in a platform-appropriate format (e.g., HTML for a web page)
### `getSessions`
### `getAppiumSessions`
`GET` **`/sessions`**
`GET` **`/appium/sessions`**
获取Appium服务器上运行的所有会话的数据。
Get data for all sessions running on an Appium server
<!-- comment source: method-signature -->
#### 响应
#### Response
会话数据对象列表。每个会话数据对象都将返回`id`和会话的功能作为`capabilities`键,如下所示:
A list of session data objects, where each object contains 3 keys:
- `id`: the session ID
- `created`: the session creation time as a Unix timestamp in milliseconds
- `capabilities`: the session capabilities
Data is only returned if the `session_discovery` [insecure feature](../guides/security.md)
is enabled on the server.
#### Example
```json
[
{
"id":"ba30c6da-c266-4734-8ddb-c16f5bb53e16",
"created": 1736092760555,
"capabilities":{ "platformName":"ios","browserName":"safari","automationName":"xcuitest","platformVersion":"17.2","deviceName":"iPhone 15" }
},
{
"id":"1441110c-1ece-4e45-abbf-ebf404f45f0a",
"created": 1736092760555,
"capabilities":{ "platformName":"ios","browserName":"safari","automationName":"xcuitest","platformVersion":"17.0","deviceName":"iPhone 14" }
},
...
@@ -341,54 +341,56 @@
`GET` **`/session/:sessionId/appium/settings`**
使用新的设置对象更新会话的设置字典。
Update the session's settings dictionary with a new settings object
<!-- comment source: method-signature -->
#### 响应
#### Response
``null``
`null`
### `updateSettings`
`POST` **`/session/:sessionId/appium/settings`**
使用新的设置对象更新会话的设置字典。
Update the session's settings dictionary with a new settings object
<!-- comment source: method-signature -->
#### 参数
#### Parameters
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `settings` | `Settings` | 一个包含设置名称和值的键值映射,映射中未列出的名称将不会修改其值。 |
| 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``
`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.
就绪状态由主体的ready属性表示,如果当前尝试创建会话会失败,则该属性为false。然而值为true并不能保证新建会话命令一定会成功。
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.
实现可以选择将额外的元信息作为主体的一部分包含进来,但顶级属性ready和message是保留的,并且不能被覆盖。
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
@@ -397,7 +399,9 @@ await driver.status();
```
<!-- END:EXAMPLE -->
##### Python
<!-- BEGIN:EXAMPLE lang=Python -->
```python
@@ -405,7 +409,9 @@ driver.get_status()
```
<!-- END:EXAMPLE -->
##### Java
<!-- BEGIN:EXAMPLE lang=Java -->
```java
@@ -413,7 +419,9 @@ driver.getStatus();
```
<!-- END:EXAMPLE -->
##### Ruby
<!-- BEGIN:EXAMPLE lang=Ruby -->
```ruby
@@ -425,9 +433,10 @@ remote_status
```
<!-- END:EXAMPLE -->
<!-- END:EXAMPLES -->
#### 响应
#### Response
`Object`
@@ -435,101 +444,59 @@ remote_status
`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``
`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
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `type?` | `string` | 仅用于旧的(JSONWP)命令,超时的类型 |
| `ms?` | `string` \| `number` | 仅用于旧的(JSONWP)命令,表示超时的毫秒数 |
| `script?` | `number` | 用于W3C命令的脚本超时时间(以毫秒为单位) |
| `pageLoad?` | `number` | 用于W3C命令的页面加载超时时间(以毫秒为单位) |
| `implicit?` | `string` \| `number` | 用于W3C命令的隐式等待超时时间(以毫秒为单位) |
| 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`**
设置隐式等待超时时间
!!! warning "已弃用"
请使用`/session/:sessionId/timeouts`代替
使用`timeouts`代替
<!-- comment source: method-signature -->
#### 参数
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `ms` | `string` \| `number` | the timeout in ms |
#### 响应
``null``
`null`
### `logCustomEvent`
`POST` **`/session/:sessionId/appium/log_event`**
将自定义命名事件添加到Appium事件日志中
Add a custom-named event to the Appium event log
<!-- comment source: method-signature -->
#### 参数
#### Parameters
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `vendor` | `string` | 事件所属的供应商或工具的名称,用于为事件命名 |
| `event` | `string` | 事件本身的名称 |
| 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`**
重置当前会话(运行删除会话并创建会话子程序)
!!! warning "已弃用"
请使用每个驱动程序的启动、激活、终止或清理方法。
改用显式会话管理命令代替
<!-- comment source: method-signature -->
#### 响应
``null``
`null`
@@ -1,22 +1,22 @@
# 插件: execute-driver
# Plugin: execute-driver
### `executeDriverScript`
`POST` **`/session/:sessionId/appium/execute_driver`**
在插件中执行命令
Implementation of a command within a plugin
至少,`D`必须是`ExternalDriver`,但插件可以更严格地限制它支持哪些驱动程序。
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] |
| `type?` | [script: string, scriptType: string, timeoutMs: number] |
#### 响应
#### Response
`unknown`
@@ -1,17 +1,17 @@
# 插件: images
# Plugin: images
### `compareImages`
`POST` **`/session/:sessionId/appium/compare_images`**
#### 参数
#### Parameters
| 名字 | 类型 |
| :------ | :------ |
| `mode` | `any`[] |
| Name | Type |
| :--------- | :---------------------------------------------------------- |
| `mode` | `any`[] |
| `options?` | `any`[] |
#### 响应
#### Response
`ComparisonResult`
@@ -19,48 +19,71 @@
`POST` **`/session/:sessionId/element`**
在给定定位策略和选择器的情况下查找UI元素,如果找不到则报错
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
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `any` | 定位策略 |
| `value` | `any` | 选择器与策略相结合,找到特定元素 |
| Name | Type | Description |
| :------ | :---- | :--------------------------------------------------------------------- |
| `using` | `any` | the locator strategy |
| `value` | `any` | the selector to combine with the strategy to find the specific element |
#### 响应
#### Response
`any`
对元素id进行编码的元素对象,可用于元素相关命令
The element object encoding the element id which can be used in element-related
commands
### `findElements`
`POST` **`/session/:sessionId/elements`**
查找与给定定位策略和选择器匹配的所有UI元素的列表
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
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `any` | 定位策略 |
| `value` | `any` | 选择器与策略相结合,找到特定元素s |
| 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`
+19 -14
View File
@@ -1,22 +1,27 @@
---
hide:
- toc
title: 命令简介
title: Intro to Commands
---
在这里,您可以找到Appium主模块通过其基本驱动程序公开的各种命令,以及几个插件中可用的命令。
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
Appium基本驱动程序只公开少数几个命令,因为它本身不是为单独使用而设计的。
请参阅您的[Appium驱动程序](../ecosystem/drivers.md)的文档,了解它公开的命令
然后查阅您的[Appium客户端](../ecosystem/clients.md)文档,了解该命令的确切语法。
命令列表可以在此处找到:
```
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.
```
* [基础驱动程序](./base-driver.md)
* [执行驱动程序插件](./execute-driver-plugin.md)
* [图片插件](./images-plugin.md)
* [宽松能力插件](./relaxed-caps-plugin.md)
* [通用XML插件](./universal-xml-plugin.md)
The command listings can be found here:
- [Base Driver](./base-driver.md)
- [Execute Driver Plugin](./execute-driver-plugin.md)
- [Images Plugin](./images-plugin.md)
- [Inspector](https://github.com/appium/appium-inspector/tree/main/plugins)
- [Relaxed Caps Plugin](./relaxed-caps-plugin.md)
- [Storage Plugin](./storage-plugin.md)
- [Universal XML Plugin](./universal-xml-plugin.md)
@@ -1,27 +1,27 @@
# 插件: relaxed-caps
# 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
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `desiredCapabilities?` | `any` | 新的会话功能 |
| `requiredCapabilities?` | `any` | 另一个可以发送新会话功能的地方(通常未定义) |
| `capabilities?` | `any` | 另一个可以发送新会话功能的地方(通常未定义) |
| 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`
@@ -1,67 +1,68 @@
# 插件: universal-xml
# Plugin: universal-xml
### `findElement`
`POST` **`/session/:sessionId/element`**
在给定定位策略和选择器的情况下查找UI元素,如果找不到则报错
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
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `any`[] | 定位策略 |
| Name | Type | Description |
| :------ | :---------------------------------------------------------- | :------------------- |
| `using` | `any`[] | the locator strategy |
#### 响应
#### Response
`any`
对元素id进行编码的元素对象,可用于元素相关命令
The element object encoding the element id which can be used in element-related
commands
### `findElements`
`POST` **`/session/:sessionId/elements`**
查找与给定定位策略和选择器匹配的所有UI元素的列表
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
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `any`[] | 定位策略 |
| Name | Type | Description |
| :------ | :---------------------------------------------------------- | :------------------- |
| `using` | `any`[] | the locator strategy |
#### 响应
#### Response
`any`
可能为空的元素对象列表
A possibly-empty list of element objects
### `getPageSource`
`GET` **`/session/:sessionId/source`**
以HTML/XML格式获取当前页面/应用程序源代码
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`
以适合平台的格式呈现的用户界面层次结构(例如,对于网页使用HTML)
The UI hierarchy in a platform-appropriate format (e.g., HTML for a web page)
+161
View File
@@ -0,0 +1,161 @@
---
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.
@@ -1,344 +0,0 @@
---
title: Appium的配置系统
---
Appium2支持[配置文件](../guides/config.md)。配置文件是与命令行参数保持(几乎)一一对应的关系。
用户可以为Appium2提供配置文件、命令行参数,或者两者都提供(此时命令行参数的优先级高于配置文件)。
本文档将对配置系统的工作原理进行技术概述。它旨在为Appium的贡献者提供指导,但同时也会解释该系统的基础功能。
## 读取配置文件
配置文件是一个JSON、JavaScript或YAML文件,可以根据架构进行验证。
默认情况下,此文件将被命名为`.appiumrc.{json,js,yaml,yml}`,并位于依赖`appium`的项目的根目录中。
通过`--config <file>`标志,还支持其他文件名和位置。出于显而易见的原因,不允许在配置文件中使用`config`参数。
除了单独的文件外,配置还可以嵌入到项目的`package.json`文件中,使用`appiumConfig`属性。例如:
```json
{
"appiumConfig": {
"server": {
"port": 12345
}
}
}
```
当通过`appium`可执行文件启动Appium服务器时,`lib/main.js`中的`init`函数将调用`lib/config-file.js`加载或搜索配置文件和`package.json`。
!!! 注意
如果未找到配置文件,这并不会导致错误!
[`lilconfig`](https://npm.im/lilconfig)包提供了搜索和加载配置文件的功能;有关搜索路径的更多信息,请参考其文档。
此外,Appium通过[`yaml`](https://npm.im/yaml)包支持编写YAML格式的配置文件。
当找到并成功[验证](#_2)配置文件后,其结果将与默认设置以及额外的命令行参数进行合并。
在这个合并过程中,命令行参数的优先级高于配置文件,而配置文件的优先级则高于默认设置。
## 验证
该系统同时用于配置文件和命令行参数的验证。
[ajv](https://npm.im/ajv)包提供了验证功能。当然,为了让`ajv`进行验证,必须为其提供一个模式。
基础模式是一个符合[JSON Schema Draft-7](https://json-schema.org/draft/2020-12/json-schema-core.html)标准的对象,
由`lib/schema/appium-config-schema.js`文件导出。这个模式定义了Appium原生的配置,并且仅关注其作为服务器的行为;它并没有定义任何其他功能(例如插件或驱动程序子命令)的配置。
!!! 警告
请注意,这个文件是基础模式文件;这一点在后续操作中会变得至关重要。
此文件不是JSON文件,因为(1)JSON对人类来说很难使用,(2)@jlipps特别讨厌它,(3)`ajv`接受对象,而不是JSON文件。
解释配置文件是如何被验证的会更加直接明了,所以我们从这里开始。
### 验证配置文件
当发现一个配置文件(`lib/config-file.js`),它会调用从`lib/schema/schema.js`导出的`validate`函数,并将配置文件的内容作为参数传递给该函数。
接着,validate函数会请求`ajv`根据Appium提供的模式来验证这些数据。
如果配置文件无效,ajv会生成错误,这些错误随后会被显示给用户。最后,`init`函数会检测到这些错误,将它们显示出来,并且整个进程会退出。
我希望已经解释清楚了,因为这部分相对来说是比较容易理解的。
### 验证CLI参数
正如之前提到的,相同的系统被用于验证配置文件和命令行参数。
这里并没有任何评判的意思,但Appium使用[`argparse`](https://npm.im/argparse)来解析命令行参数。
这个包以及其他类似的包提供了一个API,用于定义命令行Node.js脚本接受的参数,并最终返回一个表示用户提供的参数的对象。
就像模式定义了配置文件中允许的内容一样,它也定义了命令行上允许的内容。
#### 通过模式定义CLI参数
在验证命令行参数的值之前,必须先定义这些参数。
JSON模式并不是定义CLI参数的天然选择,它需要一些额外的处理才能使其适用,
但它已经足够接近,以至于我们可以通过一个适配器和一些自定义元数据来实现这一点。
在`lib/cli/parser.js`中,有一个围绕`argparse`库的`ArgumentParser`的包装器;它被称为`ArgParser`。
这个包装器存在是因为我们对`argparse`做了一些自定义处理,但它与模式本身没有直接关系。
创建一个`ArgParser`实例,并用原始的CLI参数调用了它的`parseArgs()`方法,在`lib/cli/args.js`里定义了可以接受的参数。
在这里,所有不打算与`server`子命令一起使用的参数都是硬编码的(例如,`driver`子命令及其子命令)。
`args.js`还包含一个`getServerArgs()`函数,该函数转而调用`lib/schema/cli-args.js`中的`toParserArgs`。
`lib/schema/cli-args.js`可以视为`argparse`和模式之间的“适配器”层。
`toParserArgs`使用了由`lib/schema/schema.js`导出的`flattenSchema`函数,该函数将模式“压平”为键值对表示。
然后,`toParserArgs`遍历每个键值对,并将其“转换”为适合最终传递给`ArgParser`的`ArgumentOption`对象。
这个适配器(`cli-args.js`)是隐藏大部分混乱的地方;让我们进一步探索这个错综复杂的环境。
##### CLI和模式不一致
转换算法(见`lib/schema/cli-args.js`中的`subSchemaToArgDef`函数)
主要就是将各种技巧和特殊情况巧妙地打包到一个函数中。
有些事情不能从`argparse`清晰地映射到JSON模式,包括但不限于:
- 模式不能原生的表达“将`--foo=<value>`的值存储在一个名为`bar`的属性中”(这对应于`ArgumentOption['dest']`属性)。
- 模式不能原生的表达别名,例如`--verbose`也可以是`-v`。
- 模式的枚举不限制于多种类型,但`argparse`中对应的`ArgumentOption['choices']`属性是限制的。
- 模式不知道`argparse`中的"动作"概念(注意Appium目前没有使用自定义动作——尽管它曾经使用过,并且可能再次使用)。
- `argparse`没有原生的`email`、`hostname`、`ipv4`、`uri`等类型,而模式有。
- 模式验证只进行验证,不执行翻译、转换或强制转换(大部分情况下),`argparse`允许这样做。
- 出于某种原因模式允许`null`类型,你曾在命令行上传递过`null`吗?
- `argparse`除了基本类型之外,不理解其他任何内容,不理解对象、数组等,当然也不理解特定类型的数组。
-
上述所有情况以及其他情况均由适配器处理。
!!! 警告
适配器中的一些决策是通过抛硬币决定的。如果你好奇为什么某些事情会是这样,那很可能是因为它不得不这样做。
让我们更仔细地看看类型的处理。
#### 通过`ajv`处理参数类型
虽然`argparse`允许使用者通过API定义各种参数的类型(例如,字符串、数字、布尔标志等),
但Appium大多避免使用这些内置类型。为什么会这样呢?原因如下:
1. 我们已经知道参数的类型,因为我们在模式中已经定义了它。
2. `ajv`提供了针对模式的验证。
3. 模式允许对类型、允许的值等进行更丰富的表达,这些是`argparse`原生无法提供的。
4. 模式的表达能力允许提供更好的错误消息。
因此,适配器避开了`argparse`的内置类型(参见`ArgumentOption['type']`允许的字符串值),
而是滥用将函数作为类型提供的能力。例外情况是布尔标志,它们没有`type`,而是有`action: 'store_true'`。
至于为什么会这样,可能永远没人知道。
##### 类型作为函数
当`type`是一个函数时,这个函数同时执行验证和强制转换(如果需要)。那么这些函数是什么呢?
> 注意:如果属性类型是布尔值,那么`ArgumentOption`中的`type`会被省略(因此不是一个函数),
> 但会提供了一个`action`属性,值为`store_true`。是的,这很奇怪。我不知道为什么。
这取决于模式。但一般来说,我们会创建一个函数管道,每个函数都对应于模式中的一个关键字。
让我们以`port`参数为例,与其询问操作系统Appium运行的用户可以绑定到哪些端口,
不如预期这个参数是一个介于1和65535之间的整数。
这实际上是由两个函数组成的管道,我们将它们组合在一起:
1. 如果可能,将值转换为整数。因为`process.argv`中的每个值都是字符串,所以如果我们想要一个数字,就必须进行转换。
2. 使用`ajv`根据端口的模式验证整数。模式允许我们通过`minimum`和`maximum`关键字定义范围。有关其工作原理的更多信息,请查阅相关文档。
就像配置文件验证一样,如果检测到错误,Appium会友好地告诉用户,并附带一些帮助文本然后退出进程。
对于其他本身就是非基本类型的参数,事情就没那么简单了。
##### 转换器
还记得`argparse`无法理解数组吗?但如果表达一个值最直观的方式实际上是一个数组怎么办?
虽然Appium可以在配置文件中接受数组,但在命令行界面上却不能。
Appium可以接受一个逗号分隔的字符串(CSV行),或者是一个字符串文件路径,
指向包含分隔列表的文件。无论哪种方式,当值从参数解析器中输出时,它都应该是一个数组。
如上所述,JSON模式的原生功能无法表达这一点。然而可以定义一个自定义关键字,
Appium可以检测并相应地处理它,这就是Appium所做的。
在这种情况下,使用`ajv`注册了一个自定义关键字`appiumCliTransformer`。
在编写本文时,`appiumCliTransformer`的值可以是`csv`或`json`。
在基础模式文件`appium-config-schema.js`中,如果希望这种行为发生,
Appium会使用`appiumCliTransformer: 'csv'`。
!!! 注意
在模式中定义的任何类型为数组的属性都会自动使用csv转换器。同样,类型为对象的属性将使用json转换器。
可以想象,某些情况下数组可能想要使用JSON转换器,但除此之外,
在类型为数组或对象的属性上使用`appiumCliTransformer`关键字并不是严格必要的。
适配器(还记得适配器吗?)创建了一个管道函数,其中包括一个特殊的“CSV转换器”,转换器在`lib/schema/cli-transwers.js`中定义,
并将此函数作为值传递给`argparse`的`ArgumentOption`的`type`属性,在这种情况下,模式中的`type: 'array'`将被忽略。
!!! 注意
配置文件不需要执行任何复杂的值转换,因为它自然允许Appium准确定义它所期望的内容。
因此Appium不会对配置文件值进行后期处理。
不需要这种特殊处理的属性直接使用`ajv`进行验证。这是如何工作的一些解释,所以接下来就是这样。
#### 通过 `ajv` 实现单个参数的验证
当我们思考 JSON 模式时,通常会认为“我有一个 JSON 文件需要根据模式进行验证”。这种理解是正确的,实际上 Appium 在处理配置文件时正是这样做的!不过,Appium 在验证参数时采用了不同的方式。
!!! 注意
在实现过程中,我曾试图将所有参数组合成一个类似配置文件的数据结构进行统一验证。虽然这在理论上是可行的,但由于 CLI 参数对象是扁平的键/值结构,而模式本身并非扁平结构,这种做法可能会引发问题。
Appium 实际采用的方式是:针对模式中特定的属性对参数值进行验证。为此,系统维护了 CLI 参数定义与对应模式属性之间的映射关系。这个映射关系通过一个 `Map` 实现,其中键是参数的唯一标识符,值是一个 `ArgSpec` 对象(定义于 `lib/schema/arg-spec.js`)。
`ArgSpec` 对象包含以下元数据:
| 属性名称 | 描述 |
| --------------- | --------------------------------------------------------------------------------------- |
| `name` | 参数的规范名称,对应模式中的属性名 |
| `extType?` | 扩展类型(`driver` 或 `plugin`),如果适用 |
| `extName?` | 扩展名称,如果适用 |
| `ref` | 模式中该属性的计算后 `$id` 引用 |
| `arg` | CLI 接受的参数名(不带前导短横线) |
| `dest` | 解析后参数对象的属性名(由 `argparse` 的 `parse_args()` 返回) |
| `defaultValue?` | 模式中 `default` 关键字对应的值(如果存在) |
当模式完成[最终化](#schema-finalization)时,该 `Map` 会被填充所有已知参数的 `ArgSpec` 对象。
在适配器为参数的 `type` 创建函数管道时,系统已经拥有该参数的 `ArgSpec`。它会创建一个调用 `validate(value, ref)` 的函数(位于 `lib/schema/schema.js`),其中 `value` 是用户提供的参数值,`ref` 是 `ArgSpec` 的 `ref` 属性。核心原理在于 `ajv` 可以使用任何已知的 `ref` 进行验证——无论该属性是否被显式定义,模式中的每个属性都可以通过其 `ref` 被引用。以下列模式为例:
```json
{
"$id": "my-schema.json",
"type": "object",
"properties": {
"foo": {
"type": "number"
}
}
}
```
其中 `foo` 的 `ref` 应为 `my-schema.json#/properties/foo`。假设我们的 `Ajv` 实例已注册该模式,即可通过 `getSchema(ref)` 方法(虽然名称有误,但其 `schema` 属性有效)获取验证函数;`schema.js` 中的 `validate(value, ref)` 方法正是调用此验证函数。
!!! 注意
虽然模式规范允许通过显式声明 `$id` 来覆盖默认引用标识,但 Appium 目前不支持此特性。如有需要,扩展开发者必须谨慎使用不包含自定义 `$id` 的 `$ref` 引用。不过 Appium 自身的模式定义都未使用 `$ref`,可见扩展通常不需要如此复杂的模式结构。
接下来我们将探讨 Appium 如何加载模式。值得注意的是,模式加载过程实际上发生在参数验证之前。
## 模式加载
让我们暂时忽略扩展功能,先从基础模式开始解析。
当首次导入 `lib/schema/schema.js` 模块时,系统会创建一个 `AppiumSchema` 实例。该实例为单例模式,其所有方法(均已绑定到实例)都通过该模块对外暴露。
构造函数仅执行基础操作:实例化一个 `Ajv` 验证器实例,并通过以下方式对其进行配置:添加 Appium 的[自定义关键字](#custom-keyword-reference);
通过 [ajv-formats](https://npm.im/ajv-formats) 模块启用 `format` 关键字支持。
在调用 `finalize()` 方法(导出为 `finalizeSchema()`)之前,`AppiumSchema` 实例不会与 `Ajv` 实例产生交互。此方法的调用标志着"模式定义阶段结束,将开始创建 `ArgSpec` 对象并向 `ajv` 注册最终模式"。
最终化触发的时机如下:
1. 当 `appium` 可执行文件启动时,首先在 `APPIUM_HOME` 目录中检查并配置扩展(此处简化处理)
2. 随后开始处理参数——实例化 `ArgParser`,该操作会运行适配器将模式转换为参数定义
3. 最终化在此处发生:创建解析器时,Appium 需要向 `ajv` 注册模式以生成参数验证函数
4. 通过 `ArgParser`完成参数解析
5. 最终根据解析结果决定后续操作流程
即使没有扩展功能,`finalize()` 仍会识别 Appium 的基础模式(`appium-config-schema.js`)并进行注册。不过上述步骤 1 实际涉及复杂的扩展处理机制,接下来我们将深入探讨扩展功能的影响。
## 扩展支持
本系统的设计目标之一是:
扩展应该能够向Appium注册自定义CLI参数,用户应该能够像使用其他参数一样使用它们。
此前,Appium 2通过`--driverArgs`方式接受参数,但验证过程需要手动实现,并要求扩展开发者使用自定义API。这种方式还要求用户在命令行中笨拙地传递JSON字符串作为配置。此外,这些参数没有上下文帮助信息(通过`--help`)。
现在,通过为选项提供模式(schema),驱动或插件可以向Appium注册CLI参数和配置文件模式。
要注册模式,扩展必须在其`package.json`中提供`appium.schema`属性。该值可以是模式本身或模式文件的路径。如果是路径,模式文件应为JSON或CommonJS模块(目前不支持ESM和YAML)。
对于该模式中的任何属性,都将以`--<扩展类型>-<扩展名称>-<属性名称>`的形式作为CLI参数出现。例如,如果`fake`驱动提供了`foo`属性,对应的参数将是`--driver-fake-foo`,并会像其他CLI参数一样显示在`appium server --help`中。
配置文件中对应的属性路径为`server.<扩展类型>.<扩展名称>.<属性名称>`,例如:
```json
{
"server": {
"driver": {
"fake": {
"foo": "bar"
}
}
}
}
```
上述命名约定避免了不同扩展类型之间的名称冲突问题。
!!! 注意
虽然扩展可以通过`appiumCliAliases`提供别名,但禁止使用"短"标志(short flags),因为所有扩展参数都带有`--<扩展类型>-<扩展名称>-`前缀。根据[Lodash的kebab-case规则](https://lodash.com/docs/4.17.15#kebabCase),扩展名称和参数名称在CLI中将被转换为kebab-case格式。
模式对象的结构与Appium基础模式相似,但仅支持顶层属性(目前不支持嵌套属性)。示例:
```json
{
"title": "为cowabunga驱动设计的超棒模式",
"type": "object",
"properties": {
"fizz": {
"type": "string",
"default": "buzz",
"$comment": "对应CLI参数--driver-cowabunga-fizz"
}
}
}
```
在用户的配置文件中,该属性将表示为`server.driver.cowabunga.fizz`。
当扩展被加载时,`schema`属性会被验证,并且模式会被注册到`AppiumSchema`中(在调用`finalize()`之前不会注册到`Ajv`)。
在最终化阶段,每个注册的模式都会被添加到`Ajv`实例中。模式会根据扩展类型和名称分配一个`$id`(这会覆盖扩展可能提供的任何现有ID)。模式还会通过`additionalProperties: false`强制禁止未知参数。
在底层实现中,基础模式包含`driver`和`plugin`属性(都是对象类型)。最终化时,会为每个属性添加对应扩展名称的子属性,其值是对扩展模式中`$id`的引用。例如,`server.driver`属性将如下所示:
```json
{
"driver": {
"cowabunga": {
"$ref": "driver-cowabunga.json"
}
}
}
```
这就是为什么我们称之为“基础”模式——当扩展提供模式时,它会发生变化。扩展模式是分开保存的,但在最终将其添加到`ajv`之前,会将引用添加到模式中。这是有效的,因为`Ajv`实例能够理解已注册模式之间的相互引用。
!!! 注意
这使得为Appium及其安装的扩展提供完整的静态模式变得不可能(截至2021年11月5日)。基础模式会通过Gulp任务生成静态`.json`模式文件,但不包含任何扩展模式。这种静态模式还有其他用途,例如IDE可以通过这种方式提供配置文件的上下文错误检查。这个问题需要后续解决?
与在基础模式中查找参数的引用ID方式相同,扩展参数的验证过程完全一致。如果`cowabunga`驱动的模式ID是`driver-cowabunga.json`,那么`fizz`属性可以通过`driver-cowabunga.json#/properties/fizz`路径在任意已注册模式中被引用。“基础”模式参数的引用路径则以`appium.json#properties/`开头。
## 开发环境支持
在开发流程中,我们自动化了以下几个任务来维护基础模式:
- 作为后置转译步骤,会从 `lib/schema/appium-config-schema.js` 生成 `lib/appium-config.schema.json`(除了 Babel 生成的 CJS 对应文件外)
- 该文件受版本控制管理。在此步骤中会被复制到 `build/lib/appium-config.schema.json`
- 通过预提交钩子(参见 monorepo 根目录的 `scripts/generate-schema-declarations.js`)会从上述 JSON 文件生成 `types/appium-config-schema.d.ts`
- `types/types.d.ts` 中的类型定义依赖此文件,该文件受版本控制管理
## 自定义关键字参考
关键字定义于 `lib/schema/keywords.js`
- `appiumCliAliases`: 允许模式声明参数别名(例如 CLI 参数可以是 `--verbose` 或 `-v`)。值为字符串数组。短于三(3)个字符的字符串将使用单短横线(`-`)而非双短横线(`--`)开头。注意任何由扩展提供的参数都必须以双短横线开头,因为这些参数需要带有 `--<extension-type>-<extension-name>-` 前缀
- `appiumCliDest`: 允许模式指定 `argparse` 解析后参数对象中的自定义属性名。若未设置,将转换为驼峰式命名
- `appiumCliDescription`: 允许模式覆盖命令行显示的参数描述。与 `appiumCliTransformer`(或 `array`/`object` 类型属性)配合使用时非常有用,因为 CLI 用户可提供的内容与配置文件用户可提供的内容存在显著差异
- `appiumCliTransformer`: 目前支持 `csv` 和 `json` 两种选项。这些是用于后处理值的自定义函数。在加载和验证配置文件时不使用这些转换器,但核心思想是它们应该产生与使用配置文件相同的对象(例如字符串数组)。`csv` 用于逗号分隔字符串和 CSV 文件;`json` 用于原始 JSON 字符串和 `.json` 文件
- `appiumCliIgnore`: 若为 `true`,则不在 CLI 中支持该属性
- `appiumDeprecated`: 若为 `true`,该属性将被视为"已弃用",并会向用户显示为弃用状态(例如在 `--help` 输出中)。注意 JSON Schema draft-2019-09 引入了新的 `deprecated` 关键字,如果我们升级到该元模式应该改用此关键字。迁移时,`appiumDeprecated` 本身应被标记为 `deprecated`
@@ -1,90 +0,0 @@
---
title: 贡献代码
---
要为Appium代码库做出贡献,请务必查看Git存储库。
!!! 信息
如果您是VS Code用户,您可以使用[Runme](https://runme.dev/api/runme?repository=https%3A%2F%2Fgithub.com%2Fappium%2Fappium.git&fileToOpen=packages%2Fappium%2Fdocs%2Fen%2Fcontributing%2Findex.md)轻松查看项目。
建议在将其克隆到您的系统之前进行[fork](https://github.com/appium/appium/fork)。
```sh
export GITHUB_USERNAME=<your-username>
git clone git@github.com:$GITHUB_USERNAME/appium.git
```
克隆后,您可以继续安装项目依赖项:
```sh
npm install
```
从现在开始,你可以做几件事。
### 监视文件
在开发Appium代码时,我们必须查看所有JavaScript和TypeScript文件,以便在每次更改后重新编译它们。您可以通过以下方式运行此监视过程:
```sh
npm run dev
```
### 在开发模式下启动Appium
要测试您的更改,您可以通过以下方式在开发模式下运行Appium:
```sh
npm start
```
### 运行测试
该项目维护了一组不同的测试变体,您可以运行这些变体来验证代码的质量。
#### 代码风格检查
Appium使用[`eslint`](https://eslint.org/)进行静态代码分析和代码风格检查。你可以通过以下方式运行这些检查:
```sh
npm run lint
```
#### 单元测试
```sh
npm run test:unit
```
您还可以对特定工作区运行测试,例如:
```sh
export APPIUM_WORKSPACE=@appium/doctor
npm run test:unit -w $APPIUM_WORKSPACE
```
#### 冒烟和端到端测试
```sh
npm run test:slow
```
### 在本地部署文档
我们的文档系统使用[MKDocs](https://www.mkdocs.org/),因此需要在您的系统上安装[Python](https://www.python.org/)。您可以通过以下方式运行文档:
```sh
# 安装所需的Python依赖项
PIP_BREAK_SYSTEM_PACKAGES=1 pip install -r packages/docutils/requirements.txt
# 构建项目
npm run build
# 运行开发服务器
npm run dev:docs
```
您应该可以在`http://127.0.0.1:8000/docs/en`查看页面:
```sh
open http://127.0.0.1:8000/docs/en
```
@@ -1,32 +0,0 @@
---
hide:
- toc
title: 为Appium做出贡献
---
Appium是一个开源项目,遵循Apache 2.0许可证。其版权由[OpenJS基金会](https://openjsf.org)持有,
并且Appium接收来自多个软件行业中的公司的贡献,无论这些公司是否具有竞争关系。
(第三方驱动程序和插件在其作者提供的许可证下可用。)
因此,我们欢迎所有贡献!该项目的进展依赖于来自公司和志愿者的代码、文档、维护和支持的投入。
Appium文档的这一部分是为那些有兴趣为Appium开发做出贡献的人准备的。它包含了开发者概览、指南和说明。
请使用导航菜单来查找特定主题。这些指南中的所有信息都假设您已经对Appium有了深入的了解。
!!! 警告
开发者信息可能不会像面向用户的信息那样频繁更新,或者其当前形式可能在线仓库中最为相关,而非发布的版本中。
请务必检查仓库或与维护者讨论以确保信息的准确性。我们总是乐于帮助新贡献者入门!
## 贡献方式
该项目提供了多种贡献方式,例如:
- [贡献代码](./develop.md)
- 改进文档
- 创建教育内容(博客文章、教程、视频等)
- 传播有关该项目的好话(例如通过Twitter)
- 如果你在使用Appium的过程中发现了漏洞,请提交它们。
- 如果你发现项目中缺少某些功能,或者愿意协助处理漏洞,请提出请求。
- 支持[Appium论坛](https://discuss.appium.io/)中的用户
@@ -35,9 +35,9 @@ To take advantage of Appium's documentation utilities, you'll need to install:
- [pip](https://pip.pypa.io/en/stable/installation/) (this may be installed automatically with Python)
- The `@appium/docutils` package:
```bash
npm install --save-dev @appium/docutils
```
```bash
npm install --save-dev @appium/docutils
```
### Initializing an Extension for Building Docs
@@ -50,7 +50,7 @@ npx appium-docs init
This will:
1. Create a `tsconfig.json` if one does not already exist. This is necessary even if your extension
is not written in TypeScript.
is not written in TypeScript.
2. Create a `mkdocs.yml` with the necessary configuration for MkDocs.
### Documenting Your Extension
@@ -60,7 +60,7 @@ files in the `docs` directory. You can therefore create your Markdown documentat
them in `docs`, and add links to these files in `mkdocs.yml`.
Refer to the [MkDocs documentation](https://www.mkdocs.org/user-guide/writing-your-docs/) for
information on how to organize and structure your documentation.
information on how to organize and structure your documentation.
### Building the Docs
@@ -21,13 +21,13 @@ The interface defines the following methods and properties:
- `diagnose(): Promise<DoctorCheckResult>`: Contains the code to diagnose a possible issue
- `fix(): Promise<string|null>`: Either fixes the actual problem if `hasAutofix()` returns true or
returns a string description for possible manual fixes. If this method throws an exception named
`FixSkippedError` and `hasAutofix()` returns true then the result of the method invocation
is going to be ignored.
returns a string description for possible manual fixes. If this method throws an exception named
`FixSkippedError` and `hasAutofix()` returns true then the result of the method invocation
is going to be ignored.
- `hasAutofix(): boolean`: Whether calling `fix()` would resolve the found issue
- `isOptional(): boolean`: Whether the found issue can be ignored and is not a showstopper
- `log: AppiumLogger`: May be used for logging. This property may be assigned
by the instance itself or by the Appium server if it is left unassigned.
by the instance itself or by the Appium server if it is left unassigned.
The `DoctorCheckResult` object returned by the `diagnose()` method must contain the following properties:
File diff suppressed because it is too large Load Diff

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