Compare commits

...
Author SHA1 Message Date
github-actions 2c2820242f chore: publish
- appium@3.9.0
 - @appium/base-driver@10.8.2
 - @appium/base-plugin@3.3.6
 - @appium/docutils@3.0.2
 - @appium/driver-test-support@3.0.2
 - @appium/eslint-config-appium-ts@3.2.7
 - @appium/execute-driver-plugin@7.0.2
 - @appium/fake-driver@6.2.5
 - @appium/fake-plugin@4.4.2
 - @appium/images-plugin@5.0.2
 - @appium/opencv@5.0.2
 - @appium/oxc-config@1.1.3
 - @appium/plugin-test-support@3.0.2
 - @appium/relaxed-caps-plugin@3.0.2
 - @appium/storage-plugin@2.0.2
 - @appium/support@7.2.9
 - @appium/types@1.7.2
 - @appium/universal-xml-plugin@3.0.2
2026-10-27 06:50:21 +00:00
Mykola Mokhnach e967b607d7 fix(base-driver): reject browser-origin WebSocket upgrades unless CORS is enabled (#23102) 2026-10-27 07:48:16 +01:00
Mykola Mokhnach 60acd1d3d8 fix(support): keep _extractEntryTo from writing through symlinks (#23101) 2026-10-27 07:47:58 +01:00
Mykola Mokhnach dddd2c3051 fix(support): reject Windows drive-relative symlink targets in zip extraction (#23100) 2026-10-26 20:43:25 +01:00
Edgars Eglītis 66ee0e46fb chore: run audit fix (#23099) 2026-10-26 21:19:50 +02:00
Mikhail cc531cf436 docs: add XPath to UiSelector to Ecosystem tools document (#23098) 2026-10-26 15:05:16 +02:00
renovate[bot] 5f2e7685bb chore(oxc-config): update dependency oxlint-tsgolint to v7.0.2005 (#23097)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-26 12:27:53 +00:00
github-actions[bot]andmykola-mokhnach b09e3c57cd docs(appium): Update documentation translations (#23093)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-10-26 08:01:41 +01:00
renovate[bot] 6a680adbf5 chore(docutils): update dependency mkdocs-git-revision-date-localized-plugin to v1.6.1 (#23096)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-26 06:57:54 +00:00
Teodor Nikolov db41945811 docs(appium): add NovaWindows Hybrid mode (since v1.4.0) (#23089) 2026-10-25 12:51:12 +02:00
renovate[bot] 9ed545596d chore(deps): update dependency npm-run-all2 to v9.0.4 (#23088)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-25 08:27:37 +01:00
dependabot[bot] e0cf688b50 chore(deps): bump the npm_and_yarn group across 2 directories with 3 updates (#23080)
Bumps the npm_and_yarn group with 3 updates in the / directory: [body-parser](https://github.com/expressjs/body-parser), [undici](https://github.com/nodejs/undici) and [fast-uri](https://github.com/fastify/fast-uri).
Bumps the npm_and_yarn group with 1 update in the /packages/base-driver directory: [body-parser](https://github.com/expressjs/body-parser).


Updates `body-parser` from 2.3.0 to 2.4.0
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/v2.3.0...v2.4.0)

Updates `undici` from 7.30.0 to 7.30.1
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v7.30.0...v7.30.1)

Updates `undici` from 6.29.0 to 6.29.1
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v7.30.0...v7.30.1)

Updates `undici` from 8.11.2 to 8.12.3
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v7.30.0...v7.30.1)

Updates `fast-uri` from 3.1.8 to 3.1.9
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.8...v3.1.9)

Updates `body-parser` from 2.3.0 to 2.4.0
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/v2.3.0...v2.4.0)

---
updated-dependencies:
- dependency-name: body-parser
  dependency-version: 2.4.0
  dependency-type: direct:production
  dependency-group: npm_and_yarn
- dependency-name: undici
  dependency-version: 7.30.1
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: undici
  dependency-version: 6.29.1
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: undici
  dependency-version: 8.12.3
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: fast-uri
  dependency-version: 3.1.9
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: body-parser
  dependency-version: 2.4.0
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-24 15:25:19 +03:00
renovate[bot] aea41abf53 chore(docutils): update dependency mkdocs-material to v9.8.0 (#23079)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-24 10:40:53 +00:00
renovate[bot] 43100de428 chore(oxc-config): update dependency oxfmt to v0.74.0 (#23071)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-24 09:46:50 +02:00
renovate[bot] 8b37725d8f chore(support): update dependency asyncbox to v6.5.0 (#23073)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-24 07:40:16 +00:00
renovate[bot] f915b6c320 chore(oxc-config): update dependency oxlint to v1.89.0 (#23072)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-24 06:15:55 +00:00
Kazuaki Matsuo 4c753a134d fix(support): prevent zip extraction through symlink chains (#23002) (#23069)
* fix(support): prevent zip extraction through symlink chains

* fix(support): address zip symlink review findings

* perf(support): revalidate only affected zip symlinks

* refactor(support): clarify zip symlink validation

* refactor(support): clarify symlink target traversal

* fix(appium): avoid npm audit during extension removal and e2e setup

* fix(support): normalize Unicode symlink dependency keys

* docs(support): shorten symlink validation comments

(cherry picked from commit 8e42cbc82d)
2026-10-24 14:50:15 +09:00
dependabot[bot] a6a69d36d3 chore(deps): bump ip-address (#23070)
Bumps the npm_and_yarn group with 1 update in the / directory: [ip-address](https://github.com/beaugunderson/ip-address).


Updates `ip-address` from 10.7.3 to 10.7.4
- [Release notes](https://github.com/beaugunderson/ip-address/releases)
- [Commits](https://github.com/beaugunderson/ip-address/compare/v10.7.3...v10.7.4)

---
updated-dependencies:
- dependency-name: ip-address
  dependency-version: 10.7.4
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-23 20:40:02 +03:00
renovate[bot] fa75288c5e chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.72.0 (#23068)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-23 19:14:23 +02:00
renovate[bot] 76acef9339 chore(eslint-config-appium-ts): update dependency eslint-plugin-perfectionist to v5.13.0 (#23067)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-23 16:06:09 +00:00
github-actions[bot]andmykola-mokhnach 353e9b11e3 docs(appium): Update documentation translations (#23065)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-10-22 08:33:02 +02:00
renovate[bot] f0d549c46c chore(eslint-config-appium-ts): update dependency eslint-plugin-n to v18.5.0 (#23059)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-21 10:57:53 +00:00
Qingyuan Wang 8d85580b22 docs: remove incorrect claim that POST /timeouts no longer accepts type/ms (#23053) 2026-10-21 13:14:37 +03:00
github-actions[bot] 815fd3e3ca docs(appium): Update documentation translations (#23058) 2026-10-21 08:53:02 +02:00
dependabot[bot] 01de9bfb7d chore(deps): bump follow-redirects (#23056)
Bumps the npm_and_yarn group with 1 update in the / directory: [follow-redirects](https://github.com/follow-redirects/follow-redirects).


Updates `follow-redirects` from 1.16.0 to 1.16.1
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.16.0...v1.16.1)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-version: 1.16.1
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-20 21:06:40 +03:00
Edgars Eglītis 522f3975e1 docs: update driver repo links to docs sites (#23045) 2026-10-20 16:40:15 +03:00
renovate[bot] c7a88ebf37 chore(docutils): update dependency lilconfig to v3.1.4 (#23041)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-20 11:40:35 +00:00
Qingyuan Wang 88ea09a90f docs(contributing): fix dead Runme link (#23043)
The https://runme.dev/api/runme?... deep-link endpoint returns 404 (the service was removed). Link to the Runme homepage instead.
2026-10-20 12:47:39 +03:00
Qingyuan Wang fff33c6666 docs(readme): fix dead link to server CLI reference (#23037) 2026-10-20 12:31:58 +03:00
Qingyuan Wang f10fdf776b docs(guides): correct how event timings are returned by the events endpoint (#23036) 2026-10-20 12:28:58 +03:00
Qingyuan Wang 355d8630fb docs(guides): clarify whole-word matching for log-filters text rules (#23035) 2026-10-20 12:26:31 +03:00
Qingyuan Wang a9542ae474 docs(readme): fix dead links to renamed and relocated files (#23034) 2026-10-20 12:24:44 +03:00
Chinmay Jha 7ea5b75bfd docs: add Optics to Ecosystem tools document (#23033) 2026-10-20 12:21:58 +03:00
github-actions[bot]andmykola-mokhnach b995004d1a docs(appium): Update documentation translations (#23032)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-10-20 12:54:55 +09:00
Qingyuan Wang 99ace58ff8 docs(config): correct package.json property name for embedded config (#23027)
Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>
2026-10-19 21:20:25 +03:00
Qingyuan Wang 85371dd4e5 docs(cli): note hostname support in --address description (#23030)
Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>
2026-10-19 21:18:25 +03:00
Qingyuan Wang 23abcdef70 docs(cli): correct --callback-address default in server reference (#23029)
Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>
2026-10-19 21:03:13 +03:00
Qingyuan Wang 76481a7494 docs(managing-exts): fix garbled sentence about loading extensions from package.json (#23028)
Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>
2026-10-19 21:00:52 +03:00
Qingyuan Wang 17173e4dda docs(guides): fix three grammar typos in caps, caching and execute-methods (#23031)
Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>
2026-10-19 20:58:50 +03:00
renovate[bot] 6f74c79a4e chore(appium): update dependency argparse to v3.0.3 (#23019)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-19 13:27:02 +00:00
Qingyuan Wang c63c31155e docs(cli-reference): correct --source=github install spec format (#23020)
Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>
2026-10-19 15:05:16 +03:00
Qingyuan Wang d49b48984a docs(developing): fix dead links to renamed source files (#23016)
* docs(developing): fix dead links to renamed source files

Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>

* docs(developing): adjust sentence to reflect routes directory

Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>

---------

Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>
2026-10-19 14:01:49 +03:00
Qingyuan Wang 2bc0a2e15a docs(intro): fix a dead link to the routes directory (#23017)
* docs(intro): fix a dead link to the routes directory

Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>

* docs(intro): adjust sentence to reflect routes directory

Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>

---------

Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>
2026-10-19 13:59:04 +03:00
Qingyuan Wang 5d30656828 docs(guides): fix a dead link to the renamed helpers source file (#23018)
Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>
2026-10-19 12:32:21 +03:00
github-actions[bot]andmykola-mokhnach 034f50cdb7 docs(appium): Update documentation translations (#23015)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-10-19 12:30:06 +03:00
Mykola Mokhnach 3c20d79238 feat(appium): fallback to latest compatible extension version for CLI install (#23013) 2026-10-18 14:37:22 +02:00
Qingyuan Wang 011a1b7fd4 docs(branch-testing): fix wrong placeholder in the plugin uninstall command (#23012)
Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>
2026-10-18 14:24:36 +03:00
Qingyuan Wang d9b8e2d2b9 docs(quickstart): fix misspelled "Test" in the Ruby quickstart guide (#23011)
Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>
2026-10-18 14:22:37 +03:00
Qingyuan Wang f1e215880b docs(api): fix dead links to the type definition file in the API reference (#23010)
Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>
2026-10-18 13:36:47 +03:00
github-actions[bot]andmykola-mokhnach 11a484bed7 docs(appium): Update documentation translations (#23008)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-10-18 12:29:56 +03:00
Qingyuan Wang c65aaa9953 docs: fix spelling mistakes in comments and guides (#23009)
Signed-off-by: NUAAwqy <146524024+NUAAwqy@users.noreply.github.com>
2026-10-18 12:25:49 +03:00
Qingyuan Wang 241d2b29aa docs(readme): fix the broken license links in the appium package README (#23001)
* docs(readme): fix the broken license links in the appium package README

* docs(readme): also fix the broken Apache-2.0 license link
2026-10-17 14:02:28 +03:00
Qingyuan Wang 1a21c6f3e7 docs(plugins): remove the duplicated word in the official plugins intro (#23000)
* docs(plugins): remove the duplicated word in the official plugins intro

* docs(plugins): remove the duplicated word in the ja and zh guides

* docs(plugins): revert ja and zh copies; translations are synced with Crowdin
2026-10-17 13:59:24 +03:00
Qingyuan Wang f06e2f81cb docs(grid): fix misspelled grid-ip-address placeholder in the en guide (#22999)
* docs(grid): fix misspelled grid-ip-address placeholder in the en and ja guides

* docs(grid): fix the same placeholder misspelling in the zh guide

* docs(grid): revert ja and zh copies; translations are synced with Crowdin
2026-10-17 13:57:01 +03:00
Qingyuan Wang 94a89dafc5 docs(readme): fix dead link to the server CLI documentation (#22998) 2026-10-17 13:56:24 +03:00
renovate[bot] 615a2a40c5 chore(oxc-config): update dependency oxlint to v1.88.0 (#23005)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-17 10:54:09 +00:00
github-actions[bot]andmykola-mokhnach e8a09d2ad8 docs(appium): Update documentation translations (#23003)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-10-17 13:54:07 +03:00
renovate[bot] d88ec034cd chore(oxc-config): update dependency oxfmt to v0.73.0 (#23004)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-17 13:48:04 +03:00
renovate[bot] 8f57e0492c chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.71.2 (#22996)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-16 16:52:51 +00:00
renovate[bot] 253180c168 chore(deps): update dependency lerna to v10.1.1 (#22995)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-16 12:24:06 +00:00
MikhailandClaude Opus 5.5 a7f59de487 docs: add XPath to Class Chain to Ecosystem tools document (#22997)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 12:54:12 +03:00
renovate[bot] d649360618 chore(deps): update dependency lerna to v10.1.0 (#22985)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-14 15:44:37 +00:00
renovate[bot] 42eaf8ecda chore(oxc-config): update dependency oxlint-tsgolint to v7.0.2004 (#22984)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-14 13:14:19 +00:00
renovate[bot] 613752a609 chore(support): update dependency uuid to v14.0.3 (#22980)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-13 18:54:47 +02:00
renovate[bot] 6db1e00041 chore(deps): update dependency @types/node to v24.19.2 (#22979)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-13 14:01:39 +00:00
Kazuaki Matsuo 14110e50b0 fix(appium): backport bidi close code validation (#22942) 2026-10-11 00:54:47 +09:00
renovate[bot] 08c86049c1 chore(oxc-config): update dependency oxfmt to v0.72.0 (#22931)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-10 18:34:31 +03:00
renovate[bot] 5f5f711184 chore(universal-xml-plugin): update dependency xpath to v0.0.35 (#22949)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-10 12:27:14 +03:00
Mykola Mokhnach f2f0e2cc05 docs(governance): clarify that contributions are voluntary (#22938) 2026-10-10 08:48:10 +02:00
renovate[bot] 68d0fa4ab7 chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.71.1 (#22930)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-09 12:24:09 +00:00
dependabot[bot] 4a6c92680c chore(deps): bump the npm_and_yarn group across 1 directory with 2 updates (#22937)
Bumps the npm_and_yarn group with 2 updates in the / directory: [brace-expansion](https://github.com/juliangruber/brace-expansion) and [smol-toml](https://github.com/squirrelchat/smol-toml).


Updates `brace-expansion` from 5.0.9 to 5.0.12
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v5.0.9...v5.0.12)

Updates `smol-toml` from 1.6.1 to 1.9.0
- [Release notes](https://github.com/squirrelchat/smol-toml/releases)
- [Commits](https://github.com/squirrelchat/smol-toml/compare/v1.6.1...v1.9.0)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 5.0.12
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: smol-toml
  dependency-version: 1.9.0
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-09 14:33:01 +03:00
renovate[bot] 61e18086dc chore(oxc-config): update dependency oxlint to v1.87.0 (#22936)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-09 10:07:39 +00:00
github-actions[bot]andmykola-mokhnach 6f68dc9093 docs(appium): Update documentation translations (#22927)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-10-09 13:01:09 +03:00
Edgars Eglītis 0dc96de9a9 chore: run audit fix (#22920) 2026-10-08 14:21:50 +03:00
renovate[bot] 868b7b67d4 chore(workflows): update actions/setup-node action to v7.1.0 (#22915)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-08 06:27:53 +00:00
renovate[bot] e560924400 chore(deps): update dependency http-cache-semantics to v4.3.0 (#22909)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-07 08:32:53 +00:00
renovate[bot] 5fbd98ec29 chore(support): update dependency shell-quote to v1.12.0 (#22904)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-06 18:37:09 +02:00
dependabot[bot] 96d130ad93 chore(deps): bump the npm_and_yarn group across 1 directory with 2 updates (#22905)
Bumps the npm_and_yarn group with 2 updates in the / directory: [postcss-selector-parser](https://github.com/postcss/postcss-selector-parser) and [proxy-addr](https://github.com/jshttp/proxy-addr).


Updates `postcss-selector-parser` from 7.1.5 to 7.1.6
- [Release notes](https://github.com/postcss/postcss-selector-parser/releases)
- [Changelog](https://github.com/postcss/postcss-selector-parser/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss-selector-parser/compare/7.1.5...7.1.6)

Updates `proxy-addr` from 2.0.7 to 2.0.8
- [Release notes](https://github.com/jshttp/proxy-addr/releases)
- [Changelog](https://github.com/jshttp/proxy-addr/blob/master/HISTORY.md)
- [Commits](https://github.com/jshttp/proxy-addr/compare/v2.0.7...v2.0.8)

---
updated-dependencies:
- dependency-name: postcss-selector-parser
  dependency-version: 7.1.6
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: proxy-addr
  dependency-version: 2.0.8
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-06 15:36:31 +03:00
renovate[bot] f986375024 chore(eslint-config-appium-ts): update dependency eslint-plugin-n to v18.4.1 (#22903)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-06 12:27:25 +00:00
github-actions[bot]andmykola-mokhnach e9dc5d6374 docs(appium): Update documentation translations (#22902)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-10-06 11:17:17 +03:00
Mykola Mokhnach 62413002a8 fix(base-driver): track and remove BiDi subscriptions by ID (#22895) 2026-10-05 16:10:19 +02:00
Mikhail Fleytman 77945ddaf1 fix(appium): prevent recursion when logging the first BiDi event of a method (#22891) 2026-10-05 15:05:37 +02:00
Kazuaki Matsuo 061d995735 docs: document contributor style conventions for agents (#22879)
* feat(oxc-config): restore class member ordering through JS plugins

* docs: document class method ordering for agents and contributors

* docs: keep ordering rules in the contributor style guide

* docs: simplify the agent style guide reference

* docs: add JSDoc and module ordering conventions
2026-10-05 15:10:06 +09:00
renovate[bot] 596ece7f11 chore(deps): update dependency @types/node to v24.19.1 (#22892)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-05 05:56:47 +00:00
github-actions[bot]andmykola-mokhnach 73e587fe3d docs(appium): Update documentation translations (#22856)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-10-03 12:47:03 +03:00
renovate[bot] 01d2b8f1e4 chore(support): update dependency shell-quote to v1.11.0 (#22858)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-03 09:46:49 +00:00
renovate[bot] 607a1ecf81 chore(oxc-config): update dependency oxlint to v1.86.0 (#22853)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-03 00:21:35 +00:00
renovate[bot] e621c6fe87 chore(universal-xml-plugin): update dependency fast-xml-parser to v5.11.2 (#22849)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-02 20:22:00 +00:00
renovate[bot] c27ced0d1d chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.71.0 (#22850)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-02 16:21:53 +00:00
renovate[bot] 7a3190e5e5 chore(deps): update definitelytyped (#22847)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-02 12:22:29 +00:00
renovate[bot] 1ca4bc311c chore(oxc-config): update dependency oxfmt to v0.71.0 (#22852)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-02 13:31:08 +03:00
David Burns a85a35e87d docs(appium): add llms.txt to the documentation site (#22839)
* docs(appium): add llms.txt to the documentation site

Adds an /llms.txt file (https://llmstxt.org/) so that LLMs can navigate the
Appium documentation without crawling it, following the same approach taken by
the Selenium project.

The file is hand-written rather than generated. Its value lies in the parts a
crawler could not work out on its own: a set of steering notes covering what
models reliably get wrong about Appium (Appium 1 era patterns, drivers needing
separate installation, the `appium:` capability prefix, `mobile:` execute
methods, the Appium 3 `--allow-insecure` scope prefix, and the move from
GET /sessions to GET /appium/sessions), followed by conceptually grouped links
with a description for each page.

MkDocs copies non-Markdown files in docs_dir to the site verbatim, so this
requires no plugin, no new dependency and no build configuration. It is served
at appium.io/docs/en/latest/llms.txt, and mike gives a per-version copy for
free.

Because the file is hand-written, nothing regenerates it when a page is renamed
or removed. check-llmstxt.js validates it against the documentation sources and
runs on every docs PR: broken links fail the build, while pages that exist but
are not listed produce a warning (or fail under --strict).

The root of appium.io is not produced by MkDocs, but crawlers look for
/llms.txt at the domain root. Since the links in the file are absolute, the
same file serves both locations, so the publish workflow copies it to the
gh-pages root on release. mike only writes under its docs/<lang> deploy prefix,
so this does not interfere with it.

English only, matching Selenium and WebdriverIO. The ja/zh docs are translated
via Crowdin, where hand-edited descriptions would drift out of sync.

* docs(appium): address llms.txt review feedback

- Describe the standard W3C capabilities as the specification's set rather than
  only browserName/browserVersion/platformName, so that generated code does not
  vendor-prefix acceptInsecureCerts, timeouts, pageLoadStrategy or webSocketUrl.
- Say that these pages describe Appium 3, and that Appium 2 is documented under
  its own version of the site, instead of claiming both are covered here.
- Note watchOS for the XCUITest driver, and the AI-related tools (Appium MCP,
  agent skills) alongside Appium Inspector.
- Correct the event timings entry: the endpoint works without the
  appium:eventTimings capability, which is being removed in Appium 4.
- check-llmstxt.js: a page that exists but is not listed is now an error rather
  than a warning, since a warning in CI logs is easy to miss. The --strict flag
  is gone, as that is now the only behaviour.
- check-llmstxt.js: validate relative and site-relative links too. A link such
  as /docs/en/3.7/guides/caps/ was previously treated as external and skipped,
  so a pinned version could have slipped past the check.
2026-10-02 13:18:58 +03:00
dependabot[bot] 43bb05cba0 chore(deps): bump the npm_and_yarn group across 1 directory with 2 updates (#22851)
Bumps the npm_and_yarn group with 2 updates in the / directory: [undici](https://github.com/nodejs/undici) and [ip-address](https://github.com/beaugunderson/ip-address).


Updates `undici` from 7.29.0 to 7.30.0
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v7.29.0...v7.30.0)

Updates `undici` from 6.28.0 to 6.29.0
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v7.29.0...v7.30.0)

Updates `ip-address` from 10.7.0 to 10.7.3
- [Release notes](https://github.com/beaugunderson/ip-address/releases)
- [Commits](https://github.com/beaugunderson/ip-address/compare/v10.7.0...v10.7.3)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 7.30.0
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: undici
  dependency-version: 6.29.0
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: ip-address
  dependency-version: 10.7.3
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-02 12:16:07 +03:00
github-actions[bot]andmykola-mokhnach 28e9501374 docs(appium): Update documentation translations (#22845)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-10-02 12:07:16 +03:00
renovate[bot] eed26a25fc chore(opencv): update dependency sharp to v0.35.5 (#22848)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-02 12:06:39 +03:00
Edgars Eglītis ecabd78fa1 docs: tune driver listing (#22844)
* docs: tune driver listing

* docs: update Espresso modes
2026-10-01 18:16:08 +03:00
dependabot[bot] e33b47f96b chore(deps): bump fast-uri in the npm_and_yarn group across 1 directory (#22831)
Bumps the npm_and_yarn group with 1 update in the / directory: [fast-uri](https://github.com/fastify/fast-uri).


Updates `fast-uri` from 3.1.6 to 3.1.8
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.6...v3.1.8)

---
updated-dependencies:
- dependency-name: fast-uri
  dependency-version: 3.1.8
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-30 13:01:00 +03:00
renovate[bot] bbf849380d chore(storage-plugin): update dependency ws to v8.22.0 (#22838)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-30 08:16:03 +02:00
renovate[bot] ac93158af5 chore(eslint-config-appium-ts): update dependency eslint-plugin-n to v18.4.0 (#22837)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-30 06:14:45 +00:00
renovate[bot] 2bec48ebc0 chore(deps): update dependency @types/node to v24.19.0 (#22832)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-29 12:28:25 +00:00
renovate[bot] 9173346c3c chore(oxc-config): update dependency oxlint-tsgolint to v7.0.2003 (#22830)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-28 21:12:01 +00:00
renovate[bot] 9396d6d3b0 chore(eslint-config-appium-ts): update dependency eslint-plugin-perfectionist to v5.12.1 (#22824)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-27 12:24:25 +00:00
Kazuaki Matsuo 359ef4ba89 fix(support): preserve exclamation marks with apostrophes (#22816)
* fix(support): preserve exclamation marks with apostrophes

* test(support): use async shell execution and document workaround
2026-09-27 02:28:37 +09:00
renovate[bot] ac2c78c822 chore(oxc-config): update dependency oxlint to v1.85.0 (#22820)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-26 12:39:38 +00:00
renovate[bot] 59ab921d8e chore(execute-driver-plugin): update dependency webdriverio to v9.32.0 (#22818)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-26 11:53:00 +00:00
renovate[bot] c051454e87 chore(oxc-config): update dependency oxfmt to v0.70.0 (#22819)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-26 13:47:43 +02:00
renovate[bot] 3c48508904 chore(eslint-config-appium-ts): update dependency eslint-plugin-perfectionist to v5.12.0 (#22817)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-26 11:38:22 +00:00
renovate[bot] 9509d19e1b chore(docutils): update dependency yargs to v18.2.0 (#22814)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-25 12:06:11 +00:00
renovate[bot] 7723622d57 chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.70.1 (#22813)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-25 14:00:20 +02:00
github-actions eb5ce47b17 chore: publish
- appium@3.8.0
 - @appium/base-driver@10.8.1
 - @appium/base-plugin@3.3.5
 - @appium/docutils@3.0.1
 - @appium/driver-test-support@3.0.1
 - @appium/eslint-config-appium-ts@3.2.6
 - @appium/execute-driver-plugin@7.0.1
 - @appium/fake-driver@6.2.4
 - @appium/fake-plugin@4.4.1
 - @appium/images-plugin@5.0.1
 - @appium/logger@2.0.12
 - @appium/opencv@5.0.1
 - @appium/oxc-config@1.1.2
 - @appium/plugin-test-support@3.0.1
 - @appium/relaxed-caps-plugin@3.0.1
 - @appium/storage-plugin@2.0.1
 - @appium/strongbox@2.0.1
 - @appium/support@7.2.8
 - @appium/types@1.7.1
 - @appium/universal-xml-plugin@3.0.1
2026-09-24 18:25:54 +00:00
Mykola Mokhnach 7df378f401 fix(support): avoid TOCTOU race in getLockFileGuard() acquisition (#22807) 2026-09-23 08:42:29 +02:00
Mohamed Mostafa 4dd2e2d47d fix(support): do not delete a path when fs.mv destination is the source or inside it (#22806) 2026-09-23 08:35:12 +02:00
renovate[bot] dacc42ba0a chore(storage-plugin): update dependency lru-cache to v11.5.3 (#22802)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-22 19:36:17 +00:00
renovate[bot] 2502f538ff chore(deps): update dependency @types/node to v24.13.6 (#22801)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-22 16:29:05 +00:00
renovate[bot] 3f38f5cd74 chore(types): update dependency type-fest to v5.10.0 (#22798)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-21 23:31:41 +00:00
renovate[bot] 6891dd4eae chore(oxc-config): update dependency oxlint-tsgolint to v7.0.2002 (#22797)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-21 15:15:48 +00:00
Mykola Mokhnach 4e8e334cbc fix(appium): filter prerelease versions in driver update e2e test (#22794) 2026-09-20 15:15:22 +02:00
Mohamed Mostafa 3423e36689 fix(base-driver): keep existing contexts when session.subscribe is called again (#22780) 2026-09-20 14:19:29 +02:00
renovate[bot] 14a9d98641 chore(eslint-config-appium-ts): update dependency eslint-plugin-perfectionist to v5.11.1 (#22786)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-19 18:08:51 +02:00
renovate[bot] f79fafb816 chore(deps): update dependency @types/node to v24.13.5 (#22785)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-19 10:22:06 +00:00
Edgars Eglītis 443b0bdd03 chore(oxc-config): update oxc packages (#22787) 2026-09-19 12:38:39 +03:00
renovate[bot] 80fbf957c8 chore(docutils): update dependency mkdocs-git-revision-date-localized-plugin to v1.6.0 (#22782)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-18 23:43:43 +00:00
renovate[bot] 0443c84ec0 chore(execute-driver-plugin): update dependency webdriverio to v9.31.9 (#22781)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-18 08:43:04 +00:00
renovate[bot] a47fdb8e05 chore(execute-driver-plugin): update dependency webdriverio to v9.31.8 (#22779)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-16 17:52:21 +02:00
renovate[bot] e2c8f09bb9 chore(docutils): update dependency yaml to v2.9.1 (#22778)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-16 17:52:08 +02:00
Mohamed Mostafa dc16d6970f fix(support): extract zip entries whose names start with dots (#22772) 2026-09-14 18:08:04 +02:00
renovate[bot] abfe1243a1 chore(base-driver): update dependency morgan to v1.12.1 (#22775)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-14 13:44:06 +02:00
renovate[bot] 9bbf6b72bf chore(appium): update dependency argparse to v3.0.2 (#22773)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-14 11:27:58 +00:00
renovate[bot] 0fa9c9bd80 chore(deps): update dependency @types/node to v24.13.4 (#22768)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-13 13:46:08 +00:00
Mohamed Mostafa 9a70a44c83 fix(support): do not set file-sized Content-Length on default multipart uploads (#22766) 2026-09-12 19:02:21 +02:00
renovate[bot] 65e14685a8 chore(oxc-config): update dependency oxfmt to v0.67.0 (#22724)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-12 11:50:40 +03:00
renovate[bot] 29eeb28f86 chore(oxc-config): update dependency oxlint to v1.82.0 (#22726)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-12 06:39:44 +00:00
github-actions[bot]andmykola-mokhnach ac412b8723 docs(appium): Update documentation translations (#22759)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-09-11 19:36:59 +03:00
renovate[bot] 68740320d2 chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.70.0 (#22761)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-11 12:14:22 +00:00
renovate[bot] 9dc6cd0019 chore(execute-driver-plugin): update dependency webdriverio to v9.31.7 (#22760)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-11 12:04:55 +00:00
Mohamed Mostafa 81c8b9da0a fix(base-driver): honor unquoted and RFC 5987 Content-Disposition filenames (#22755) 2026-09-11 08:19:50 +02:00
renovate[bot] 726348c2d5 chore(js): update dependency webdriverio to v9.31.6 (#22751)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-10 16:32:41 +00:00
Jack VanSickle 6c911debd7 feat(appium): accept package names for installed extension commands (#22747) 2026-09-10 07:25:36 +02:00
Edgars Eglītis 8ccb436701 chore(deps): bump ESLint and bplist-related dependencies (#22748) 2026-09-09 11:22:33 +03:00
Mohamed Mostafa f522b64456 fix(storage-plugin): map StorageArgumentError to InvalidArgumentError (#22734) 2026-09-08 06:50:51 +02:00
Mohamed Mostafa 3180558086 test(images-plugin): give the unit tests room to retry and finish on CI (#22743) 2026-09-08 06:44:12 +02:00
dependabot[bot] 9d07f6bc5e chore(deps): bump deepmerge-ts (#22739)
Bumps the npm_and_yarn group with 1 update in the / directory: [deepmerge-ts](https://github.com/RebeccaStevens/deepmerge-ts).


Updates `deepmerge-ts` from 7.1.6 to 8.0.2
- [Release notes](https://github.com/RebeccaStevens/deepmerge-ts/releases)
- [Changelog](https://github.com/RebeccaStevens/deepmerge-ts/blob/main/CHANGELOG.md)
- [Commits](https://github.com/RebeccaStevens/deepmerge-ts/compare/v7.1.6...v8.0.2)

---
updated-dependencies:
- dependency-name: deepmerge-ts
  dependency-version: 8.0.2
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-07 12:42:56 +03:00
Edgars Eglītis b234e2b56b chore(oxc-config): bump oxc dependencies (#22737) 2026-09-07 12:11:56 +03:00
Edgars Eglītis b635641f24 chore: regenerate lockfile (#22728)
* chore: regenerate lockfile

* chore: regenerate again after a deeper cleanup
2026-09-05 14:10:02 +03:00
Edgars EglītisandMykola Mokhnach 6d720b1112 test(base-driver): fix invalid import (#22729)
* test: fix invalid import

* test: import BaseDriver from package entry in type test

tsd builds its type-check program from an explicit file list, which
trips TS6059 (composite project) when the raw lib source is imported
directly, pulling in the whole transitive dependency tree.

* fix: exclude test/types from base-driver's main tsc build

Importing @appium/base-driver by package name from within its own
test/types dir is a self-reference: the main composite build (tsc -b)
was including test/types too, so it tried to resolve the package's own
not-yet-emitted build/lib/index.d.ts while still generating it,
breaking the whole build. packages/strongbox already excludes
test/types from its main include for the same reason; tsd targets
test/types independently via its own "directory" config, unaffected
by this exclude.

* fix: use explicit tsconfig include instead of excluding test/types

Matches packages/strongbox's pattern of listing test subfolders
explicitly rather than excluding test/types from "test".

---------

Co-authored-by: Mykola Mokhnach <mokhnach@gmail.com>
2026-09-05 13:55:31 +03:00
Mohamed Mostafa 6ab17feb71 fix(appium): match insecure feature prefixes by automationName, case-insensitively (#22710) 2026-09-05 09:25:01 +02:00
Mohamed Mostafa afa4837530 fix(strongbox): reject item names that slugify to an empty path (#22717) 2026-09-04 18:37:47 +02:00
renovate[bot] 1ada93cf76 chore(types): update dependency type-fest to v5.9.0 (#22713)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-03 11:03:14 +00:00
dependabot[bot] b32e28d36d chore(deps): bump fast-uri in the npm_and_yarn group across 1 directory (#22711)
Bumps the npm_and_yarn group with 1 update in the / directory: [fast-uri](https://github.com/fastify/fast-uri).


Updates `fast-uri` from 3.1.5 to 3.1.7
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.5...v3.1.7)

---
updated-dependencies:
- dependency-name: fast-uri
  dependency-version: 3.1.7
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-03 10:50:55 +03:00
renovate[bot] 119e21f067 chore(opencv): update dependency sharp to v0.35.4 (#22712)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-03 07:40:13 +02:00
Mohamed Mostafa 6ba6faf6f5 fix(appium): do not treat a directory as a CLI argument file (#22709) 2026-09-02 20:40:47 +02:00
dependabot[bot] 422362a259 chore(deps): bump the npm_and_yarn group across 1 directory with 3 updates (#22707)
Bumps the npm_and_yarn group with 3 updates in the / directory: [@humanfs/node](https://github.com/humanwhocodes/humanfs/tree/HEAD/packages/node), [browserslist](https://github.com/browserslist/browserslist) and [qs](https://github.com/ljharb/qs).


Updates `@humanfs/node` from 0.16.6 to 0.16.8
- [Release notes](https://github.com/humanwhocodes/humanfs/releases)
- [Changelog](https://github.com/humanwhocodes/humanfs/blob/main/packages/node/CHANGELOG.md)
- [Commits](https://github.com/humanwhocodes/humanfs/commits/node-v0.16.8/packages/node)

Updates `browserslist` from 4.28.2 to 4.28.8
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.28.2...4.28.8)

Updates `qs` from 6.15.2 to 6.16.0
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.15.2...v6.16.0)

---
updated-dependencies:
- dependency-name: "@humanfs/node"
  dependency-version: 0.16.8
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: browserslist
  dependency-version: 4.28.8
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: qs
  dependency-version: 6.16.0
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-02 19:30:56 +03:00
renovate[bot] 62bfe1566a chore(execute-driver-plugin): update dependency webdriverio to v9.31.5 (#22706)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-02 15:28:34 +00:00
Kazuaki Matsuo 8a9350b8e9 docs: fix docs build (#22702) 2026-09-02 13:01:01 +09:00
github-actions[bot]andmykola-mokhnach bf51d27137 docs(appium): Update documentation translations (#22701)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-09-02 12:21:52 +09:00
dependabot[bot] de00df0afa chore(deps): bump the npm_and_yarn group across 1 directory with 2 updates (#22698)
Bumps the npm_and_yarn group with 2 updates in the / directory: [postcss-selector-parser](https://github.com/postcss/postcss-selector-parser) and [tar](https://github.com/isaacs/node-tar).


Updates `postcss-selector-parser` from 7.1.1 to 7.1.4
- [Release notes](https://github.com/postcss/postcss-selector-parser/releases)
- [Changelog](https://github.com/postcss/postcss-selector-parser/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss-selector-parser/compare/v7.1.1...7.1.4)

Updates `tar` from 7.5.19 to 7.5.22
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v7.5.19...v7.5.22)

---
updated-dependencies:
- dependency-name: postcss-selector-parser
  dependency-version: 7.1.4
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: tar
  dependency-version: 7.5.22
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-01 19:21:41 +03:00
renovate[bot] c3a48181c8 chore(oxc-config): update dependency oxlint to v1.80.0 (#22696)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-01 16:05:19 +00:00
Edgars Eglītis 77dc09af36 docs: add watchOS blogpost (#22697) 2026-09-01 18:57:25 +03:00
renovate[bot] 59af10a17c chore(oxc-config): update dependency oxfmt to v0.65.0 (#22695)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-01 13:29:46 +03:00
renovate[bot] 6e989bd89a chore(support): update dependency axios to v1.20.0 (#22692)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-01 10:09:07 +00:00
renovate[bot] 557e71f766 chore(deps): update dependency json-schema-to-typescript to v16 (#22694)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-01 13:03:25 +03:00
renovate[bot] 63d94d03c6 chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.68.0 (#22693)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-01 00:43:50 +00:00
renovate[bot] 8a0022c147 chore(base-driver): update dependency morgan to v1.12.0 (#22690)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-31 21:10:49 +00:00
renovate[bot] 72ee77d139 chore(universal-xml-plugin): update dependency fast-xml-parser to v5.11.1 (#22691)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-31 21:05:10 +00:00
renovate[bot] 70a01da4b2 chore(support): update dependency asyncbox to v6.4.3 (#22688)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-31 19:24:34 +00:00
renovate[bot] 1b705bcd24 chore(appium): update dependency argparse to v3.0.1 (#22689)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-31 19:11:44 +00:00
renovate[bot] 574bd6cbfb chore(execute-driver-plugin): update dependency webdriverio to v9.31.4 (#22687)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-31 19:06:33 +00:00
Mohamed Mostafa 9c00b86ce7 fix(base-driver): reject invalid timeout with InvalidArgumentError (#22679) 2026-08-31 20:35:57 +02:00
Mohamed Mostafa 0c4da64aea fix(base-driver): skip unknown events in session.unsubscribe (#22671) 2026-08-29 17:26:32 +02:00
Edgars Eglītis dafc5985bb ci: tune docs publish workflow (#22670) 2026-08-25 20:06:49 +03:00
github-actions[bot]andmykola-mokhnach 02443f98d6 docs(appium): Update documentation translations (#22669)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-08-25 14:16:56 +09:00
renovate[bot] b4097b54d4 chore(execute-driver-plugin): update dependency webdriverio to v9.31.2 (#22667)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-24 21:28:14 +00:00
github-actions b67de03966 chore: publish
- appium@3.7.0
 - @appium/base-driver@10.8.0
 - @appium/base-plugin@3.3.4
 - @appium/docutils@3.0.0
 - @appium/driver-test-support@3.0.0
 - @appium/eslint-config-appium-ts@3.2.5
 - @appium/execute-driver-plugin@7.0.0
 - @appium/fake-driver@6.2.3
 - @appium/fake-plugin@4.4.0
 - @appium/images-plugin@5.0.0
 - @appium/logger@2.0.11
 - @appium/opencv@5.0.0
 - @appium/oxc-config@1.1.1
 - @appium/plugin-test-support@3.0.0
 - @appium/relaxed-caps-plugin@3.0.0
 - @appium/semantic-release-config@1.2.0
 - @appium/storage-plugin@2.0.0
 - @appium/strongbox@2.0.0
 - @appium/support@7.2.7
 - @appium/tsconfig@1.2.1
 - @appium/types@1.7.0
 - @appium/universal-xml-plugin@3.0.0
2026-08-24 20:49:04 +00:00
Mykola Mokhnach 2b39493e98 ci: fix conventional changelog immutable (#22668) 2026-08-24 22:47:13 +02:00
Ajay Mandal e916673e32 docs: add Itsmeaj Linux driver listing (#22666)
* docs: update Linux driver listing

* docs: use Itsmeaj Linux driver package

* docs: identify Itsmeaj as Linux driver maintainer

* docs: add separate AT-SPI2 Linux driver entry

* docs: distinguish Linux drivers by maintainer
2026-08-24 18:42:17 +03:00
Mohamed Mostafa 76ff5aa69a fix(strongbox): custom container paths are always rejected on Windows (#22665) 2026-08-24 17:05:37 +02:00
Mykola Mokhnach b1b313b989 chore(eslint-config-appium-ts): deprecate in favour of oxc-config (#22664) 2026-08-24 15:42:36 +02:00
Mykola Mokhnach 658f88d8c1 feat(release): add next-major beta-branch support to release tooling (#22663) 2026-08-24 15:36:18 +02:00
github-actions[bot]andmykola-mokhnach 3999208fc0 docs(appium): Update documentation translations (#22662)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-08-23 11:59:36 +03:00
Mohamed Mostafa 1f945716a0 fix(universal-xml-plugin): iOS findElements drops matches after the first one (#22644) 2026-08-23 08:58:11 +02:00
renovate[bot] 0a3ad48419 chore(oxc-config): update dependency oxlint to v1.79.0 (#22659)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-22 22:55:36 +02:00
Edgars Eglītis 17be28c750 chore(oxc-config): update oxfmt to v0.64.0 (#22661) 2026-08-22 23:14:52 +03:00
renovate[bot] 746073148f chore(universal-xml-plugin): update dependency @xmldom/xmldom to v0.9.12 (#22660)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-22 22:56:19 +03:00
renovate[bot] 73ef2f7d43 chore(deps): update dependency lerna to v10.0.1 (#22656)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-22 19:49:21 +00:00
renovate[bot] 6fb07a5dbc chore(universal-xml-plugin): update dependency @xmldom/xmldom to v0.9.11 (#22657)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-22 22:40:03 +03:00
Edgars EglītisandSri Harsha 5dd80daf63 docs: adjust formatting for TestMu AI (originally LT) partnership blogpost (#22645)
Co-authored-by: Sri Harsha <12621691+harsha509@users.noreply.github.com>
2026-08-22 11:57:24 +05:30
renovate[bot] 05e36962e6 chore(universal-xml-plugin): update dependency fast-xml-parser to v5.11.0 (#22653)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-22 08:00:45 +02:00
renovate[bot] eaa824f601 chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.67.0 (#22652)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-22 05:35:32 +00:00
renovate[bot] 6cb62d21e8 chore(tsconfig): update dependency @tsconfig/node20 to v20.1.10 (#22654)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-22 01:46:44 +00:00
renovate[bot] 8254a7a3b5 chore(support): update dependency uuid to v14.0.2 (#22651)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-21 21:18:40 +00:00
renovate[bot] 83e99bc752 chore(docutils): update dependency mkdocs-git-revision-date-localized-plugin to v1.5.4 (#22650)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-21 21:13:25 +00:00
Edgars Eglītis 147c0bcac3 ci: adjust publish docs workflow trigger condition (#22649)
* ci: adjust docs workflow trigger condition

* ci: restrict condition to server releases
2026-08-21 18:42:39 +03:00
github-actions[bot]andmykola-mokhnach ddd4251108 docs(appium): Update documentation translations (#22648)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-08-21 11:17:04 +03:00
Mykola Mokhnach b19bd7878b test(appium): re-enable BiDi/IPC e2e tests fixed by webdriverio 9.31.1 (#22647) 2026-08-20 22:32:38 +02:00
Edgars Eglītis 91446df648 docs: add new /appium prefixed routes (#22646) 2026-08-20 23:10:27 +03:00
Mykola Mokhnach d5b316031e feat(base-driver): add /appium-prefixed routes for JSONWP/MJSONWP end points (#22642) 2026-08-20 19:42:02 +02:00
Edgars Eglītis 737cf77b6e chore: run audit fix (#22643) 2026-08-20 11:24:09 +03:00
Mohamed Mostafa c35a12a51d fix(appium): parse --webhook as a URI instead of host:port (#22635) 2026-08-20 07:06:46 +02:00
Edgars Eglītis 5c2aafa208 docs(appium): prefer latest alias for SEO (#22641) 2026-08-19 16:54:21 +03:00
Mykola Mokhnach 4422d99d45 fix(base-driver): anchor CORS async-response regex and match on req.path (#22639) 2026-08-19 11:47:06 +02:00
github-actions[bot]andmykola-mokhnach ce50dd7fa7 docs(appium): Update documentation translations (#22638)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-08-18 15:25:52 +09:00
Mykola Mokhnach f06226b7bb feat(base-driver): add httpServer.frontRouter for global extension middleware (#22632) 2026-08-17 08:22:11 +02:00
Mohamed Mostafa 33459705ed fix(images-plugin): compare yScale with the same float precision as xScale (#22634) 2026-08-14 14:03:06 +02:00
github-actions[bot]andmykola-mokhnach f4ca259852 docs(appium): Update documentation translations (#22630)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-08-13 09:21:37 +09:00
Mykola Mokhnach a49ae68f13 test(appium): add e2e coverage for extension-provided CLI args (#22629) 2026-08-12 19:18:02 +02:00
renovate[bot] 50bd67e59d chore(eslint-config-appium-ts): update dependency eslint-plugin-n to v18.3.0 (#22627)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-12 18:28:21 +02:00
Edgars Eglītis 549b4d4179 docs: update extension script options (#22628) 2026-08-12 11:27:49 +03:00
Mohamed Mostafa 26ffad4f24 fix(base-driver): reject a non-string url without throwing TypeError (#22625) 2026-08-11 22:25:19 +02:00
renovate[bot] 1a81ac88f3 chore(storage-plugin): update dependency ws to v8.21.3 (#22626)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-11 20:14:31 +02:00
Mohamed Mostafa c9fca97cae fix(execute-driver-plugin): fail fast if the script process dies (#22607) 2026-08-08 13:50:14 +02:00
Edgars Eglītis 7d87b26047 chore(oxc-config): update oxfmt to 0.62.0 (#22624) 2026-08-08 10:41:39 +03:00
renovate[bot] 87930a2df1 chore(oxc-config): update dependency oxlint to v1.77.0 (#22622)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-08 09:21:31 +02:00
renovate[bot] 29ee04cf03 chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.66.0 (#22620)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-08 08:52:33 +02:00
renovate[bot] 8892b1022d chore(semantic-release-config): update dependency semantic-release to v25.0.9 (#22619)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-08 08:52:24 +02:00
renovate[bot] b97fe497cf chore(storage-plugin): update dependency ws to v8.21.2 (#22618)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-07 16:38:51 +00:00
renovate[bot] a729d86637 chore(execute-driver-plugin): update dependency webdriverio to v9.30.1 (#22617)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-07 13:54:05 +00:00
renovate[bot] e5bd73272b chore(eslint-config-appium-ts): update dependency eslint-plugin-perfectionist to v5.10.1 (#22616)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-07 10:58:17 +00:00
github-actions[bot]andmykola-mokhnach 037b42454a docs(appium): Update documentation translations (#22615)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-08-07 11:13:49 +03:00
renovate[bot] 5cf259f974 chore(eslint-config-appium-ts): update dependency eslint-plugin-jsdoc to v63.3.3 (#22612)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-06 20:07:56 +02:00
Edgars Eglītis 1486078c82 chore: replace safe occurrences of JWProxy (#22614) 2026-08-06 16:54:45 +03:00
Mykola Mokhnach 01a4eaec49 chore: remove chai and related packages now that all tests use node:assert (#22611) 2026-08-05 23:15:32 +02:00
Mykola Mokhnach 10086b543f test(appium): replace chai with node:assert/strict (#22604) 2026-08-05 22:22:23 +02:00
Mohamed Mostafa 68ce0e2bdd fix(base-driver): return a W3C error for a malformed JSON body (#22606) 2026-08-05 22:22:02 +02:00
renovate[bot] ae4ca98826 chore(deps): update dependency @types/semver to v7.8.0 (#22609)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-05 17:31:44 +02:00
Mykola Mokhnach 1d1631e64e test(base-driver): replace chai with node:assert/strict (#22603) 2026-08-05 17:31:35 +02:00
Mykola Mokhnach 5721d50b3a chore(deps): remove obsolete devDependencies (#22610) 2026-08-05 15:16:15 +02:00
Mykola Mokhnach bd3a120587 fix(driver-test-support): make import/require conditions explicit in exports map (#22605) 2026-08-05 14:41:58 +02:00
Mykola Mokhnach 3e2592804a test(strongbox): replace chai with node:assert/strict (#22593) 2026-08-05 13:30:33 +02:00
Mykola Mokhnach 93c0842dbb test(fake-driver): replace chai with node:assert/strict (#22600) 2026-08-05 12:19:37 +02:00
Mykola Mokhnach 13e8834405 test(support): replace chai with node:assert/strict (#22594) 2026-08-05 12:02:49 +02:00
Mykola Mokhnach 3ab2320e1b test(logger): replace chai with node:assert/strict (#22598) 2026-08-05 12:02:18 +02:00
Mykola Mokhnach 258fc2245a test(opencv): replace chai with node:assert/strict (#22597) 2026-08-05 11:46:11 +02:00
Mykola Mokhnach 5dd9baf5ea test(images-plugin): replace chai with node:assert/strict (#22599) 2026-08-05 11:42:07 +02:00
Mykola Mokhnach 481807f8db test(docutils): replace chai with node:assert/strict (#22602) 2026-08-05 11:41:52 +02:00
Mykola Mokhnach 8a90e74af3 test(execute-driver-plugin): replace chai with node:assert/strict (#22601) 2026-08-05 11:36:00 +02:00
Mykola Mokhnach ea9595ff53 test(relaxed-caps-plugin): replace chai with node:assert/strict (#22596) 2026-08-05 11:35:48 +02:00
github-actions[bot]andmykola-mokhnach 5d796139f6 docs(appium): Update documentation translations (#22608)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-08-05 11:12:18 +03:00
Mykola Mokhnach b3f8a5eea6 test(storage-plugin): replace chai with node:assert/strict (#22595) 2026-08-04 23:47:22 +02:00
Mykola Mokhnach ae549c8613 feat(plugin-test-support)!: Migrate to ESM (#22592)
BREAKING CHANGE: @appium/plugin-test-support is now an ESM-only package. It can no longer be loaded via CommonJS require(); consumers must use import or dynamic import(). Deep imports into the package's internals are no longer possible — only the public entry point is exposed via exports.
2026-08-04 23:46:58 +02:00
Mykola Mokhnach af8efc0882 feat(storage-plugin)!: Migrate to ESM (#22590)
BREAKING CHANGE: @appium/storage-plugin is now an ESM-only package. It can no longer be loaded via CommonJS require(); consumers must use import or dynamic import(). Deep imports into the package's internals are no longer possible — only the public entry point is exposed via exports.
2026-08-04 21:12:58 +02:00
renovate[bot] 63103cfa0d chore(deps): update dependency lerna to v10 (#22582)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-04 21:12:34 +02:00
Mykola Mokhnach b0938e6334 feat(driver-test-support)!: Migrate to ESM (#22591)
BREAKING CHANGE: @appium/driver-test-support is now an ESM-only package. It can no longer be loaded via CommonJS require(); consumers must use import or dynamic import(). Deep imports into the package's internals are no longer possible — only the public entry point is exposed via exports.
2026-08-04 21:01:21 +02:00
Mykola Mokhnach 4b0cc9d37f chore(base-driver): Deprecate the legacy createSession API shape (#22587) 2026-08-04 18:55:03 +02:00
dependabot[bot] 909cc3d4c0 chore(deps): bump the npm_and_yarn group across 1 directory with 2 updates (#22589)
Bumps the npm_and_yarn group with 2 updates in the / directory: [undici](https://github.com/nodejs/undici) and [fast-uri](https://github.com/fastify/fast-uri).


Updates `undici` from 6.27.0 to 6.28.0
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v6.27.0...v6.28.0)

Updates `undici` from 7.28.0 to 7.29.0
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v6.27.0...v6.28.0)

Updates `fast-uri` from 3.1.4 to 3.1.5
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.4...v3.1.5)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 6.28.0
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: undici
  dependency-version: 7.29.0
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: fast-uri
  dependency-version: 3.1.5
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 11:14:24 +03:00
dependabot[bot] 1a8f88029b chore(deps): bump ip-address (#22588)
Bumps the npm_and_yarn group with 1 update in the / directory: [ip-address](https://github.com/beaugunderson/ip-address).


Updates `ip-address` from 10.2.0 to 10.4.0
- [Release notes](https://github.com/beaugunderson/ip-address/releases)
- [Commits](https://github.com/beaugunderson/ip-address/compare/v10.2.0...v10.4.0)

---
updated-dependencies:
- dependency-name: ip-address
  dependency-version: 10.4.0
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 10:52:02 +03:00
Mohamed Mostafa 3a8049887d fix(support): do not treat a sibling folder as a subpath of the root (#22586) 2026-08-03 20:12:19 +02:00
Mykola Mokhnach 2ed7bb04d8 feat(docutils)!: Migrate to ESM (#22585)
BREAKING CHANGE: @appium/docutils is now an ESM-only package. It can no longer be loaded via CommonJS require(); consumers must use import or dynamic import(). Deep imports into the package's internals are no longer possible — only the public entry point is exposed via exports.
2026-08-03 14:22:39 +02:00
Mykola Mokhnach db87f3cdd4 feat(opencv)!: Migrate to ESM (#22581)
BREAKING CHANGE: @appium/opencv is now an ESM-only package. It can no longer be loaded via CommonJS require(); consumers must use import or dynamic import(). Deep imports into the package's internals are no longer possible — only the public entry point is exposed via exports.
2026-08-02 18:14:58 +02:00
Mykola Mokhnach 2c0f3fd9e3 fix(appium): load @appium/docutils dynamically in docs build script (#22584) 2026-08-02 18:09:44 +02:00
renovate[bot] 63b167c408 chore(support): update dependency axios to v1.19.0 (#22579)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-02 09:59:46 +02:00
renovate[bot] 406dfad41f chore(support): update dependency teen_process to v4.2.1 (#22580)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-02 09:59:33 +02:00
renovate[bot] 85574e7e80 chore(support): update dependency asyncbox to v6.4.2 (#22578)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-02 09:48:01 +02:00
renovate[bot] 336395fcfa chore(oxc-config): update dependency oxlint to v1.76.0 (#22577)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-02 09:47:50 +02:00
Mykola Mokhnach d9e8b3ba73 feat(execute-driver-plugin)!: Migrate to ESM (#22576)
BREAKING CHANGE: @appium/execute-driver-plugin is now an ESM-only package. It can no longer be loaded via CommonJS require(); consumers must use import or dynamic import(). Deep imports into the package's internals are no longer possible — only the public entry point is exposed via exports. 
BREAKING CHANGE: The forked child process (execute-child.js) now runs as ESM as well, since it inherits "type": "module" from the package's package.json.
2026-08-01 21:31:46 +02:00
Mykola Mokhnach e625408f55 feat(relaxed-caps-plugin)!: Migrate to ESM (#22573)
BREAKING CHANGE: @appium/relaxed-caps-plugin is now an ESM-only package. It can no longer be loaded via CommonJS require(); consumers must use import or dynamic import(). Deep imports into the package's internals are no longer possible — only the public entry point is exposed via exports.
2026-08-01 21:31:07 +02:00
Mykola Mokhnach d2a981a45f feat(images-plugin)!: Migrate to ESM (#22574)
BREAKING CHANGE: @appium/images-plugin is now an ESM-only package. It can no longer be loaded via CommonJS require(); consumers must use import or dynamic import(). Deep imports into the package's internals are no longer possible — only the public entry point is exposed via exports.
2026-08-01 21:30:46 +02:00
Mykola Mokhnach 76f2dd3b36 test(appium): use dynamic import instead of require in extension-config test (#22575) 2026-08-01 17:36:25 +02:00
Mohamed Mostafa 03dac9d6e8 fix(base-driver): keep the find error if the page source fails (#22572) 2026-08-01 16:57:03 +02:00
dependabot[bot] eb93d49802 chore(deps-dev): bump nx in the npm_and_yarn group across 1 directory (#22569)
Bumps the npm_and_yarn group with 1 update in the / directory: [nx](https://github.com/nrwl/nx/tree/HEAD/packages/nx).


Updates `nx` from 22.6.3 to 22.7.8
- [Release notes](https://github.com/nrwl/nx/releases)
- [Commits](https://github.com/nrwl/nx/commits/22.7.8/packages/nx)

---
updated-dependencies:
- dependency-name: nx
  dependency-version: 22.7.8
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-01 16:55:07 +02:00
renovate[bot] 3f21bcf1a7 chore(deps): update dependency npm-run-all2 to v9.0.3 (#22570)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-01 16:54:58 +02:00
renovate[bot] d708029325 chore(oxc-config): update dependency oxfmt to v0.61.0 (#22571)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-01 16:54:51 +02:00
renovate[bot] 485b8d7a70 chore(eslint-config-appium-ts): update dependency eslint-plugin-jsdoc to v63.3.2 (#22567)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-01 01:10:47 +00:00
renovate[bot] c688932525 chore(docutils): update dependency yargs to v18.1.0 (#22566)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-31 22:32:00 +00:00
Mohamed Mostafa 77d159838f fix(images-plugin): avoid NaN coordinates when an action offset is unset (#22568)
The plugin adds the image element center to the offset carried by
pointerMove and scroll actions. That payload is not validated anywhere,
so an action arriving without x or y made the sum NaN, and the driver
got NaN as the target coordinate. Count an unset offset as zero.
2026-07-31 19:31:02 +02:00
Mykola Mokhnach c733c090f6 feat(strongbox)!: Migrate package to ESM (#22563)
BREAKING CHANGE: @appium/strongbox is now an ESM-only package. It can no longer be loaded via CommonJS require(); consumers must use import or dynamic import(). No other package in this monorepo currently depends on @appium/strongbox, so this only affects external consumers.
2026-07-31 17:25:00 +02:00
renovate[bot] 2a07c2818c chore(deps): update dependency eslint to v10.8.0 (#22565)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-31 11:08:47 +00:00
github-actions[bot]andmykola-mokhnach 52cbfd2708 docs(appium): Update documentation translations (#22564)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-07-31 09:47:59 +09:00
Mykola Mokhnach a551c38171 feat(storage-plugin): Add route aliases (#22558) 2026-07-30 21:17:15 +02:00
renovate[bot] 0f42831afa chore(semantic-release-config): update dependency @semantic-release/git to v11.0.1 (#22562)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-30 12:45:01 +00:00
Mykola Mokhnach 5c870329a3 feat(universal-xml-plugin)!: Migrate package to ESM (#22557)
BREAKING CHANGE: @appium/universal-xml-plugin is now an ESM-only package. It can no longer be loaded via CommonJS require(); consumers must use import or dynamic import(). Appium's own extension loader already loads plugins via dynamic import(), so appium plugin install/use universal-xml is unaffected. Deep imports into the package's internals are no longer possible — only the public entry point is exposed via exports.
2026-07-29 21:59:11 +02:00
Mykola Mokhnach a236fdbc97 chore(base-driver): Group route definitions (#22556) 2026-07-29 20:59:05 +02:00
Mykola Mokhnach a2e9cef145 fix(ci): fall back to plain npm install only on Socket Firewall's own backend failure (#22559) 2026-07-29 20:11:42 +02:00
renovate[bot] 7d72502769 chore(oxc-config): update dependency oxlint to v1.75.0 (#22547)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-29 19:13:22 +02:00
renovate[bot] 12a91e5293 chore(oxc-config): update dependency oxlint-tsgolint to v7 (#22551)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-29 18:58:27 +02:00
Mykola Mokhnach d093b76bef chore(support): Flex sharp dependency version (#22555) 2026-07-28 20:27:27 +02:00
Mykola Mokhnach 120b9ddfac style: Update EditorConfig to include additional file types 2026-07-28 20:03:30 +02:00
ian zhang 281e61c297 fix(base-driver,storage-plugin): redact sensitive payloads in debug logs (#22549) 2026-07-27 20:21:15 -07:00
Mohamed Mostafa 8ac6bfcc3b fix(logger): mask secure values surrounded by non-word characters (#22553)
`\b` only asserts a boundary next to a word character, so text rules like
`P@ssw0rd!` never matched anything. Now it is only added to the sides where
the value itself begins or ends with a word character.
2026-07-26 10:34:47 -07:00
Edgars Eglītis cdd448800e docs: update aggregate changelog (#22552) 2026-07-26 13:18:37 +03:00
renovate[bot] e977a29b0b chore(support): update dependency teen_process to v4.1.10 (#22550)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-26 08:31:55 +00:00
renovate[bot] 2d8fa2662e chore(oxc-config): update dependency oxfmt to v0.60.0 (#22543)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-25 20:00:57 +03:00
renovate[bot] b96c8fa718 chore(execute-driver-plugin): update dependency webdriverio to v9.30.0 (#22542)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-25 10:06:20 +00:00
Mykola Mokhnach c6a88e7dd7 ci: tune publish retry success criteria (#22546) 2026-07-25 09:06:09 +02:00
Mykola Mokhnach 087a83a27e ci: Fix lerna publish command (#22545) 2026-07-25 08:54:57 +02:00
Mykola Mokhnach 6a241d760a ci: Add an option to recover missing packages (#22544) 2026-07-25 08:48:19 +02:00
github-actions e648569dfb chore: publish
- appium@3.6.0
 - @appium/base-driver@10.7.2
 - @appium/base-plugin@3.3.3
 - @appium/docutils@2.5.2
 - @appium/driver-test-support@2.0.1
 - @appium/eslint-config-appium-ts@3.2.4
 - @appium/execute-driver-plugin@6.0.7
 - @appium/fake-driver@6.2.2
 - @appium/fake-plugin@4.3.3
 - @appium/images-plugin@4.2.8
 - @appium/logger@2.0.10
 - @appium/opencv@4.1.7
 - @appium/oxc-config@1.1.0
 - @appium/plugin-test-support@2.0.1
 - @appium/relaxed-caps-plugin@2.2.5
 - @appium/schema@1.3.0
 - @appium/semantic-release-config@1.1.0
 - @appium/storage-plugin@1.1.8
 - @appium/strongbox@1.1.3
 - @appium/support@7.2.6
 - @appium/tsconfig@1.2.0
 - @appium/types@1.6.0
 - @appium/universal-xml-plugin@2.1.7
2026-07-25 06:12:06 +00:00
Mykola Mokhnach ea6a2e117f fix: typescript config (#22540) 2026-07-24 22:22:31 +02:00
Edgars Eglītis 4fffe28f89 chore: run npm audit fix (#22541) 2026-07-24 23:19:25 +03:00
dependabot[bot] a4a9022303 chore(deps): bump fast-uri in the npm_and_yarn group across 1 directory (#22539)
Bumps the npm_and_yarn group with 1 update in the / directory: [fast-uri](https://github.com/fastify/fast-uri).


Updates `fast-uri` from 3.1.2 to 3.1.4
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.2...v3.1.4)

---
updated-dependencies:
- dependency-name: fast-uri
  dependency-version: 3.1.4
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-24 23:07:00 +03:00
renovate[bot] 8fd47be066 chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.65.0 (#22538)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-24 21:36:17 +02:00
renovate[bot] 0af2a4bfd8 chore(deps): update dependency sinon to v22.1.0 (#22537)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-24 21:36:04 +02:00
renovate[bot] e0c9018453 chore(eslint-config-appium-ts): update dependency eslint-plugin-jsdoc to v63.2.0 (#22536)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-23 12:51:38 +00:00
Mykola Mokhnach f4d14c1969 feat(tsconfig): hoist typescript version (#22533) 2026-07-22 18:11:49 +02:00
Mykola Mokhnach e44e5ea918 chore: Use https protocol to access versions and download icons (#22534) 2026-07-22 18:06:41 +02:00
Mykola Mokhnach 32f0bdf870 feat(semantic-release-config): add shared semantic-release configuration package (#22527) 2026-07-22 15:52:47 +02:00
Mykola Mokhnach bf30246a65 chore: Linter warnings (#22532) 2026-07-22 10:19:55 +02:00
renovate[bot] 764cfbae75 chore(oxc-config): update dependency oxlint-tsgolint to v0.25.0 (#22530)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-22 10:54:51 +03:00
dependabot[bot] 5f0534f154 chore(deps): bump fast-uri in the npm_and_yarn group across 1 directory (#22531)
Bumps the npm_and_yarn group with 1 update in the / directory: [fast-uri](https://github.com/fastify/fast-uri).


Updates `fast-uri` from 3.1.2 to 3.1.4
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.2...v3.1.4)

---
updated-dependencies:
- dependency-name: fast-uri
  dependency-version: 3.1.4
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-22 09:37:46 +02:00
renovate[bot] 0b7e7419ef chore(oxc-config): update dependency oxlint to v1.74.0 (#22529)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-22 09:36:49 +02:00
Mykola Mokhnach fee213e49d feat: Add centralised Oxc lint and format config (#22489) 2026-07-22 09:24:20 +02:00
github-actions[bot]andmykola-mokhnach 2fa12e915a docs(appium): Update documentation translations (#22528)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-07-21 19:22:18 -07:00
Asijit Manna f943fab141 feat(appium): add --allow-unknown-args to tolerate unrecognized server CLI arguments (#22477) 2026-07-21 15:20:09 +02:00
Edgars Eglītis 6609b2be57 fix(base-driver): fix typo in generic sensor protocol route (#22525) 2026-07-21 11:47:08 +03:00
Mykola Mokhnach f17899a0f5 ci: Remove the redundant recursion API param (#22524) 2026-07-21 10:36:45 +02:00
renovate[bot] 350eab89a5 chore(eslint-config-appium-ts): update dependency eslint-plugin-jsdoc to v63.1.0 (#22522)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-21 08:32:54 +02:00
renovate[bot] 57092711c0 chore(workflows): update actions/checkout action to v7.0.1 (#22521)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-21 08:30:47 +02:00
Mykola Mokhnach cac18e30b5 chore: Remove lodash usage from scripts (#22518) 2026-07-20 22:51:37 +02:00
Mykola Mokhnach 77d249226a fix(docutils): Duplicate package imports (#22520) 2026-07-20 22:49:00 +02:00
Mykola Mokhnach 154ea18252 fix(appium): Duplicated module import (#22519) 2026-07-20 22:48:51 +02:00
renovate[bot] 0cfafb23c0 chore(universal-xml-plugin): update dependency fast-xml-parser to v5.10.1 (#22516)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-19 14:37:19 +00:00
Kazuaki Matsuo b56646198c fix: use module sync in appium/support (#22514)
* fix: use module sync in appium/support

* use node assert

* add __filename

* fix format
2026-07-18 07:34:45 -07:00
renovate[bot] 13d3b615e6 chore(storage-plugin): update dependency ws to v8.21.1 (#22513)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-18 13:33:44 +00:00
renovate[bot] 7c0d771408 chore(docutils): update dependency mkdocs-material to v9.7.7 (#22512)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-18 09:15:07 +00:00
renovate[bot] 0a40623085 chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.64.0 (#22505)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-17 15:02:17 +00:00
renovate[bot] b9ad1f1712 chore(workflows): update slackapi/slack-github-action action to v4 (#22511)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-17 13:17:37 +03:00
github-actions[bot]andmykola-mokhnach 608668ed47 docs(appium): Update documentation translations (#22504)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-07-17 13:11:19 +03:00
renovate[bot] 73d4b7760b chore(workflows): update actions/setup-node action to v7 (#22509)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-17 12:57:46 +03:00
renovate[bot] 5112541a34 chore(deps): update dependency oxfmt to v0.59.0 (#22508)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-17 11:56:39 +03:00
Edgars Eglītis cfde82a40e chore(deps): update argparse to v3 (#22507) 2026-07-17 11:51:00 +03:00
renovate[bot] 0f3fd55c65 chore(workflows): update actions/setup-node action to v6.5.0 (#22503)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-16 22:10:20 +00:00
renovate[bot] 67cf081098 chore(universal-xml-plugin): update dependency fast-xml-parser to v5.10.0 (#22502)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-16 18:01:17 +00:00
renovate[bot] d63f5441c7 chore(support): update dependency teen_process to v4.1.9 (#22501)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-16 08:59:17 +00:00
Kazuaki Matsuo 0bb61073e2 docs: drop appiumpro.com (#22500) 2026-07-16 00:57:32 -07:00
renovate[bot] 52eb9e308e chore(support): update dependency shell-quote to v1.10.0 (#22498)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-14 22:14:53 +00:00
renovate[bot] 868153fee4 chore(deps): update dependency eslint to v10.7.0 (#22497)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-14 16:49:16 +00:00
renovate[bot] c25293b23e chore(eslint-config-appium-ts): update dependency eslint-plugin-n to v18.2.2 (#22496)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-14 09:58:51 +00:00
renovate[bot] 4c380d7604 chore(eslint-config-appium-ts): update dependency eslint-plugin-jsdoc to v63.0.13 (#22495)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-13 15:53:59 +00:00
renovate[bot] 1e93aec531 chore(workflows): update slackapi/slack-github-action action to v3.0.5 (#22493)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-12 17:08:10 +00:00
renovate[bot] 22f8a9b04d chore(support): update dependency asyncbox to v6.3.5 (#22492)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-12 08:45:48 +00:00
renovate[bot] 1a7199fbbc chore(support): update dependency teen_process to v4.1.8 (#22488)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-11 22:45:13 +00:00
renovate[bot] fa9c4b2aab chore(storage-plugin): update dependency lru-cache to v11.5.2 (#22487)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-11 18:34:39 +00:00
renovate[bot] 3836f0e614 chore(deps): update dependency @types/node to v24.13.3 (#22490)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-11 13:36:51 +00:00
Edgars Eglītis 6e3fd0a8bc chore: format (#22491) 2026-07-11 14:13:52 +03:00
Mykola Mokhnach d5b1393285 feat: Add codegraph (#22485) 2026-07-11 08:35:38 +02:00
renovate[bot] 123b0e1908 chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.63.0 (#22484)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-11 00:40:30 +00:00
Mykola Mokhnach eabe372b0b test: enable source mapping (#22486) 2026-07-10 22:03:27 +02:00
renovate[bot] 416c3349b7 chore(eslint-config-appium-ts): update dependency eslint-plugin-perfectionist to v5.10.0 (#22483)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-10 09:42:04 +00:00
renovate[bot] ad720f5ca0 chore(deps): update dependency oxfmt to v0.58.0 (#22482)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-10 11:15:58 +03:00
renovate[bot] 6d31d6acb2 chore(eslint-config-appium-ts): update dependency eslint-plugin-jsdoc to v63.0.12 (#22480)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-09 21:46:14 +00:00
renovate[bot] 4e93a63ac5 chore(types): update dependency type-fest to v5.8.0 (#22479)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-08 09:46:27 +00:00
renovate[bot] 7233dd315a chore(eslint-config-appium-ts): update dependency eslint-plugin-jsdoc to v63.0.11 (#22478)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-07 16:14:48 +00:00
github-actions[bot]andmykola-mokhnach 97d53ffa5b docs(appium): Update documentation translations (#22476)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-07-05 18:31:45 -07:00
Mykola Mokhnach 2cec9fa27f chore: Remove redundant chai type references (#22475) 2026-07-05 14:41:16 +02:00
renovate[bot] a1a7b7e981 chore(support): update dependency sharp to v0.35.3 (#22472)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-04 15:31:47 +03:00
Mykola Mokhnach 228103f489 chore(appium): Drop mocha (#22469) 2026-07-04 13:57:57 +02:00
renovate[bot] 9dcb2c4056 chore(deps): update dependency @types/sinon to v22 (#22471)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-04 11:59:35 +03:00
Asijit Manna a9dd7f5e41 fix(base-driver): redact proxied response body in proxy logs (#22470) 2026-07-03 21:09:38 +02:00
Mykola Mokhnach de2cd50b96 fix(base-driver): Perform shallow clone of initial options (#22465) 2026-07-03 20:59:18 +02:00
renovate[bot] ccb3106814 chore(support): update dependency asyncbox to v6.3.4 (#22468)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-03 13:53:38 +00:00
renovate[bot] f707dfa174 chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.62.1 (#22467)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-03 09:52:31 +00:00
Mykola Mokhnach 53b2db196d chore(docutils): Drop mocha (#22466) 2026-07-03 08:38:03 +02:00
Mykola Mokhnach 279ebb5cd6 chore(driver-test-support): Drop mocha and chai (#22464) 2026-07-03 06:21:52 +02:00
Mykola Mokhnach f1fc5a6869 chore(fake-driver): Drop mocha (#22463) 2026-07-02 22:07:42 +02:00
Mykola Mokhnach 24586d4ed9 chore(fake-plugin): Drop mocha and chai (#22462) 2026-07-02 20:52:27 +02:00
Mykola Mokhnach 4915433aae chore(logger): Drop mocha (#22457) 2026-07-02 18:51:19 +02:00
Mykola Mokhnach fd70da7ab4 fix: Typescript references (#22458) 2026-07-02 18:39:05 +02:00
renovate[bot] fa769cebd9 chore(deps): update dependency eslint to v10.6.0 (#22455)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-02 14:43:41 +00:00
renovate[bot] 1eb55e85d7 chore(support): update dependency asyncbox to v6.3.1 (#22460)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-02 11:14:34 +00:00
dependabot[bot] f98eea77d1 chore(deps-dev): bump the npm_and_yarn group across 1 directory with 2 updates (#22459)
Bumps the npm_and_yarn group with 2 updates in the / directory: [@sigstore/verify](https://github.com/sigstore/sigstore-js) and [sigstore](https://github.com/sigstore/sigstore-js).


Updates `@sigstore/verify` from 3.1.0 to 3.1.1
- [Release notes](https://github.com/sigstore/sigstore-js/releases)
- [Commits](https://github.com/sigstore/sigstore-js/compare/sigstore@3.1.0...@sigstore/verify@3.1.1)

Updates `sigstore` from 4.1.0 to 4.1.1
- [Release notes](https://github.com/sigstore/sigstore-js/releases)
- [Commits](https://github.com/sigstore/sigstore-js/compare/sigstore@4.1.0...sigstore@4.1.1)

---
updated-dependencies:
- dependency-name: "@sigstore/verify"
  dependency-version: 3.1.1
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: sigstore
  dependency-version: 4.1.1
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-02 08:33:47 +03:00
renovate[bot] 4cbcf95d77 chore(support): update dependency teen_process to v4.1.7 (#22452)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-02 03:42:12 +00:00
renovate[bot] 4c947872f1 chore(execute-driver-plugin): update dependency webdriverio to v9.29.1 (#22451)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-01 23:26:49 +00:00
renovate[bot] 11882be379 chore(eslint-config-appium-ts): update dependency eslint-plugin-import-x to v4.17.1 (#22454)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-01 14:38:04 +00:00
Mykola Mokhnach e3334b4dd7 chore(opencv): Drop mocha (#22456) 2026-07-01 16:17:16 +02:00
Mykola Mokhnach a10f403bb1 chore(relaxed-caps-plugin): Ditch mocha (#22453) 2026-07-01 13:40:08 +02:00
Mykola Mokhnach 08d50889c2 chore: Migrate from prettier to oxfmt (#22450) 2026-07-01 08:54:13 +02:00
renovate[bot] d3628a9410 chore(eslint-config-appium-ts): update dependency eslint-plugin-jsdoc to v63.0.10 (#22448)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-30 13:51:26 +00:00
Mykola Mokhnach 8d6b5f87c7 chore(support): Drop mocha (#22444) 2026-06-30 07:56:15 +02:00
Mykola Mokhnach 531b20a3c1 chore(strongbox): Drop mocha (#22446) 2026-06-29 22:03:12 +02:00
renovate[bot] 6699d1b266 chore(eslint-config-appium-ts): update dependency eslint-plugin-n to v18.2.1 (#22445)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-29 12:36:06 +00:00
renovate[bot] 37a6006537 chore(support): update dependency shell-quote to v1.9.0 (#22442)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-28 12:49:57 +00:00
renovate[bot] 1b449709d1 chore(eslint-config-appium-ts): update dependency eslint-plugin-jsdoc to v63.0.8 (#22441)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-28 09:14:18 +00:00
Mykola Mokhnach 0e4ecc49d6 chore(universal-xml-plugin): Drop mocha and chai (#22440) 2026-06-27 22:18:18 +02:00
Mykola Mokhnach bf29503054 chore(base-driver): Drop mocha (#22435) 2026-06-27 11:58:04 +02:00
dependabot[bot] ab0633a70c chore(deps-dev): bump @sigstore/core (#22439)
Bumps the npm_and_yarn group with 1 update in the / directory: [@sigstore/core](https://github.com/sigstore/sigstore-js).


Updates `@sigstore/core` from 3.1.0 to 3.2.1
- [Release notes](https://github.com/sigstore/sigstore-js/releases)
- [Commits](https://github.com/sigstore/sigstore-js/compare/sigstore@3.1.0...@sigstore/core@3.2.1)

---
updated-dependencies:
- dependency-name: "@sigstore/core"
  dependency-version: 3.2.1
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-27 12:46:21 +03:00
Mykola Mokhnach 0c44ddeebe chore(base-plugin): Drop mocha and chai (#22438) 2026-06-27 08:33:28 +02:00
Mykola Mokhnach d9eb36f413 fix(support): Prevent extraction of external symlinks (#22436) 2026-06-27 07:59:04 +02:00
github-actions[bot]andmykola-mokhnach b483d82b13 docs(appium): Update documentation translations (#22437)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-06-26 22:56:09 -07:00
Mykola Mokhnach 93e81777b9 chore(images-plugin): Drop mocha (#22434) 2026-06-26 20:34:34 +02:00
renovate[bot] 623ef38f2a chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.62.0 (#22433)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-26 08:17:37 +02:00
renovate[bot] 5c696c5c91 chore(eslint-config-appium-ts): update dependency eslint-plugin-import-x to v4.17.0 (#22431)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-26 08:17:22 +02:00
renovate[bot] 98215066ee chore(support): update dependency axios to v1.18.1 (#22430)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-26 08:17:05 +02:00
Mykola Mokhnach 8026a953aa chore(execute-driver-plugin): Drop mocha usage (#22432) 2026-06-26 08:12:04 +02:00
Mykola Mokhnach c8556f172e chore(storage-plugin): Drop mocha usage (#22429) 2026-06-26 07:47:56 +02:00
Mykola Mokhnach e9a41bd9ae chore(base-driver): Migrate index to typescript (#22428) 2026-06-26 07:47:34 +02:00
Mykola Mokhnach e810f2f23d test(base-driver): Add tests to typescript build validation (#22427) 2026-06-25 19:35:23 +02:00
Mykola Mokhnach c04c38d1e6 chore: Update driver-test-support to not export mocha-specific suites (#22424) 2026-06-25 18:33:38 +02:00
renovate[bot] d9c4e4c4ad chore(eslint-config-appium-ts): update dependency eslint-plugin-jsdoc to v63.0.7 (#22426)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-25 09:05:44 +00:00
renovate[bot] bce22834ba chore(eslint-config-appium-ts): update dependency eslint-plugin-unicorn to v68 (#22420)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-24 16:25:18 +02:00
Mykola Mokhnach ac65be5a1e chore: Update pluginE2EHarness to drop implicit mocha deps (#22421) 2026-06-24 16:24:35 +02:00
renovate[bot] 1e570c4d29 chore(support): update dependency uuid to v14.0.1 (#22422)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-24 14:01:35 +00:00
renovate[bot] 52ec456d17 chore(universal-xml-plugin): update dependency fast-xml-parser to v5.9.3 (#22419)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-23 18:12:07 +00:00
renovate[bot] a89e429a84 chore(support): update dependency semver to v7.8.5 (#22417)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-23 14:49:58 +00:00
renovate[bot] 4b0666d7d5 chore(support): update dependency sharp to v0.35.2 (#22418)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-23 11:27:47 +03:00
renovate[bot] 816ca05020 chore(execute-driver-plugin): update webdriverio monorepo to v9.29.0 (#22416)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-22 13:56:01 +00:00
Mykola Mokhnach 31036f65b2 chore: Ditch unmaintained midnight-smoker dependency (#22414) 2026-06-21 14:22:23 +02:00
renovate[bot] 4bb987c037 chore(workflows): update actions/checkout action to v7 (#22413)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-21 15:07:56 +03:00
renovate[bot] 0162f3ab4e chore(base-driver): update dependency body-parser to v2.3.0 (#22411)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-21 13:09:00 +02:00
renovate[bot] 813c6b5b7a chore(eslint-config-appium-ts): update dependency eslint-plugin-jsdoc to v63.0.6 (#22410)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-21 13:08:47 +02:00
renovate[bot] edc2013073 chore(universal-xml-plugin): update dependency fast-xml-parser to v5.9.2 (#22409)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-20 17:29:10 +00:00
dependabot[bot] 979a6e4c9d chore(deps): bump undici in the npm_and_yarn group across 1 directory (#22404)
Bumps the npm_and_yarn group with 1 update in the / directory: [undici](https://github.com/nodejs/undici).


Updates `undici` from 6.24.0 to 6.27.0
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v6.24.0...v6.27.0)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 6.27.0
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-20 18:59:37 +03:00
renovate[bot] 1cc4f0f2e5 chore(support): update dependency teen_process to v4.1.5 (#22408)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-20 13:56:00 +00:00
renovate[bot] 0467311286 chore(eslint-config-appium-ts): update typescript-eslint monorepo to v8.61.1 (#22407)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-20 12:37:45 +00:00
renovate[bot] cb9c476fbb chore(eslint-config-appium-ts): update dependency eslint-plugin-jsdoc to v63.0.5 (#22406)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-20 08:35:20 +00:00
github-actions[bot]andmykola-mokhnach 44278bdfc3 docs(appium): Update documentation translations (#22405)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2026-06-19 20:02:12 -07:00
renovate[bot] a8418f95e9 chore(eslint-config-appium-ts): update dependency eslint-plugin-perfectionist to v5.9.1 (#22403)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-19 19:45:19 +00:00
renovate[bot] 7e67b54726 chore(eslint-config-appium-ts): update dependency eslint-plugin-jsdoc to v63.0.4 (#22402)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-19 13:49:33 +00:00
github-actions e6b583a209 chore: publish
- appium@3.5.2
 - @appium/base-driver@10.7.1
 - @appium/base-plugin@3.3.2
 - @appium/docutils@2.5.1
 - @appium/driver-test-support@1.2.5
 - @appium/execute-driver-plugin@6.0.6
 - @appium/fake-plugin@4.3.2
 - @appium/images-plugin@4.2.7
 - @appium/storage-plugin@1.1.7
 - @appium/support@7.2.5
 - @appium/universal-xml-plugin@2.1.6
2026-06-18 21:21:35 +00:00
renovate[bot] 3016201f2a chore(universal-xml-plugin): update dependency fast-xml-parser to v5.9.0 (#22397)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-18 23:15:13 +02:00
renovate[bot] e0d5c4dfd6 chore(support): update dependency axios to v1.18.0 (#22396)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-18 23:14:50 +02:00
Mykola Mokhnach 779a3a048f fix(support): uploadFile overload (#22400) 2026-06-18 23:14:27 +02:00
renovate[bot] 07302ab3e9 chore(workflows): update egmacke/action-check-label action to v5 (#22399)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-18 17:12:45 +03:00
Edgars Eglītis 609db021f4 docs: adjust plugin READMEs for consistency (#22395) 2026-06-18 11:02:19 +03:00
651 changed files with 28650 additions and 21893 deletions
+10
View File
@@ -0,0 +1,10 @@
<!-- CODEGRAPH_START -->
## CodeGraph
In repositories indexed by CodeGraph (a `.codegraph/` directory exists at the repo root), reach for it BEFORE grep/find or reading files when you need to understand or locate code:
- **MCP tool** (when available): `codegraph_explore` answers most code questions in one call — the relevant symbols' verbatim source plus the call paths between them, including dynamic-dispatch hops grep can't follow. Name a file or symbol in the query to read its current line-numbered source. If it's listed but deferred, load it by name via tool search.
- **Shell** (always works): `codegraph explore "<symbol names or question>"` prints the same output.
If there is no `.codegraph/` directory, skip CodeGraph entirely — indexing is the user's decision.
<!-- CODEGRAPH_END -->
+17
View File
@@ -0,0 +1,17 @@
{
"permissions": {
"allow": ["mcp__codegraph__*"]
},
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "codegraph prompt-hook"
}
]
}
]
}
}
+5
View File
@@ -0,0 +1,5 @@
# CodeGraph data files — local to each machine, not for committing.
# Ignore everything in .codegraph/ except this file itself, so transient
# files (the database, daemon.pid, sockets, logs) never show up in git.
*
!.gitignore
+9
View File
@@ -0,0 +1,9 @@
{
"mcpServers": {
"codegraph": {
"type": "stdio",
"command": "codegraph",
"args": ["serve", "--mcp", "--path", "."]
}
}
}
+2 -1
View File
@@ -1,13 +1,14 @@
# editorconfig.org
root = true
[*]
[*.{js,cjs,mjs,jsx,ts,cts,mts,tsx,json,jsonc}]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 120
[*.md]
trim_trailing_whitespace = false
+8 -9
View File
@@ -3,7 +3,6 @@ description: Create a new bug report.
title: '🐞 bug: <title>'
labels: [Bug, Needs Triage]
body:
- type: markdown
attributes:
value: ':stop_sign: _Make sure you are reporting an issue. For general questions, please use [http://discuss.appium.io](http://discuss.appium.io)._'
@@ -13,9 +12,9 @@ body:
label: Is there an existing issue for this?
description: 'Please [search :mag: the issues](https://github.com/appium/appium/issues) to check if this bug has already been reported.'
options:
- label: I have searched the existing issues
required: true
- label: I have searched the existing issues
required: true
- type: input
attributes:
label: Appium Version
@@ -49,7 +48,7 @@ body:
description: |
You can retrieve the latest server/driver/plugin version number by running `npm info <package-name> version`. If you are not up to date, please try to reproduce your issue after updating all affected components.
options:
- label: I confirm the issue is still reproducible with the latest component versions
- label: I confirm the issue is still reproducible with the latest component versions
- type: textarea
attributes:
@@ -82,10 +81,10 @@ body:
:warning: _Remember to redact or remove any sensitive information!_
value: |
- Debug details (`appium --show-debug-info`):
- Last component version(s) which did _not_ exhibit the problem:
- Platform and version of device under test:
- Real device or emulator/simulator:
- Debug details (`appium --show-debug-info`):
- Last component version(s) which did _not_ exhibit the problem:
- Platform and version of device under test:
- Real device or emulator/simulator:
- type: textarea
attributes:
+1 -1
View File
@@ -1,5 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: ❓ Question
- name: ❓ Question
url: https://discuss.appium.io/
about: Please use the Appium forum for any questions.
+1 -2
View File
@@ -1,9 +1,8 @@
name: 💡 Feature Request
description: Suggest an idea for this project.
title: "💡 feat: <title>"
title: '💡 feat: <title>'
labels: [Enhancement]
body:
- type: textarea
attributes:
label: Is your feature request related to a problem?
+39 -3
View File
@@ -20,7 +20,7 @@ runs:
using: composite
steps:
- name: Use Node.js ${{ inputs.node-version }}
uses: actions/setup-node@v6.4.0
uses: actions/setup-node@v7.1.0
with:
node-version: ${{ inputs.node-version }}
cache: npm
@@ -33,8 +33,44 @@ runs:
run: |
# Replace npm with sfw npm in the install command
install_cmd="${{ inputs.install-command }}"
install_cmd="${install_cmd//npm /sfw npm }"
$install_cmd
sfw_install_cmd="${install_cmd//npm /sfw npm }"
# Socket Firewall can fail to reach its own backend (a transient
# network error unrelated to the actual npm install) and, in that
# case, either exit non-zero or exit 0 without having actually
# completed the install, leaving node_modules incomplete. We only
# want to fall back to a plain (non-firewalled) install when we can
# positively attribute the failure to *that* Socket Firewall error —
# a real npm/package problem (bad version, checksum mismatch, failing
# postinstall script, etc.) must fail the job as-is, not be silently
# retried and potentially masked.
sfw_log="$(mktemp)"
set +e
$sfw_install_cmd 2>&1 | tee "$sfw_log"
sfw_exit="${PIPESTATUS[0]}"
set -e
sfw_infra_failure=0
if grep -qi 'Socket Firewall encountered an unexpected error' "$sfw_log"; then
sfw_infra_failure=1
fi
install_incomplete=0
if [ "$sfw_exit" -eq 0 ]; then
npm ls --depth=0 >/dev/null 2>&1 || install_incomplete=1
fi
rm -f "$sfw_log"
if [ "$sfw_infra_failure" -eq 1 ] && { [ "$sfw_exit" -ne 0 ] || [ "$install_incomplete" -eq 1 ]; }; then
echo "::warning::Socket Firewall failed to reach its backend; retrying with a plain npm install"
$install_cmd
elif [ "$sfw_exit" -ne 0 ]; then
echo "::error::npm install failed"
exit "$sfw_exit"
elif [ "$install_incomplete" -eq 1 ]; then
echo "::error::npm install appears incomplete and is not attributable to a Socket Firewall failure"
exit 1
fi
- name: Build packages
if: ${{ inputs.run-build == 'true' }}
shell: bash
+10
View File
@@ -73,6 +73,11 @@ labels:
matcher:
files: ['packages/eslint-config-appium-ts/**']
- label: '@appium/oxc-config'
sync: true
matcher:
files: ['packages/oxc-config/**']
- label: '@appium/execute-driver-plugin'
sync: true
matcher:
@@ -118,6 +123,11 @@ labels:
matcher:
files: ['packages/schema/**']
- label: '@appium/semantic-release-config'
sync: true
matcher:
files: ['packages/semantic-release-config/**']
- label: '@appium/support'
sync: true
matcher:
+19 -19
View File
@@ -15,10 +15,9 @@ on:
- 'package*.json'
- 'lerna.json'
- '.npmrc'
- '.mocharc.js'
- '.github/workflows/build.yml' # this file
- '.eslintrc'
- '.eslintignore'
- 'oxlint.config.mjs'
- 'oxfmt.config.mjs'
- '!**/sample-code/**'
- '!packages/*/docs/**'
pull_request:
@@ -35,10 +34,9 @@ on:
- 'package*.json'
- 'lerna.json'
- '.npmrc'
- '.mocharc.js'
- '.github/workflows/build.yml' # this file
- '.eslintrc'
- '.eslintignore'
- 'oxlint.config.mjs'
- 'oxfmt.config.mjs'
- '!**/sample-code/**'
- '!packages/*/docs/**'
@@ -61,7 +59,7 @@ jobs:
outputs:
packages: ${{ steps.discover-packages.outputs.packages }}
steps:
- uses: actions/checkout@v6.0.3
- uses: actions/checkout@v7.0.1
- name: Discover packages with e2e tests
id: discover-packages
run: |
@@ -103,14 +101,14 @@ jobs:
test-smoke:
needs:
- prepare_matrix
- prepare_matrix
name: Smoke Tests
strategy:
matrix:
node-version: ${{ fromJSON(needs.prepare_matrix.outputs.versions) }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6.0.3
- uses: actions/checkout@v7.0.1
- name: Setup, install and build
uses: ./.github/actions/setup-build
with:
@@ -122,14 +120,14 @@ jobs:
test-unit:
needs:
- prepare_matrix
- prepare_matrix
name: Unit Tests
strategy:
matrix:
node-version: ${{ fromJSON(needs.prepare_matrix.outputs.versions) }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6.0.3
- uses: actions/checkout@v7.0.1
- name: Setup, install and build
uses: ./.github/actions/setup-build
with:
@@ -141,14 +139,14 @@ jobs:
test-types:
needs:
- prepare_matrix
- prepare_matrix
name: Type Tests
strategy:
matrix:
node-version: ${{ fromJSON(needs.prepare_matrix.outputs.versions) }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6.0.3
- uses: actions/checkout@v7.0.1
- name: Setup, install and build
uses: ./.github/actions/setup-build
with:
@@ -160,8 +158,8 @@ jobs:
test-e2e:
needs:
- prepare_matrix
- prepare_e2e_packages
- prepare_matrix
- prepare_e2e_packages
name: E2E Tests - ${{ matrix.package_dir }} (Node ${{ matrix.node-version }})
if: ${{ github.event_name == 'pull_request' }}
strategy:
@@ -171,7 +169,7 @@ jobs:
package_dir: ${{ fromJSON(needs.prepare_e2e_packages.outputs.packages) }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6.0.3
- uses: actions/checkout@v7.0.1
- name: Setup, install and build
uses: ./.github/actions/setup-build
with:
@@ -188,14 +186,16 @@ jobs:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6.0.3
- uses: actions/checkout@v7.0.1
- name: Setup and install (no build)
uses: ./.github/actions/setup-build
with:
node-version: lts/*
install-command: npm ci
run-build: 'false'
- name: ESLint
- name: Lint
run: npm run lint:ci
- name: Prettier
- name: Format check
run: npm run format:check
- name: Verify changelog generation
run: npm run verify:changelog-generation
+1 -1
View File
@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v6.0.3
uses: actions/checkout@v7.0.1
- name: Cleanup
run: |
+3 -3
View File
@@ -21,9 +21,9 @@ jobs:
project_name: appium-inspector
steps:
- uses: actions/checkout@v6.0.3
- uses: actions/checkout@v7.0.1
- name: Use Node.js LTS
uses: actions/setup-node@v6.4.0
uses: actions/setup-node@v7.1.0
with:
node-version: lts/*
cache: 'npm'
@@ -36,7 +36,7 @@ jobs:
CROWDIN_PROJECT_ID: ${{ vars[matrix.project_id_var] }}
CROWDIN_TOKEN: ${{ secrets.CROWDIN_DOCS_TOKEN }}
- name: Post to Slack for ${{ matrix.project_name }}
uses: slackapi/slack-github-action@v3.0.3
uses: slackapi/slack-github-action@v4.0.0
with:
errors: true
webhook: ${{ secrets.SLACK_WEBHOOK_URL }}
@@ -12,11 +12,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6.0.3
- uses: actions/checkout@v7.0.1
with:
persist-credentials: false
- name: Use Node.js LTS
uses: actions/setup-node@v6.4.0
uses: actions/setup-node@v7.1.0
with:
node-version: lts/*
cache: 'npm'
@@ -15,9 +15,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6.0.3
- uses: actions/checkout@v7.0.1
- name: Use Node.js LTS
uses: actions/setup-node@v6.4.0
uses: actions/setup-node@v7.1.0
with:
node-version: lts/*
cache: 'npm'
+5 -5
View File
@@ -14,13 +14,13 @@ jobs:
outputs:
versions: ${{ steps.generate-matrix.outputs.lts }}
steps:
- name: Select all current LTS versions of Node.js
id: generate-matrix
uses: msimerson/node-lts-versions@v2.0.2
- name: Select all current LTS versions of Node.js
id: generate-matrix
uses: msimerson/node-lts-versions@v2.0.2
check:
needs:
- prepare_matrix
- prepare_matrix
name: Check
runs-on: ${{ matrix.os }}
strategy:
@@ -29,7 +29,7 @@ jobs:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v6.4.0
uses: actions/setup-node@v7.1.0
with:
node-version: ${{ matrix.node-version }}
- name: Install Appium
+5 -1
View File
@@ -37,7 +37,7 @@ jobs:
name: Docs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6.0.3
- uses: actions/checkout@v7.0.1
- name: Install dependencies (Node.js)
uses: bahmutov/npm-install@v1.12.1
with:
@@ -49,5 +49,9 @@ jobs:
run: |
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
- name: Check llms.txt
run: npm run docs:check-llmstxt
- name: Build Docs
run: npm run docs:preview
- name: Verify llms.txt was published to the site
run: test -s packages/appium/docs/site/en/llms.txt
+1 -1
View File
@@ -13,7 +13,7 @@ jobs:
env:
FOSSA_API_KEY: ${{secrets.FOSSA_API_KEY}}
steps:
- uses: actions/checkout@v6.0.3
- uses: actions/checkout@v7.0.1
with:
ref: master
- name: Install dependencies
+3 -3
View File
@@ -14,9 +14,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6.0.3
- uses: actions/checkout@v7.0.1
- name: Use Node.js LTS
uses: actions/setup-node@v6.4.0
uses: actions/setup-node@v7.1.0
with:
node-version: lts/*
cache: 'npm'
@@ -29,7 +29,7 @@ jobs:
# GITHUB_TOKEN is optional - if not provided, uses unauthenticated requests (rate limited)
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Post to Slack
uses: slackapi/slack-github-action@v3.0.3
uses: slackapi/slack-github-action@v4.0.0
with:
errors: true
webhook: ${{ secrets.SLACK_WEBHOOK_URL }}
+154 -49
View File
@@ -8,6 +8,16 @@ on:
required: true
type: boolean
default: true
recover_missing_only:
description: 'Recovery mode: skip version bump, publish only packages missing on npm at their current package.json version'
required: true
type: boolean
default: false
bootstrap_packages:
description: 'One-time beta-branch bootstrap only: comma-separated package names (e.g. @appium/base-driver,@appium/support) to force-bump to their next-major beta (premajor --preid beta), bypassing conventional-commit detection. Leave empty for a normal release.'
required: false
type: string
default: ''
permissions:
contents: write
@@ -18,11 +28,15 @@ permissions:
jobs:
release:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/master' && contains(fromJSON('["mykola-mokhnach", "jlipps", "eglitise", "KazuCocoa"]'), github.actor)
# keep this branch name in sync with env.BETA_BRANCH below - the `env` context isn't available
# to jobs.<job_id>.if (GitHub Actions resolves it before job-level env is set up)
if: (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/appium4') && contains(fromJSON('["mykola-mokhnach", "jlipps", "eglitise", "KazuCocoa"]'), github.actor)
env:
BETA_BRANCH: appium4
steps:
- name: Checkout repository
uses: actions/checkout@v6.0.3
uses: actions/checkout@v7.0.1
with:
fetch-depth: 0
@@ -43,15 +57,148 @@ jobs:
# for lerna createRelease
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DRY_RUN: ${{ inputs.dry_run }}
RECOVER_MISSING_ONLY: ${{ inputs.recover_missing_only }}
BOOTSTRAP_PACKAGES: ${{ inputs.bootstrap_packages }}
run: |
set -euo pipefail
# On the beta branch ($BETA_BRANCH), every release is a beta prerelease anchored at its
# target major (see packages/semantic-release-config's "Next-major beta branches" docs
# for the equivalent semantic-release behavior this mirrors).
BETA_FLAGS=""
DIST_TAG_FLAGS=""
if [ "${{ github.ref_name }}" = "$BETA_BRANCH" ]; then
BETA_FLAGS="--conventional-prerelease --preid beta"
DIST_TAG_FLAGS="--dist-tag beta"
fi
# One-time bootstrap for packages just starting their beta train: force them
# straight to <next-major>.0.0-beta.0 instead of waiting for/relying on a commit that
# happens to be marked as breaking. Not part of the normal release flow below - this
# exits early on its own.
if [ -n "$BOOTSTRAP_PACKAGES" ]; then
if [ "${{ github.ref_name }}" != "$BETA_BRANCH" ]; then
echo "bootstrap_packages is only meaningful on the $BETA_BRANCH branch" >&2
exit 1
fi
if [ "$RECOVER_MISSING_ONLY" = "true" ]; then
echo "bootstrap_packages cannot be combined with recover_missing_only" >&2
exit 1
fi
echo "Bootstrapping ${BOOTSTRAP_PACKAGES} to their next-major beta (premajor --preid beta), bypassing conventional-commit detection"
if [ "$DRY_RUN" = "true" ]; then
printf "n\n" | npx lerna version premajor --preid beta --exact --no-git-tag-version --no-push --force-publish="$BOOTSTRAP_PACKAGES"
else
npx lerna publish premajor --preid beta --exact --force-publish="$BOOTSTRAP_PACKAGES" --dist-tag beta --yes
fi
exit 0
fi
# Prints "<pkg_name>@<pkg_version>" to stdout for each non-private workspace package
# whose current package.json version is not yet on npm.
find_missing_packages() {
for pkg_json in packages/*/package.json; do
if [ ! -f "$pkg_json" ]; then
continue
fi
if [ "$(jq -r '.private // false' "$pkg_json")" = "true" ]; then
continue
fi
pkg_name="$(jq -r '.name // empty' "$pkg_json")"
pkg_version="$(jq -r '.version // empty' "$pkg_json")"
if [ -z "$pkg_name" ] || [ -z "$pkg_version" ]; then
echo "Skipping malformed package manifest: $pkg_json" >&2
continue
fi
pkg_spec="${pkg_name}@${pkg_version}"
if ! npm view "$pkg_spec" version >/dev/null 2>&1; then
echo "$pkg_spec"
fi
done
}
# Resolves the workspace directory of a package given its npm name.
package_dir_for() {
local target="$1"
for pkg_json in packages/*/package.json; do
if [ ! -f "$pkg_json" ]; then
continue
fi
if [ "$(jq -r '.name // empty' "$pkg_json")" = "$target" ]; then
dirname "$pkg_json"
return 0
fi
done
return 1
}
# Publishes each "<pkg_name>@<pkg_version>" package spec passed as an argument.
# `lerna publish` has no per-package scope filter, so this runs `npm publish`
# directly from each package's directory instead. Returns non-zero if any
# individual publish failed; npm publish's own exit code is taken as authoritative,
# no npm registry re-scan is done to double-check it.
publish_missing_packages() {
echo "Publishing missing packages one-by-one"
local overall_status=0
for pkg_spec in "$@"; do
pkg_name="${pkg_spec%@*}"
pkg_dir="$(package_dir_for "$pkg_name")"
if [ -z "$pkg_dir" ]; then
echo "Could not resolve workspace directory for ${pkg_name}"
overall_status=1
continue
fi
echo "Publishing ${pkg_spec}"
set +e
(cd "$pkg_dir" && npm publish $DIST_TAG_FLAGS)
publish_exit_code=$?
set -e
if [ $publish_exit_code -ne 0 ]; then
echo "npm publish failed for ${pkg_spec} (exit code ${publish_exit_code})"
overall_status=1
fi
done
return $overall_status
}
if [ "$RECOVER_MISSING_ONLY" = "true" ]; then
echo "Recovery mode: scanning for packages missing on npm at their current package.json version"
mapfile -t missing < <(find_missing_packages)
if [ ${#missing[@]} -eq 0 ]; then
echo "No missing packages found; nothing to do"
exit 0
fi
echo "Missing package versions on npm:"
printf ' - %s\n' "${missing[@]}"
if [ "$DRY_RUN" = "true" ]; then
echo "Dry run: not publishing"
exit 0
fi
if ! publish_missing_packages "${missing[@]}"; then
echo "Recovery incomplete: one or more packages failed to publish"
exit 1
fi
echo "All missing packages published successfully"
exit 0
fi
if [ "$DRY_RUN" = "true" ]; then
echo "Running lerna publish in dry-run mode"
printf "n\n" | npx lerna version --exact --no-git-tag-version --no-push
printf "n\n" | npx lerna version --exact --no-git-tag-version --no-push $BETA_FLAGS
else
echo "Running lerna publish for real"
set +e
release_output="$(npm run release -- --yes 2>&1)"
release_output="$(npm run release -- --yes $BETA_FLAGS $DIST_TAG_FLAGS 2>&1)"
release_exit_code=$?
set -e
printf '%s\n' "$release_output"
@@ -76,55 +223,13 @@ jobs:
fi
git checkout "$tagged_commit"
missing=()
for pkg_json in packages/*/package.json; do
if [ ! -f "$pkg_json" ]; then
continue
fi
if [ "$(jq -r '.private // false' "$pkg_json")" = "true" ]; then
continue
fi
pkg_name="$(jq -r '.name // empty' "$pkg_json")"
pkg_version="$(jq -r '.version // empty' "$pkg_json")"
if [ -z "$pkg_name" ] || [ -z "$pkg_version" ]; then
echo "Skipping malformed package manifest: $pkg_json"
continue
fi
pkg_spec="${pkg_name}@${pkg_version}"
if ! npm view "$pkg_spec" version >/dev/null 2>&1; then
missing+=("$pkg_spec")
fi
done
mapfile -t missing < <(find_missing_packages)
if [ ${#missing[@]} -gt 0 ]; then
echo "Missing package versions on npm before scoped recovery:"
printf ' - %s\n' "${missing[@]}"
echo "Publishing missing packages one-by-one with scope"
for pkg_spec in "${missing[@]}"; do
pkg_name="${pkg_spec%@*}"
echo "Publishing ${pkg_name}"
set +e
npx lerna publish from-package --yes --scope "$pkg_name"
scoped_exit_code=$?
set -e
if [ $scoped_exit_code -ne 0 ]; then
echo "Scoped publish exited non-zero for ${pkg_name}; will verify on npm"
fi
done
final_missing=()
for pkg_spec in "${missing[@]}"; do
if ! npm view "$pkg_spec" version >/dev/null 2>&1; then
final_missing+=("$pkg_spec")
fi
done
if [ ${#final_missing[@]} -gt 0 ]; then
echo "Recovery incomplete after scoped retries. Still missing:"
printf ' - %s\n' "${final_missing[@]}"
if ! publish_missing_packages "${missing[@]}"; then
echo "Recovery incomplete: one or more packages failed to publish"
exit $release_exit_code
fi
fi
+12 -3
View File
@@ -15,11 +15,15 @@ permissions:
jobs:
version:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/master' && contains(fromJSON('["mykola-mokhnach", "jlipps", "eglitise", "KazuCocoa"]'), github.actor)
# keep this branch name in sync with env.BETA_BRANCH below - the `env` context isn't available
# to jobs.<job_id>.if (GitHub Actions resolves it before job-level env is set up)
if: (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/appium4') && contains(fromJSON('["mykola-mokhnach", "jlipps", "eglitise", "KazuCocoa"]'), github.actor)
env:
BETA_BRANCH: appium4
steps:
- name: Checkout repository
uses: actions/checkout@v6.0.3
uses: actions/checkout@v7.0.1
with:
fetch-depth: 0
@@ -38,4 +42,9 @@ jobs:
- name: Run Lerna version
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: npx lerna version --exact --yes
run: |
BETA_FLAGS=""
if [ "${{ github.ref_name }}" = "$BETA_BRANCH" ]; then
BETA_FLAGS="--conventional-prerelease --preid beta"
fi
npx lerna version --exact --yes $BETA_FLAGS
+1 -1
View File
@@ -9,7 +9,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check for "On Hold" label
uses: egmacke/action-check-label@v4
uses: egmacke/action-check-label@v5
with:
label: On Hold
state: absent
+24 -9
View File
@@ -2,17 +2,21 @@ name: Publish docs
on:
workflow_dispatch:
workflow_run:
workflows: ["Appium Server Release"]
types:
- completed
push:
# Runs when any new Appium tag is pushed = there is a new release
# Does not trigger for tags with a slash, e.g. 1.0/beta
tags:
- appium@*
- '!appium@*beta*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6.0.3
- uses: actions/checkout@v7.0.1
with:
fetch-depth: 0 # ensure the docs branch is also fetched
- run: |
git config user.name github-actions
git config user.email github-actions@github.com
@@ -24,9 +28,20 @@ jobs:
run-build: 'true'
- name: Install dependencies (Python)
run: npm run install-docs-deps
- name: Fetch gh-pages
run: |
git fetch origin gh-pages:gh-pages || true
- name: Publish docs
run: npm run docs:publish
# The docs are deployed by mike into docs/<lang>/<version>, but crawlers look for
# /llms.txt at the domain root. The file's links are absolute, so the same file serves
# both locations.
- name: Publish llms.txt to the site root
run: |
npm run docs:publish
cp packages/appium/docs/en/llms.txt "${RUNNER_TEMP}/llms.txt"
git checkout -f gh-pages
cp "${RUNNER_TEMP}/llms.txt" llms.txt
git add llms.txt
if git diff --cached --quiet -- llms.txt; then
echo "Root llms.txt is already up to date"
else
git commit -m "docs: update root llms.txt"
git push origin gh-pages
fi
+1 -1
View File
@@ -23,7 +23,7 @@ jobs:
name: Check Renovate Configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6.0.3
- uses: actions/checkout@v7.0.1
- name: Validate Renovate Config
uses: rinchsan/renovate-config-validator@v0.2.1
with:
+9
View File
@@ -0,0 +1,9 @@
{
"mcpServers": {
"codegraph": {
"type": "stdio",
"command": "codegraph",
"args": ["serve", "--mcp"]
}
}
}
-11
View File
@@ -1,11 +0,0 @@
// @ts-check
'use strict';
module.exports = {
require: ['ts-node/register'],
// forbids use of .only() in CI
forbidOnly: Boolean(process.env.CI),
color: true,
timeout: '5s',
};
-16
View File
@@ -1,16 +0,0 @@
**/node_modules/**
**/build/**
**/fixtures/**
**/*.min.*
**/*.md
package-lock.json
package.json
**/.vscode/**
**/*.html
**/generated/**
# generated
packages/schema/lib/appium-config.schema.json
packages/types/lib/appium-config.ts
**/*.hbs
/.nx/workspace-data
+1 -4
View File
@@ -1,9 +1,6 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["github>appium/appium//renovate/default"],
"schedule": [
"after 10pm",
"before 5:00am"
],
"schedule": ["after 10pm", "before 5:00am"],
"timezone": "America/Vancouver"
}
+4
View File
@@ -0,0 +1,4 @@
# Repository guidance
Before changing code, read and follow the
[contributor style guide](packages/appium/docs/en/contributing/index.md#code-style).
+2
View File
@@ -29,8 +29,10 @@ to driver/client documentation
* [fake-plugin](packages/fake-plugin/CHANGELOG.md)
* [logger](packages/logger/CHANGELOG.md)
* [opencv](packages/opencv/CHANGELOG.md)
* [oxc-config](packages/oxc-config/CHANGELOG.md)
* [plugin-test-support](packages/plugin-test-support/CHANGELOG.md)
* [schema](packages/schema/CHANGELOG.md)
* [semantic-release-config](packages/semantic-release-config/CHANGELOG.md)
* [strongbox](packages/strongbox/CHANGELOG.md)
* [support](packages/support/CHANGELOG.md)
* [tsconfig](packages/tsconfig/CHANGELOG.md)
+25
View File
@@ -149,6 +149,31 @@ a discretionary of special basis. Basically, this scheme is run at the project's
not a public service. Making contributions to the project under this scheme does not obligate the
project to pay you for such work, or otherwise compensate you in any way.
### Contributions Are Voluntary
Appium is a community-driven open source project, and all contributions to it are voluntary.
Opening a pull request, or responding to review feedback, does not create a contract, a
commission, a work-for-hire arrangement, or any other obligation on the part of the project, its
Committers, the TC, or the OpenJS Foundation. In particular:
- The project does not hire contractors, assign paid tasks, or quote per-PR, per-task, or hourly
rates. The "value tiers" above are an after-the-fact, discretionary gesture of appreciation, not
a price list.
- Compensation can't be requested, negotiated, or promised in advance, and it must not be made a
condition for starting, continuing, or revising a contribution. A value tier is only assigned by a
Committer after a change has been merged, and may be zero.
- Review feedback, including requests to extend, rework, or re-scope a change, is a normal part of
getting it merged and is never a reason to ask for additional payment.
- Contributors are free to stop working on a change at any time. Maintainers may pick it up, or
close it if it does not suit the project.
- Contributions that appear to be primarily motivated by obtaining payouts (for example, bulk or
low-effort changes, including AI-generated ones submitted without understanding or testing them)
may be closed, and repeated abuse of the scheme may result in the contributor being excluded from
it and from the project's spaces. Contributors are fully responsible for the content they submit,
regardless of the tools used to produce it.
If you are not comfortable contributing on these terms, please do not contribute.
### Raising Issues Related to Governance
This governance model necessarily leaves many situations unspecified. If
+2 -2
View File
@@ -133,7 +133,7 @@ appium plugin uninstall <plugin-name>
## Server Command Line Interface
In order to start sending commands to the Appium server, it must be running on the URL and port
where your client library expects it to listen. [Appium's command-line interface](http://appium.io/docs/en/latest/cli/server/)
where your client library expects it to listen. [Appium's command-line interface](https://appium.io/docs/en/latest/reference/cli/)
is used to launch and configure the server:
```bash
@@ -161,7 +161,7 @@ for the particular driver or whether it supports parallel sessions.
automation, all using the WebDriver model that's already the standard for web automation.
5. You can run your automated tests locally and in a cloud. There are multiple cloud providers that
support various Appium drivers (mostly targeting iOS and Android mobile automation).
6. [Appium Inspector](https://github.com/appium/appium-inspector) can be used to visually inspect
6. [Appium Inspector](https://appium.github.io/appium-inspector/) can be used to visually inspect
the page source of applications across different platforms, facilitating easier test development.
Investing in the [WebDriver](https://w3c.github.io/webdriver/webdriver-spec.html) protocol means you
+2 -5
View File
@@ -7,10 +7,7 @@ import {defineConfig, globalIgnores} from 'eslint/config';
const testFileConfigItems = appiumConfig.filter(
(item) => typeof item?.name === 'string' && item.name.startsWith('Test Files'),
);
const testSupportFiles = [
'packages/driver-test-support/lib/**',
'packages/plugin-test-support/lib/**',
];
const testSupportFiles = ['packages/driver-test-support/lib/**', 'packages/plugin-test-support/lib/**'];
const testSupportConfig = testFileConfigItems.map((item) => ({...item, files: testSupportFiles}));
export default defineConfig([
@@ -28,7 +25,7 @@ export default defineConfig([
rules: {
'@typescript-eslint/consistent-type-imports': [
'error',
{ fixStyle: 'separate-type-imports', prefer: 'type-imports' },
{fixStyle: 'separate-type-imports', prefer: 'type-imports'},
],
},
},
+1 -1
View File
@@ -14,7 +14,7 @@
"version": {
"conventionalCommits": true,
"createRelease": "github",
"allowBranch": ["master", "appium3"],
"allowBranch": ["master", "appium4"],
"exact": true
}
},
+11
View File
@@ -0,0 +1,11 @@
import appiumConfig, {defineConfig, ignorePatterns as appiumIgnorePatterns} from '@appium/oxc-config/oxfmt';
export default defineConfig({
...appiumConfig,
ignorePatterns: [
...appiumIgnorePatterns,
'packages/appium/docs/**',
'packages/schema/lib/appium-config.schema.json',
'packages/types/lib/appium-config.ts',
],
});
+11
View File
@@ -0,0 +1,11 @@
import appiumConfig, {defineConfig, ignorePatterns as appiumIgnorePatterns} from '@appium/oxc-config/oxlint';
export default defineConfig({
extends: [appiumConfig],
ignorePatterns: [
...appiumIgnorePatterns,
'packages/appium/docs/**/assets/**',
'packages/appium/docs/**/js/**',
'packages/appium/sample-code/**',
],
});
+10930 -8520
View File
File diff suppressed because it is too large Load Diff
+41 -66
View File
@@ -4,28 +4,31 @@
"private": true,
"description": "Automation for Apps.",
"keywords": [
"android",
"automation",
"firefoxos",
"ios",
"javascript",
"selenium",
"webdriver",
"ios",
"android",
"firefoxos",
"testing"
"testing",
"webdriver"
],
"homepage": "https://appium.io",
"bugs": {
"url": "https://github.com/appium/appium/issues"
},
"license": "Apache-2.0",
"author": "https://github.com/appium",
"repository": {
"type": "git",
"url": "https://github.com/appium/appium.git"
},
"license": "Apache-2.0",
"author": "https://github.com/appium",
"workspaces": [
"packages/*"
],
"publishConfig": {
"access": "public"
},
"scripts": {
"build": "run-s build:*",
"build:compile": "tsc -b",
@@ -43,15 +46,16 @@
"dev": "run-s build:compile \"build:workspaces\" \"build:compile -- --watch\"",
"dev:docs": "npm run -w packages/appium dev:docs",
"docs": "npm run -w packages/appium build:docs",
"docs:check-llmstxt": "npm run -w packages/appium check:docs:llmstxt",
"docs:preview": "npm run -w packages/appium build:docs:preview",
"docs:publish": "npm run -w packages/appium publish:docs",
"doctor": "node ./scripts/doctor-stub.mjs",
"install-docs-deps": "npm run -w packages/appium install-docs-deps",
"format": "prettier -w ./packages ./scripts",
"format:check": "prettier --check ./packages ./scripts",
"lint": "eslint .",
"lint:ci": "eslint --quiet .",
"lint:fix": "run-s \"lint -- --fix\"",
"format": "oxfmt -c oxfmt.config.mjs .",
"format:check": "oxfmt -c oxfmt.config.mjs --check .",
"lint": "oxlint -c oxlint.config.mjs .",
"lint:ci": "oxlint -c oxlint.config.mjs --quiet .",
"lint:fix": "oxlint -c oxlint.config.mjs --fix .",
"prepare": "run-p rebuild",
"prepublishOnly": "run-s rebuild",
"preversion": "run-s rebuild",
@@ -68,90 +72,57 @@
"test:e2e": "lerna run test:e2e",
"test:quick": "run-s lint test:unit test:types",
"test:slow": "run-s test:quick test:smoke test:e2e",
"test:smoke": "smoker --all test:smoke",
"test:smoke": "lerna run test:smoke",
"test:types": "lerna run test:types",
"test:unit": "lerna run test",
"upload": "gulp github-upload",
"verify:changelog-generation": "node ./scripts/verify-changelog-generation.mjs",
"zip": "zip -qr ./appium.zip ./packages/appium",
"zip-and-upload": "run-s zip upload"
},
"prettier": {
"bracketSpacing": false,
"printWidth": 100,
"singleQuote": true
},
"devDependencies": {
"@eslint/js": "10.0.1",
"@stylistic/eslint-plugin": "5.10.0",
"@tsconfig/node20": "20.1.9",
"@types/argparse": "2.0.17",
"@appium/oxc-config": "1.0.0",
"@tsconfig/node20": "20.1.10",
"@types/async-lock": "1.4.2",
"@types/bluebird": "3.5.42",
"@types/chai": "5.2.3",
"@types/chai-as-promised": "8.0.2",
"@types/content-disposition": "0.5.9",
"@types/express": "5.0.6",
"@types/finalhandler": "1.2.4",
"@types/jsftp": "2.1.5",
"@types/json-schema": "7.0.15",
"@types/klaw": "3.0.7",
"@types/klaw": "3.0.8",
"@types/lockfile": "1.0.4",
"@types/lodash": "4.17.24",
"@types/method-override": "3.0.0",
"@types/mocha": "10.0.10",
"@types/morgan": "1.9.10",
"@types/mv": "2.1.4",
"@types/node": "24.13.2",
"@types/node": "24.19.2",
"@types/plist": "3.0.5",
"@types/pluralize": "0.0.33",
"@types/semver": "7.7.1",
"@types/semver": "7.8.0",
"@types/serve-favicon": "2.5.7",
"@types/shell-quote": "1.7.5",
"@types/sinon": "21.0.1",
"@types/sinon-chai": "4.0.0",
"@types/sinon": "22.0.0",
"@types/which": "3.0.4",
"@types/ws": "8.18.1",
"@types/xmldom": "0.1.34",
"@types/ws": "8.18.2",
"@types/yargs": "17.0.35",
"asyncbox": "6.3.0",
"chai": "6.2.2",
"chai-as-promised": "8.0.2",
"conventional-changelog-conventionalcommits": "7.0.2",
"asyncbox": "6.5.0",
"conventional-changelog-conventionalcommits": "9.3.1",
"cpy-cli": "7.0.0",
"cross-env": "10.1.0",
"eslint": "10.5.0",
"eslint-config-prettier": "10.1.8",
"eslint-import-resolver-typescript": "4.4.5",
"eslint-plugin-import-x": "4.16.2",
"eslint-plugin-mocha": "11.3.0",
"eslint-plugin-n": "18.1.0",
"eslint-plugin-promise": "7.3.0",
"finalhandler": "2.1.1",
"json-schema-to-typescript": "15.0.4",
"lerna": "9.0.7",
"midnight-smoker": "8.0.0",
"json-schema-to-typescript": "16.0.0",
"lerna": "10.1.1",
"mjpeg-consumer": "2.0.0",
"mjpeg-server": "0.3.1",
"mocha": "11.7.6",
"npm-run-all2": "9.0.2",
"prettier": "3.8.4",
"npm-run-all2": "9.0.4",
"rewiremock": "3.14.6",
"rimraf": "6.1.3",
"serve-static": "2.2.1",
"sinon": "22.0.0",
"sinon-chai": "4.0.1",
"teen_process": "4.1.3",
"ts-node": "10.9.2",
"sinon": "22.1.0",
"teen_process": "4.2.1",
"tsd": "0.33.0",
"typescript": "6.0.3",
"typescript-eslint": "8.61.0",
"webdriverio": "9.28.0",
"ws": "8.21.0"
},
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
"npm": ">=10"
},
"publishConfig": {
"access": "public"
"webdriverio": "9.32.0",
"ws": "8.22.0"
},
"overrides": {
"@sidvind/better-ajv-errors": {
@@ -160,6 +131,10 @@
"ajv-formats": {
"ajv": "8.20.0"
},
"http-cache-semantics": "4.2.0"
"http-cache-semantics": "4.3.0"
},
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
"npm": ">=10"
}
}
-10
View File
@@ -1,10 +0,0 @@
// @ts-check
'use strict';
module.exports = {
require: ['ts-node/register'],
forbidOnly: Boolean(process.env.CI),
color: true,
timeout: '5s',
};
+65
View File
@@ -3,6 +3,71 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.9.0](https://github.com/appium/appium/compare/appium@3.8.0...appium@3.9.0) (2026-10-27)
### Features
* **appium:** fallback to latest compatible extension version for CLI &#x60;install&#x60; ([#23013](https://github.com/appium/appium/issues/23013)) ([3c20d79](https://github.com/appium/appium/commit/3c20d7923806bcc2333670e6cef5c24c6da60d62))
### Bug Fixes
* **appium:** backport bidi close code validation ([#22942](https://github.com/appium/appium/issues/22942)) ([14110e5](https://github.com/appium/appium/commit/14110e50b0bf3414c778e039acb7058a3c649e2e))
* **appium:** prevent recursion when logging the first BiDi event of a method ([#22891](https://github.com/appium/appium/issues/22891)) ([77945dd](https://github.com/appium/appium/commit/77945ddaf10665f9457f6bdc94f9103a631f5ca4))
* **base-driver:** track and remove BiDi subscriptions by ID ([#22895](https://github.com/appium/appium/issues/22895)) ([6241300](https://github.com/appium/appium/commit/62413002a83e70b14eb0a3979cd7a054757a0d80))
* **support:** prevent zip extraction through symlink chains ([#23002](https://github.com/appium/appium/issues/23002)) ([#23069](https://github.com/appium/appium/issues/23069)) ([4c753a1](https://github.com/appium/appium/commit/4c753a134d8e172cfec4caec9033fe2a3d884e27))
## [3.8.0](https://github.com/appium/appium/compare/appium@3.7.0...appium@3.8.0) (2026-09-24)
### Features
* **appium:** accept package names for installed extension commands ([#22747](https://github.com/appium/appium/issues/22747)) ([6c911de](https://github.com/appium/appium/commit/6c911debd72cb7fe094d27671d1cf14098ff537a))
### Bug Fixes
* **appium:** do not treat a directory as a CLI argument file ([#22709](https://github.com/appium/appium/issues/22709)) ([6ba6faf](https://github.com/appium/appium/commit/6ba6faf6f533192afbdf9462dbbb3a5c1e5d85c5))
* **appium:** filter prerelease versions in driver update e2e test ([#22794](https://github.com/appium/appium/issues/22794)) ([4e8e334](https://github.com/appium/appium/commit/4e8e334cbc0ae910f521ae7ff7d3ed15f9be0a6a))
* **appium:** match insecure feature prefixes by automationName, case-insensitively ([#22710](https://github.com/appium/appium/issues/22710)) ([6ab17fe](https://github.com/appium/appium/commit/6ab17feb71d74c1f349616f22896faeb256a66ec))
## [3.7.0](https://github.com/appium/appium/compare/appium@3.6.0...appium@3.7.0) (2026-08-24)
### Features
* **base-driver:** add httpServer.frontRouter for global extension middleware ([#22632](https://github.com/appium/appium/issues/22632)) ([f06226b](https://github.com/appium/appium/commit/f06226b7bb2fb7ee2f3a61833f4a1d7777d4ef21))
* **storage-plugin:** Add route aliases ([#22558](https://github.com/appium/appium/issues/22558)) ([a551c38](https://github.com/appium/appium/commit/a551c3817156bbc7e06793227643a2d11c0c0259))
### Bug Fixes
* **appium:** load @appium/docutils dynamically in docs build script ([#22584](https://github.com/appium/appium/issues/22584)) ([2c0f3fd](https://github.com/appium/appium/commit/2c0f3fd9e319c3bc774bdd2a65148da11094c87c))
* **appium:** parse --webhook as a URI instead of host:port ([#22635](https://github.com/appium/appium/issues/22635)) ([c35a12a](https://github.com/appium/appium/commit/c35a12a51d30fe311ef96ebe386cd9c5540e3927))
* **support:** do not treat a sibling folder as a subpath of the root ([#22586](https://github.com/appium/appium/issues/22586)) ([3a80498](https://github.com/appium/appium/commit/3a8049887dc673a6658c3821a2882e0145c3aa86))
## [3.6.0](https://github.com/appium/appium/compare/appium@3.5.2...appium@3.6.0) (2026-07-25)
### Features
* **appium:** add --allow-unknown-args to tolerate unrecognized server CLI arguments ([#22477](https://github.com/appium/appium/issues/22477)) ([f943fab](https://github.com/appium/appium/commit/f943fab1411826212cfb174e3847e610c25f37b7))
### Bug Fixes
* **appium:** Duplicated module import ([#22519](https://github.com/appium/appium/issues/22519)) ([154ea18](https://github.com/appium/appium/commit/154ea1825281335569f0d6952db527135c75e153))
* typescript config ([#22540](https://github.com/appium/appium/issues/22540)) ([ea6a2e1](https://github.com/appium/appium/commit/ea6a2e117f56c1d7ff459378700494407c51608e))
* Typescript references ([#22458](https://github.com/appium/appium/issues/22458)) ([fd70da7](https://github.com/appium/appium/commit/fd70da7ab407bf1f6fec8a3576b9a33f0aef9b69))
## [3.5.2](https://github.com/appium/appium/compare/appium@3.5.1...appium@3.5.2) (2026-06-18)
**Note:** Version bump only for package appium
## [3.5.1](https://github.com/appium/appium/compare/appium@3.5.0...appium@3.5.1) (2026-06-18)
+2 -2
View File
@@ -133,7 +133,7 @@ appium plugin uninstall <plugin-name>
## Server Command Line Interface
In order to start sending commands to the Appium server, it must be running on the URL and port
where your client library expects it to listen. [Appium's command-line interface](http://appium.io/docs/en/latest/cli/server/)
where your client library expects it to listen. [Appium's command-line interface](https://appium.io/docs/en/latest/reference/cli/)
is used to launch and configure the server:
```bash
@@ -161,7 +161,7 @@ for the particular driver or whether it supports parallel sessions.
automation, all using the WebDriver model that's already the standard for web automation.
5. You can run your automated tests locally and in a cloud. There are multiple cloud providers that
support various Appium drivers (mostly targeting iOS and Android mobile automation).
6. [Appium Inspector](https://github.com/appium/appium-inspector) can be used to visually inspect
6. [Appium Inspector](https://appium.github.io/appium-inspector/) can be used to visually inspect
the page source of applications across different platforms, facilitating easier test development.
Investing in the [WebDriver](https://w3c.github.io/webdriver/webdriver-spec.html) protocol means you
+2
View File
@@ -16,6 +16,8 @@ plugins:
blog:
enabled: true
post_excerpt: required
mike:
canonical_version: 'latest'
redirects:
redirect_maps:
'intro/requirements.md': 'quickstart/requirements.md'
@@ -17,3 +17,8 @@ authors:
avatar: 'https://avatars.githubusercontent.com/u/4045041?v=4'
slug: 'sai'
url: 'https://saikrishna.tech'
mykola:
name: 'Mykola Mokhnach'
description: 'Appium Core Maintainer'
avatar: https://avatars.githubusercontent.com/u/7767781?v=4
slug: 'mykola'
@@ -8,11 +8,13 @@ date: 2025-11-25
# Announcing LambdaTest as Appium's Newest Development Partner
As part of our ongoing effort to recognize organizations that meaningfully support the Appium project through dedicated maintainer time, we are excited to welcome our newest Development Partner: LambdaTest!
LambdaTest has long been an active participant in the automated testing ecosystem. Today, they are officially formalizing their commitment by investing people—dedicated engineers who will directly support Appium's development, maintenance, and ecosystem growth.
This kind of hands-on contribution is crucial for ensuring Appium continues to evolve. We deeply value partners who empower their engineering teams to contribute code directly to open source rather than just sponsorship.
<!-- more -->
LambdaTest has long been an active participant in the automated testing ecosystem. Today, they are officially formalizing their commitment by investing people—dedicated engineers who will directly support Appium's development, maintenance, and ecosystem growth.
This kind of hands-on contribution is crucial for ensuring Appium continues to evolve. We deeply value partners who empower their engineering teams to contribute code directly to open source rather than just sponsorship.
<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" />
@@ -22,15 +24,19 @@ This kind of hands-on contribution is crucial for ensuring Appium continues to e
LambdaTest engineers are already contributing actively across several key Appium repositories. Their current focus includes:
**appium-mcp** – Supporting Appium's implementation of the Model Context Protocol (MCP) to drive forward modern AI-assisted capabilities.
**appium-remote-xpc** – Contributing to the native macOS/XPC-based remote execution layer, essential for iOS automation.
**appium-tun-tap** – Assisting in the development and maintenance of network virtualization and tunneling components for advanced testing scenarios.
* [`appium-mcp`](https://github.com/appium/appium-mcp) – Supporting Appium's implementation of the Model Context Protocol (MCP) to drive forward modern AI-assisted capabilities.
* [`appium-ios-remotexpc`](https://github.com/appium/appium-ios-remotexpc) – Contributing to the native macOS/XPC-based remote execution layer, essential for iOS automation.
* [`appium-ios-tuntap`](https://github.com/appium/appium-ios-tuntap) – Assisting in the development and maintenance of network virtualization and tunneling components for advanced testing scenarios.
These contributions strengthen critical infrastructure within the Appium ecosystem and demonstrate LambdaTest's commitment to deep technical involvement in the project's evolution.
About LambdaTest
**About LambdaTest**
LambdaTest’s platform already serves a massive community of Appium users. As a GenAI-powered Quality Engineering Platform, they provide a full-stack testing cloud with 10,000+ real mobile devices and 3,000+ browsers.
Beyond standard infrastructure, they are pushing the boundaries of test execution with AI-native test management and next-generation agents like KaneAI. By supporting Appium alongside Selenium, Playwright, and other major frameworks, LambdaTest helps teams orchestrate intelligent automation at cloud scale.
LambdaTest will continue contributing people, code, and development expertise to strengthen Appium's core functionality. Their commitment represents a significant investment into the future of the framework, and we're thrilled to have them collaborating with us at this deeper level.
The Appium project is proud to recognize LambdaTest as our newest official Development Partner. We can't wait to see what we'll build together!
@@ -0,0 +1,38 @@
---
authors:
- mykola
date: 2026-09-01
---
# Announcing watchOS Simulator Support in the XCUITest Driver
We’re excited to announce that the XCUITest driver now supports automation of watchOS apps — a
platform that’s been on Appium’s requested list for a long time.
<!-- more -->
In order to automate watchOS, you'll need the following:
* XCUITest driver version 12.6.0 or later (WebDriverAgent 16.5.0 or later)
* Xcode 15.4 or later
* watchOS 10 or later
Important to note: ^^the driver currently only works with simulators — real devices are not
compatible.^^
The good news: automating a watchOS app looks just like automating any other iOS/iPadOS app. The
standard use-cases of finding and clicking on elements, retrieving the page source, using the
Appium Inspector — all work as usual. The one exception here is standard W3C gesture/touch actions
(tap/swipe via the Actions API), which are not supported.
On top of that, a few watchOS-specific extensions are available:
- `mobile: pressButton` — press the Digital Crown or Action button
- `mobile: rotateDigitalCrown` — rotate the Digital Crown (since driver version 12.7.0)
- `mobile: performHandGesture` — perform double-tap or wrist flick hand gestures (since driver
version 12.7.0)
For full setup instructions, capabilities, and limitations, check out the
[watchOS guide](https://appium.github.io/appium-xcuitest-driver/latest/guides/watchos/).
Happy testing!
+22 -1
View File
@@ -61,7 +61,7 @@ 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).
If you are VS Code user, you can easily check out the project using [Runme](https://runme.dev/).
Install dependencies:
```sh
@@ -103,6 +103,27 @@ export APPIUM_WORKSPACE=@appium/base-driver
npm run test:unit -w $APPIUM_WORKSPACE
```
### Code Style
#### JSDoc
Add concise JSDoc to all public class methods and exported functions.
#### Module Ordering
Place exported functions and classes before non-exported functions and classes in each module.
This rule does not apply to constants or variables.
#### Class Member Ordering
When adding or moving class methods, follow these conventions:
- Order methods by visibility: public → protected → private. Methods without an explicit visibility
modifier belong to the public group.
- Place private helper methods at the end of the class.
- Preserve existing order within each visibility group.
- Before finishing, check the ordering of methods you added or moved.
### Documentation
The documentation for this project is [available in the project repository itself](https://github.com/appium/appium/tree/master/packages/appium/docs).
@@ -62,6 +62,33 @@ 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.
### Helping LLMs Use Your Documentation
The [`/llms.txt` convention](https://llmstxt.org/) is a Markdown file at the root of a
documentation site, listing its most useful pages so that large language models can navigate the
site without crawling it. Appium's own documentation provides one at
[appium.io/docs/en/latest/llms.txt](https://appium.io/docs/en/latest/llms.txt), and you may want to
do the same for your extension.
MkDocs copies any non-Markdown file in your `docs` directory to the built site as-is, so all you
need to do is write an `llms.txt` and place it alongside your Markdown files. No plugin or build
configuration is required.
The value of this file lies in the parts a crawler could not have worked out on its own, so it is
worth writing by hand rather than generating it from your navigation:
- A short description of what your extension automates, and which platforms it targets
- The handful of things models reliably get wrong about your extension - removed capabilities,
renamed commands, patterns from an older major version that no longer apply
- Links to the pages that matter, with a description of each
Because links in `llms.txt` are read out of context, they must be absolute URLs. If you use Mike
for versioning, point them at your version alias (for example `latest`) rather than at a pinned
version, so that the file does not go stale. Note that a hand-written file can drift as pages are
renamed; Appium validates its own with a
[script](https://github.com/appium/appium/blob/master/packages/appium/docs/scripts/check-llmstxt.js)
that runs in CI, which you are welcome to adapt.
### Building the Docs
At this point, you can use the `appium-docs` CLI tool. Run this tool with no arguments to get the
@@ -80,8 +80,9 @@ The required subfields are:
capability to tell Appium to use *your* driver.
* `platformNames`: this is an array of one or more platform names considered valid for your driver.
When a user sends in the `platformName` capability to start a session, it must be included in
this list for your driver to handle the session. Known platform name strings include: `iOS`,
`tvOS`, `macOS`, `Windows`, `Android`.
this list for your driver to handle the session. These names should generally include the
operating systems your driver is targeting - for example, a driver targeting iOS would include
`iOS`, while a driver targeting the Chrome browser on Windows would include `Windows`.
* `mainClass`: this is a named export (in CommonJS style) from your `main` field. It must be a
class which extends Appium's `BaseDriver` (see below).
@@ -222,17 +223,22 @@ So you'll probably end up overriding `createSession`. You can do so by defining
driver:
```js
async createSession(jwpCaps, reqCaps, w3cCaps, otherDriverData) {
const [sessionId, caps] = super.createSession(w3cCaps);
async createSession(w3cCaps) {
const [sessionId, caps] = await super.createSession(w3cCaps);
// do your own stuff here
return [sessionId, caps];
}
```
For legacy reasons, your function will receive old-style JSON Wire Protocol desired and required
caps as the first two arguments. Given that the old protocol isn't supported anymore and clients
have all been updated, you can instead only rely on the `w3cCaps` parameter. (For a discussion
about what `otherDriverData` is about, see the section below on concurrent drivers).
!!! warning "Deprecated"
Older drivers may still define `createSession` with up to four parameters, e.g.
`createSession(jwpCaps, reqCaps, w3cCaps, otherDriverData)`. This shape is a holdover from the
retired JSON Wire Protocol, which required desired and required caps as the first two
arguments; only the first W3C-shaped argument was ever used. The `otherDriverData` parameter is
likewise deprecated in favor of [IPC](#send-messages-to-plugins-running-on-the-same-session) for
coordinating with other concurrently-running sessions. New drivers should use the single-argument
form shown above.
You'll want to make sure to call `super.createSession` in order to get the session ID as well as
the processed capabilities (note that capabilities are also set on `this.caps`; modifying `caps`
@@ -276,8 +282,8 @@ You handle WebDriver commands by implementing functions in your driver class. Ea
WebDriver Protocol, plus the various Appium extensions, has a corresponding function that you
implement if you want to support that command in your driver. The best way to see which commands
Appium supports and which method you need to implement for each command is to look at Appium's
[routes.js](https://github.com/appium/appium/blob/master/packages/base-driver/lib/protocol/routes.js).
Each route object in this file tells you the command name as well as the parameters you'd expect to
[routes/](https://github.com/appium/appium/tree/master/packages/base-driver/lib/protocol/routes).
Each route object in this directory's files tells you the command name as well as the parameters you'd expect to
receive for that command.
Let's take this block for example:
@@ -318,7 +324,7 @@ Websockets. Implementing handlers for BiDi commands works just the same as imple
for WebDriver classic commands (described in the previous section). You simply define a method on
your driver of the appropriate name, and it will be called when the BiDi command is requested by
the client. To see which specific names you should use for BiDi commands, have a look at
[bidi-commands.js](https://github.com/appium/appium/blob/master/packages/base-driver/lib/protocol/bidi-commands.js)
[bidi-commands.ts](https://github.com/appium/appium/blob/master/packages/base-driver/lib/protocol/bidi-commands.ts)
You are not limited to BiDi commands that are defined in the official BiDi specification. If you
wish to define new commands, you may do so; you just need to tell Appium about them! See
@@ -520,14 +526,13 @@ route, then the route will not be proxied and instead will be handled by your dr
example, we are avoiding proxying all `POST` routes that have the `appium` prefix.
Next, we have to set up the proxying itself. The way to do this is to use a special class from
Appium called `JWProxy`. (The name means "JSON Wire Proxy" and is related to a legacy
implementation of the protocol). You'll want to create a `JWProxy` object using the details required to
connect to the remote server:
Appium called `WebDriverProxy`. You'll want to create a `WebDriverProxy` object using the details
required to connect to the remote server:
```js
// import {JWProxy} from 'appium/driver';
// import {WebDriverProxy} from 'appium/driver';
const proxy = new JWProxy({
const proxy = new WebDriverProxy({
server: 'remote.server',
port: 1234,
base: '/',
@@ -539,8 +544,8 @@ this.proxyCommand = proxy.command.bind(proxy);
Here we are creating a proxy object and assigning some of its methods to `this` under the names
`proxyReqRes` and `proxyCommand`. This is required for Appium to use the proxy, so don't forget
this step! The `JWProxy` has a variety of other options which you can check out in the source code,
as well. (TODO: publish options as API docs and link here).
this step! The `WebDriverProxy` has a variety of other options [which you can check out in the
source code as well.](https://github.com/appium/appium/blob/master/packages/base-driver/lib/jsonwp-proxy/proxy.ts)
Finally, we need a way to tell Appium when the proxy is active. For your driver it might always
be active, or it might only be active when in a certain context. You can define the logic as an
@@ -797,6 +802,12 @@ that multiple simultaneous sessions don't use the same resources:
1. Have each driver express what resources it is using, then examine currently-used resources from
other drivers when a new session begins.
!!! warning "Deprecated"
The `driverData`-based mechanism described below is deprecated. Prefer
[IPC](#send-messages-to-plugins-running-on-the-same-session) for coordinating resources across
concurrently-running sessions instead.
To support this third strategy, you can implement `get driverData` in your driver to return what
sorts of resources your driver is currently using, for example:
@@ -808,7 +819,7 @@ get driverData() {
Now, when a new session is started on your driver, the `driverData` response from any other
simultaneously running drivers (of the same type) will also be included, as the last parameter of
the `createSession` method:
the deprecated, multi-argument form of the `createSession` method:
```js
async createSession(jwpCaps, reqCaps, w3cCaps, driverData)
@@ -476,10 +476,10 @@ capability.
You probably don't normally need to update the Appium server object (which is an
[Express](https://expressjs.com/) server having already been
[configured](https://github.com/appium/appium/blob/master/packages/base-driver/lib/express/server.js)
in a variety of ways). But, for example, you could add new Express middleware to the server to
support your plugin's requirements. To update the server you must implement the `static async
updateServer` method in your class. This method takes three parameters:
[configured](https://github.com/appium/appium/blob/master/packages/base-driver/lib/express/server.ts)
in a variety of ways). But, for example, you could add new routes to the server to support your
plugin's requirements. To update the server you must implement the `static async updateServer`
method in your class. This method takes three parameters:
* `expressApp`: the Express app object
* `httpServer`: the Node HTTP server object
@@ -492,6 +492,25 @@ results you'll need to test! Warning: this should be considered an advanced feat
knowledge of Express, as well as the care not to do anything that could affect the operation of
other parts of the Appium server!
`updateServer` runs *after* Appium's own routes are registered, so `expressApp.use(...)` here
won't see requests to paths Appium already owns — Express matches middleware and routes in
registration order. For middleware that must see requests to those routes too (e.g. logging or
auth), use `httpServer.frontRouter` instead: Appium mounts this
[Router](https://expressjs.com/en/5x/api/router/) before any route is registered, so anything
attached to it — even from inside `updateServer` — still runs ahead of route matching. Note this
is still *after* Appium's own baseline middleware (CORS, WebSocket upgrade handling, body
parsing, etc.), so it won't see requests Appium itself has already rejected, e.g. a CORS
preflight failure or a body that failed to parse:
```js
static async updateServer(expressApp, httpServer, cliArgs) {
httpServer.frontRouter.use((req, res, next) => {
console.log(`Incoming request: ${req.method} ${req.url}`);
next();
});
}
```
### Handle unexpected session shutdown
When developing a plugin you may want to add some cleanup logic for when a session ends. You would
@@ -62,7 +62,7 @@ functionality (e.g., the `plugin` or `driver` subcommands).
Note that this file is the _base_ schema; this will become painfully relevant.
This file is is _not_ a JSON file, because a) JSON is painful to work with for humans, b) is
This file is _not_ a JSON file, because a) JSON is painful to work with for humans, b) is
especially reviled by @jlipps, and c) `ajv` accepts objects, not JSON files.
It is more straightforward to explain how config files are validated, so we'll start there.
+24 -14
View File
@@ -15,34 +15,34 @@ To learn more about drivers, check out the [Driver Intro](../intro/drivers.md).
These drivers are currently maintained by the Appium team:
### [Chromium](https://github.com/appium/appium-chromium-driver)
### [Chromium](https://appium.github.io/appium-chromium-driver/)
* Target: Desktop and mobile Chromium browsers (Chrome, Microsoft Edge, etc.)
* Target: Desktop Chromium-based browsers (Chrome, Microsoft Edge, etc.)
* Mode: Web
```sh title="Install This Driver"
appium driver install chromium
```
### [Espresso](https://github.com/appium/appium-espresso-driver)
### [Espresso](https://appium.github.io/appium-espresso-driver/)
* Target: Android applications
* Mode: Native
* Target: Android applications (mobile, TV, Wear, XR, Automotive)
* Mode: Native, Hybrid, Web
```sh title="Install This Driver"
appium driver install espresso
```
### [Gecko](https://github.com/appium/appium-geckodriver)
### [Gecko](https://appium.github.io/appium-geckodriver/)
* Target: Desktop and mobile Gecko browsers (Firefox)
* Target: Desktop and mobile Gecko-based browsers (Firefox, etc.)
* Mode: Web
```sh title="Install This Driver"
appium driver install gecko
```
### [Mac2](https://github.com/appium/appium-mac2-driver)
### [Mac2](https://appium.github.io/appium-mac2-driver/)
* Target: macOS applications
* Mode: Native
@@ -51,7 +51,7 @@ appium driver install gecko
appium driver install mac2
```
### [Safari](https://github.com/appium/appium-safari-driver)
### [Safari](https://appium.github.io/appium-safari-driver/)
* Target: Desktop and mobile Safari browsers
* Mode: Web
@@ -60,9 +60,9 @@ appium driver install mac2
appium driver install safari
```
### [UiAutomator2](https://github.com/appium/appium-uiautomator2-driver)
### [UiAutomator2](https://appium.github.io/appium-uiautomator2-driver/)
* Target: Android, Android TV, Android Wear applications
* Target: Android applications (mobile, TV, Wear, XR, Automotive)
* Modes: Native, Hybrid, Web
```sh title="Install This Driver"
@@ -85,7 +85,7 @@ appium driver install windows
### [XCUITest](https://appium.github.io/appium-xcuitest-driver/)
* Target: iOS, iPadOS, tvOS applications
* Target: iOS, iPadOS, tvOS, watchOS applications
* Modes: Native, Hybrid, Web
```sh title="Install This Driver"
@@ -126,7 +126,7 @@ appium driver install --source=npm appium-flutter-integration-driver
appium driver install --source=npm appium-lg-webos-driver
```
### [Linux](https://github.com/fantonglang/appium-linux-driver)
### [Linux (@fantonglang)](https://github.com/fantonglang/appium-linux-driver)
!!! warning
@@ -143,6 +143,16 @@ yarn install
node ./
```
### [Linux (@Itsmeaj)](https://github.com/Itsmeaj/appium)
* Target: Linux desktop applications on X11 and Wayland
* Mode: Native
* Supported by: `@Itsmeaj`
```sh title="Install This Driver"
appium driver install --source=npm @itsmeaj/appium-linux-driver
```
### [NovaWindows](https://github.com/AutomateThePlanet/appium-novawindows-driver)
!!! info
@@ -151,7 +161,7 @@ node ./
[Windows driver](#windows)
* Target: Windows applications
* Mode: Native
* Mode: Native, Hybrid
* Supported by: Community / Automate The Planet
```sh title="Install This Driver"
+1 -1
View File
@@ -12,7 +12,7 @@ for more specialised automation workflows.
## Official Plugins
These plugins are are currently maintained by the Appium team:
These plugins are currently maintained by the Appium team:
### [Execute Driver](https://github.com/appium/appium/tree/master/packages/execute-driver-plugin)
@@ -104,3 +104,44 @@ Supported by: `@AppiumTestDistribution`
```sh title="Install This Tool"
npm install -g appium-installer
```
### [Optics](https://github.com/mozarkai/optics-framework)
Optics is an open-source test automation framework that uses Appium to drive Android, iOS,
Android TV, Samsung Tizen and LG webOS apps (and Selenium or Playwright for web). Tests are written
as CSV or YAML keyword steps, and the same keywords are available as a Python library, a Robot
Framework library, an HTTP API and an MCP server. Element lookup falls back from XPath to visible
text, OCR and image matching.
Supported by: `@chinmayajha`
```sh title="Install This Tool"
pip install "optics-framework[mobile]"
```
### [XPath to Class Chain](https://github.com/domovou69/xpath-to-class-chain)
XPath to Class Chain is a command-line tool for migrating iOS XPath locators in test code to
`-ios class chain` selectors. It converts the XPaths that have an exact class chain equivalent,
converts with a warning those that only have a close one (such as grouped positions `(//X)[n]`),
and skips the rest with a reason (for example, sibling or parent axes).
Supported by: `@domovou69`
```sh title="Install This Tool"
npm install -g xpath-to-class-chain
```
### [XPath to UiSelector](https://github.com/domovou69/xpath-to-uiselector)
XPath to UiSelector is a command-line tool for migrating Android XPath locators in test code to
`-android uiautomator` selectors. It converts the XPaths that have an exact `UiSelector`
equivalent, converts with a warning those that only have a close one (such as `//A//B`), and skips
the rest with a reason. The strategy call is rewritten together with the string, for example
`AppiumBy.xpath` becomes `AppiumBy.androidUIAutomator`.
Supported by: `@domovou69`
```sh title="Install This Tool"
npm install -g xpath-to-uiselector
```
@@ -52,6 +52,6 @@ After the PR is merged there is no need to use the local plugin/driver deploymen
to switch back to the package managed by NPM. Follow the next steps for that:
- Unlink the installed driver/plugin from the server by running `appium driver uninstall <driver_name>` or
`appium plugin uninstall <driver_name>`.
`appium plugin uninstall <plugin_name>`.
- Delete the local source folder (`rm -rf <full_path_to_plugin_or_driver_folder_with_fetched_sources>`).
- Install the driver or the plugin from NPM. Check the component README in order to find a proper command for that.
+2 -2
View File
@@ -8,14 +8,14 @@ principles, so you could create more performant and efficient test suite executi
## Why Caching Is Necessary
Mobile application bundles could reach hundreds of megabytes is size. This could become a serious
Mobile application bundles could reach hundreds of megabytes in size. This could become a serious
performance issue if a test suite is executed, and it is necessary to fetch/extract the same application
bundle for each test.
## What Is Cached
Caching could be applied to application bundles generated by
[`configureApp`](https://github.com/appium/appium/blob/master/packages/base-driver/lib/basedriver/helpers.js#L107) helper call.
[`configureApp`](https://github.com/appium/appium/blob/master/packages/base-driver/lib/basedriver/helpers.ts#L99) helper call.
Inherited drivers can customize their caching logic by providing own `onPostProcess`
(or both `inDownload` and `onPostProcess`) property definition, but the general
rule of thumb is that we need to cache locally all application bundles need to be downloaded and/or extracted
+1 -1
View File
@@ -24,7 +24,7 @@ to launch. In order to achieve this, Appium defines its own [extension capabilit
## Common Appium Capabilities
According to the WebDriver spec, extension capabilities must include a namespace prefix (signifying
the vendor introducing the capability), and the namespace must end a colon (`:`). Appium's vendor
the vendor introducing the capability), and the namespace must end in a colon (`:`). Appium's vendor
prefix is `appium:`, and so any Appium-specific capabilities must include this prefix. Depending on
your Appium client, 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.
+1 -1
View File
@@ -34,7 +34,7 @@ discovered and loaded by Appium:
- `appium.config.cjs`
- `.appiumrc` (which is considered to be JSON)
Further, _if your project uses Node.js,_ you can use store the configuration inside an `appium`
Further, _if your project uses Node.js,_ you can store the configuration inside an `appiumConfig`
property in your `package.json` and it will be automatically discovered.
### Config File Search
+11 -10
View File
@@ -6,18 +6,17 @@ title: Retrieving Event Timings
---
Appium comes with the ability to retrieve timing information about startup
information and command length. This is an advanced feature that is controlled
by the use of the `appium:eventTimings` capability (set it to `true` to log event
timings).
information and command length. This is an advanced feature; the server records
event timings for every session.
With this capability turned on, the `POST /session/:id/appium/events` response (i.e.,
the response to `driver.logs.events` or similar, depending on client) will be
decorated with an `events` property. This is the structure of that `events`
property:
The timings can be retrieved at any point during a session via the
`POST /session/:id/appium/events` endpoint (i.e., the response to
`driver.logs.events` or similar, depending on client). The response body is the
event history object itself. This is its structure:
```
{
"<event_type>": [<occurence_timestamp_1>, ...],
"<event_type>": [<occurrence_timestamp_1>, ...],
"commands": [
{
"cmd": "<command_name>",
@@ -29,7 +28,7 @@ property:
}
```
In other words, the `events` property has 2 kinds of properties of its own:
In other words, the event history object has 2 kinds of properties of its own:
* Properties which are the names of event types
* The `commands` property
@@ -63,7 +62,9 @@ generate various kinds of reports from event timings output:
!!! note
In the past, events were available as a part of `GET /session/:id` response
In the past, when the `appium:eventTimings` capability was set to `true`, the event history
was also returned as an `events` property of the (now deprecated) `GET /session/:id`
response
## Add a custom event
@@ -16,7 +16,7 @@ by client libraries. There are two main strategies for this:
based client library (including all Selenium and Appium clients).
There are pros and cons for each strategy, but it is ultimately up to the extension author to
decide how they wish implement new commands.
decide how they wish to implement new commands.
This guide is designed to specifically help you understand the "Execute Method" strategy. This
pattern is commonly used in official Appium drivers and other third-party extensions.
@@ -67,7 +67,7 @@ function, but the function itself—the snippet—is always a string and is the
In the world of Appium, we are usually not automating a web browser, which means this command is
not particularly useful. But it *is* useful as a way to encode the name of an arbitrary command and
to provide parameters. For example, the [XCUITest
Driver](https://github.com/appium/appium-xcuitest-driver) has implemented a command that lets a client
Driver](https://appium.github.io/appium-xcuitest-driver/) has implemented a command that lets a client
terminate a running application if you know the ID (the `bundleId`) of the app. The way that the
driver makes this command available is via the Execute Method `mobile: terminateApp`. Instead of
providing a JavaScript function to the "Execute Script" command, the user provides a _known string_
+1 -1
View File
@@ -137,7 +137,7 @@ all parameters and descriptions see
Once you start the Appium server it will register with the grid, and you will see your device on
the grid console page:
`http://**\<grid-ip-adress\>**:**\<grid-port\>**/grid/console`
`http://**\<grid-ip-address\>**:**\<grid-port\>**/grid/console`
### Example Grid Node Configuration JSON
@@ -18,8 +18,11 @@ Each rule is an object with a set of predefined properties. The following rule p
supported:
- `pattern`: A valid Javascript RegExp pattern to replace. Must be a valid non-empty pattern.
- `text`: A simple non-empty exact text match to replace. Either this property or the above one must
be provided. `pattern` has priority over `text` if both are provided.
- `text`: A simple non-empty exact text to replace. Either this property or the above one must
be provided. `pattern` has priority over `text` if both are provided. Note that the text is
matched as a whole word: special characters are escaped and word boundaries (`\b`) are added on
the sides where the value begins or ends with a word character. For example, a rule with text
`pass` replaces `pass` in `my pass here`, but does not match inside `password`.
- `flags`: Regular expression flags for the given pattern. Supported flags are the same as for the
standard JavaScript [RegExp constructor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Advanced_searching_with_flags_2).
Note that the `g` (global matching) flag is always enabled.
@@ -25,7 +25,7 @@ appium driver install xcuitest
```
This command will install the latest version of the
[XCUITest Driver](https://github.com/appium/appium-xcuitest-driver). The Extension CLI comes with a variety
[XCUITest Driver](https://appium.github.io/appium-xcuitest-driver/). The Extension CLI comes with a variety
of commands and parameters; see the documentation for that command for all the specifics.
The all-important question when Appium is managing your extensions for you is: where are they installed?
@@ -63,7 +63,7 @@ like any other dependency. Basically, whenever you run Appium, if you have not e
1. Try to determine whether the _current directory_ is inside an `npm` package.
1. If so, it will check whether `appium` is a dependency (dev, prod, or peer) in the project's
`package.json`
1. If so, _unless you have specified `APPIUM_HOME` in your environment_, Appium will ignore load
1. If so, _unless you have specified `APPIUM_HOME` in your environment_, Appium will load
drivers and plugins defined in that `package.json` file instead.
This means you are freely able to add Appium drivers and plugins as regular package dependencies or
@@ -106,10 +106,10 @@ and it is recommended to migrate to the following replacements:
|Appium 1 Package|Replacement in Appium 2|
|--|--|
|iOS Driver|[XCUITest Driver](https://appium.github.io/appium-xcuitest-driver/latest/)|
|UiAutomator Driver|[UiAutomator2](https://github.com/appium/appium-uiautomator2-driver/)|
|iOS Driver|[XCUITest Driver](https://appium.github.io/appium-xcuitest-driver/)|
|UiAutomator Driver|[UiAutomator2](https://appium.github.io/appium-uiautomator2-driver/)|
|`wd` Client|[WebdriverIO Client](https://webdriver.io/)|
|Appium Desktop|[Appium Inspector](https://github.com/appium/appium-inspector)|
|Appium Desktop|[Appium Inspector](https://appium.github.io/appium-inspector/)|
!!! info "Actions Needed"
@@ -148,9 +148,9 @@ Icons are used to indicate endpoint support in either certain drivers, or in the
- :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-android:{ .lg } - [UiAutomator2 driver](https://appium.github.io/appium-uiautomator2-driver/)
- :material-coffee:{ .lg } - [Espresso driver](https://appium.github.io/appium-espresso-driver/)
- :material-apple-finder:{ .lg } - [Mac2 driver](https://appium.github.io/appium-mac2-driver/)
- :material-microsoft-windows:{ .lg } - [Windows driver](https://github.com/appium/appium-windows-driver)
</div>
@@ -454,9 +454,6 @@ longer accepts, as well as the parameters it continues to accept in Appium 3.
* `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`
+1 -1
View File
@@ -99,7 +99,7 @@ a driver does this by relying on platform-specific automation technologies. For
maintains an iOS automation technology called
[XCUITest](https://developer.apple.com/documentation/xctest/user_interface_tests). The Appium
driver that supports iOS app automation is called the [XCUITest
Driver](https://github.com/appium/appium-xcuitest-driver) because ultimately what it does is
Driver](https://appium.github.io/appium-xcuitest-driver/) because ultimately what it does is
convert the WebDriver protocol to XCUITest library calls.
One of the reasons that drivers are independent, pluggable modules is that they work completely
+4 -4
View File
@@ -49,8 +49,8 @@ async setUrl(url) {
[^1]: You might notice that `setUrl` doesn't look anything like `Navigate To`, so how did we know
to use it rather than some other random string? Well, Appium's WebDriver-protocol-to-method-name
mapping is defined in a special file within the `@appium/base-driver` package called
[routes.js](https://github.com/appium/appium/blob/master/packages/base-driver/lib/protocol/routes.js).
mappings are defined in special files within the `@appium/base-driver` package's
[routes/](https://github.com/appium/appium/tree/master/packages/base-driver/lib/protocol/routes) directory.
So if you're writing a driver, this is where you would go to figure out what method names to use
and what parameters to expect. Or you could look at the source for any of the main Appium
drivers!
@@ -81,7 +81,7 @@ from there is up to you, the driver author!
## Automation mapping
But *typically* what driver authors want to do is to provide automation behaviours for a given
platform(s) that are semantically very similar to the the WebDriver spec implementations for
platform(s) that are semantically very similar to the WebDriver spec implementations for
browsers. When you want to find an element, you should get a reference to a UI element. When you
want to click or tap that element, the resulting behaviour should be the same as if a person were
to click or tap on the element. And so on.
@@ -175,7 +175,7 @@ be passed back directly to the client, without any XCUITest driver code seeing i
This architectural pattern provides a nice bonus for driver authors who choose to deal with the
WebDriver protocol everywhere, rather than constructing bespoke protocols. It also means that
Appium can create wrapper drivers for any other existing WebDriver implementation very easily. If
you look at the [Appium Safari driver](https://github.com/appium/appium-safari-driver) code, for
you look at the [Appium Safari driver](https://appium.github.io/appium-safari-driver/) code, for
example, you'll see that it implements basically no standard commands, because all of these are
proxied directly to an underlying SafariDriver process.
+142
View File
@@ -0,0 +1,142 @@
# Appium
> Appium is an open-source framework for UI automation of many app platforms - mobile (iOS, Android, Tizen), browser (Chrome, Firefox, Safari), desktop (macOS, Windows), TV (Roku, tvOS, Android TV, Samsung) and more - driven over the W3C WebDriver protocol.
Appium is split into four parts: the Appium server, which defines the core APIs; drivers, which
implement connectivity to a specific platform; clients, which implement Appium's API in a specific
programming language; and plugins, which change or extend the server's behaviour. To automate
anything you need the server, at least one driver, and a client.
Notes for tools generating Appium code from this documentation:
- Appium 3 is the current major version, and these pages describe Appium 3. Appium 2 is still
supported but is documented separately, under its own version of this site, reachable from the
version selector. Appium 1 is no longer supported: `DesiredCapabilities`, `MobileBy`, the
`findElementByAccessibilityId` family of methods, and the `/wd/hub` server base path are all
Appium 1 era patterns - the default base path has been `/` since Appium 2.
- Drivers are not bundled with the server. Install them explicitly, for example
`appium driver install uiautomator2` or `appium driver install xcuitest`.
- Appium 3 requires Node.js in the range `^20.19.0 || ^22.12.0 || >=24.0.0`, and npm 10 or newer.
- Standard W3C capabilities are written without a prefix. `platformName`, `browserName` and
`browserVersion` are the ones used most often with Appium, and the rest of the specification's
set - `acceptInsecureCerts`, `pageLoadStrategy`, `timeouts`, `webSocketUrl` and so on - is also
accepted, mostly by the browser drivers. Every Appium-specific capability needs the `appium:`
vendor prefix - `appium:automationName`, `appium:app`, `appium:udid` - or must be nested,
unprefixed, inside an `appium:options` object.
- Capabilities cannot be changed once a session has started. Parameters that are adjustable during
a session are exposed through the Settings API instead.
- Driver-specific commands are usually Execute Methods rather than new client methods: call the
standard `Execute Script` command with a known command name such as `mobile: terminateApp`, and
pass a *single* object whose keys are the parameter names. Do not invent client-side method names
for these.
- Beyond the small common set documented here, capabilities, execute methods, settings and locator
strategies are defined by each driver and documented on that driver's own site. Refer users to
the driver's documentation rather than guessing names.
- Appium 3 removed many endpoints that were deprecated in Appium 2. Check the Appium 3 migration
guide before using an endpoint carried over from older code.
- `GET /sessions` was removed. Session discovery is now `GET /appium/sessions`, and requires
starting the server with `--allow-insecure=*:session_discovery`.
- In Appium 3, every `--allow-insecure` feature name must carry a scope prefix: either a driver
name (`uiautomator2:adb_shell`) or the wildcard (`*:adb_shell`).
- WebDriver BiDi support is opt-in per session, via the standard `webSocketUrl` capability.
- Contexts model the difference between native and webview modes. `Get Contexts` always returns at
least one context, conventionally named `NATIVE_APP`.
## Getting started
- [Appium Documentation](https://appium.io/docs/en/latest/): documentation home for the Appium server and its ecosystem.
- [Appium in a Nutshell](https://appium.io/docs/en/latest/intro/): how the server, drivers, clients and plugins fit together, and what you need to install.
- [How Does Appium Work?](https://appium.io/docs/en/latest/intro/appium/): the goals and architecture of the Appium project.
- [Intro to Appium Drivers](https://appium.io/docs/en/latest/intro/drivers/): what a driver is, and how Appium supports unrelated platforms through them.
- [Intro to Appium Clients](https://appium.io/docs/en/latest/intro/clients/): Appium's client-server architecture and its relationship to the W3C WebDriver specification.
- [Getting Started](https://appium.io/docs/en/latest/quickstart/): the quickstart path - install Appium, install a driver, install a client, run a first script.
- [System Requirements](https://appium.io/docs/en/latest/quickstart/requirements/): supported operating systems and the required Node.js and npm versions.
- [Install Appium](https://appium.io/docs/en/latest/quickstart/install/): installing the Appium server with npm.
- [Install the UiAutomator2 Driver](https://appium.io/docs/en/latest/quickstart/uiauto2-driver/): installing an Android driver and its Android SDK prerequisites.
- [Write a Test (JS)](https://appium.io/docs/en/latest/quickstart/test-js/): a first Appium script in JavaScript with WebdriverIO.
- [Write a Test (Python)](https://appium.io/docs/en/latest/quickstart/test-py/): a first Appium script in Python.
- [Write a Test (Java)](https://appium.io/docs/en/latest/quickstart/test-java/): a first Appium script in Java.
- [Write a Test (Ruby)](https://appium.io/docs/en/latest/quickstart/test-rb/): a first Appium script in Ruby.
- [Write a Test (.NET)](https://appium.io/docs/en/latest/quickstart/test-dotnet/): a first Appium script in C#.
- [Next Steps](https://appium.io/docs/en/latest/quickstart/next-steps/): where to go after the quickstart.
## Drivers, clients and plugins
Which driver you install determines which platform you can automate, and the driver's own
documentation is the authoritative source for its capabilities and commands.
- [The Appium Ecosystem](https://appium.io/docs/en/latest/ecosystem/): index of officially-supported and community-supported Appium projects.
- [Appium Drivers](https://appium.io/docs/en/latest/ecosystem/drivers/): every known driver with its install command and documentation link. Official drivers include UiAutomator2 and Espresso (Android), XCUITest (iOS, iPadOS, tvOS, watchOS), Mac2 (macOS), Windows, Chromium, Gecko and Safari.
- [Appium Clients](https://appium.io/docs/en/latest/ecosystem/clients/): official clients for Java, Python, Ruby and .NET, plus community clients including WebdriverIO, Nightwatch.js, Robot Framework, Rust and Swift.
- [Appium Plugins](https://appium.io/docs/en/latest/ecosystem/plugins/): optional extensions that modify or extend server behaviour. Not required for standard automation.
- [Appium-Related Tools](https://appium.io/docs/en/latest/ecosystem/tools/): tools for installation, test development and inspection, such as Appium Inspector, and tools for driving Appium from an AI agent, such as the Appium MCP server and the Appium agent skills.
- [Managing Drivers and Plugins](https://appium.io/docs/en/latest/guides/managing-exts/): installing, listing, updating and removing extensions, and installing from sources other than the official index.
## Sessions and capabilities
- [Session Capabilities](https://appium.io/docs/en/latest/guides/caps/): how capabilities work, the `appium:` vendor prefix, `appium:options` grouping, BiDi opt-in via `webSocketUrl`, and always-match versus first-match.
- [Session Properties](https://appium.io/docs/en/latest/reference/session/): the key properties of a session - capabilities, execute methods, settings and locator strategies - and which are defined by the server versus the driver.
- [Capabilities](https://appium.io/docs/en/latest/reference/session/caps/): the full list of capabilities recognized by the Appium server and base driver, and therefore supported by every driver.
- [Session Settings](https://appium.io/docs/en/latest/guides/settings/): parameters that, unlike capabilities, can be adjusted while a session is running.
- [Execute Methods](https://appium.io/docs/en/latest/guides/execute-methods/): the `mobile:` command convention that drivers use to expose commands beyond the WebDriver spec, with examples in every official client language.
- [Managing Contexts](https://appium.io/docs/en/latest/guides/context/): switching between native and webview modes with the Get Contexts, Get Current Context and Set Context commands.
- [Caching of Application Bundles](https://appium.io/docs/en/latest/guides/caching/): how the base driver caches application builds, and how to use it for faster suite execution.
- [Retrieving Event Timings](https://appium.io/docs/en/latest/guides/event-timing/): startup and command timing information, retrieved from the `POST /session/:sessionId/appium/events` endpoint. The `appium:eventTimings` capability described on that page is not required for the endpoint to work, and is being removed in Appium 4.
## Server configuration and the command line
- [Command Line Interface](https://appium.io/docs/en/latest/reference/cli/): the `appium` executable and its `server`, `driver`, `plugin` and `setup` subcommands.
- [appium server](https://appium.io/docs/en/latest/reference/cli/server/): the complete set of server command-line arguments.
- [appium driver/plugin](https://appium.io/docs/en/latest/reference/cli/extensions/): the extension management subcommands - `install`, `list`, `update`, `uninstall`, `run` and `doctor`.
- [appium setup](https://appium.io/docs/en/latest/reference/cli/setup/): installing a preset bundle of extensions for mobile, browser or desktop automation.
- [Environment Variables](https://appium.io/docs/en/latest/reference/cli/env-vars/): advanced behaviour toggled through the environment rather than CLI arguments.
- [The Appium Config File](https://appium.io/docs/en/latest/guides/config/): supplying server arguments through a config file instead of the command line. CLI arguments take precedence.
- [Filtering the Appium Log](https://appium.io/docs/en/latest/guides/log-filters/): redacting passwords, device identifiers and other sensitive values from server logs with `--log-filters`.
- [Header Handling](https://appium.io/docs/en/latest/guides/headers/): request ID tracking through the `x-request-id` header.
- [SSL/TLS/SPDY Support](https://appium.io/docs/en/latest/guides/tls/): starting the server with secure connections enabled.
- [Appium and Selenium Grid](https://appium.io/docs/en/latest/guides/grid/): relaying commands from a Selenium Grid to an Appium server.
## Security
- [Appium Server Security](https://appium.io/docs/en/latest/guides/security/): the insecure-feature mechanism, and the `--allow-insecure`, `--deny-insecure` and `--relaxed-security` flags. In Appium 3 every feature name requires a scope prefix.
- [Insecure Features](https://appium.io/docs/en/latest/reference/cli/insecure-features/): the features defined at the server and official-plugin level, including `session_discovery` and `execute_driver_script`. Drivers define their own in their own documentation.
## API endpoints
- [Reference](https://appium.io/docs/en/latest/reference/): index of the core interfaces supported by the Appium server.
- [API Endpoints](https://appium.io/docs/en/latest/reference/api/): endpoints exposed by the base driver, and therefore inherited by every driver.
- [WebDriver Protocol](https://appium.io/docs/en/latest/reference/api/webdriver/): the W3C WebDriver endpoints Appium supports.
- [WebDriver BiDi Protocol](https://appium.io/docs/en/latest/reference/api/bidi/): the W3C WebDriver BiDi commands Appium supports. These are commands over a WebSocket, not URL endpoints, and require the `webSocketUrl` capability.
- [Appium Protocol](https://appium.io/docs/en/latest/reference/api/appium/): endpoints defined by Appium's own extension of the WebDriver protocol.
- [Plugin Endpoints](https://appium.io/docs/en/latest/reference/api/plugins/): endpoints added or modified by the official plugins.
- [Other Protocols](https://appium.io/docs/en/latest/reference/api/others/): additional supported endpoints, including the Chromedriver protocol extension.
## Migrating between major versions
- [Migrating to Appium 3](https://appium.io/docs/en/latest/guides/migrating-2-to-3/): every breaking change from Appium 2 to 3 - the Node 20 minimum, removed and modified endpoints, the mandatory `--allow-insecure` scope prefix, and the move from `GET /sessions` to `GET /appium/sessions`.
- [Migrating to Appium 2](https://appium.io/docs/en/latest/guides/migrating-1-to-2/): the Appium 1 to 2 changes, including drivers becoming separately installed extensions and the default base path changing from `/wd/hub` to `/`.
## Building drivers and plugins
- [Developing Appium Extensions](https://appium.io/docs/en/latest/developing/): overview of building your own driver or plugin against Appium's modular structure.
- [Building Drivers](https://appium.io/docs/en/latest/developing/build-drivers/): writing a driver, including command definitions, capability constraints and execute methods.
- [Building Plugins](https://appium.io/docs/en/latest/developing/build-plugins/): writing a plugin that modifies or extends server behaviour.
- [Building Doctor Checks](https://appium.io/docs/en/latest/developing/build-doctor-checks/): shipping preconditions checks that `appium driver doctor` can run for your extension.
- [Building Documentation](https://appium.io/docs/en/latest/developing/build-docs/): using `@appium/docutils` to build an MkDocs site for your extension.
- [Masking Sensitive Log Data](https://appium.io/docs/en/latest/developing/sensitive/): marking values as sensitive so they are redacted from extension logs.
- [Appium's Config System](https://appium.io/docs/en/latest/developing/config-system/): how the schema-driven config file and CLI argument system works internally.
- [Local Validation Of Extension PRs](https://appium.io/docs/en/latest/guides/branch-testing/): installing a driver or plugin from an unmerged branch to test it locally.
## Contributing
- [Contributing to Appium](https://appium.io/docs/en/latest/contributing/): how to contribute code, documentation, maintenance and support to the project.
## Optional
- [Appium Blog](https://appium.io/docs/en/latest/blog/): release announcements and project news.
- [Additional Resources](https://appium.io/docs/en/latest/resources/): third-party courses, books, talks and tutorials.
- [Appium Project History](https://appium.io/docs/en/latest/intro/history/): how the project evolved since 2012, of interest mostly for background.
- [Sponsors & Backers](https://appium.io/docs/en/latest/sponsors/): the project's sponsorship program.
- [Source repository](https://github.com/appium/appium): the Appium server implementation.
- [JSON Wire Protocol](https://appium.io/docs/en/latest/reference/api/jsonwp/): legacy pre-W3C protocol, listed for historical reference. Do not base new code on it.
- [Mobile JSON Wire Protocol](https://appium.io/docs/en/latest/reference/api/mjsonwp/): legacy pre-W3C mobile protocol extension, listed for historical reference. Do not base new code on it.
+1 -1
View File
@@ -13,7 +13,7 @@ The basic plan for this quickstart is as follows:
1. Install Appium
1. Install an Appium driver and its dependencies
- This guide provides instructions for the [UiAutomator2 driver](https://github.com/appium/appium-uiautomator2-driver)
- This guide provides instructions for the [UiAutomator2 driver](https://appium.github.io/appium-uiautomator2-driver/)
1. Install an Appium client library in your language of choice
- This guide contains options for JavaScript, Python, Java, Ruby, and .NET
1. Write and run a simple Appium automation script using a sample application
@@ -14,7 +14,7 @@ reference materials especially for beginners:
- [Capabilities](../guides/caps.md)
- [Settings](../guides/settings.md)
You'll also find that the [Appium Inspector](https://github.com/appium/appium-inspector) is an
You'll also find that the [Appium Inspector](https://appium.github.io/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.
@@ -39,7 +39,7 @@ The `appium_lib_core` is the main part as an Appium client.
`appium_lib_core` does not have such a global variable.
This example is by the `appium_lib_core` with `test-unit` gem module.
Tes code in `appium_lib` should be similar.
Test code in `appium_lib` should be similar.
```ruby title="test.rb"
--8<-- "./sample-code/quickstarts/rb/test.rb"
@@ -12,7 +12,7 @@ interface that allows Appium to automate a particular platform.
(whereas the iOS driver, for example, requires you to be using macOS).
The driver we're going to use is called the [UiAutomator2
Driver](https://github.com/appium/appium-uiautomator2-driver). It's worth visiting that driver's
Driver](https://appium.github.io/appium-uiautomator2-driver/). It's worth visiting that driver's
documentation and bookmarking it, because it will be an invaluable reference down the line.
## Set up Android automation requirements
@@ -105,7 +105,7 @@ appium setup
```
Running this will install Appium's mobile-specific drivers: UiAutomator2, [XCUITest](https://appium.github.io/appium-xcuitest-driver/)
(only if running macOS), and [Espresso](https://github.com/appium/appium-espresso-driver).
(only if running macOS), and [Espresso](https://appium.github.io/appium-espresso-driver/).
You can also use this command to batch install drivers for desktop applications or desktop browsers.
For more details on this, refer to the [Setup command documentation](../reference/cli/setup.md).
+112 -2
View File
@@ -89,7 +89,7 @@ Retrieves the URL endpoints and WebDriver BiDi commands supported in the current
#### Response
`ListCommandsResponse` - an object containing all supported endpoints and BiDi commands, grouped by
their origin (base Appium, driver-specific, or plugin-specific). Refer to [the type definition file](https://github.com/appium/appium/blob/master/packages/types/lib/command.ts)
their origin (base Appium, driver-specific, or plugin-specific). Refer to [the type definition file](https://github.com/appium/appium/blob/master/packages/types/lib/command-maps.ts)
for a detailed structure of this object.
### listExtensions
@@ -103,9 +103,51 @@ Retrieves the [execute methods](../../guides/execute-methods.md) supported in th
#### Response
`ListExtensionsResponse` - an object containing all supported execute methods, grouped by their
origin (driver-specific or plugin-specific). Refer to [the type definition file](https://github.com/appium/appium/blob/master/packages/types/lib/command.ts)
origin (driver-specific or plugin-specific). Refer to [the type definition file](https://github.com/appium/appium/blob/master/packages/types/lib/command-maps.ts)
for a detailed structure of this object.
### getCurrentAppiumContext
```
GET /session/:sessionId/appium/context
```
Retrieves the active application context.
#### Response
`string` - the name of the active context
### setAppiumContext
```
POST /session/:sessionId/appium/context
```
Sets an application context as the active context.
#### Parameters
|Name|Description|Type|
|--|--|--|
|`name`|Name of the context to set as the active one|string|
#### Response
`null`
### getAppiumContexts
```
GET /session/:sessionId/appium/contexts
```
Retrieves all available application contexts.
#### Response
`string[]` - the names of available contexts
### getLogEvents
```
@@ -392,3 +434,71 @@ Retrieves data from a directory on the device under test.
#### Response
`string` - the Base64-encoded zip file of the directory contents
### getAppiumRotation
```
GET /session/:sessionId/appium/device/rotation
```
Retrieves the current spatial orientation of the device under test.
#### Response
`Rotation` - an object with the following properties:
|Name|Description|Type|
|--|--|--|
|`x`|Degrees by which the device is rotated on its X axis|number|
|`y`|Degrees by which the device is rotated on its Y axis|number|
|`z`|Degrees by which the device is rotated on its Z axis|number|
### setAppiumRotation
```
POST /session/:sessionId/appium/device/rotation
```
Sets the spatial orientation of the device under test.
#### Parameters
|Name|Description|Type|
|--|--|--|
|`x`|Degrees by which the device is rotated on its X axis|number|
|`y`|Degrees by which the device is rotated on its Y axis|number|
|`z`|Degrees by which the device is rotated on its Z axis|number|
#### Response
`null`
### getAppiumOrientation
```
GET /session/:sessionId/appium/device/orientation
```
Retrieves the current orientation of the device under test.
#### Response
`string` - either `PORTRAIT` or `LANDSCAPE`
### setAppiumOrientation
```
POST /session/:sessionId/appium/device/orientation
```
Sets the orientation of the device under test.
#### Parameters
|Name|Description|Type|
|--|--|--|
|`orientation`|New device orientation. Supported values are `PORTRAIT` or `LANDSCAPE`.|string|
#### Response
`null`
+10 -5
View File
@@ -46,7 +46,7 @@ Subscribes to one or more BiDi events.
#### Response
`null`
`{subscription: string}` — a unique subscription ID that can be passed to `session.unsubscribe`.
### bidiUnsubscribe
@@ -56,15 +56,20 @@ session.unsubscribe
> WebDriver BiDi documentation: [session.unsubscribe](https://w3c.github.io/webdriver-bidi/#command-session-unsubscribe)
Unsubscribes from one or more BiDi events.
Unsubscribes using either previously returned subscription IDs or event names.
Removing a subscription ID preserves any overlapping subscriptions.
#### Parameters
|Name|Description|Type|Default|
|--|--|--|--|
|`contexts?`|Contexts in which to unsubscribe from the specified events. By default, the global scope is applied.|string[]|`['']`|
|`events`|Names of events to unsubscribe from|string[]||
|`subscriptions?`|Non-empty list of subscription IDs returned by `session.subscribe`. Cannot be combined with `events` or `contexts`.|string[]||
|`contexts?`|Non-standard, only together with `events`: contexts in which to unsubscribe from the specified events. By default, the global scope is applied.|string[]|`['']`|
|`events?`|Non-empty list of event names to unsubscribe from. Required when `subscriptions` is omitted.|string[]||
All subscription IDs must be known to the current session. An unknown ID causes an `invalid argument`
error without removing any subscriptions. Subscription IDs are cleared when the session is deleted.
#### Response
`null`
`{}`
@@ -139,6 +139,10 @@ GET /session/:sessionId/orientation
Retrieves the current orientation of the device under test.
!!! warning "Deprecated"
Please use [`getAppiumOrientation`](./appium.md#getappiumorientation) instead
#### Response
`string` - either `PORTRAIT` or `LANDSCAPE`
@@ -153,6 +157,10 @@ POST /session/:sessionId/orientation
Sets the orientation of the device under test.
!!! warning "Deprecated"
Please use [`setAppiumOrientation`](./appium.md#setappiumorientation) instead
#### Parameters
|Name|Description|Type|
@@ -20,6 +20,10 @@ GET /session/:sessionId/rotation
Retrieves the current spatial orientation of the device under test.
!!! warning "Deprecated"
Please use [`getAppiumRotation`](./appium.md#getappiumrotation) instead
#### Response
`Rotation` - an object with the following properties:
@@ -40,6 +44,10 @@ POST /session/:sessionId/rotation
Sets the spatial orientation of the device under test.
!!! warning "Deprecated"
Please use [`setAppiumRotation`](./appium.md#setappiumrotation) instead
#### Parameters
|Name|Description|Type|
@@ -62,6 +70,10 @@ GET /session/:sessionId/context
Retrieves the active application context.
!!! warning "Deprecated"
Please use [`getCurrentAppiumContext`](./appium.md#getcurrentappiumcontext) instead
#### Response
`string` - the name of the active context
@@ -76,6 +88,10 @@ POST /session/:sessionId/context
Sets an application context as the active context.
!!! warning "Deprecated"
Please use [`setAppiumContext`](./appium.md#setappiumcontext) instead
#### Parameters
|Name|Description|Type|
@@ -96,6 +112,10 @@ GET /session/:sessionId/contexts
Retrieves all available application contexts.
!!! warning "Deprecated"
Please use [`getAppiumContexts`](./appium.md#getappiumcontexts) instead
#### Response
`string[]` - the names of available contexts
@@ -169,10 +169,17 @@ Modifies the [`createSession`](./webdriver.md#createsession) endpoint:
All endpoints for this plugin can be invoked without creating a session, allowing you to prepare
your test environment in advance.
!!! info
Prior to plugin version 1.2.0, all endpoints below were mounted under the `/storage` prefix
(e.g. `/storage/add`) instead of `/appium/storage`. The `/storage`-prefixed routes are still
available for backward compatibility, but are deprecated and will be removed in a future
version of the plugin.
### addStorageItem
```
POST /storage/add
POST /appium/storage/add
```
Adds a new file to the storage.
@@ -198,8 +205,8 @@ Example:
```json
{
"ws": {
"stream": "/storage/add/ccc963411b2621335657963322890305ebe96186/stream",
"events": "/storage/add/ccc963411b2621335657963322890305ebe96186/events"
"stream": "/appium/storage/add/ccc963411b2621335657963322890305ebe96186/stream",
"events": "/appium/storage/add/ccc963411b2621335657963322890305ebe96186/events"
},
"ttlMs": 300000
}
@@ -208,7 +215,7 @@ Example:
### deleteStorageItem
```
POST /storage/delete
POST /appium/storage/delete
```
Deletes a file in the storage.
@@ -227,7 +234,7 @@ the storage, or if the delete request is invalid.
### listStorageItems
```
GET /storage/list
GET /appium/storage/list
```
List all files present in the storage.
@@ -245,7 +252,7 @@ List all files present in the storage.
### resetStorage
```
POST /storage/reset
POST /appium/storage/reset
```
Deletes all uploaded files and stops any incomplete uploads.
@@ -13,6 +13,12 @@ Provides management options for a specific extension (driver or plugin). Both th
The following sub-subcommands are supported: `doctor`, `install`, `list`, `run`, `update`,
and `uninstall`.
For `doctor`, `run`, `update`, and `uninstall`, you can identify an installed extension by its
short name or its exact npm package name. For example, `appium driver uninstall uiautomator2`
and `appium driver uninstall appium-uiautomator2-driver` refer to the same installed driver.
Short names take precedence if a name also matches another extension's package name. Package names
can include a scope, such as `@appium/fake-driver`, but must not include a version or tag suffix.
## `doctor`
Runs doctor checks for an installed extension, which validate whether the extension has its prerequisites
@@ -31,7 +37,7 @@ appium {driver|plugin} doctor <extension-name>
|Argument|Description|
|--|--|
|`extension-name`|The short name of the installed extension|
|`extension-name`|The short name or exact npm package name of the installed extension|
#### Options
@@ -75,7 +81,7 @@ appium {driver|plugin} install <install-spec>
|--|--|
|None|The short name of an official extension, with optional modifiers as supported by `npm install` (e.g. version or tag)|
|`git`|The Git URL of the extension|
|`github`|The GitHub repository URL of the extension|
|`github`|The GitHub repository slug of the extension, in the form `<org>/<repo>`|
|`local`|The local path to the extension containing its `package.json` file|
|`npm`|The name of the `npm` package, with optional modifiers as supported by `npm install` (e.g. version or tag)|
@@ -108,7 +114,7 @@ appium {driver|plugin} install <install-spec>
- Install the XCUITest driver from GitHub:
```
appium driver install https://github.com/appium/appium-xcuitest-driver --source=github --package=appium-xcuitest-driver
appium driver install appium/appium-xcuitest-driver --source=github --package=appium-xcuitest-driver
```
- Install the XCUITest driver using a Git URL:
@@ -158,13 +164,13 @@ extensions include scripts.
#### Usage
```
appium {driver|plugin} run <extension-name> <script-name> [script-args]
appium {driver|plugin} run <extension-name> [<script-name> [<script-args>]]
```
|Argument|Description|
|--|--|
|`extension-name`|The short name of the installed extension|
|`script-name`|The name of the script to be run|
|`extension-name`|The short name or exact npm package name of the installed extension|
|`script-name`|The name of the script to run. If not provided, a list of available scripts is returned.|
|`script-args`|Any additional arguments passed to the script|
#### Options
@@ -181,6 +187,12 @@ appium {driver|plugin} run <extension-name> <script-name> [script-args]
appium driver run uiautomator2 reset
```
- List all available scripts included in the XCUITest driver:
```
appium driver run xcuitest
```
## `update`
Updates one or more extensions. Only supported for extensions installed via `npm`. By default,
@@ -194,7 +206,7 @@ appium {driver|plugin} update <extension-name>
|Argument|Description|
|--|--|
|`extension-name`|The short name of the installed extension, or `installed` to update all installed extensions|
|`extension-name`|The short name or exact npm package name of the installed extension, or `installed` to update all installed extensions|
#### Options
@@ -229,7 +241,7 @@ appium {driver|plugin} uninstall <extension-name>
|Argument|Description|
|--|--|
|`extension-name`|The short name of the installed extension|
|`extension-name`|The short name or exact npm package name of the installed extension|
#### Options
@@ -26,11 +26,12 @@ appium
|<div style="width:15em">Argument</div>|Description|Type|<div style="width:7em">Default</div>|
|--|--|--|--|
|`--address`, `-a`|IPv4/IPv6 address to listen on|string|`0.0.0.0`|
|`--address`, `-a`|IPv4/IPv6 address or a hostname to listen on|string|`0.0.0.0`|
|`--allow-cors`|Allow web browser connections from any host|boolean|`false`|
|`--allow-insecure`|List of [insecure features](../../guides/security.md) that should be allowed in this server's sessions. Individual features can be overridden by `--deny-insecure`. Has no effect in combination with `--relaxed-security`.|array<string>|`[]`|
|`--allow-unknown-args`|Do not exit if unrecognized command-line arguments are passed to the server; ignore them instead. Useful when the Appium CLI is wrapped by external tooling that appends extra flags.|boolean|`false`|
|`--base-path`, `-pa`|Base path to use as the prefix for all webdriver routes running on the server|string|`""`|
|`--callback-address`, `-ca`|Callback IP address|string|`0.0.0.0`|
|`--callback-address`, `-ca`|Callback IP address|string|same as `--address`|
|`--callback-port`, `-cp`|Callback port|integer|`4723`|
|`--config`|Path to an [Appium configuration JSON file](../../guides/config.md)|string||
|`--debug-log-spacing`|Add exaggerated spacing in logs to help with visual inspection|boolean|`false`|
@@ -64,7 +65,7 @@ appium
|`--tmp`|Absolute path to the directory used for temporary files|string|[`os.tmpdir()`](https://nodejs.org/api/os.html#ostmpdir)|
|`--use-drivers`|List of drivers to activate. By default, all installed drivers are activated.|array<string>|`[]`|
|`--use-plugins`|List of plugins to activate. By default, no plugins are activated. Set to `["all"]` to activate all installed plugins.|array<string>|`[]`|
|`--webhook`, `-G`|URL for an HTTP listener where the server logs should be output. This does not affect output on the console.|string||
|`--webhook`, `-G`|URL for an HTTP listener where the server logs should be output. This does not affect output on the console. A bare `host:port` is also accepted, which posts the logs to the root path over plain http; a value having neither a scheme nor a port falls back to `127.0.0.1:9003`.|string||
### Info Options
@@ -34,7 +34,7 @@ default value.
| `webSocketUrl` | Toggle support of the WebDriver BiDi protocol | `boolean` ||
| `appium:eventTimings` (deprecated) | Toggle collection of [Event Timings](../../guides/event-timing.md). This capability is deprecated - please use the [`getLogEvents`](../api/appium.md#getlogevents) endpoint instead. | `boolean` ||
| `appium:newCommandTimeout` | Number of seconds the Appium server should wait for clients to send commands before stopping the session. A value of `0` disables the timeout. | `number` | `60` |
| `appium:printPageSourceOnFindFailure` | Toggle retrieval of the the page source and its printing to the Appium log, whenever a request to find an element fails | `boolean` ||
| `appium:printPageSourceOnFindFailure` | Toggle retrieval of the page source and its printing to the Appium log, whenever a request to find an element fails | `boolean` ||
### Validated Capabilities
@@ -8,11 +8,6 @@ title: Additional Resources
Here you can find links to additional Appium resources around the web:
## Websites
- [Appium Pro](https://appiumpro.com) - a blog and newsletter written by one of Appium's
maintainers, Jonathan Lipps, with lots of useful guides
## Online Courses
- [Appium and Selenium Fundamentals](https://ui.headspin.io/university/learn/appium-selenium-fundamentals-2020) - a comprehensive video course on learning Python, Selenium, and Appium by Jonathan Lipps
@@ -17,3 +17,8 @@ authors:
avatar: 'https://avatars.githubusercontent.com/u/4045041?v=4'
slug: 'sai'
url: 'https://saikrishna.tech'
mykola:
name: 'Mykola Mokhnach'
description: 'Appium Core Maintainer'
avatar: https://avatars.githubusercontent.com/u/7767781?v=4
slug: 'mykola'
@@ -8,11 +8,13 @@ date: 2025-11-25
# Announcing LambdaTest as Appium's Newest Development Partner
As part of our ongoing effort to recognize organizations that meaningfully support the Appium project through dedicated maintainer time, we are excited to welcome our newest Development Partner: LambdaTest!
LambdaTest has long been an active participant in the automated testing ecosystem. Today, they are officially formalizing their commitment by investing people—dedicated engineers who will directly support Appium's development, maintenance, and ecosystem growth.
This kind of hands-on contribution is crucial for ensuring Appium continues to evolve. We deeply value partners who empower their engineering teams to contribute code directly to open source rather than just sponsorship.
<!-- more -->
LambdaTest has long been an active participant in the automated testing ecosystem. Today, they are officially formalizing their commitment by investing people—dedicated engineers who will directly support Appium's development, maintenance, and ecosystem growth.
This kind of hands-on contribution is crucial for ensuring Appium continues to evolve. We deeply value partners who empower their engineering teams to contribute code directly to open source rather than just sponsorship.
<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" />
@@ -20,15 +22,19 @@ This kind of hands-on contribution is crucial for ensuring Appium continues to e
</div>
LambdaTest engineers are already contributing actively across several key Appium repositories. Their current focus includes:
**appium-mcp** – Supporting Appium's implementation of the Model Context Protocol (MCP) to drive forward modern AI-assisted capabilities.
**appium-remote-xpc** – Contributing to the native macOS/XPC-based remote execution layer, essential for iOS automation.
**appium-tun-tap** – Assisting in the development and maintenance of network virtualization and tunneling components for advanced testing scenarios.
- [`appium-mcp`](https://github.com/appium/appium-mcp) – Supporting Appium's implementation of the Model Context Protocol (MCP) to drive forward modern AI-assisted capabilities.
- [`appium-ios-remotexpc`](https://github.com/appium/appium-ios-remotexpc) – Contributing to the native macOS/XPC-based remote execution layer, essential for iOS automation.
- [`appium-ios-tuntap`](https://github.com/appium/appium-ios-tuntap) – Assisting in the development and maintenance of network virtualization and tunneling components for advanced testing scenarios.
These contributions strengthen critical infrastructure within the Appium ecosystem and demonstrate LambdaTest's commitment to deep technical involvement in the project's evolution.
About LambdaTest
**About LambdaTest**
LambdaTest’s platform already serves a massive community of Appium users. As a GenAI-powered Quality Engineering Platform, they provide a full-stack testing cloud with 10,000+ real mobile devices and 3,000+ browsers.
Beyond standard infrastructure, they are pushing the boundaries of test execution with AI-native test management and next-generation agents like KaneAI. By supporting Appium alongside Selenium, Playwright, and other major frameworks, LambdaTest helps teams orchestrate intelligent automation at cloud scale.
LambdaTest will continue contributing people, code, and development expertise to strengthen Appium's core functionality. Their commitment represents a significant investment into the future of the framework, and we're thrilled to have them collaborating with us at this deeper level.
The Appium project is proud to recognize LambdaTest as our newest official Development Partner. We can't wait to see what we'll build together!
@@ -0,0 +1,38 @@
---
authors:
- mykola
date: 2026-09-01
---
# Announcing watchOS Simulator Support in the XCUITest Driver
We’re excited to announce that the XCUITest driver now supports automation of watchOS apps — a
platform that’s been on Appium’s requested list for a long time.
<!-- more -->
In order to automate watchOS, you'll need the following:
- XCUITest driver version 12.6.0 or later (WebDriverAgent 16.5.0 or later)
- Xcode 15.4 or later
- watchOS 10 or later
Important to note: ^^the driver currently only works with simulators — real devices are not
compatible.^^
The good news: automating a watchOS app looks just like automating any other iOS/iPadOS app. The
standard use-cases of finding and clicking on elements, retrieving the page source, using the
Appium Inspector — all work as usual. The one exception here is standard W3C gesture/touch actions
(tap/swipe via the Actions API), which are not supported.
On top of that, a few watchOS-specific extensions are available:
- `mobile: pressButton` — press the Digital Crown or Action button
- `mobile: rotateDigitalCrown` — rotate the Digital Crown (since driver version 12.7.0)
- `mobile: performHandGesture` — perform double-tap or wrist flick hand gestures (since driver
version 12.7.0)
For full setup instructions, capabilities, and limitations, check out the
[watchOS guide](https://appium.github.io/appium-xcuitest-driver/latest/guides/watchos/).
Happy testing!
+22 -1
View File
@@ -62,7 +62,7 @@ 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).
If you are VS Code user, you can easily check out the project using [Runme](https://runme.dev/).
Install dependencies:
@@ -109,6 +109,27 @@ export APPIUM_WORKSPACE=@appium/base-driver
npm run test:unit -w $APPIUM_WORKSPACE
```
### Code Style
#### JSDoc
Add concise JSDoc to all public class methods and exported functions.
#### Module Ordering
Place exported functions and classes before non-exported functions and classes in each module.
This rule does not apply to constants or variables.
#### Class Member Ordering
When adding or moving class methods, follow these conventions:
- Order methods by visibility: public → protected → private. Methods without an explicit visibility
modifier belong to the public group.
- Place private helper methods at the end of the class.
- Preserve existing order within each visibility group.
- Before finishing, check the ordering of methods you added or moved.
### Documentation
The documentation for this project is [available in the project repository itself](https://github.com/appium/appium/tree/master/packages/appium/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
@@ -62,6 +62,33 @@ 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.
### Helping LLMs Use Your Documentation
The [`/llms.txt` convention](https://llmstxt.org/) is a Markdown file at the root of a
documentation site, listing its most useful pages so that large language models can navigate the
site without crawling it. Appium's own documentation provides one at
[appium.io/docs/en/latest/llms.txt](https://appium.io/docs/en/latest/llms.txt), and you may want to
do the same for your extension.
MkDocs copies any non-Markdown file in your `docs` directory to the built site as-is, so all you
need to do is write an `llms.txt` and place it alongside your Markdown files. No plugin or build
configuration is required.
The value of this file lies in the parts a crawler could not have worked out on its own, so it is
worth writing by hand rather than generating it from your navigation:
- A short description of what your extension automates, and which platforms it targets
- The handful of things models reliably get wrong about your extension - removed capabilities,
renamed commands, patterns from an older major version that no longer apply
- Links to the pages that matter, with a description of each
Because links in `llms.txt` are read out of context, they must be absolute URLs. If you use Mike
for versioning, point them at your version alias (for example `latest`) rather than at a pinned
version, so that the file does not go stale. Note that a hand-written file can drift as pages are
renamed; Appium validates its own with a
[script](https://github.com/appium/appium/blob/master/packages/appium/docs/scripts/check-llmstxt.js)
that runs in CI, which you are welcome to adapt.
### Building the Docs
At this point, you can use the `appium-docs` CLI tool. Run this tool with no arguments to get the
@@ -80,8 +80,9 @@ The required subfields are:
capability to tell Appium to use _your_ driver.
- `platformNames`: this is an array of one or more platform names considered valid for your driver.
When a user sends in the `platformName` capability to start a session, it must be included in
this list for your driver to handle the session. Known platform name strings include: `iOS`,
`tvOS`, `macOS`, `Windows`, `Android`.
this list for your driver to handle the session. These names should generally include the
operating systems your driver is targeting - for example, a driver targeting iOS would include
`iOS`, while a driver targeting the Chrome browser on Windows would include `Windows`.
- `mainClass`: this is a named export (in CommonJS style) from your `main` field. It must be a
class which extends Appium's `BaseDriver` (see below).
@@ -222,17 +223,24 @@ So you'll probably end up overriding `createSession`. You can do so by defining
driver:
```js
async createSession(jwpCaps, reqCaps, w3cCaps, otherDriverData) {
const [sessionId, caps] = super.createSession(w3cCaps);
async createSession(w3cCaps) {
const [sessionId, caps] = await super.createSession(w3cCaps);
// do your own stuff here
return [sessionId, caps];
}
```
For legacy reasons, your function will receive old-style JSON Wire Protocol desired and required
caps as the first two arguments. Given that the old protocol isn't supported anymore and clients
have all been updated, you can instead only rely on the `w3cCaps` parameter. (For a discussion
about what `otherDriverData` is about, see the section below on concurrent drivers).
!!! warning "Deprecated"
```
Older drivers may still define `createSession` with up to four parameters, e.g.
`createSession(jwpCaps, reqCaps, w3cCaps, otherDriverData)`. This shape is a holdover from the
retired JSON Wire Protocol, which required desired and required caps as the first two
arguments; only the first W3C-shaped argument was ever used. The `otherDriverData` parameter is
likewise deprecated in favor of [IPC](#send-messages-to-plugins-running-on-the-same-session) for
coordinating with other concurrently-running sessions. New drivers should use the single-argument
form shown above.
```
You'll want to make sure to call `super.createSession` in order to get the session ID as well as
the processed capabilities (note that capabilities are also set on `this.caps`; modifying `caps`
@@ -276,8 +284,8 @@ You handle WebDriver commands by implementing functions in your driver class. Ea
WebDriver Protocol, plus the various Appium extensions, has a corresponding function that you
implement if you want to support that command in your driver. The best way to see which commands
Appium supports and which method you need to implement for each command is to look at Appium's
[routes.js](https://github.com/appium/appium/blob/master/packages/base-driver/lib/protocol/routes.js).
Each route object in this file tells you the command name as well as the parameters you'd expect to
[routes/](https://github.com/appium/appium/tree/master/packages/base-driver/lib/protocol/routes).
Each route object in this directory's files tells you the command name as well as the parameters you'd expect to
receive for that command.
Let's take this block for example:
@@ -320,7 +328,7 @@ Websockets. Implementing handlers for BiDi commands works just the same as imple
for WebDriver classic commands (described in the previous section). You simply define a method on
your driver of the appropriate name, and it will be called when the BiDi command is requested by
the client. To see which specific names you should use for BiDi commands, have a look at
[bidi-commands.js](https://github.com/appium/appium/blob/master/packages/base-driver/lib/protocol/bidi-commands.js)
[bidi-commands.ts](https://github.com/appium/appium/blob/master/packages/base-driver/lib/protocol/bidi-commands.ts)
You are not limited to BiDi commands that are defined in the official BiDi specification. If you
wish to define new commands, you may do so; you just need to tell Appium about them! See
@@ -522,14 +530,13 @@ route, then the route will not be proxied and instead will be handled by your dr
example, we are avoiding proxying all `POST` routes that have the `appium` prefix.
Next, we have to set up the proxying itself. The way to do this is to use a special class from
Appium called `JWProxy`. (The name means "JSON Wire Proxy" and is related to a legacy
implementation of the protocol). You'll want to create a `JWProxy` object using the details required to
connect to the remote server:
Appium called `WebDriverProxy`. You'll want to create a `WebDriverProxy` object using the details
required to connect to the remote server:
```js
// import {JWProxy} from 'appium/driver';
// import {WebDriverProxy} from 'appium/driver';
const proxy = new JWProxy({
const proxy = new WebDriverProxy({
server: 'remote.server',
port: 1234,
base: '/',
@@ -541,8 +548,8 @@ this.proxyCommand = proxy.command.bind(proxy);
Here we are creating a proxy object and assigning some of its methods to `this` under the names
`proxyReqRes` and `proxyCommand`. This is required for Appium to use the proxy, so don't forget
this step! The `JWProxy` has a variety of other options which you can check out in the source code,
as well. (TODO: publish options as API docs and link here).
this step! The `WebDriverProxy` has a variety of other options which you can check out in the
source code as well.
Finally, we need a way to tell Appium when the proxy is active. For your driver it might always
be active, or it might only be active when in a certain context. You can define the logic as an
@@ -799,6 +806,14 @@ that multiple simultaneous sessions don't use the same resources:
3. Have each driver express what resources it is using, then examine currently-used resources from
other drivers when a new session begins.
!!! warning "Deprecated"
```
The `driverData`-based mechanism described below is deprecated. Prefer
[IPC](#send-messages-to-plugins-running-on-the-same-session) for coordinating resources across
concurrently-running sessions instead.
```
To support this third strategy, you can implement `get driverData` in your driver to return what
sorts of resources your driver is currently using, for example:
@@ -810,7 +825,7 @@ get driverData() {
Now, when a new session is started on your driver, the `driverData` response from any other
simultaneously running drivers (of the same type) will also be included, as the last parameter of
the `createSession` method:
the deprecated, multi-argument form of the `createSession` method:
```js
async createSession(jwpCaps, reqCaps, w3cCaps, driverData)
@@ -482,10 +482,10 @@ capability.
You probably don't normally need to update the Appium server object (which is an
[Express](https://expressjs.com/) server having already been
[configured](https://github.com/appium/appium/blob/master/packages/base-driver/lib/express/server.js)
in a variety of ways). But, for example, you could add new Express middleware to the server to
support your plugin's requirements. To update the server you must implement the `static async
updateServer` method in your class. This method takes three parameters:
[configured](https://github.com/appium/appium/blob/master/packages/base-driver/lib/express/server.ts)
in a variety of ways). But, for example, you could add new routes to the server to support your
plugin's requirements. To update the server you must implement the `static async updateServer`
method in your class. This method takes three parameters:
- `expressApp`: the Express app object
- `httpServer`: the Node HTTP server object
@@ -498,6 +498,25 @@ results you'll need to test! Warning: this should be considered an advanced feat
knowledge of Express, as well as the care not to do anything that could affect the operation of
other parts of the Appium server!
`updateServer` runs _after_ Appium's own routes are registered, so `expressApp.use(...)` here
won't see requests to paths Appium already owns — Express matches middleware and routes in
registration order. For middleware that must see requests to those routes too (e.g. logging or
auth), use `httpServer.frontRouter` instead: Appium mounts this
[Router](https://expressjs.com/en/5x/api/router/) before any route is registered, so anything
attached to it — even from inside `updateServer` — still runs ahead of route matching. Note this
is still _after_ Appium's own baseline middleware (CORS, WebSocket upgrade handling, body
parsing, etc.), so it won't see requests Appium itself has already rejected, e.g. a CORS
preflight failure or a body that failed to parse:
```js
static async updateServer(expressApp, httpServer, cliArgs) {
httpServer.frontRouter.use((req, res, next) => {
console.log(`Incoming request: ${req.method} ${req.url}`);
next();
});
}
```
### Handle unexpected session shutdown
When developing a plugin you may want to add some cleanup logic for when a session ends. You would
@@ -65,7 +65,7 @@ functionality (e.g., the `plugin` or `driver` subcommands).
Note that this file is the _base_ schema; this will become painfully relevant.
```
This file is is _not_ a JSON file, because a) JSON is painful to work with for humans, b) is
This file is _not_ a JSON file, because a) JSON is painful to work with for humans, b) is
especially reviled by @jlipps, and c) `ajv` accepts objects, not JSON files.
It is more straightforward to explain how config files are validated, so we'll start there.
+24 -14
View File
@@ -17,34 +17,34 @@ If you maintain an Appium driver that you would like to be listed here, feel fre
These drivers are currently maintained by the Appium team:
### [Chromium](https://github.com/appium/appium-chromium-driver)
### [Chromium](https://appium.github.io/appium-chromium-driver/)
- Target: Desktop and mobile Chromium browsers (Chrome, Microsoft Edge, etc.)
- Target: Desktop Chromium-based browsers (Chrome, Microsoft Edge, etc.)
- Mode: Web
```sh title="Install This Driver"
appium driver install chromium
```
### [Espresso](https://github.com/appium/appium-espresso-driver)
### [Espresso](https://appium.github.io/appium-espresso-driver/)
- Target: Android applications
- Mode: Native
- Target: Android applications (mobile, TV, Wear, XR, Automotive)
- Mode: Native, Hybrid, Web
```sh title="Install This Driver"
appium driver install espresso
```
### [Gecko](https://github.com/appium/appium-geckodriver)
### [Gecko](https://appium.github.io/appium-geckodriver/)
- Target: Desktop and mobile Gecko browsers (Firefox)
- Target: Desktop and mobile Gecko-based browsers (Firefox, etc.)
- Mode: Web
```sh title="Install This Driver"
appium driver install gecko
```
### [Mac2](https://github.com/appium/appium-mac2-driver)
### [Mac2](https://appium.github.io/appium-mac2-driver/)
- Target: macOS applications
- Mode: Native
@@ -53,7 +53,7 @@ appium driver install gecko
appium driver install mac2
```
### [Safari](https://github.com/appium/appium-safari-driver)
### [Safari](https://appium.github.io/appium-safari-driver/)
- Target: Desktop and mobile Safari browsers
- Mode: Web
@@ -62,9 +62,9 @@ appium driver install mac2
appium driver install safari
```
### [UiAutomator2](https://github.com/appium/appium-uiautomator2-driver)
### [UiAutomator2](https://appium.github.io/appium-uiautomator2-driver/)
- Target: Android, Android TV, Android Wear applications
- Target: Android applications (mobile, TV, Wear, XR, Automotive)
- Modes: Native, Hybrid, Web
```sh title="Install This Driver"
@@ -89,7 +89,7 @@ appium driver install windows
### [XCUITest](https://appium.github.io/appium-xcuitest-driver/)
- Target: iOS, iPadOS, tvOS applications
- Target: iOS, iPadOS, tvOS, watchOS applications
- Modes: Native, Hybrid, Web
```sh title="Install This Driver"
@@ -130,7 +130,7 @@ appium driver install --source=npm appium-flutter-integration-driver
appium driver install --source=npm appium-lg-webos-driver
```
### [Linux](https://github.com/fantonglang/appium-linux-driver)
### [Linux (@fantonglang)](https://github.com/fantonglang/appium-linux-driver)
!!! warning
@@ -149,6 +149,16 @@ yarn install
node ./
```
### [Linux (@Itsmeaj)](https://github.com/Itsmeaj/appium)
- Target: Linux desktop applications on X11 and Wayland
- Mode: Native
- Supported by: `@Itsmeaj`
```sh title="Install This Driver"
appium driver install --source=npm @itsmeaj/appium-linux-driver
```
### [NovaWindows](https://github.com/AutomateThePlanet/appium-novawindows-driver)
!!! info
@@ -159,7 +169,7 @@ This driver is recommended as a drop-in replacement for the partially unmaintain
```
- Target: Windows applications
- Mode: Native
- Mode: Native, Hybrid
- Supported by: Community / Automate The Planet
```sh title="Install This Driver"
+1 -1
View File
@@ -14,7 +14,7 @@ If you maintain an Appium plugin that you would like to be listed here, feel fre
## Official Plugins
These plugins are are currently maintained by the Appium team:
These plugins are currently maintained by the Appium team:
### [Execute Driver](https://github.com/appium/appium/tree/master/packages/execute-driver-plugin)
@@ -113,3 +113,30 @@ Supported by: `@AppiumTestDistribution`
```sh title="Install This Tool"
npm install -g appium-installer
```
### [Optics](https://github.com/mozarkai/optics-framework)
Optics is an open-source test automation framework that uses Appium to drive Android, iOS,
Android TV, Samsung Tizen and LG webOS apps (and Selenium or Playwright for web). Tests are written
as CSV or YAML keyword steps, and the same keywords are available as a Python library, a Robot
Framework library, an HTTP API and an MCP server. Element lookup falls back from XPath to visible
text, OCR and image matching.
Supported by: `@chinmayajha`
```sh title="Install This Tool"
pip install "optics-framework[mobile]"
```
### [XPath to Class Chain](https://github.com/domovou69/xpath-to-class-chain)
XPath to Class Chain is a command-line tool for migrating iOS XPath locators in test code to
`-ios class chain` selectors. It converts the XPaths that have an exact class chain equivalent,
converts with a warning those that only have a close one (such as grouped positions `(//X)[n]`),
and skips the rest with a reason (for example, sibling or parent axes).
Supported by: `@domovou69`
```sh title="Install This Tool"
npm install -g xpath-to-class-chain
```
@@ -52,6 +52,6 @@ After the PR is merged there is no need to use the local plugin/driver deploymen
to switch back to the package managed by NPM. Follow the next steps for that:
- Unlink the installed driver/plugin from the server by running `appium driver uninstall <driver_name>` or
`appium plugin uninstall <driver_name>`.
`appium plugin uninstall <plugin_name>`.
- Delete the local source folder (`rm -rf <full_path_to_plugin_or_driver_folder_with_fetched_sources>`).
- Install the driver or the plugin from NPM. Check the component README in order to find a proper command for that.
+2 -2
View File
@@ -8,14 +8,14 @@ principles, so you could create more performant and efficient test suite executi
## Why Caching Is Necessary
Mobile application bundles could reach hundreds of megabytes is size. This could become a serious
Mobile application bundles could reach hundreds of megabytes in size. This could become a serious
performance issue if a test suite is executed, and it is necessary to fetch/extract the same application
bundle for each test.
## What Is Cached
Caching could be applied to application bundles generated by
[`configureApp`](https://github.com/appium/appium/blob/master/packages/base-driver/lib/basedriver/helpers.js#L107) helper call.
[`configureApp`](https://github.com/appium/appium/blob/master/packages/base-driver/lib/basedriver/helpers.ts#L99) helper call.
Inherited drivers can customize their caching logic by providing own `onPostProcess`
(or both `inDownload` and `onPostProcess`) property definition, but the general
rule of thumb is that we need to cache locally all application bundles need to be downloaded and/or extracted
+2 -2
View File
@@ -24,7 +24,7 @@ to launch. In order to achieve this, Appium defines its own [extension capabilit
## 一般的なAppiumのCapabilities
According to the WebDriver spec, extension capabilities must include a namespace prefix (signifying
the vendor introducing the capability), and the namespace must end a colon (`:`). Appium's vendor
the vendor introducing the capability), and the namespace must end in a colon (`:`). Appium's vendor
prefix is `appium:`, and so any Appium-specific capabilities must include this prefix. Depending on
your Appium client, 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.
@@ -78,7 +78,7 @@ BiDi commands, so make sure to reference their documentation.
## `appium:options` を使用して機能をグループ化する
テストで `appium:` 機能を多用すると、繰り返しが多くなる可能性があります。 代わりに、すべての機能を単一の `appium:options` 機能のオブジェクト値として組み合わせることもできます。その場合、オブジェクト内の機能にプレフィックスを使用する必要はありません。 例:
テストで `appium:` 機能を多用すると、繰り返しが多くなる可能性があります。代わりに、すべての機能を単一の `appium:options` 機能のオブジェクト値として組み合わせることもできます。その場合、オブジェクト内の機能にプレフィックスを使用する必要はありません。例:
```json
{
+2 -2
View File
@@ -36,7 +36,7 @@ discovered and loaded by Appium:
- `appium.config.cjs`
- `.appiumrc` (which is considered to be JSON)
Further, _if your project uses Node.js,_ you can use store the configuration inside an `appium`
Further, _if your project uses Node.js,_ you can store the configuration inside an `appiumConfig`
property in your `package.json` and it will be automatically discovered.
### Config File Search
@@ -98,5 +98,5 @@ The above configuration corresponds to the `--driver-xcuitest-webkit-debug-proxy
```
All properties are case-sensitive and will be in
[kebab-case](https://en.wikipedia.org/wiki/Naming_convention_\(programming\)#Delimiter-separated_words).
[kebab-case](https://en.wikipedia.org/wiki/Naming_convention_(programming)#Delimiter-separated_words).
For example, `callback-port` is allowed, but `callbackPort` is not.
+11 -10
View File
@@ -6,18 +6,17 @@ title: Retrieving Event Timings
---
Appium comes with the ability to retrieve timing information about startup
information and command length. This is an advanced feature that is controlled
by the use of the `appium:eventTimings` capability (set it to `true` to log event
timings).
information and command length. This is an advanced feature; the server records
event timings for every session.
With this capability turned on, the `POST /session/:id/appium/events` response (i.e.,
the response to `driver.logs.events` or similar, depending on client) will be
decorated with an `events` property. This is the structure of that `events`
property:
The timings can be retrieved at any point during a session via the
`POST /session/:id/appium/events` endpoint (i.e., the response to
`driver.logs.events` or similar, depending on client). The response body is the
event history object itself. This is its structure:
```
{
"<event_type>": [<occurence_timestamp_1>, ...],
"<event_type>": [<occurrence_timestamp_1>, ...],
"commands": [
{
"cmd": "<command_name>",
@@ -29,7 +28,7 @@ property:
}
```
In other words, the `events` property has 2 kinds of properties of its own:
In other words, the event history object has 2 kinds of properties of its own:
- Properties which are the names of event types
- The `commands` property
@@ -64,7 +63,9 @@ generate various kinds of reports from event timings output:
!!! note
```
In the past, events were available as a part of `GET /session/:id` response
In the past, when the `appium:eventTimings` capability was set to `true`, the event history
was also returned as an `events` property of the (now deprecated) `GET /session/:id`
response
```
## Add a custom event
@@ -10,13 +10,13 @@ defined by the W3C WebDriver spec, Appium needs a way for these "extended" comma
by client libraries. There are two main strategies for this:
1. Appium drivers define new W3C-compatible API routes, and Appium clients are updated to include
support for those new routes.
support for those new routes.
2. Appium drivers define so-called "Execute Methods" which provide new functionality by
overloading the existing `Execute Script` command which is already available in any WebDriver-
based client library (including all Selenium and Appium clients).
overloading the existing `Execute Script` command which is already available in any WebDriver-
based client library (including all Selenium and Appium clients).
There are pros and cons for each strategy, but it is ultimately up to the extension author to
decide how they wish implement new commands.
decide how they wish to implement new commands.
This guide is designed to specifically help you understand the "Execute Method" strategy. This
pattern is commonly used in official Appium drivers and other third-party extensions.
@@ -134,9 +134,9 @@ Javascript execution:
1. The script string is just a command name; it will be provided by the driver documentation
2. The standard way to provide parameters is as a _single_ object with keys representing parameter
names and values representing parameter values. So in this case, we had to specify both the
parameter name (`bundleId`) as the key of the parameters object, and the parameter value
(`com.my.app`) as the value for that key. A driver can define parameters as _required_ or _optional_.
names and values representing parameter values. So in this case, we had to specify both the
parameter name (`bundleId`) as the key of the parameters object, and the parameter value
(`com.my.app`) as the value for that key. A driver can define parameters as _required_ or _optional_.
Of course, always refer to the documentation for the particular Execute Method in case the author
has made any alterations to the standard access method.
+1 -1
View File
@@ -137,7 +137,7 @@ all parameters and descriptions see
Once you start the Appium server it will register with the grid, and you will see your device on
the grid console page:
`http://**\<grid-ip-adress\>**:**\<grid-port\>**/grid/console`
`http://**\<grid-ip-address\>**:**\<grid-port\>**/grid/console`
### Example Grid Node Configuration JSON
@@ -18,8 +18,11 @@ Each rule is an object with a set of predefined properties. The following rule p
supported:
- `pattern`: A valid Javascript RegExp pattern to replace. Must be a valid non-empty pattern.
- `text`: A simple non-empty exact text match to replace. Either this property or the above one must
be provided. `pattern` has priority over `text` if both are provided.
- `text`: A simple non-empty exact text to replace. Either this property or the above one must
be provided. `pattern` has priority over `text` if both are provided. Note that the text is
matched as a whole word: special characters are escaped and word boundaries (`\b`) are added on
the sides where the value begins or ends with a word character. For example, a rule with text
`pass` replaces `pass` in `my pass here`, but does not match inside `password`.
- `flags`: Regular expression flags for the given pattern. Supported flags are the same as for the
standard JavaScript [RegExp constructor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Advanced_searching_with_flags_2).
Note that the `g` (global matching) flag is always enabled.
@@ -27,7 +27,7 @@ appium driver install xcuitest
```
This command will install the latest version of the
[XCUITest Driver](https://github.com/appium/appium-xcuitest-driver). The Extension CLI comes with a variety
[XCUITest Driver](https://appium.github.io/appium-xcuitest-driver/). The Extension CLI comes with a variety
of commands and parameters; see the documentation for that command for all the specifics.
The all-important question when Appium is managing your extensions for you is: where are they installed?
@@ -65,7 +65,7 @@ like any other dependency. Basically, whenever you run Appium, if you have not e
1. Try to determine whether the _current directory_ is inside an `npm` package.
2. If so, it will check whether `appium` is a dependency (dev, prod, or peer) in the project's
`package.json`
3. If so, _unless you have specified `APPIUM_HOME` in your environment_, Appium will ignore load
3. If so, _unless you have specified `APPIUM_HOME` in your environment_, Appium will load
drivers and plugins defined in that `package.json` file instead.
This means you are freely able to add Appium drivers and plugins as regular package dependencies or

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