Compare commits

..
Author SHA1 Message Date
Jonathan Lipps c8fe441252 chore: publish
- appium@2.19.0
 - @appium/base-driver@9.18.0
 - @appium/base-plugin@2.3.7
 - @appium/docutils@1.1.1
 - @appium/driver-test-support@0.8.0
 - @appium/execute-driver-plugin@4.0.6
 - @appium/fake-driver@5.7.3
 - @appium/fake-plugin@3.2.7
 - @appium/images-plugin@3.1.3
 - @appium/logger@1.7.1
 - @appium/opencv@3.0.10
 - @appium/plugin-test-support@0.3.54
 - @appium/storage-plugin@0.1.3
 - @appium/strongbox@0.3.4
 - @appium/support@6.1.1
 - @appium/test-support@3.1.10
 - @appium/types@0.26.0
 - @appium/universal-xml-plugin@1.0.34
2025-05-31 19:04:10 -07:00
renovate[bot] 886daa7c8d chore(execute-driver-plugin): update dependency webdriverio to v9.15.0 (#21305)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-31 20:22:29 +00:00
Edgars Eglītis 496fa6ec2e docs: update sponsors (#21307)
* docs: add Jetify as Gold Sponsor

* docs: fix BrowserStack logo in light mode
2025-05-31 21:07:14 +03:00
renovate[bot] 05e89064a5 chore(deps): update eslint-related packages (#21306)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-31 17:52:13 +00:00
renovate[bot] 707016e238 chore(docutils): update dependency mkdocs-git-revision-date-localized-plugin to v1.4.7 (#21303)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-29 11:26:56 +00:00
Mykola Mokhnach 4b2141d83f chore(base-driver): Mark geolocation-related methods as deprecated (#21302) 2025-05-29 09:47:42 +02:00
renovate[bot] 94a0e1604d chore(deps): update dependency typescript-eslint to v8.33.0 (#21301)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-28 02:57:01 +00:00
renovate[bot] 548b34af98 chore(docutils): update dependency mkdocs-git-revision-date-localized-plugin to v1.4.6 (#21298)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-26 23:32:04 +00:00
renovate[bot] 28b59cc746 chore(deps): update dependency eslint-import-resolver-typescript to v4.4.1 (#21297)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-26 18:34:49 +00:00
Noritaka Kobayashi a9d45957df chore(): fix typos (#21294) 2025-05-25 23:44:20 -07:00
renovate[bot] 69cb6c4d19 chore(deps): update dependency mocha to v11.5.0 (#21293)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-25 21:57:24 +00:00
renovate[bot] 5d58e56aa6 chore(deps): update dependency eslint-import-resolver-typescript to v4.4.0 (#21292)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-25 16:57:12 +00:00
Noritaka Kobayashi c5c7e4465e refactor(base-driver,logger,opencv,strongbox): remove unnecessary undefined & fix typo (#21291) 2025-05-24 15:15:10 -07:00
Noritaka Kobayashi 2e4c1968bb docs(docs): fix typo (#21290) 2025-05-23 22:11:08 -07:00
Noritaka Kobayashi 64bad9ef8f refactor(base-driver): use optional chaining (#21289) 2025-05-23 19:11:49 +02:00
renovate[bot] 2fe146cfc9 chore(docutils): update dependency diff to v8.0.2 (#21288)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-22 21:24:47 +03:00
Noritaka Kobayashi b5c8c097c7 refactor(appium,base-driver,support): replace regex checks with string methods for better readability (#21287) 2025-05-22 09:50:45 -07:00
renovate[bot] 7d960c8cbb chore(support): update dependency teen_process to v2.3.2 (#21286)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-21 18:43:27 +02:00
cb3a27b66a docs(appium): Update documentation translations - Japanese resources (#21284)
* docs(appium): Update documentation translations

* revert zh

* add missing authors

* reflect the latest one

---------

Co-authored-by: KazuCocoa <5511591+KazuCocoa@users.noreply.github.com>
Co-authored-by: Kazuaki Matsuo <fly.49.89.over@gmail.com>
2025-05-21 08:53:30 -07:00
renovate[bot] 7e9c437e17 chore(deps): update dependency mocha to v11.4.0 (#21281)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-20 22:20:07 +00:00
renovate[bot] faf3389b40 chore(support): update dependency sharp to v0.34.2 (#21282)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-20 21:28:08 +03:00
Edgars Eglītis de6238b84e docs: update sponsors (#21280)
* docs: update sponsors

* chore: add back sauce logo (used in blog)
2025-05-20 21:14:20 +03:00
Edgars Eglītis cf01c4764f chore(deps): remove @types/diff (#21279) 2025-05-20 21:02:17 +03:00
renovate[bot] 98544c8846 chore(deps): update dependency @types/diff to v8 (#21273)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-18 21:29:44 +03:00
renovate[bot] c6ef35a3c1 chore(deps): update dependency rewiremock to v3.14.6 (#21272)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-18 18:02:57 +00:00
renovate[bot] 437e6618a1 chore(deps): update dependency eslint-import-resolver-typescript to v4.3.5 (#21271)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-18 17:39:21 +00:00
renovate[bot] fe1fa8f71e chore(docutils): update dependency yaml to v2.8.0 (#21270)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-18 17:06:56 +00:00
renovate[bot] c9718cb1f2 chore(deps): update dependency mocha to v11.3.0 (#21269)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-18 15:09:41 +00:00
renovate[bot] 9bec504aa8 chore(execute-driver-plugin): update dependency webdriverio to v9.14.0 (#21268)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-18 03:02:59 +00:00
renovate[bot] e9e00c2abe chore(deps): update eslint-related packages to v9.27.0 (#21267)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-17 21:23:11 +00:00
renovate[bot] 20bb7c659d chore(docutils): update dependency diff to v8 (#21263)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-14 10:24:02 +03:00
renovate[bot] 08dd96089a chore(deps): update dependency http-cache-semantics to v4.2.0 (#21259)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-14 03:49:18 +00:00
renovate[bot] 076e7a0025 chore(universal-xml-plugin): update dependency fast-xml-parser to v5.2.3 (#21260)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-13 23:29:10 +03:00
renovate[bot] 2d54dfb832 chore(workflows): update egmacke/action-check-label action to v4 (#21261)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-13 21:24:55 +03:00
renovate[bot] 9178cbff74 chore(docutils): update dependency mkdocs-material to v9.6.14 (#21258)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-13 17:22:40 +00:00
renovate[bot] 0f0b938fdf chore(types): update dependency type-fest to v4.41.0 (#21252)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-13 17:18:26 +00:00
renovate[bot] 451e6851fe chore(deps): update eslint-related packages (#21256)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-13 16:58:33 +00:00
renovate[bot] 2e015e1e2d chore(execute-driver-plugin): update dependency webdriverio to v9.13.0 (#21255)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-13 08:29:26 +00:00
renovate[bot] f82c6ec965 chore(deps): update dependency mocha to v11.2.2 (#21254)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-13 07:58:29 +00:00
renovate[bot] 7ae198fdff chore(support): update dependency semver to v7.7.2 (#21253)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-13 07:28:20 +00:00
renovate[bot] 351b8fca33 chore(storage-plugin): update dependency ws to v8.18.2 (#21251)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-13 07:10:25 +00:00
renovate[bot] 3e559cdbff chore(docutils): update dependency mkdocs-material to v9.6.13 (#21250)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-13 06:34:19 +00:00
Mykola Mokhnach 5c42deda82 chore(base-driver): Tune the deprecation warning message (#21240) 2025-05-09 20:36:51 +02:00
Edgars Eglītis 5f6bdfc5df feat(appium): implement GET /appium/sessions and deprecate GET /sessions (#21233)
* feat(appium): implement GET /appium/sessions

* chore: address most comments

* chore: fix basedriver tests

* chore: adjust basedriver tests

* chore: address more comments

* feat: lock session retrieval behind security flag

* docs: update security feature-related docs

* chore: fix tests

* chore: address comments

* feat: configure features on server launch

* chore: address most comments

* chore: extract insecure feature code to separate mixin

* chore: reduce duplication in tests

* chore: add tests for configureDriverFeatures

* chore: remove leftover utils code

* chore: minor test improvements
2025-05-06 19:07:07 +03:00
Mykola Mokhnach 63963e9c95 docs(appium): Describe how to log sensitive data (#21232) 2025-05-01 08:38:15 +02:00
renovate[bot] 0f8f59e7ab chore(types): update dependency type-fest to v4.40.1 (#21228)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-27 10:07:31 +00:00
renovate[bot] 4445c54068 chore(support): update dependency axios to v1.9.0 (#21225)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-26 10:27:15 +00:00
renovate[bot] ed0fb8d795 chore(deps): update dependency @types/node to v22.15.2 (#21223)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-25 23:51:21 +00:00
Jonathan Lipps 8476bd3f65 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
2025-04-25 12:00:24 -07:00
Kazuaki Matsuo c6aa31bda0 docs(appium): address default timeout in newCommandTimeout (#21222) 2025-04-23 23:14:45 -07:00
Edgars Eglītis ffaffc11d9 docs: remove SeleniumConf banner (#21221) 2025-04-23 11:51:00 -07:00
renovate[bot] 8edc4143a8 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>
2025-04-23 19:16:38 +03:00
Edgars Eglītis ca9e79b00d 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
2025-04-22 23:46:12 +03:00
renovate[bot] d870b7aca7 chore(execute-driver-plugin): update dependency webdriverio to v9.12.7 (#21218)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-22 15:26:48 +00:00
renovate[bot] 6cb9e846cc chore(deps): update eslint-related packages (#21216)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-22 11:28:39 +00:00
renovate[bot] 5b33298ca7 chore(deps): update eslint-related packages (#21214)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-20 06:41:51 +00:00
renovate[bot] e88ea8c783 chore(docutils): update dependency mkdocs-material to v9.6.12 (#21211)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-18 11:10:51 +00:00
renovate[bot] c9ecc152c9 chore(execute-driver-plugin): update dependency webdriverio to v9.12.6 (#21210)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-17 12:16:18 +00:00
Mykola Mokhnach 97c62676fc chore(base-driver): Mark /session/:sessionId/network_connection deprecated (#21209) 2025-04-16 19:43:57 +02:00
renovate[bot] 9e9cbdeaf1 chore(types): update dependency type-fest to v4.40.0 (#21208)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-16 11:32:56 +00:00
renovate[bot] 2422e44082 chore(deps): update dependency typescript-eslint to v8.30.1 (#21206)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-15 16:35:00 +00:00
Teodor Nikolov 05a562ca9e docs(appium): add NovaWindows driver to Appium other drivers list (#21202) 2025-04-14 22:39:40 +09:00
Mykola Mokhnach a17291db4e chore(base-driver): Mark IME commands and receive_async_response as deprecated (#21201) 2025-04-14 08:43:48 +02:00
renovate[bot] 1cc2e3324a chore(execute-driver-plugin): update dependency webdriverio to v9.12.5 (#21200)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-12 14:30:49 +00:00
renovate[bot] 1be94b9f7a chore(deps): update dependency @types/node to v22.14.1 (#21199)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-12 10:24:11 +00:00
renovate[bot] bd9ce0c78e chore(deps): update dependency lerna to v8.2.2 (#21197)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-11 14:59:35 +00:00
renovate[bot] 649e997e07 chore(deps): update dependency eslint-config-prettier to v10.1.2 (#21195)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-11 11:08:33 +02:00
renovate[bot] d782d28326 chore(deps): update dependency tsd to v0.32.0 (#21194)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-10 19:44:16 +03:00
renovate[bot] 17f25ecb33 chore(support): update dependency sharp to v0.34.1 (#21191)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-09 17:08:00 +03:00
renovate[bot] eb559dc833 chore(deps): update dependency typescript-eslint to v8.29.1 (#21189)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-08 13:14:10 +00:00
renovate[bot] a765ff99d5 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>
2025-04-07 09:48:23 +02:00
Edgars Eglītis 7979351543 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
2025-04-06 20:38:42 +03:00
Edgars Eglītis 55da22fc40 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
2025-04-06 19:57:32 +03:00
renovate[bot] d4a0126ad5 chore(support): update dependency sharp to v0.34.0 (#21183)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-06 14:03:53 +03:00
renovate[bot] 846c60a3c7 chore(deps): update eslint-related packages to v9.24.0 (#21182)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-06 10:08:02 +00:00
renovate[bot] 3b054fe8d1 chore(execute-driver-plugin): update dependency webdriverio to v9.12.4 (#21180)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-05 14:04:18 +00:00
renovate[bot] dafc7abaec chore(docutils): update dependency typescript to v5.8.3 (#21179)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-05 09:24:31 +00:00
renovate[bot] f6eb67e838 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>
2025-04-04 19:16:16 +03:00
renovate[bot] 1e07b227a1 chore(execute-driver-plugin): update dependency webdriverio to v9.12.3 (#21177)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-04 12:23:33 +02:00
Mykola Mokhnach 1de5d0a0e8 fix(logger): Error stack logging (#21176) 2025-04-04 09:44:31 +02:00
renovate[bot] 25c0600b9f chore(types): update dependency type-fest to v4.39.1 (#21173)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-03 15:25:52 +00:00
renovate[bot] 229f24d2e3 chore(deps): update dependency @types/node to v22.14.0 (#21172)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-03 10:13:13 +00:00
Edgars Eglītis 804b1a3c15 fix(docutils): add & adjust various log messages (#21160)
* fix(docutils): add & adjust various log messages

* fix: use npm from support package for npm calls
2025-04-02 20:36:57 +03:00
renovate[bot] 742ad1e9b5 chore(types): update dependency type-fest to v4.39.0 (#21168)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-02 14:26:37 +00:00
renovate[bot] 71bfb5ada9 chore(docutils): update dependency mkdocs-material to v9.6.11 (#21167)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-02 11:01:24 +00:00
renovate[bot] 49d8b242e4 chore(deps): update definitelytyped (#21164)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-01 22:19:17 +00:00
renovate[bot] 2b4b4c2a39 chore(deps): update dependency typescript-eslint to v8.29.0 (#21165)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-01 13:38:23 +00:00
renovate[bot] 228e479785 chore(docutils): update dependency mkdocs-material to v9.6.10 (#21161)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-31 12:45:12 +00:00
Regan Karlewicz a82476f2fc feat(base-driver): Accept x-request-id as override to generated requestId in handleLogContext (#21154) 2025-03-31 09:22:38 +02:00
renovate[bot] fcc66a1b4c 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>
2025-03-30 09:10:24 +02:00
renovate[bot] d7e383c5f4 chore(docutils): update dependency yaml to v2.7.1 (#21158)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-30 09:10:12 +02:00
renovate[bot] 28b091a450 chore(execute-driver-plugin): update dependency webdriverio to v9.12.2 (#21151)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-29 07:00:32 +01:00
renovate[bot] f55de14a4f 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>
2025-03-29 07:00:15 +01:00
Mykola Mokhnach d334ad4b4a chore(storage-plugin): Use base driver import for W3C error response creation (#21153) 2025-03-29 06:32:08 +01:00
renovate[bot] 423ef391bb chore(deps): update definitelytyped (#21147)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-27 09:41:50 +01:00
renovate[bot] 283cd2c695 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>
2025-03-27 02:25:26 +00:00
renovate[bot]andMykola Mokhnach 2e08ebbe16 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>
2025-03-26 11:56:56 +01:00
renovate[bot] 7713985a50 chore(deps): update eslint-related packages (#21142)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-25 20:04:51 +00:00
renovate[bot] e508e217ed chore(test-support): update dependency sinon to v19.0.5 (#21141)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-25 12:49:25 +00:00
renovate[bot] f09640ccf3 chore(deps): update definitelytyped (#21139)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-24 23:36:34 +00:00
renovate[bot] 8f30a5461e chore(types): update dependency type-fest to v4.38.0 (#21140)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-24 17:10:50 +00:00
renovate[bot] 6ba28ebc28 chore(deps): update eslint-related packages to v9.23.0 (#21138)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-22 09:15:40 +00:00
Mykola Mokhnach c24d2ac461 feat: Add a possibility to mask sensitive log values depending on request headers (#21123) 2025-03-21 23:12:41 +01:00
renovate[bot] 4e381ada17 chore(deps): update dependency @types/node to v22.13.11 (#21135)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-21 15:55:28 +00:00
renovate[bot] 5b971de540 chore(test-support): update dependency sinon to v19.0.4 (#21130)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-20 17:35:07 +01:00
renovate[bot] de737bba73 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>
2025-03-20 16:47:50 +01:00
renovate[bot] d8225d0176 chore(deps): update dependency typescript-eslint to v8.27.0 (#21131)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-20 14:27:09 +01:00
renovate[bot] aaab7b956e chore(execute-driver-plugin): update dependency webdriverio to v9.12.1 (#21129)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-20 11:22:58 +00:00
renovate[bot] 8d77bd3e06 chore(support): update dependency axios to v1.8.4 (#21127)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-20 09:22:57 +01:00
renovate[bot] b7dcd3f7b9 chore(deps): update dependency @types/express to v5.0.1 (#21126)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-20 07:52:40 +00:00
renovate[bot] eccae91099 chore(docutils): update dependency consola to v3.4.2 (#21124)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-18 15:27:48 +00:00
zhangxh075 3425da9cf6 docs: update zh contributing documentation (#21117)
* Translate Validation of Individual Arguments via AJV section

* Complete the translation of the config system file
2025-03-17 22:13:19 +02:00
Jonathan Lipps 603d1e7fb2 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
2025-03-17 11:24:00 -07:00
Mykola Mokhnach f800c9d760 fix(base-driver): Exclude proxied headers from the server response (#21120) 2025-03-17 19:18:19 +01:00
renovate[bot] 8f5a6c47a9 chore(docutils): update dependency mkdocs-material to v9.6.9 (#21121)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-17 17:32:59 +00:00
renovate[bot] 157108c70c 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>
2025-03-16 14:00:18 +00:00
renovate[bot] 7c5e3ee86e 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>
2025-03-15 09:18:40 +01:00
renovate[bot] 6e836e0860 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>
2025-03-15 09:18:26 +01:00
renovate[bot] 65492d7f3b chore(universal-xml-plugin): update dependency fast-xml-parser to v5 (#21109)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-14 12:38:14 +01:00
renovate[bot] c07045ea48 chore(docutils): update dependency mkdocs-material to v9.6.8 (#21108)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-14 08:35:46 +01:00
renovate[bot] 1f68195ff3 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>
2025-03-14 07:31:45 +00:00
renovate[bot] fd09d7fa0f 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>
2025-03-13 09:36:52 +00:00
renovate[bot] 04f140a4ad chore(execute-driver-plugin): update dependency webdriverio to v9.12.0 (#21072) 2025-03-12 19:55:32 +01:00
renovate[bot] 3f077db410 chore(support): update dependency axios to v1.8.3 (#21102)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-12 15:03:59 +00:00
renovate[bot] 3bda97f3c5 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>
2025-03-12 11:26:23 +00:00
Jonathan Lipps 7c05f5c213 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
2025-03-11 14:40:58 -07:00
Mykola Mokhnach e68757b349 fix(base-driver): Fix proxy url generation (#21099) 2025-03-11 19:27:57 +01:00
renovate[bot] f007b46a65 chore(deps): update eslint-related packages (#21097)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-11 10:28:26 +00:00
Edgars Eglītis f9b51ec526 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
2025-03-10 19:45:28 +02:00
renovate[bot] 884173f967 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>
2025-03-10 16:37:11 +00:00
Mykola Mokhnach f3b1f3556c chore(storage-plugin): Simplify add to storage logic (#21092) 2025-03-09 20:12:10 +01:00
Sakura Nene ef3d781d88 docs(appium): fix a broken character that caused incorrect rendering of mkdocs (#21090) (#21091) 2025-03-09 17:28:08 +01:00
Mykola Mokhnach 15280b80d2 feat(storage-plugin): Tune the files keeping behaviour (#21086) 2025-03-09 09:34:32 +01:00
renovate[bot] 365a7b1770 chore(deps): update eslint-related packages to v9.22.0 (#21085)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-08 22:49:45 +00:00
Kazuaki Matsuo d1e7124d4d docs(base-driver): remove outdated READMEs (#21083) 2025-03-08 09:18:25 -08:00
renovate[bot] cb799d7ab8 chore(deps): update dependency @types/node to v22.13.10 (#21084)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-08 13:24:36 +00:00
Mykola Mokhnach ba4aa394d1 feat: Add storage plugin (#21075) 2025-03-08 09:21:10 +01:00
Kazuaki Matsuo a4eda0054b chore(fake-driver): accept 3.0.0-beta.0 as well (#21076) 2025-03-07 18:51:49 -08:00
renovate[bot] dbd0d321e0 chore(deps): update dependency eslint-config-prettier to v10.1.1 (#21081)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-07 14:39:41 +00:00
renovate[bot] c6d5383425 chore(support): update dependency axios to v1.8.2 (#21080)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-07 10:40:52 +00:00
Mykola Mokhnach 859f3c430a test(images-plugin): Fix test host (#21079) 2025-03-07 09:03:54 +01:00
Mykola Mokhnach e3560e0bee test: Update tests of images plugin (#21078) 2025-03-07 07:56:28 +01:00
renovate[bot] 51eea37e93 chore(deps): update dependency finalhandler to v2 (#21074)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-06 14:21:47 +01:00
renovate[bot] 053c105f6f chore(types): update dependency type-fest to v4.37.0 (#21073)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-06 14:21:16 +01:00
kkb912002 0c50504266 feat(images-plugin): supports image elements included in actions. (#21055) 2025-03-06 14:20:55 +01:00
renovate[bot] 1766a8d0cf 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>
2025-03-06 11:40:34 +00:00
renovate[bot] dbad59f1ff chore(docutils): update dependency typescript to v5.8.2 (#21057)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-06 06:34:24 +00:00
renovate[bot] b70ddd50a8 chore(deps): update definitelytyped (#21067)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-06 02:11:37 +00:00
renovate[bot] bbe04a7ac0 chore(deps): update dependency typescript-eslint to v8.26.0 (#21068)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-05 22:16:07 +00:00
renovate[bot] a7c9f6198a 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>
2025-03-05 16:30:05 +00:00
renovate[bot] c5723e7655 chore(tsconfig): update dependency @tsconfig/node14 to v14.1.3 (#21065)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-05 10:59:02 +00:00
282 changed files with 10073 additions and 13040 deletions
+2 -4
View File
@@ -3,7 +3,6 @@ on:
push:
branches:
- master
- appium3
# this list of paths could potentially impact the build
paths:
- '**/tsconfig*.json'
@@ -25,7 +24,6 @@ on:
pull_request:
branches:
- master
- appium3
paths:
- '**/tsconfig*.json'
- 'packages/base-driver/static/**/*'
@@ -79,7 +77,7 @@ jobs:
# - macos-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
@@ -97,7 +95,7 @@ jobs:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- 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@v5
uses: actions/checkout@v4
- name: Cleanup
run: |
@@ -4,15 +4,17 @@ name: Sync Crowdin Docs Translations
on:
workflow_dispatch:
schedule:
- cron: 0 0 * * *
# TODO: Uncomment the scheduler as soon as we have existing translations
# imported to Crowdin
# schedule:
# - cron: 0 0 * * 0
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Use Node.js LTS
uses: actions/setup-node@v4
with:
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- 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@v5
- uses: actions/checkout@v4
- 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@v5
- uses: actions/checkout@v4
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@v5
- uses: actions/checkout@v4
- 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@v5
- uses: actions/checkout@v4
- name: Validate Renovate Config
uses: rinchsan/renovate-config-validator@v0.2.0
with:
-10
View File
@@ -204,16 +204,6 @@ contribution of project development and leadership!
</a>
</p>
<p align="center">
<a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
<picture>
<source srcset="packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-dark.png" media="(prefers-color-scheme: dark)"/>
<source srcset="packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-light.png" media="(prefers-color-scheme: light)"/>
<img src="packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-dark.png" width="300" alt="LambdaTest"/>
</picture>
</a>
</p>
### Other Sponsors
A full list of sponsors is available at our [Sponsors page](https://appium.io/docs/en/latest/sponsors/).
+1 -1
View File
@@ -14,7 +14,7 @@
"version": {
"conventionalCommits": true,
"createRelease": "github",
"allowBranch": ["master", "appium3"]
"allowBranch": "master"
}
},
"ignoreChanges": ["**/test/**", "**/*.md"],
+3389 -4895
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",
"sync-pkgs:common-fields:logger": "sync-monorepo-packages --packages=\"packages/logger\" --fields=author,bugs,homepage",
"sync-pkgs:common-fields:default": "sync-monorepo-packages --packages=\"!packages/logger\" --fields=author,license,bugs,homepage,engines",
"sync-pkgs:common-fields:logger": "sync-monorepo-packages --packages=\"packages/logger\" --fields=author,bugs,homepage,engines",
"sync-pkgs:keywords": "sync-monorepo-packages --field=keywords --packages=\"packages/*\" --packages=\"!packages/types\" --packages=\"!packages/eslint-config-appium-ts\" ",
"sync-pkgs:license": "sync-monorepo-packages --force --no-package-json --packages=\"!packages/logger\" LICENSE",
"test": "run-s test:quick",
@@ -85,26 +85,26 @@
},
"devDependencies": {
"@colors/colors": "1.6.0",
"@eslint/js": "9.33.0",
"@tsconfig/node14": "14.1.4",
"@eslint/js": "9.28.0",
"@tsconfig/node14": "14.1.3",
"@types/argparse": "2.0.17",
"@types/archiver": "6.0.3",
"@types/async-lock": "1.4.2",
"@types/base64-stream": "1.0.5",
"@types/bluebird": "3.5.42",
"@types/chai": "5.2.2",
"@types/chai": "5.2.1",
"@types/chai-as-promised": "8.0.2",
"@types/express": "5.0.3",
"@types/express": "5.0.1",
"@types/jsftp": "2.1.5",
"@types/json-schema": "7.0.15",
"@types/klaw": "3.0.7",
"@types/klaw": "3.0.6",
"@types/lockfile": "1.0.4",
"@types/lodash": "4.17.20",
"@types/lodash": "4.17.16",
"@types/method-override": "3.0.0",
"@types/mocha": "10.0.10",
"@types/mv": "2.1.4",
"@types/ncp": "2.0.8",
"@types/node": "22.17.2",
"@types/node": "22.15.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.1",
"chai": "5.2.0",
"chai-as-promised": "8.0.1",
"conventional-changelog-conventionalcommits": "7.0.2",
"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",
"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",
"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.3",
"lerna": "8.2.2",
"log-symbols": "4.1.0",
"midnight-smoker": "8.0.0",
"mjpeg-consumer": "2.0.0",
"mjpeg-server": "0.3.1",
"mocha": "11.7.1",
"npm-run-all2": "8.0.4",
"prettier": "3.6.2",
"mocha": "11.5.0",
"npm-run-all2": "6.2.6",
"prettier": "3.5.3",
"rewiremock": "3.14.6",
"rimraf": "6.0.1",
"serve-static": "2.2.0",
"sinon": "21.0.0",
"rimraf": "5.0.10",
"serve-static": "1.16.2",
"sinon": "20.0.0",
"sync-monorepo-packages": "1.0.2",
"teen_process": "3.0.0",
"ts-node": "10.9.2",
"tsd": "0.33.0",
"typescript": "5.9.2",
"typescript-eslint": "8.39.1",
"webdriverio": "9.19.1",
"ws": "8.18.3",
"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",
"yaml-js": "0.3.1"
},
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
"npm": ">=10"
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
"npm": ">=8"
},
"publishConfig": {
"access": "public"
-36
View File
@@ -3,42 +3,6 @@
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,16 +204,6 @@ contribution of project development and leadership!
</a>
</p>
<p align="center">
<a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
<picture>
<source srcset="packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-dark.png" media="(prefers-color-scheme: dark)"/>
<source srcset="packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-light.png" media="(prefers-color-scheme: light)"/>
<img src="packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-dark.png" width="300" alt="LambdaTest"/>
</picture>
</a>
</p>
### Other Sponsors
A full list of sponsors is available at our [Sponsors page](https://appium.io/docs/en/latest/sponsors/).
@@ -1,42 +0,0 @@
---
authors:
- jlipps
date: 2025-07-01
---
# Announcing LambdaTest as Appium Strategic Partner
After recently celebrating the 1-year anniversary of our [Sponsorship Program and Compensation
Scheme](https://appium.io/docs/en/latest/blog/2024/05/14/announcing-appiums-sponsorship-program/),
the Appium project is very excited to announce that <a
href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">LambdaTest</a>
is coming on board as one of our Strategic Partners!
<!-- more -->
<div style="text-align:center;width:100%">
<a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-dark.png#only-dark" width="300" />
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-light.png#only-light" width="300" />
</a>
</div>
Having long been active in the Appium community and the automated testing industry, LambdaTest is
now significantly stepping up their investment into these areas. With the decision to come on board
as a Strategic Partner, LambdaTest will support the Appium project through financial contribution
as well as contribution of code and project maintenance. Obviously, without the generous support of
partners like LambdaTest, we would not be able to continue our contributor compensation scheme,
which has seen the release of a substantial amount of funds to Appium maintainers and contributors
over the last year. Thanks again to LambdaTest, and stay tuned for more collaboration updates
throughout the year!
**About LambdaTest**
<em>LambdaTest is a GenAI-powered Quality Engineering Platform that empowers teams to test
intelligently, smarter, and ship faster. Built for scale, it offers a full-stack testing cloud with
10K+ real mobile devices and 3,000+ browsers. With AI-native test management, MCP servers, and
agent-based automation, LambdaTest supports Selenium, Appium, Playwright, and all major frameworks.
AI Agents like HyperExecute and KaneAI bring the power of AI and cloud into your software testing
workflow, enabling seamless automation testing with 120+ integrations. LambdaTest Agents accelerate
your testing throughout the entire SDLC, from test planning and authoring to automation,
infrastructure, execution, RCA, and reporting.</em>
@@ -1,40 +0,0 @@
---
authors:
- sai
- srini
- jlipps
date: 2025-08-07
---
# 🚀 Appium 3
Appium 3 is here — and while it's not as massive a leap as Appium 2, it introduces a few essential
breaking changes that developers and QA engineers should be aware of.
<!-- more -->
The main idea behind Appium 3 is to clear out old cruft so that Appium can be leaner moving
forward, and rely on newer versions of software with better performance and security
characteristics. We're also getting rid of legacy behaviors and protocols that we deprecated as
part of Appium 2.
For you as a user, there's not much to worry about. The breaking changes are minimal:
- Node.js / NPM minimum version bump (to 20.19 / 10)
- Removal of certain deprecated endpoints
- Security feature flag prefix requirements (e.g. `adb_shell` to `uiautomator2:adb_shell`)
In terms of new features, we've been adding them incrementally rather than saving them up for
Appium 3. But with this release we are excited to share these new capabilities:
- `appium plugin install inspector` (Use Appium to host the Inspector rather than downloading it as a separate app)
- Clients can set the `X-Appium-Is-Sensitive` HTTP header on requests to direct the server to mask the data in the request in the logs, so that when you send a password into an input box, the password's actual value is not logged in plaintext. ([Learn more](../../developing/sensitive.md))
Of course, we have a full [Appium 3 migration guide](../../guides/migrating-2-to-3.md) to make sure
you know all the details and can deeply understand the consequences of upgrading to Appium 3 in
your environment.
---
**Ready to make the leap?** Appium 3 is a great step forward in creating more secure, maintainable,
and W3C-compliant test automation pipelines. Happy testing!
+84 -14
View File
@@ -233,6 +233,28 @@ 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.
@@ -271,6 +293,22 @@ 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
@@ -299,9 +337,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)
### `getAppiumSessions`
### `getSessions`
`GET` **`/appium/sessions`**
`GET` **`/sessions`**
Get data for all sessions running on an Appium server
@@ -309,27 +347,17 @@ Get data for all sessions running on an Appium server
#### Response
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
A list of session data objects.
Each session data object will be returned with `id` and the session's capabilities as `capabilities` keys like an example below:
```json
[
{
"id":"ba30c6da-c266-4734-8ddb-c16f5bb53e16",
"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" }
},
...
@@ -472,6 +500,30 @@ 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`**
@@ -490,3 +542,21 @@ 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,7 +20,6 @@ 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-classic-commands)). Curious what command names there
implemented](./build-drivers.md#implement-webdriver-commands)). Curious what command names there
are? They are defined in the Appium base driver's
[routes.js](https://github.com/appium/appium-base-driver/blob/master/lib/protocol/routes.js) file,
and of course you can add more as defined in the next section.
@@ -250,7 +250,7 @@ An `ArgSpec` object stores the following metadata:
| `dest` | Property name in parsed arguments object (as returned by `argparse`'s `parse_args()`) |
| `defaultValue?` | Value of the `default` keyword in schema, if appropriate |
When a schema is [finalized](#schema-loading), the `Map` is populated with `ArgSpec` objects
When a schema is [finalized](#schema-finalization), the `Map` is populated with `ArgSpec` objects
for all known arguments.
So when the adapter is creating the pipeline of functions for the argument's `type`, it already has
@@ -22,7 +22,6 @@ 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,7 +67,12 @@ generate various kinds of reports from event timings output:
## Add a custom event
!!! warning "TODO"
The links to the commands in the following paragraph do not yet work since these docs are under
construction.
You can add custom events that will show up in the event timings data. You can send a custom event
name to the Appium server using the [Log Custom Event API](../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.
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.
@@ -1,463 +0,0 @@
---
title: Migrating to Appium 3
---
<style>
.md-typeset .grid {
grid-template-columns: repeat(auto-fit,minmax(min(100%,11rem),1fr));
}
</style>
This document is a guide for those who are using Appium 2 and would like to upgrade to Appium 3.
It contains a list of breaking changes, as well as suggestions for handling them.
While Appium 2 was a major overhaul of the entire Appium architecture, Appium 3 is a smaller
upgrade with fewer breaking changes, which should result in a much simpler migration process.
## Installation
The installation method for Appium 3 remains the same as for Appium 2. If you want to upgrade, you
can simply install Appium 3 on top of your existing installation:
```bash
# optional: `appium setup reset`
npm install -g appium
```
## Breaking Changes
### Node 20+ Required
With Appium 2, the minimum required Node version was `14.17.0`. Support for Node 14 had already
ended before the release of Appium 2, which meant that even users on outdated Node versions were
able to use it.
Appium 3 drops support for outdated Node versions, and bumps the minimum required version to Node
`20.19.0`, 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
+32 -24
View File
@@ -27,20 +27,9 @@ Appium when starting it from the command line:
|<div style="width:10em">Parameter</div>|Description|
|---------------------------------------|-----------|
|`--relaxed-security`|Turns on _all_ insecure features, except those blocked by `--deny-insecure`|
|`--allow-insecure`|Turns on _only_ specified features, except those blocked by `--deny-insecure`. Has no effect when used in combination with `--relaxed-security`|
|`--deny-insecure`|Explicitly turns _off_ specified features, overriding `--relaxed-security` and `--allow-insecure`|
All of the above arguments can also be specified in the [Appium Configuration file](./config.md).
Features passed to `--allow-insecure`/`--deny-insecure` must be specified as a comma-separated list,
and each feature in the list must additionally include a prefix, indicating the driver to which the
feature should apply. The prefix can be either the driver's `automationName`, or the wildcard (`*`)
symbol, if the feature should be applied to all drivers. The prefix and feature name are separated
using the colon character (`:`).
For example, `first:foo` refers to the `foo` feature for the `first` driver, whereas `*:bar` refers
to the `bar` feature for all drivers.
|`--relaxed-security`|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).|
## Insecure Features
@@ -55,8 +44,7 @@ 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. Enabling
these features requires using the wildcard prefix:
Some insecure features operate on the server level, and do not require a driver session:
|<div style="width:12em">Feature Name</div>|Description|
|------------|-----------|
@@ -64,26 +52,46 @@ these features requires using the wildcard prefix:
## Examples
Turn on the `foo` feature only for the `first` driver:
To turn on the `get_server_logs` feature, the Appium server could be started like this:
```bash
appium --allow-insecure=first:foo
appium --allow-insecure=get_server_logs
```
Turn on the `foo` feature for all drivers:
To turn on multiple features:
```bash
appium --allow-insecure=*:foo
appium --allow-insecure=get_server_logs,record_audio
```
Turn on the `foo` feature for all drivers _except_ `first`:
To allow all features except one:
```bash
appium --allow-insecure=*:foo --deny-insecure=first:foo
appium --relaxed-security --deny-insecure=adb_shell
```
Turn on all features _except_ `foo` for all drivers:
## 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:
```bash
appium --relaxed-security --deny-insecure=*:foo
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.
-6
View File
@@ -33,12 +33,6 @@ Android TV, Samsung), and more!
<img src="assets/images/sponsor-logo-browserstack-light.png#only-light" style="width: 220px;" />
</a>
</div>
<div class="homepageSponsor">
<a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
<img src="assets/images/sponsor-logo-lambdatest-dark.png#only-dark" style="width: 220px;" />
<img src="assets/images/sponsor-logo-lambdatest-light.png#only-light" style="width: 220px;" />
</a>
</div>
</div>
</div>
@@ -8,9 +8,9 @@ title: System Requirements
The basic requirements for the Appium server are:
* A macOS, Linux, or Windows operating system
* [Node.js](https://nodejs.org) version in the [SemVer](https://semver.org) range `^20.19.0 || ^22.12.0 || >=24.0.0`
* [Node.js](https://nodejs.org) version in the [SemVer](https://semver.org) range `^14.17.0 || ^16.13.0 || >=18.0.0`
* LTS is recommended
* [`npm`](https://npmjs.com) version `>=10` (`npm` is usually bundled with Node.js, but can be upgraded
* [`npm`](https://npmjs.com) version `>=8` (`npm` is usually bundled with Node.js, but can be upgraded
independently)
By itself, Appium is relatively lightweight and doesn't have significant disk space or RAM
-5
View File
@@ -33,11 +33,6 @@ 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](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
@@ -1,41 +0,0 @@
---
authors:
- jlipps
date: 2025-07-01
---
# Announcing LambdaTest as Appium Strategic Partner
After recently celebrating the 1-year anniversary of our Sponsorship Program and Compensation
Scheme,
the Appium project is very excited to announce that <a
href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">LambdaTest</a>
is coming on board as one of our Strategic Partners!
<!-- more -->
<div style="text-align:center;width:100%"><a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-dark.png#only-dark" width="300" />
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-light.png#only-light" width="300" />
</a>
</div>
Having long been active in the Appium community and the automated testing industry, LambdaTest is
now significantly stepping up their investment into these areas. With the decision to come on board
as a Strategic Partner, LambdaTest will support the Appium project through financial contribution
as well as contribution of code and project maintenance. Obviously, without the generous support of
partners like LambdaTest, we would not be able to continue our contributor compensation scheme,
which has seen the release of a substantial amount of funds to Appium maintainers and contributors
over the last year. Thanks again to LambdaTest, and stay tuned for more collaboration updates
throughout the year!
**About LambdaTest**
<em>LambdaTest is a GenAI-powered Quality Engineering Platform that empowers teams to test
intelligently, smarter, and ship faster. Built for scale, it offers a full-stack testing cloud with
10K+ real mobile devices and 3,000+ browsers. With AI-native test management, MCP servers, and
agent-based automation, LambdaTest supports Selenium, Appium, Playwright, and all major frameworks.
AI Agents like HyperExecute and KaneAI bring the power of AI and cloud into your software testing
workflow, enabling seamless automation testing with 120+ integrations. LambdaTest Agents accelerate
your testing throughout the entire SDLC, from test planning and authoring to automation,
infrastructure, execution, RCA, and reporting.</em>
@@ -1,40 +0,0 @@
---
authors:
- sai
- srini
- jlipps
date: 2025-08-07
---
# 🚀 Appium 3
Appium 3 is here — and while it's not as massive a leap as Appium 2, it introduces a few essential
breaking changes that developers and QA engineers should be aware of.
<!-- more -->
The main idea behind Appium 3 is to clear out old cruft so that Appium can be leaner moving
forward, and rely on newer versions of software with better performance and security
characteristics. We're also getting rid of legacy behaviors and protocols that we deprecated as
part of Appium 2.
For you as a user, there's not much to worry about. The breaking changes are minimal:
- Node.js / NPM minimum version bump (to 20.19 / 10)
- Removal of certain deprecated endpoints
- Security feature flag prefix requirements (e.g. `adb_shell` to `uiautomator2:adb_shell`)
In terms of new features, we've been adding them incrementally rather than saving them up for
Appium 3. But with this release we are excited to share these new capabilities:
- `appium plugin install inspector` (Use Appium to host the Inspector rather than downloading it as a separate app)
- Clients can set the `X-Appium-Is-Sensitive` HTTP header on requests to direct the server to mask the data in the request in the logs, so that when you send a password into an input box, the password's actual value is not logged in plaintext. ([Learn more](../../developing/sensitive.md))
Of course, we have a full [Appium 3 migration guide](../../guides/migrating-2-to-3.md) to make sure
you know all the details and can deeply understand the consequences of upgrading to Appium 3 in
your environment.
---
**Ready to make the leap?** Appium 3 is a great step forward in creating more secure, maintainable,
and W3C-compliant test automation pipelines. Happy testing!
-1
View File
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Server Command-Line Arguments
---
-1
View File
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Server Environment Variables
---
-1
View File
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Command-Line Overview
---
-1
View File
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Setup Command-Line Usage
---
+92 -14
View File
@@ -234,6 +234,30 @@ 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.
@@ -272,6 +296,24 @@ 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
@@ -300,9 +342,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)
### `getAppiumSessions`
### `getSessions`
`GET` **`/appium/sessions`**
`GET` **`/sessions`**
Get data for all sessions running on an Appium server
@@ -310,27 +352,17 @@ Get data for all sessions running on an Appium server
#### Response
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
A list of session data objects.
Each session data object will be returned with `id` and the session's capabilities as `capabilities` keys like an example below:
```json
[
{
"id":"ba30c6da-c266-4734-8ddb-c16f5bb53e16",
"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" }
},
...
@@ -482,6 +514,32 @@ 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`**
@@ -500,3 +558,23 @@ 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,7 +1,6 @@
---
hide:
- toc
title: Intro to Commands
---
@@ -22,7 +21,6 @@ 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,7 +1,6 @@
---
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 strictly
the `appiumCliTransformer` keyword on an `array`-or-`object`-typed property is not stricly
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-loading), the `Map` is populated with `ArgSpec` objects
When a schema is [finalized](#schema-finalization), the `Map` is populated with `ArgSpec` objects
for all known arguments.
So when the adapter is creating the pipeline of functions for the argument's `type`, it already has
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Intro to Development
---
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Masking Sensitive Log Data
---
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Appium Clients
---
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Appium Drivers
---
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Ecosystem Overview
---
+7 -9
View File
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Appium Plugins
---
@@ -19,14 +18,13 @@ 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 |
| [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 |
| <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 |
### Other Plugins
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Appium-Related Tools
---
+62 -37
View File
@@ -2,65 +2,89 @@
title: Session Capabilities
---
「Capabilities」は、Appiumセッションを開始するために使用されるパラメータセットに付けられた名前です。 セット内の情報は、セッションにどのような「Capabilities」を持たせたいかを表します。たとえば、特定のモバイルオペレーティングシステムや特定のデバイスバージョンなどです。 Capabilities はキーと値のペアとして表され、値には他のオブジェクトを含む任意の有効な JSON 型を使用できます。
"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.
W3C WebDriver 仕様の [Capabilities に関するセクション](https://w3c.github.io/webdriver/#capabilities) では、以下の機能を含む 10 個の標準機能のセットが定義されています:
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:
| Capability 名 | 型 | 説明 |
| ---------------- | -------- | --------------------- |
| `browserName` | `string` | 起動して自動化するブラウザの名前 |
| `browserVersion` | `string` | ブラウザのバージョン |
| `platformName` | `string` | ブラウザをホストするプラットフォームの種類 |
| 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 |
## 一般的なAppiumのCapabilities
## Common Appium Capabilities
Appium はこれらのブラウザに焦点を当てた capabilities を理解しますが、いくつかの capabilities も追加導入しています。 WebDriver 仕様によれば、非標準の「拡張 capabilities」には、capabilities を導入したベンダーを示す名前空間となる接頭辞(末尾に「:」)を含める必要があります。 Appium の接頭辞は「appium:」であるため、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 の一覧です:
Here is a list of all the globally-recognized Appium capabilities:
!!! info
```
個々のドライバやプラグインは独自の capabilities をサポートしている場合があるため、具体的な capability 名のリストについては、それぞれのドキュメントを参照してください。また、一部のドライバはこれらの capabilities をすべてサポートしていない場合があります
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
```
| <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`) |
| <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`) |
ドライバーの中には、capabilitiesのより複雑な制約をグループとして設定しているものもあります。 たとえば、`appium:app` および `browserName` capabilities は上記では必須ではないと記載していますが、特定のアプリでセッションを開始する場合、XCUITest ドライバーは、`appium:app`、`browserName`、または `appium:bundleId` の少なくとも1 つが capabilities に含まれていることが必要です (含まれていない場合、どのアプリをインストールまたは起動すればよいか判断できないため、ホーム画面からセッションが開かれます)。 各ドライバーは、これらの capabilities やその他のプラットフォーム固有の要件をどのように解釈するかを記述しています。
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.
!!! note
```
Capabilitiesは、セッション開始時に使用されるパラメータのようなものです。Capabilitiesが送信され、セッションが開始された後変更できません。ドライバーがセッション中に動作の一部を更新する場合、capabilitiesの代わりに、またはcapabilitiesに加えて、[Settings](./settings.md)も利用可能です。
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.
```
各 Appium クライアントには、capabilities を構築し、セッションを開始する独自の方法があります。 各クライアントライブラリでこれを行う例については、[エコシステム](../ecosystem/index.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.
## BiDi プロトコルのサポート
## BiDi Protocol Support
Appiumは、base-driver 9.5.0以降で[WebDriver BiDi](https://w3c.github.io/webdriver-bidi/)プロトコルをサポートしています。
実際の動作は個々のドライバーによって異なりますが、Appium と base-driver はプロトコルをサポートしています。
ドライバーが 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.
| Capability 名 | 型 | 説明 |
| -------------- | --------- | ------------------------- |
| `webSocketUrl` | `boolean` | セッションで BiDi プロトコルを有効にします。 |
| Capability Name | Type | Description |
| --------------- | --------- | ------------------------------------------------------- |
| `webSocketUrl` | `boolean` | To enable BiDi protocol in the session. |
## `appium:options` を使用して機能をグループ化する
## Using `appium:options` to Group Capabilities
テストで `appium:` 機能を多用すると、繰り返しが多くなる可能性があります。 代わりに、すべての機能を単一の `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:
```json
{
@@ -75,7 +99,8 @@ Appiumは、base-driver 9.5.0以降で[WebDriver BiDi](https://w3c.github.io/web
}
```
機能値自体がオブジェクトである場合の構築方法は言語によって異なることに注意してください。これを実現する方法の詳細な例については、クライアントのドキュメントを参照してください。
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,7 +1,6 @@
---
hide:
- toc
title: Managing Contexts
---
+10 -4
View File
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Retrieving Event Timings
---
@@ -69,7 +68,14 @@ 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 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.
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.
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Execute Methods
---
@@ -1,457 +0,0 @@
---
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
+37 -26
View File
@@ -25,22 +25,11 @@ 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, 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.
| <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). |
## Insecure Features
@@ -55,8 +44,7 @@ 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. Enabling
these features requires using the wildcard prefix:
Some insecure features operate on the server level, and do not require a driver session:
| <div style="width:12em">Feature Name</div> | Description |
| ------------------------------------------ | ------------------------------------------------------------------------------- |
@@ -64,26 +52,49 @@ these features requires using the wildcard prefix:
## Examples
Turn on the `foo` feature only for the `first` driver:
To turn on the `get_server_logs` feature, the Appium server could be started like this:
```bash
appium --allow-insecure=first:foo
appium --allow-insecure=get_server_logs
```
Turn on the `foo` feature for all drivers:
To turn on multiple features:
```bash
appium --allow-insecure=*:foo
appium --allow-insecure=get_server_logs,record_audio
```
Turn on the `foo` feature for all drivers _except_ `first`:
To allow all features except one:
```bash
appium --allow-insecure=*:foo --deny-insecure=first:foo
appium --relaxed-security --deny-insecure=adb_shell
```
Turn on all features _except_ `foo` for all drivers:
## 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:
```bash
appium --relaxed-security --deny-insecure=*:foo
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.
```
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Session Settings
---
-1
View File
@@ -1,7 +1,6 @@
---
hide:
- toc
title: SSL/TLS/SPDY Support
---
+1 -8
View File
@@ -2,7 +2,6 @@
hide:
- navigation
- toc
title: ようこそ
---
@@ -29,12 +28,6 @@ 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>
@@ -42,7 +35,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,7 +1,6 @@
---
hide:
- toc
title: Intro to Appium Clients
---
-1
View File
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Appium in a Nutshell
---
@@ -1,7 +1,6 @@
---
hide:
- toc
title: "クイックスタート: はじめに"
---
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Appiumをインストールする
---
@@ -1,19 +1,22 @@
---
hide:
- toc
title: 次のステップ
title: Next Steps
---
Android自動化用のシステムの設定と簡単なテストの実行が完了したら、このドキュメントを引き続き参照してください。 特に初心者にとって、これらは優れたガイドと参考資料です:
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:
- [エコシステム](../ecosystem/index.md) ページ: 利用可能なドライバー、クライアント、プラグイン、ツールを見る
- [Appium ドライバーとプラグインの管理](../guides/managing-exts.md)
- The [Ecosystem](../ecosystem/index.md) page: browse the available drivers, clients, plugins, and tools
- [Managing Appium Drivers and Plugins](../guides/managing-exts.md)
- [Capabilities](../guides/caps.md)
- [Settings](../guides/settings.md)
また、[Appium Inspector](https://github.com/appium/appium-inspector) は、アプリの視覚的な検査を可能にし、テストスクリプトで使用する要素ロケーターを見つけるのに役立つ、Appium テストの作成に不可欠なツールです。
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 コースもご活用いただけます。
You might also take advantage of one of the many online Appium courses available to you.
頑張って楽しんでください!
Good luck and have fun!
@@ -1,16 +1,15 @@
---
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 `^20.19.0 || ^22.12.0 || >=24.0.0`
- [Node.js](https://nodejs.org) version in the [SemVer](https://semver.org) range `^14.17.0 || ^16.13.0 || >=18.0.0`
- LTS is recommended
- [`npm`](https://npmjs.com) version `>=10` (`npm` is usually bundled with Node.js, but can be upgraded
- [`npm`](https://npmjs.com) version `>=8` (`npm` is usually bundled with Node.js, but can be upgraded
independently)
By itself, Appium is relatively lightweight and doesn't have significant disk space or RAM
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Write a Test (.NET)
---
@@ -83,7 +82,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 overridden using environment variables.
kind of thing you want to automate. Some of these parameters can be overriden 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,7 +1,6 @@
---
hide:
- toc
title: Write a Test (Java)
---
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Write a Test (JS)
---
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Write a Test (Python)
---
@@ -1,7 +1,6 @@
---
hide:
- toc
title: Write a Test (Ruby)
---
-1
View File
@@ -2,7 +2,6 @@
hide:
- navigation
- toc
title: Additional Resources
---
+12 -13
View File
@@ -2,7 +2,6 @@
hide:
- navigation
- toc
title: Sponsors & Backers
---
@@ -11,7 +10,9 @@ title: Sponsors & Backers
.sponsor-section img { height: 64px; padding-right: 1em; }
</style>
If you'd like to join this amazing group and help ensure Appium's continued development
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
and maintenance, you can contribute via Appium's OpenCollective
Hub.
@@ -22,23 +23,21 @@ 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">
<img src="/docs/en/latest/assets/images/sponsor-logo-browserstack-dark.png#only-dark" width="250" alt="BrowserStack" />
<img src="/docs/en/latest/assets/images/sponsor-logo-browserstack-light.png#only-light" width="250" alt="BrowserStack" />
</a>
<a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-dark.png#only-dark" width="250" alt="LambdaTest" />
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-light.png#only-light" width="250" alt="LambdaTest" />
<picture>
<source srcset="../assets/images/sponsor-logo-browserstack-dark.png" media="(prefers-color-scheme: dark)"/>
<source srcset="../assets/images/sponsor-logo-browserstack-light.png" media="(prefers-color-scheme: light)"/>
<img src="../assets/images/sponsor-logo-browserstack-dark.png" width="250" alt="Browserstack"/>
</picture>
</a>
## Gold Sponsors
<div class="sponsor-section">
<a href="https://jetify.com/" target="_blank"><img src="https://images.opencollective.com/jetify/415824c/avatar/64.png" alt="Jetify" /></a>
</div>
<a href="https://opencollective.com/appium" target="_blank"><img src="https://opencollective.com/appium/tiers/gold-sponsor.svg?avatarHeight=100&button=false&random=1"/></a>
[Become a Gold Sponsor](https://opencollective.com/appium/contribute/gold-sponsor-72877/checkout?interval=month&amount=500&contributeAs=me)
-1
View File
@@ -50,7 +50,6 @@ 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,7 +50,6 @@ nav:
- commands/universal-xml-plugin.md
- ガイド:
- 移行:
- guides/migrating-2-to-3.md
- guides/migrating-1-to-2.md
- サーバ/ドライバの設定:
- guides/managing-exts.md
+10 -14
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: Appium自动化项目文档
site_description: The Appium automation project documentation
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,23 +46,20 @@ nav:
- commands/execute-driver-plugin.md
- commands/images-plugin.md
- commands/relaxed-caps-plugin.md
- commands/storage-plugin.md
- commands/universal-xml-plugin.md
- 指南:
- 迁移:
- guides/migrating-2-to-3.md
- Migration:
- 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
@@ -75,8 +72,7 @@ nav:
- developing/build-plugins.md
- developing/build-docs.md
- developing/build-doctor-checks.md
- developing/sensitive.md
- 开发者参考:
- developing/config-system.md
- 贡献: contributing.md
- 赞助商: sponsors.md
- 贡献:
- contributing/index.md
- contributing/develop.md
- contributing/config-system.md
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

@@ -4,8 +4,4 @@
<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. 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
@@ -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,
program](https://appium.io/docs/en/latest/blog/2024/05/14/announcing-appiums-sponsorship-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>!
@@ -1,41 +0,0 @@
---
authors:
- jlipps
date: 2025-07-01
---
# Announcing LambdaTest as Appium Strategic Partner
After recently celebrating the 1-year anniversary of our Sponsorship Program and Compensation
Scheme,
the Appium project is very excited to announce that <a
href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">LambdaTest</a>
is coming on board as one of our Strategic Partners!
<!-- more -->
<div style="text-align:center;width:100%"><a href="https://lambdatest.com/?utm_source=appium.io&utm_medium=organic&utm_campaign=june_25&utm_term=sk&utm_content=webpage">
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-dark.png#only-dark" width="300" />
<img src="/docs/en/latest/assets/images/sponsor-logo-lambdatest-light.png#only-light" width="300" />
</a>
</div>
Having long been active in the Appium community and the automated testing industry, LambdaTest is
now significantly stepping up their investment into these areas. With the decision to come on board
as a Strategic Partner, LambdaTest will support the Appium project through financial contribution
as well as contribution of code and project maintenance. Obviously, without the generous support of
partners like LambdaTest, we would not be able to continue our contributor compensation scheme,
which has seen the release of a substantial amount of funds to Appium maintainers and contributors
over the last year. Thanks again to LambdaTest, and stay tuned for more collaboration updates
throughout the year!
**About LambdaTest**
<em>LambdaTest is a GenAI-powered Quality Engineering Platform that empowers teams to test
intelligently, smarter, and ship faster. Built for scale, it offers a full-stack testing cloud with
10K+ real mobile devices and 3,000+ browsers. With AI-native test management, MCP servers, and
agent-based automation, LambdaTest supports Selenium, Appium, Playwright, and all major frameworks.
AI Agents like HyperExecute and KaneAI bring the power of AI and cloud into your software testing
workflow, enabling seamless automation testing with 120+ integrations. LambdaTest Agents accelerate
your testing throughout the entire SDLC, from test planning and authoring to automation,
infrastructure, execution, RCA, and reporting.</em>
@@ -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
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/)
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, which outlines how the
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
project is run, who makes project decisions, etc... This document will be kept up to date with the
latest details of the program, so that's the place to bookmark for reference!
As of now, Appium has opened up sponsorship opportunities via our OpenCollective
page. OpenCollective is a service which allows people to donate
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
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,
@@ -1,40 +0,0 @@
---
authors:
- sai
- srini
- jlipps
date: 2025-08-07
---
# 🚀 Appium 3
Appium 3 is here — and while it's not as massive a leap as Appium 2, it introduces a few essential
breaking changes that developers and QA engineers should be aware of.
<!-- more -->
The main idea behind Appium 3 is to clear out old cruft so that Appium can be leaner moving
forward, and rely on newer versions of software with better performance and security
characteristics. We're also getting rid of legacy behaviors and protocols that we deprecated as
part of Appium 2.
For you as a user, there's not much to worry about. The breaking changes are minimal:
- Node.js / NPM minimum version bump (to 20.19 / 10)
- Removal of certain deprecated endpoints
- Security feature flag prefix requirements (e.g. `adb_shell` to `uiautomator2:adb_shell`)
In terms of new features, we've been adding them incrementally rather than saving them up for
Appium 3. But with this release we are excited to share these new capabilities:
- `appium plugin install inspector` (Use Appium to host the Inspector rather than downloading it as a separate app)
- Clients can set the `X-Appium-Is-Sensitive` HTTP header on requests to direct the server to mask the data in the request in the logs, so that when you send a password into an input box, the password's actual value is not logged in plaintext. ([Learn more](../../developing/sensitive.md))
Of course, we have a full [Appium 3 migration guide](../../guides/migrating-2-to-3.md) to make sure
you know all the details and can deeply understand the consequences of upgrading to Appium 3 in
your environment.
---
**Ready to make the leap?** Appium 3 is a great step forward in creating more secure, maintainable,
and W3C-compliant test automation pipelines. Happy testing!
+53 -60
View File
@@ -1,70 +1,63 @@
---
hide:
- toc
title: Server Command-Line Arguments
title: 服务器命令行参数
---
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`或`appium server`。`server`子命令是他的默认命令,因此如果省略它,Appium会将认为您想要运行Appium服务器。
The invocation of `appium` (or `appium server`) can take a number of arguments, which are detailed
below.
`appium`(或`appium server`)的调用可以接受多个参数,详细信息如下。
!!! note
!!! 注意
```
All of these arguments can be set via a [Configuration File](../guides/config.md) instead if
you want. Any arguments set on the command line will override any arguments found in
a configuration file.
```
如果您愿意,所有这些参数都可以通过[配置文件](../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`|
| <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` |
以下参数用于信息检索,运行之后服务器将自动退出。因此,它们仅供参考或调试使用。
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` |
|<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`|
+16 -17
View File
@@ -1,23 +1,22 @@
---
hide:
- toc
title: Server Environment Variables
title: 服务器环境变量
---
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:
配置Appium服务器的主要方式是通过[命令行参数](./args.md)。然而,一些更高级的功能是通过环境变量切换或配置的。
要设置环境变量,请参阅操作系统和终端的文档。这些是Appium服务器能够理解的环境变量:
| 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. |
|变量&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);默认情况下禁用。|
+93 -120
View File
@@ -1,60 +1,50 @@
---
title: Extension Command-Line Usage
title: 扩展命令行用法
---
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允许灵活安装和管理各种扩展,例如驱动程序(为Appium提供自动化给定平台的能力)和插件(可以增强或改变单个Appium命令的工作方式)。
要从概念上理解这些实体,请查看[引言](../intro/index.md)。
Management of drivers and plugins is handled by Appium's Extension CLI (command-line interface).
驱动程序和插件的管理由Appium的扩展命令行处理。
!!! note
!!! 注意
```
This reference uses placeholders to refer to various options. Anywhere you see one of these
placeholders in the reference, ensure you replace it with the correct type of actual content.
```
这篇文档使用了占位符来指代各种选项。在参考文档中,任何时候你看到这些占位符,确保你用正确的实际内容替换它们。
|占位符|含义|
|--|--|
|`<ext-type>`|"Extension type",它应该是`driver`或`plugin`;所有的扩展命令行都可以与驱动程序或插件一起使用,因此您必须指定将使用哪种类型的扩展。|
|`<ext-name>`|"Extension name",这是对`appium <ext-type> list`的调用中找到的扩展名的简称;这与扩展的NPM包名不同,或者通常来说,与扩展的“安装规范”是有所区别的。|
|`<install-spec>`|"Install specification",这是指用于指示Appium应安装什么扩展的字符串。|
|`<install-source>`|这是指Appium安装扩展程序应该使用的方法。|
| Placeholder | Meaning |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `<ext-type>` | "Extension type". It should be either `driver` or `plugin`. All the Extension CLI commands can be used with either drivers or plugins, so you must specify which type of extension will be used |
| `<ext-name>` | "Extension name". This is the short name of the extension found in a call to `appium <ext-type> list`. This is distinct from the NPM package name of the extension or, in general, the "install spec" of the extension. |
| `<install-spec>` | "Install specification". This refers to the string used to indicate what extension Appium should install. |
| `<install-source>` | This refers to the method that Appium should use to install an extension. |
## 命令
## Commands
所有扩展命令行都以`appium <ext-type>`开头,即 `appium driver`或`appium plugin`。
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.
所有扩展命令行都可以接受一个可选的`--json`参数,这个参数会让命令的输出结果以机器可读的JSON字符串形式返回,而不是标准的、为人类阅读优化的、带颜色的输出。
### `doctor`
Run doctor checks for the given extension, which validate whether the extension has its prerequisites
configured correctly. Note that not all extensions include doctor checks. See the
[Building Doctor Checks](../developing/build-doctor-checks.md) tutorial for more details on
how to create them.
运行给定扩展的医生检查,以验证扩展的先决条件是否配置正确。请注意,并非所有的扩展都包含医生检查工具。
有关如何创建它们的更多详细信息,请参阅[构建检查工具](../developing/build-doctor-checks.md)教程。
Usage:
使用方法:
```
appium <ext-type> doctor <ext-name>
```
Required arguments:
必须的参数:
- `<ext-type>`: must be `driver` or `plugin`
- `<ext-name>`: the name of the extension whose doctor checks you want to run
- `<ext-type>`:必须为`driver`或`plugin`
- `<ext-name>`:您要运行医生检查的扩展名
Optional arguments:
可选的参数:
- `--json`: return the result in JSON format
- `--json`:以JSON格式返回结果
Example (run doctor checks for the UiAutomator2 driver):
示例(运行UiAutomator2驱动程序的医生检查):
```
appium driver doctor uiautomator2
@@ -62,124 +52,110 @@ appium driver doctor uiautomator2
### `install`
Install an extension. If successful, respond with the short name of the extension which can be used
in other invocations of the Extension CLI. If the extension is a driver, also note which platforms
may be used with the driver.
安装一个扩展。如果安装成功,返回扩展的短名称,这个短名称可以在其他扩展命令行的调用中使用。如果扩展是一个驱动程序,还应该注明可以使用该驱动程序的平台。
Usage:
使用方法:
```
appium <ext-type> install <install-spec> [--source=<install-source>] [--package=<package-name>] [--json]
```
Required arguments:
必须的参数:
- `<ext-type>`: must be `driver` or `plugin`
- `<install-spec>`: this is the name, location, and/or version of the extension you want to
install. Its possible values are dependent on the `<install-source>` (see below).
- `<ext-type>`:必须为`driver`或`plugin`
- `<install-spec>`:这是您要安装的扩展的名称、位置或版本。其可能的值取决于`<install-source>`(见下文)。
Optional arguments:
可选的参数:
- `--source`: this directs Appium where to find your extension. See below for a table of possible
source types and corresponding install specification.
- `--package`: when `<install-source>` is `git` or `github`, `--package` is required. It should be
the Node.js package name of the extension. Without this information, Appium will not be able to
find the installed package.
- `--json`: return the result in JSON format
- `--source`:告诉Appium如何定位您的扩展;查看下面的表格,了解可能的来源类型和相应的安装规范。
- `--package`:当`<install-source>`的值为`git`或`github`,`--package`参数是必须的. 它必须是扩展的Node.js包名称。缺少这些信息的话,Appium将无法定位到已安装的包。
- `--json`:以JSON格式返回结果
| 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. |
|安装源类型|行为|
|--|--|
|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包信息所在目录的路径。|
#### NPM-based `<install-spec>`
#### 基于NPM安装 `<install-spec>`
When Appium is installing an extension via NPM (as is the case when `--source` is either omitted or
set to `npm`), the `<install-spec>` can be complex, and can include any kind of information allowed
by `npm install`:
当Appium通过NPM安装扩展(即当`--source`参数被省略或设置为`npm`时),`<install-spec>`可以非常复杂,并且可以包括`npm install`所允许的任何形式的信息:
- `[@scope]/<name>`
- `[@scope]/<name>@<version>`
- `[@scope]/<name>@<tag>`
- `[@scope]/<name>@<version range>`
#### Examples
#### 示例
- Install the latest XCUITest driver:
- 安装最新的XCUITest驱动程序:
```
appium driver install xcuitest
```
```
appium driver install xcuitest
```
- Install the XCUITest driver at version 4.11.1:
- 安装4.11.1版本的XCUITest驱动程序:
```
appium driver install xcuitest@4.11.1
```
```
appium driver install xcuitest@4.11.1
```
- Install the `beta` version of the `@appium/fake-driver` from NPM:
- 从NPM安装`beta`版本的`@appium/fake-driver`:
```
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`
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.
列出已安装和可用的扩展。可用扩展包括Appium团队正式认可的扩展,但您不仅限于安装此列表中显示的扩展。
Usage:
使用方法:
```
appium <ext-type> list [--installed] [--updates] [--json]
```
Required arguments:
必须的参数:
- `<ext-type>`: must be `driver` or `plugin`
- `<ext-type>`:必须为`driver`或`plugin`
Optional arguments:
可选的参数:
- `--installed`: show only installed extensions, not installed plus available extensions
- `--updates`: for extensions installed via NPM, display a message if there are any updates
- `--json`: return the result in JSON format
- `--installed`:仅显示已安装的扩展程序,而不是已安装和可用的扩展程序
- `--updates`:对于通过NPM安装的扩展,如果有任何更新,则显示一条消息
- `--json`:以JSON格式返回结果
### `run`
Run a script included in an extension package. Extension authors can include runnable scripts that
assist with setup or perform other tasks. These scripts are given names (called the `<script-name>`
in this reference) by extension authors and will generally be documented in extension
documentation.
运行扩展包中包含的脚本。扩展作者可以包含可运行的脚本,以协助设置或执行其他任务。这些脚本由扩展作者命名(本指南中称为`<script-name>`),通常会在扩展文档中加以说明。
Usage:
使用方法:
```
appium <ext-type> run <ext-name> [--json] <script-name> [script-args]
```
Required arguments:
必须的参数:
- `<ext-type>`: must be `driver` or `plugin`
- `<ext-name>`: the name of the extension whose script you want to run
- `<script-name>`: the name of the script the extension has published
- `<ext-type>`:必须为`driver`或`plugin`
- `<ext-name>`:要运行脚本的扩展名
- `<script-name>`:扩展发布的脚本的名称
Optional arguments:
可选的参数:
- `script-args`: any arguments that Appium does not interpret as belonging to its own set of
arguments will be passed along to the extension script
- `--json`: return the result in JSON format
- `script-args`:任何Appium无法识别为其自身参数集的参数,都将传递给扩展脚本
- `--json`:以JSON格式返回结果
Example (run the `reset` script included with the UiAutomator2 driver):
示例(运行UiAutomator2驱动程序附带的`reset`脚本):
```
appium driver run uiautomator2 reset
@@ -187,42 +163,39 @@ appium driver run uiautomator2 reset
### `update`
Update one or more extensions that have been installed via NPM. By default, Appium will not
automatically update any extension past a major version boundary, so as to prevent
unintended breaking changes.
更新通过NPM安装的一个或多个扩展。默认情况下,Appium不会自动更新超过主要版本边界的任何扩展,以防止意外的破坏性更改。
Usage:
使用方法:
```
appium <ext-type> update <ext-name> [--unsafe] [--json]
```
Required arguments:
必须的参数:
- `<ext-type>`: must be `driver` or `plugin`
- `<ext-name>`: the name of the extension to update, or the string `installed` (which will update
all installed extensions)
- `<ext-type>`:必须为`driver`或`plugin`
- `<ext-name>`:要更新的扩展名或已安装的字符串(将更新所有已安装的扩展)
Optional arguments:
可选的参数:
- `--unsafe`: direct Appium to go ahead and update past a major version boundary
- `--json`: return the result in JSON format
- `--unsafe`:允许Appium更新到超越主要版本界限的版本
- `--json`:以JSON格式返回结果
### `uninstall`
Remove an installed extension.
删除已安装的扩展。
Usage:
使用方法:
```
appium <ext-type> uninstall <ext-name> [--json]
```
Required arguments:
必须的参数:
- `<ext-type>`: must be `driver` or `plugin`
- `<ext-name>`: the name of the extension to uninstall
- `<ext-type>`:必须为`driver`或`plugin`
- `<ext-name>`:要卸载的扩展程序的名称
Optional arguments:
可选的参数:
- `--json`: return the result in JSON format
- `--json`:以JSON格式返回结果
+15 -16
View File
@@ -1,25 +1,24 @@
---
hide:
- toc
title: Command-Line Overview
title: 命令行概述
---
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提供了一个命令行可执行文件(`appium`),这可能是您与Appium服务器交互的主要方式。这一部分的文档描述了如何使用此可执行文件。
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 -v`或`appium --version`返回已安装的版本信息,或运行`appium -h`或`appium --help`返回帮助信息。
The main `appium` executable provides the following subcommands:
主命令`appium`可提供以下子命令:
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)
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)
Like the main command, you can also run each subcommand with the `-h` or `--help` flag to learn more about it.
与主命令一样,您也可以使用`-h`或`--help`标志运行每个子命令以了解更多信息。
+13 -23
View File
@@ -1,33 +1,23 @@
---
hide:
- toc
title: Setup Command-Line Usage
title: 设置命令行用法
---
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.
`setup`命令旨在简化Appium的初始设置过程。它允许一次性安装多个扩展(驱动程序/插件),而无需多次运行`appium <ext-name> install <ext-name>`。
The command has several presets that can be used to install different sets of extensions.
The presets are as follows:
该命令具有多个预设,可用于安装不同组合的扩展。这些预设如下:
| Preset | Installation Command | Included Drivers | Included Plugins |
| ------------------- | --------------------------------------- | ------------------------------------------ | ---------------- |
| Mobile | `appium setup mobile` or `appium setup` | `uiautomator2`, `xcuitest`[^1], `espresso` | `images` |
| Desktop application | `appium setup desktop` | `mac2`[^1], `windows`[^2] | `images` |
| Desktop browser | `appium setup browser` | `safari`[^1], `gecko`, `chromium` | `images` |
|预设|安装命令|包含的驱动|包含的插件|
|--|--|--|--|
|手机端应用程序|`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`|
Attempting to install a preset while already having one or more of its included extensions installed
will only install the missing extensions.
在已安装一个或多个预设包含的扩展的情况下尝试安装预设,将只安装缺少的扩展。
Refer to the [Ecosystem documentation](../ecosystem/index.md) to learn more about the extensions
listed above.
请参阅[生态系统](../ecosystem/index.md)文档,了解有关扩展的更多信息。
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.
[^1]: 仅在主机运行macOS时才安装。
[^2]: 仅在主机运行Windows时才安装。
+218 -185
View File
@@ -1,252 +1,247 @@
# Driver: base-driver
# 驱动: base-driver
### `createSession`
`POST` **`/session`**
Historically the first two arguments were reserved for JSONWP capabilities.
Appium 2 has dropped the support of these, so now we only accept capability
objects in W3C format and thus allow any of the three arguments to represent
the latter.
从历史上看,前两个参数是专门用于JSONWP功能的,但是Appium2已经放弃了对这些参数的支持。
现在我们只接受W3C格式的功能对象,这种对象可以通过三个参数中的任意一个来传递。
**`See`**
**`请参阅`**
[https://w3c.github.io/webdriver/#new-session](https://w3c.github.io/webdriver/#new-session)
<!-- comment source: multiple -->
#### Parameters
#### 参数
| Name | Type | Description |
| :---------------------- | :---------------------------------------------- | :----------------------------------------------------------------------------------------------------- |
| `desiredCapabilities?` | `W3CDriverCaps`<`C`\> | the new session capabilities |
| `requiredCapabilities?` | `W3CDriverCaps`<`C`\> | another place the new session capabilities could be sent (typically left undefined) |
| `capabilities?` | `W3CDriverCaps`<`C`\> | another place the new session capabilities could be sent (typically left undefined) |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `desiredCapabilities?` | `W3CDriverCaps`<`C`\> | 新的会话功能 |
| `requiredCapabilities?` | `W3CDriverCaps`<`C`\> | 另一个可以发送新会话功能的地方(通常未定义) |
| `capabilities?` | `W3CDriverCaps`<`C`\> | 另一个可以发送新会话功能的地方(通常未定义) |
#### Response
#### 响应
`CreateResult`
The capabilities object representing the created session
表示所创建会话的能力对象
### `deleteSession`
`DELETE` **`/session/:sessionId`**
Returns capabilities for the session and event history (if applicable)
返回会话和事件历史记录的功能(如果可用)
<!-- comment source: method-signature -->
#### Response
#### 响应
`SingularSessionData`<`C`, `SessionData`\>
A session data object
会话数据对象
### `getSession`
`GET` **`/session/:sessionId`**
Returns capabilities for the session and event history (if applicable).
!!! warning "Deprecated"
```
Please use `getAppiumSessionCapabilities` to get the session capabilities.
Please use `getLogEvents` to get event history.
```
返回会话和事件历史记录的功能(如果可用)
<!-- comment source: multiple -->
#### Response
#### 响应
`SingularSessionData`<`C`, `SessionData`\>
A session data object
### `getAppiumSessionCapabilities`
`GET` **`/session/:sessionId/appium/capabilities`**
Returns capabilities for the session.
<!-- comment source: multiple -->
#### Response
`AppiumSessionCapabilities`
A session data object
会话数据对象
### `findElement`
`POST` **`/session/:sessionId/element`**
Find a UI element given a locator strategy and a selector, erroring if it can't be found
在给定定位策略和选择器的情况下查找UI元素,如果找不到则报错
**`See`**
**`请参阅`**
[https://w3c.github.io/webdriver/#find-element](https://w3c.github.io/webdriver/#find-element)
<!-- comment source: method-signature -->
#### Parameters
#### 参数
| Name | Type | Description |
| :------ | :------- | :--------------------------------------------------------------------- |
| `using` | `string` | the locator strategy |
| `value` | `string` | the selector to combine with the strategy to find the specific element |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `string` | 定位策略 |
| `value` | `string` | 选择器与策略相结合,找到特定元素 |
#### Response
#### 响应
`Element`<`string`\>
The element object encoding the element id which can be used in element-related
commands
对元素id进行编码的元素对象,可用于元素相关命令
### `findElementFromElement`
`POST` **`/session/:sessionId/element/:elementId/element`**
Find a UI element given a locator strategy and a selector, erroring if it can't be found. Only
look for elements among the set of descendants of a given element
在给定定位策略和选择器的情况下查找UI元素,如果找不到则会报错,仅在给定元素的子元素中查找。
**`See`**
**`请参阅`**
[https://w3c.github.io/webdriver/#find-element-from-element](https://w3c.github.io/webdriver/#find-element-from-element)
<!-- comment source: method-signature -->
#### Parameters
#### 参数
| Name | Type | Description |
| :------ | :------- | :--------------------------------------------------------------------- |
| `using` | `string` | the locator strategy |
| `value` | `string` | the selector to combine with the strategy to find the specific element |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `string` | 定位策略 |
| `value` | `string` | 选择器与策略相结合,找到特定元素 |
#### Response
#### 响应
`Element`<`string`\>
The element object encoding the element id which can be used in element-related
commands
对元素id进行编码的元素对象,可用于元素相关命令
### `findElementFromShadowRoot`
`POST` **`/session/:sessionId/shadow/:shadowId/element`**
Find an element from a shadow root
从阴影根中查找元素。
**`See`**
**`请参阅`**
[https://w3c.github.io/webdriver/#find-element-from-shadow-root](https://w3c.github.io/webdriver/#find-element-from-shadow-root)
<!-- comment source: method-signature -->
#### Parameters
#### 参数
| Name | Type | Description |
| :------ | :------- | :---------------------------------------------------------------------- |
| `using` | `string` | the locator strategy |
| `value` | `string` | the selector to combine with the strategy to find the specific elements |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `string` | 定位策略 |
| `value` | `string` | 选择器与策略相结合,找到特定元素 |
#### Response
#### 响应
`Element`<`string`\>
The element inside the shadow root matching the selector
阴影根内与选择器匹配的元素
### `findElements`
`POST` **`/session/:sessionId/elements`**
Find a a list of all UI elements matching a given a locator strategy and a selector
查找与给定定位策略和选择器匹配的所有UI元素的列表
**`See`**
**`请参阅`**
[https://w3c.github.io/webdriver/#find-elements](https://w3c.github.io/webdriver/#find-elements)
<!-- comment source: method-signature -->
#### Parameters
#### 参数
| Name | Type | Description |
| :------ | :------- | :---------------------------------------------------------------------- |
| `using` | `string` | the locator strategy |
| `value` | `string` | the selector to combine with the strategy to find the specific elements |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `string` | 定位策略 |
| `value` | `string` | 选择器与策略相结合,找到特定元素 |
#### Response
#### 响应
`Element`<`string`\>[]
A possibly-empty list of element objects
仅在给定元素的子元素中查找。
### `findElementsFromElement`
`POST` **`/session/:sessionId/element/:elementId/elements`**
Find a a list of all UI elements matching a given a locator strategy and a selector. Only
look for elements among the set of descendants of a given element
查找与给定定位策略和选择器匹配的所有UI元素的列表,仅在给定元素的子元素中查找。
**`See`**
**`请参阅`**
[https://w3c.github.io/webdriver/#find-elements-from-element](https://w3c.github.io/webdriver/#find-elements-from-element)
<!-- comment source: method-signature -->
#### Parameters
#### 参数
| Name | Type | Description |
| :------ | :------- | :---------------------------------------------------------------------- |
| `using` | `string` | the locator strategy |
| `value` | `string` | the selector to combine with the strategy to find the specific elements |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `string` | 定位策略 |
| `value` | `string` | 选择器与策略相结合,找到特定元素 |
#### Response
#### 响应
`Element`<`string`\>[]
A possibly-empty list of element objects
仅在给定元素的子元素中查找。
### `findElementsFromShadowRoot`
`POST` **`/session/:sessionId/shadow/:shadowId/elements`**
Find elements from a shadow root
从阴影根中查找元素。
**`See`**
**`请参阅`**
[https://w3c.github.io/webdriver/#find-element-from-shadow-root](https://w3c.github.io/webdriver/#find-element-from-shadow-root)
<!-- comment source: method-signature -->
#### Parameters
#### 参数
| Name | Type | Description |
| :------ | :------- | :---------------------------------------------------------------------- |
| `using` | `string` | the locator strategy |
| `value` | `string` | the selector to combine with the strategy to find the specific elements |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `string` | 定位策略 |
| `value` | `string` | 选择器与策略相结合,找到特定元素 |
#### Response
#### 响应
`Element`<`string`\>[]
A possibly empty list of elements inside the shadow root matching the selector
在阴影根内与选择器匹配的可能为空的元素列表。
### `getLog`
`POST` **`/session/:sessionId/log`**
获取给定日志类型的日志。
!!! warning "已弃用"
请使用`/session/:sessionId/se/log`代替
<!-- comment source: method-signature -->
#### 参数
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `type` | `string` | ILogCommands.supportedLogTypes中定义的日志类型的名称/密钥。 |
#### 响应
`any`
### `getLog`
`POST` **`/session/:sessionId/se/log`**
Get the log for a given log type.
获取给定日志类型的日志。
<!-- comment source: method-signature -->
#### Parameters
#### 参数
| Name | Type | Description |
| :----- | :------- | :------------------------------------------------------------------------------------------------- |
| `type` | `string` | Name/key of log type as defined in ILogCommands.supportedLogTypes. |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `type` | `string` | ILogCommands.supportedLogTypes中定义的日志类型的名称/密钥。 |
#### Response
#### 响应
`any`
@@ -254,31 +249,47 @@ Get the log for a given log type.
`POST` **`/session/:sessionId/appium/events`**
Get a list of events that have occurred in the current session
获取当前会话中发生的事件列表。
<!-- comment source: method-signature -->
#### Parameters
#### 参数
| Name | Type | Description |
| :------ | :--------------------------------------------------------------------------- | :-------------------------------------------------------- |
| `type?` | `string` \\| `string`[] | filter the returned events by including one or more types |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `type?` | `string` \| `string`[] | 通过包含一个或多个类型筛选返回的事件 |
#### Response
#### 响应
`EventHistory` \| `Record`<`string`, `number`\>
The event history for the session
会话的事件历史记录。
### `getLogTypes`
`GET` **`/session/:sessionId/log/types`**
以字符串列表的形式获取可用日志类型。
!!! warning "已弃用"
请使用`/session/:sessionId/se/log/types`代替
<!-- comment source: method-signature -->
#### 响应
`string`[]
### `getLogTypes`
`GET` **`/session/:sessionId/se/log/types`**
Get available log types as a list of strings
以字符串列表的形式获取可用日志类型。
<!-- comment source: method-signature -->
#### Response
#### 响应
`string`[]
@@ -286,51 +297,40 @@ Get available log types as a list of strings
`GET` **`/session/:sessionId/source`**
Get the current page/app source as HTML/XML
以HTML/XML格式获取当前页面/应用程序源代码。
**`See`**
**`请参阅`**
[https://w3c.github.io/webdriver/#get-page-source](https://w3c.github.io/webdriver/#get-page-source)
<!-- comment source: method-signature -->
#### Response
#### 响应
`string`
The UI hierarchy in a platform-appropriate format (e.g., HTML for a web page)
以适合平台的格式呈现的用户界面层次结构(例如,对于网页使用HTML)。
### `getAppiumSessions`
### `getSessions`
`GET` **`/appium/sessions`**
`GET` **`/sessions`**
Get data for all sessions running on an Appium server
获取Appium服务器上运行的所有会话的数据。
<!-- comment source: method-signature -->
#### Response
#### 响应
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
会话数据对象列表。每个会话数据对象都将返回`id`和会话的功能作为`capabilities`键,如下所示:
```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,56 +341,54 @@ is enabled on the server.
`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
#### 参数
| 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. |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `settings` | `Settings` | 一个包含设置名称和值的键值映射,映射中未列出的名称将不会修改其值。 |
#### 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.
返回关于远程端是否处于可以创建新会话的状态的信息,并且还可以包含特定于实现的任意元信息。
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属性表示,如果当前尝试创建会话会失败,则该属性为false。然而值为true并不能保证新建会话命令一定会成功。
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.
实现可以选择将额外的元信息作为主体的一部分包含进来,但顶级属性ready和message是保留的,并且不能被覆盖。
<!-- comment source: builtin-interface -->
#### Examples
#### 示例
<!-- BEGIN:EXAMPLES -->
##### JavaScript
<!-- BEGIN:EXAMPLE lang=JavaScript -->
```js
@@ -399,9 +397,7 @@ await driver.status();
```
<!-- END:EXAMPLE -->
##### Python
<!-- BEGIN:EXAMPLE lang=Python -->
```python
@@ -409,9 +405,7 @@ driver.get_status()
```
<!-- END:EXAMPLE -->
##### Java
<!-- BEGIN:EXAMPLE lang=Java -->
```java
@@ -419,9 +413,7 @@ driver.getStatus();
```
<!-- END:EXAMPLE -->
##### Ruby
<!-- BEGIN:EXAMPLE lang=Ruby -->
```ruby
@@ -433,10 +425,9 @@ remote_status
```
<!-- END:EXAMPLE -->
<!-- END:EXAMPLES -->
#### Response
#### 响应
`Object`
@@ -444,59 +435,101 @@ 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
#### 参数
| 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 |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `type?` | `string` | 仅用于旧的(JSONWP)命令,超时的类型 |
| `ms?` | `string` \| `number` | 仅用于旧的(JSONWP)命令,表示超时的毫秒数 |
| `script?` | `number` | 用于W3C命令的脚本超时时间(以毫秒为单位) |
| `pageLoad?` | `number` | 用于W3C命令的页面加载超时时间(以毫秒为单位) |
| `implicit?` | `string` \| `number` | 用于W3C命令的隐式等待超时时间(以毫秒为单位) |
#### Response
#### 响应
`null`
``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``
### `logCustomEvent`
`POST` **`/session/:sessionId/appium/log_event`**
Add a custom-named event to the Appium event log
将自定义命名事件添加到Appium事件日志中
<!-- comment source: method-signature -->
#### Parameters
#### 参数
| Name | Type | Description |
| :------- | :------- | :-------------------------------------------------------------------------- |
| `vendor` | `string` | the name of the vendor or tool the event belongs to, to namespace the event |
| `event` | `string` | the name of the event itself |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `vendor` | `string` | 事件所属的供应商或工具的名称,用于为事件命名 |
| `event` | `string` | 事件本身的名称 |
#### Response
#### 响应
`null`
``null``
### `reset`
`POST` **`/session/:sessionId/appium/app/reset`**
重置当前会话(运行删除会话并创建会话子程序)
!!! warning "已弃用"
请使用每个驱动程序的启动、激活、终止或清理方法。
改用显式会话管理命令代替
<!-- comment source: method-signature -->
#### 响应
``null``
@@ -1,22 +1,22 @@
# Plugin: execute-driver
# 插件: execute-driver
### `executeDriverScript`
`POST` **`/session/:sessionId/appium/execute_driver`**
Implementation of a command within a plugin
在插件中执行命令
At minimum, `D` must be `ExternalDriver`, but a plugin can be more narrow about which drivers it supports.
至少,`D`必须是`ExternalDriver`,但插件可以更严格地限制它支持哪些驱动程序。
<!-- 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 @@
# Plugin: images
# 插件: images
### `compareImages`
`POST` **`/session/:sessionId/appium/compare_images`**
#### Parameters
#### 参数
| Name | Type |
| :--------- | :---------------------------------------------------------- |
| `mode` | `any`[] |
| 名字 | 类型 |
| :------ | :------ |
| `mode` | `any`[] |
| `options?` | `any`[] |
#### Response
#### 响应
`ComparisonResult`
@@ -19,71 +19,48 @@
`POST` **`/session/:sessionId/element`**
Find a UI element given a locator strategy and a selector, erroring if it can't be found
在给定定位策略和选择器的情况下查找UI元素,如果找不到则报错
**`See`**
**`请参阅`**
[https://w3c.github.io/webdriver/#find-element](https://w3c.github.io/webdriver/#find-element)
<!-- comment source: method-signature -->
#### Parameters
#### 参数
| Name | Type | Description |
| :------ | :---- | :--------------------------------------------------------------------- |
| `using` | `any` | the locator strategy |
| `value` | `any` | the selector to combine with the strategy to find the specific element |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `any` | 定位策略 |
| `value` | `any` | 选择器与策略相结合,找到特定元素 |
#### Response
#### 响应
`any`
The element object encoding the element id which can be used in element-related
commands
对元素id进行编码的元素对象,可用于元素相关命令
### `findElements`
`POST` **`/session/:sessionId/elements`**
Find a a list of all UI elements matching a given a locator strategy and a selector
查找与给定定位策略和选择器匹配的所有UI元素的列表
**`See`**
**`请参阅`**
[https://w3c.github.io/webdriver/#find-elements](https://w3c.github.io/webdriver/#find-elements)
<!-- comment source: method-signature -->
#### Parameters
#### 参数
| Name | Type | Description |
| :------ | :---- | :---------------------------------------------------------------------- |
| `using` | `any` | the locator strategy |
| `value` | `any` | the selector to combine with the strategy to find the specific elements |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `any` | 定位策略 |
| `value` | `any` | 选择器与策略相结合,找到特定元素s |
#### 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`
可能为空的元素对象列表
+14 -19
View File
@@ -1,27 +1,22 @@
---
hide:
- toc
title: Intro to Commands
title: 命令简介
---
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.
在这里,您可以找到Appium主模块通过其基本驱动程序公开的各种命令,以及几个插件中可用的命令。
!!! note
!!! 注意
```
The Appium base driver only exposes a few commands, as it is not meant to be used on its own.
Please refer to the documentation of your [Appium driver](../ecosystem/drivers.md) to learn
about the commands it exposes, and then check your [Appium client](../ecosystem/clients.md)
documentation for the exact syntax of that command.
```
Appium基本驱动程序只公开少数几个命令,因为它本身不是为单独使用而设计的。
请参阅您的[Appium驱动程序](../ecosystem/drivers.md)的文档,了解它公开的命令
然后查阅您的[Appium客户端](../ecosystem/clients.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)
* [基础驱动程序](./base-driver.md)
* [执行驱动程序插件](./execute-driver-plugin.md)
* [图片插件](./images-plugin.md)
* [宽松能力插件](./relaxed-caps-plugin.md)
* [通用XML插件](./universal-xml-plugin.md)
@@ -1,27 +1,27 @@
# Plugin: relaxed-caps
# 插件: relaxed-caps
### `createSession`
`POST` **`/session`**
Start a new automation session
开始新的自动化会话
**`See`**
**`请参阅`**
[https://w3c.github.io/webdriver/#new-session](https://w3c.github.io/webdriver/#new-session)
<!-- comment source: multiple -->
#### Parameters
#### 参数
| Name | Type | Description |
| :---------------------- | :---- | :----------------------------------------------------------------------------------------------------- |
| `desiredCapabilities?` | `any` | the new session capabilities |
| `requiredCapabilities?` | `any` | another place the new session capabilities could be sent (typically left undefined) |
| `capabilities?` | `any` | another place the new session capabilities could be sent (typically left undefined) |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `desiredCapabilities?` | `any` | 新的会话功能 |
| `requiredCapabilities?` | `any` | 另一个可以发送新会话功能的地方(通常未定义) |
| `capabilities?` | `any` | 另一个可以发送新会话功能的地方(通常未定义) |
#### Response
#### 响应
`any`
The capabilities object representing the created session
所创建会话的能力对象
@@ -1,113 +0,0 @@
# 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,68 +1,67 @@
# Plugin: universal-xml
# 插件: universal-xml
### `findElement`
`POST` **`/session/:sessionId/element`**
Find a UI element given a locator strategy and a selector, erroring if it can't be found
在给定定位策略和选择器的情况下查找UI元素,如果找不到则报错
**`See`**
**`请参阅`**
[https://w3c.github.io/webdriver/#find-element](https://w3c.github.io/webdriver/#find-element)
<!-- comment source: method-signature -->
#### Parameters
#### 参数
| Name | Type | Description |
| :------ | :---------------------------------------------------------- | :------------------- |
| `using` | `any`[] | the locator strategy |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `any`[] | 定位策略 |
#### Response
#### 响应
`any`
The element object encoding the element id which can be used in element-related
commands
对元素id进行编码的元素对象,可用于元素相关命令
### `findElements`
`POST` **`/session/:sessionId/elements`**
Find a a list of all UI elements matching a given a locator strategy and a selector
查找与给定定位策略和选择器匹配的所有UI元素的列表
**`See`**
**`请参阅`**
[https://w3c.github.io/webdriver/#find-elements](https://w3c.github.io/webdriver/#find-elements)
<!-- comment source: method-signature -->
#### Parameters
#### 参数
| Name | Type | Description |
| :------ | :---------------------------------------------------------- | :------------------- |
| `using` | `any`[] | the locator strategy |
| 名字 | 类型 | 描述 |
| :------ | :------ | :------ |
| `using` | `any`[] | 定位策略 |
#### Response
#### 响应
`any`
A possibly-empty list of element objects
可能为空的元素对象列表
### `getPageSource`
`GET` **`/session/:sessionId/source`**
Get the current page/app source as HTML/XML
以HTML/XML格式获取当前页面/应用程序源代码
**`See`**
**`请参阅`**
[https://w3c.github.io/webdriver/#get-page-source](https://w3c.github.io/webdriver/#get-page-source)
<!-- comment source: method-signature -->
#### Response
#### 响应
`string`
The UI hierarchy in a platform-appropriate format (e.g., HTML for a web page)
以适合平台的格式呈现的用户界面层次结构(例如,对于网页使用HTML)
-161
View File
@@ -1,161 +0,0 @@
---
hide:
- navigation
title: Contributing to Appium
---
The Appium project would not exist without the many contributions of code, documentation,
maintenance, and support from companies and volunteers. As such, we welcome contributions!
There are a lot of different ways to help the project - see below for everything you can do and the
processes to follow for each contribution method. Note that no matter how you contribute, your
participation is governed by our [Code of Conduct](https://github.com/appium/appium/blob/master/CONDUCT.md).
## Join the Discussion Forum
You don't need to know the internals of Appium to be able to contribute! If you have experience with
using Appium and feel like sharing your knowledge with others, consider helping out users on the
Appium forums at [discuss.appium.io](https://discuss.appium.io/). Hop on over and see if there are
any questions that you can answer.
## Report Bugs or Feature Requests
If you've encountered a bug, or have a cool feature in mind that you think Appium should support,
make sure to let us know at our [GitHub issue tracker](https://github.com/appium/appium/issues).
Please use the appropriate issue form template when creating your issue.
## Triage Issues
In addition to creating issues, you can also help us investigate already reported issues. All you
need is enough familiarity with Appium to try and reproduce bugs.
You can get started by checking our [GitHub issue tracker](https://github.com/appium/appium/issues)
for issues with labels such as `Needs Triage` or `Needs Info`, and leaving relevant comments:
- If the issue is a duplicate, drop a link to the original issue
- If the user has not provided enough information (such as Appium logs), ask them for more details
- If you can reproduce the problem on your own environment, provide all the information that you think
would help us track down the cause of the issue
For further information on triaging Appium issues (for any Appium project repository), please contact
any member of the [Technical Committee](https://github.com/appium/appium/blob/master/GOVERNANCE.md#the-technical-committee).
## Contribute Code
We are always open to pull requests for improving the Appium code or documentation!
!!! info
```
Developer information may not be kept up to date as frequently as user-facing information, or
it may be most relevant in its current form on the online repository, not in this published
version. Make sure to check the repo or discuss with maintainers. We would be glad to help
new contributors get started!
```
Start by cloning the repository (we recommend [forking](https://github.com/appium/appium/fork)
it first):
```sh
git clone https://github.com/appium/appium.git
cd appium
```
!!! info
```
If you are VS Code user, you can easily check out the project using [Runme](https://runme.dev/api/runme?repository=https%3A%2F%2Fgithub.com%2Fappium%2Fappium.git&fileToOpen=packages%2Fappium%2Fdocs%2Fen%2Fcontributing%2Findex.md).
```
Install dependencies:
```sh
npm install
```
From here on there are several things you can do.
Build the project:
```sh
npm run build
```
Build the project and watch for changes:
```sh
npm run dev
```
Start the locally built Appium server:
```sh
npm start
```
Run various tests:
```sh
npm run lint
npm run test:unit
npm run test:types
npm run test:smoke
npm run test:e2e
npm run test:quick # unit and types
npm run test:slow # everything
```
You can also run tests for specific workspaces, e.g.:
```sh
export APPIUM_WORKSPACE=@appium/base-driver
npm run test:unit -w $APPIUM_WORKSPACE
```
### Documentation
The documentation for this project is [available in the project repository itself](https://github.com/appium/appium/tree/master/packages/appium/docs).
It is contained in Markdown files, which are built by our documentation system in the
`@appium/docutils` module. This module is based on [MkDocs](https://www.mkdocs.org/) and therefore
requires [Python](https://www.python.org/) to be installed on your system.
Install Python dependencies:
```sh
npm run install-docs-deps
```
After making your changes, you can run the documentation server in dev mode:
```sh
npm run dev:docs
```
You can then view the documentation at `http://127.0.0.1:8000/docs/en`.
## Translating Appium Documentation
The process of Appium documents localization into languages other than English is automated and is done via
the [Crowdin Translations Management System](https://crowdin.com). Do not edit any translated documents
directly in the GitHub Appium repository as they are going to be replaced with ones exported from Crowdin
during an upcoming sync.
### Where To Start
If you would like to contribute to the translation of Appium documents into your language then simply join
the translators group for the [Appium Documentation](https://crowdin.com/project/appium-documentation)
Crowdin project, and start translating documents there. If you see that your language is missing from
the list of available Crowdin languages then simply let us know by creating an
[issue](https://github.com/appium/appium/issues).
### Source Language Updates
Changes in documents are synchronized to Crowdin automatically via the `Update Crowdin English Docs` GitHub action.
This action is triggered automatically as soon as there are any changes under `packages/appium/docs/en/**.md`
or `packages/appium/docs/mkdocs-en.yml`.
### Fetching Translated Documents
In order to fetch translated files from Crowdin to the GitHub repository it is necessary to trigger
the `Sync Crowdin Docs Translations` action. This action should also automatically create a PR with
corresponding translated resources included.
@@ -0,0 +1,344 @@
---
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`
@@ -0,0 +1,90 @@
---
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
```
@@ -0,0 +1,32 @@
---
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