Compare commits

...
Author SHA1 Message Date
Jonathan Lipps c00cbfa1fb chore: publish
- appium@3.1.0
 - @appium/base-driver@10.1.0
 - @appium/base-plugin@3.0.3
 - @appium/docutils@2.1.1
 - @appium/driver-test-support@1.0.3
 - @appium/eslint-config-appium-ts@2.0.3
 - @appium/execute-driver-plugin@5.0.2
 - @appium/fake-driver@6.0.1
 - @appium/fake-plugin@4.0.3
 - @appium/images-plugin@4.0.2
 - @appium/logger@2.0.2
 - @appium/opencv@4.0.2
 - @appium/plugin-test-support@1.0.2
 - @appium/relaxed-caps-plugin@2.0.1
 - @appium/storage-plugin@1.0.2
 - @appium/support@7.0.2
 - @appium/test-support@4.0.2
 - @appium/types@1.1.0
 - @appium/universal-xml-plugin@2.0.1
2025-10-08 14:02:07 -07:00
renovate[bot] 3d57d047f3 chore(support): update dependency semver to v7.7.3 (#21645)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-08 10:43:30 +00:00
github-actions[bot]andmykola-mokhnach 27d7d9c29a docs(appium): Update documentation translations (#21644)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2025-10-08 00:21:35 -07:00
Edgars Eglītis e6635b737d fix(base-driver,relaxed-caps-plugin,types): add missing W3C caps (#21642)
* fix(base-driver,relaxed-caps-plugin,types): add missing W3C standard caps

* docs: add links to webdriver caps
2025-10-07 19:35:54 +03:00
renovate[bot] cb9b3736ac chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.46.0 (#21640)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-07 09:35:05 +00:00
Edgars Eglītis e8835c80fd chore(deps): remove @types/uuid (#21641) 2025-10-07 09:30:52 +03:00
Edgars Eglītis cb386cef85 chore(deps): remove vulnerable axios versions from lockfile (#21639) 2025-10-07 09:12:40 +03:00
Edgars Eglītis 7ccb6c2aec chore(appium): update dependency winston to v3.18.3 (#21638) 2025-10-07 09:06:17 +03:00
renovate[bot] efbdc34689 chore(universal-xml-plugin): update dependency fast-xml-parser to v5.3.0 (#21633)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-05 13:41:06 +00:00
renovate[bot] 0919cad18d chore(eslint-config-appium-ts): update eslint-related packages to v9.37.0 (#21632)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-04 08:43:54 +00:00
renovate[bot] 0049513230 chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.45.0 (#21629)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-03 16:52:16 +00:00
renovate[bot] 9ce33f70c6 chore(deps): update dependency cross-env to v10.1.0 (#21628)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-03 12:26:16 +00:00
renovate[bot] debf2ef757 chore(docutils): update dependency mkdocs-material to v9.6.21 (#21627)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-02 18:35:49 +00:00
renovate[bot] 012525cd18 chore(deps): update dependency typescript to v5.9.3 (#21626)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-02 13:12:46 +00:00
renovate[bot] 6f9effcd5a chore(deps): update dependency mocha to v11.7.4 (#21623)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-02 04:49:49 +00:00
github-actions[bot]andmykola-mokhnach 60aaf8019c docs(appium): Update documentation translations (#21625)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2025-10-01 18:41:44 -07:00
renovate[bot] f1bfcb3002 chore(deps): update dependency @types/node to v22.18.8 (#21622)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-01 21:01:34 +00:00
dependabot[bot] b836010d06 chore(deps): bump tar-fs in the npm_and_yarn group across 1 directory (#21608)
Bumps the npm_and_yarn group with 1 update in the / directory: [tar-fs](https://github.com/mafintosh/tar-fs).


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

---
updated-dependencies:
- dependency-name: tar-fs
  dependency-version: 3.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>
2025-10-01 12:47:39 +03:00
github-actions[bot]andmykola-mokhnach 5568749990 docs(appium): Update documentation translations (#21621)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2025-10-01 12:46:15 +03:00
renovate[bot]andKazuaki Matsuo dd01c57da6 chore(deps): update dependency lerna to v9 (#21603)
* chore(deps): update dependency lerna to v9

* run lerna repair

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Kazuaki Matsuo <fly.49.89.over@gmail.com>
2025-09-30 19:14:52 -07:00
renovate[bot] 3096f47fd0 chore(deps): update dependency @types/node to v22.18.7 (#21618)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-30 12:28:36 +00:00
github-actions[bot]andmykola-mokhnach 938b1088b2 docs(appium): Update documentation translations (#21617)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2025-09-29 21:42:42 -07:00
renovate[bot] 1c7e36c297 chore(execute-driver-plugin): update dependency webdriverio to v9.20.0 (#21615)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-28 12:30:25 +00:00
renovate[bot] 5f45defd7a chore(driver-test-support): update dependency chai to v6.2.0 (#21614)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-28 09:27:23 +00:00
Kazuaki Matsuo dad07575c9 fix(appium): fix base path handling in bidi (#21611)
* fix bidi with base path

* run test with custom base path
2025-09-27 00:04:32 -07:00
renovate[bot] c403768a41 chore(storage-plugin): update dependency lru-cache to v11.2.2 (#21606)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-24 14:14:17 +02:00
renovate[bot] 3a9739365b chore(eslint-config-appium-ts): update eslint-related packages (#21602)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-23 10:12:28 +00:00
renovate[bot] 280e2ec792 chore(eslint-config-appium-ts): update eslint-related packages to v9.36.0 (#21601)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-20 08:09:13 +02:00
renovate[bot] 2f069ae351 chore(types): update dependency type-fest to v5.0.1 (#21600)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-19 13:31:35 +00:00
renovate[bot] 4ef43e8348 chore(deps): update dependency @types/uuid to v11 (#21599)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-18 16:04:09 +02:00
renovate[bot]andMykola Mokhnach 3624635393 chore(types): update dependency type-fest to v5 (#21587)
* chore(types): update dependency type-fest to v5

* update types

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Mykola Mokhnach <mokhnach@gmail.com>
2025-09-18 08:44:17 +02:00
renovate[bot] 560ddce517 chore(eslint-config-appium-ts): update dependency typescript-eslint to v8.44.0 (#21598)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-18 08:21:24 +02:00
renovate[bot] f0b2cbfaf2 chore(support): update dependency sharp to v0.34.4 (#21597)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-18 08:21:11 +02:00
renovate[bot] dd96fc9e5b chore(docutils): update dependency mkdocs-material to v9.6.20 (#21596)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-18 06:08:37 +00:00
renovate[bot] 218bbaeea4 chore(deps): update dependency @types/node to v22.18.6 (#21595)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-18 08:05:46 +02:00
renovate[bot] bfe008671f chore(deps): update dependency lerna to v8.2.4 (#21593)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-17 17:40:03 +00:00
renovate[bot] 0f40a20517 chore(deps): update dependency @types/node to v22.18.5 (#21592)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-17 13:11:48 +00:00
🚀 Erdinç Yılmaz 24bd9eeb1f chore(appium,fake-driver,support): updates tests and docstring (#21541)
* fix: remove trailing comma in tsconfig.json

* docs: enhance JSDoc documentation and clean up outdated TODO comments

* chore: tweak the type

* chore: keep the version comparison
2025-09-16 21:22:37 -07:00
renovate[bot] 1c3891b3d6 chore(support): update dependency axios to v1.12.2 (#21588)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-15 19:46:29 +00:00
renovate[bot] 1cc1619c79 chore(deps): update dependency @types/node to v22.18.3 (#21586)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-14 14:00:33 +00:00
Noritaka Kobayashi 9f8b55e7ab chore: fix typos (#21585) 2025-09-13 17:14:42 -07:00
renovate[bot] 34665dbe77 chore(support): update dependency axios to v1.12.1 (#21580)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-13 15:55:01 +03:00
github-actions[bot]andmykola-mokhnach 1fc22d25f9 docs(appium): Update documentation translations (#21583)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2025-09-12 21:50:10 -07:00
Edgars Eglītis 7f906fcf9a feat: add 21 WebDriver extension endpoints (#21577)
* chore: add reference links to extensions

* feat: add permissions and reporting API endpoints

* feat: add device posture API endpoints

* feat: add generic sensor API endpoints

* docs: fix protocol order

* feat: add custom handlers API endpoint

* feat: add SPC API endpoint

* feat: add compute pressure API endpoints

* feat: add FedCM API endpoints

* chore: formatting & test hash fix

* docs: add protocol-enabling capabilities where possible

* docs: adjust wording + fix anchors

* docs: fix FedCM HTTP methods
2025-09-12 08:40:10 +03:00
github-actions[bot]andmykola-mokhnach c1ef362a89 docs(appium): Update documentation translations (#21579)
Co-authored-by: mykola-mokhnach <7767781+mykola-mokhnach@users.noreply.github.com>
2025-09-11 19:08:57 -07:00
Edgars Eglītis 1753dcd5e9 feat: add inspector to plugins installed via appium setup (#21578) 2025-09-11 18:54:37 +03:00
Edgars Eglītis cbea4f2e97 feat: add W3C printPage endpoint (#21576) 2025-09-11 08:49:07 +03:00
Edgars Eglītis e2d076c5dc chore: reorder routes.js to match docs (#21568) 2025-09-10 20:21:46 +03:00
113 changed files with 8874 additions and 4005 deletions
+2
View File
@@ -11,3 +11,5 @@ package.json
# generated
packages/types/lib/appium-config.ts
**/*.hbs
/.nx/workspace-data
+6021 -3151
View File
File diff suppressed because it is too large Load Diff
+10 -11
View File
@@ -85,7 +85,7 @@
},
"devDependencies": {
"@colors/colors": "1.6.0",
"@eslint/js": "9.35.0",
"@eslint/js": "9.37.0",
"@tsconfig/node20": "20.1.6",
"@types/argparse": "2.0.17",
"@types/archiver": "6.0.3",
@@ -104,7 +104,7 @@
"@types/mocha": "10.0.10",
"@types/mv": "2.1.4",
"@types/ncp": "2.0.8",
"@types/node": "22.18.1",
"@types/node": "22.18.8",
"@types/pluralize": "0.0.33",
"@types/semver": "7.7.1",
"@types/serve-favicon": "2.5.7",
@@ -114,19 +114,18 @@
"@types/source-map-support": "0.5.10",
"@types/supports-color": "8.1.3",
"@types/teen_process": "2.0.4",
"@types/uuid": "10.0.0",
"@types/which": "3.0.4",
"@types/wrap-ansi": "3.0.0",
"@types/ws": "8.18.1",
"@types/xmldom": "0.1.34",
"@types/yargs": "17.0.33",
"asyncbox": "3.0.0",
"chai": "6.0.1",
"chai": "6.2.0",
"chai-as-promised": "8.0.2",
"conventional-changelog-conventionalcommits": "7.0.2",
"cpy-cli": "6.0.0",
"cross-env": "10.0.0",
"eslint": "9.35.0",
"cross-env": "10.1.0",
"eslint": "9.37.0",
"eslint-config-prettier": "10.1.8",
"eslint-import-resolver-typescript": "4.4.4",
"eslint-plugin-import": "2.32.0",
@@ -135,12 +134,12 @@
"finalhandler": "2.1.0",
"get-port": "5.1.1",
"json-schema-to-typescript": "15.0.4",
"lerna": "8.2.3",
"lerna": "9.0.0",
"log-symbols": "4.1.0",
"midnight-smoker": "8.0.0",
"mjpeg-consumer": "2.0.0",
"mjpeg-server": "0.3.1",
"mocha": "11.7.2",
"mocha": "11.7.4",
"npm-run-all2": "8.0.4",
"prettier": "3.6.2",
"rewiremock": "3.14.6",
@@ -151,9 +150,9 @@
"teen_process": "3.0.1",
"ts-node": "10.9.2",
"tsd": "0.33.0",
"typescript": "5.9.2",
"typescript-eslint": "8.43.0",
"webdriverio": "9.19.2",
"typescript": "5.9.3",
"typescript-eslint": "8.46.0",
"webdriverio": "9.20.0",
"ws": "8.18.3",
"yaml-js": "0.3.1"
},
+16
View File
@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.1.0](https://github.com/appium/appium/compare/appium@3.0.2...appium@3.1.0) (2025-10-08)
### Features
* add 21 WebDriver extension endpoints ([#21577](https://github.com/appium/appium/issues/21577)) ([7f906fc](https://github.com/appium/appium/commit/7f906fcf9a0dd84f348b0b3a79da818281f21835))
* add inspector to plugins installed via `appium setup` ([#21578](https://github.com/appium/appium/issues/21578)) ([1753dcd](https://github.com/appium/appium/commit/1753dcd5e9f4ee3a9bd869f2e846a8a1c68b6970))
* add W3C printPage endpoint ([#21576](https://github.com/appium/appium/issues/21576)) ([cbea4f2](https://github.com/appium/appium/commit/cbea4f2e97d2d291bd67fd98359b37caab1b21fa))
### Bug Fixes
* **appium:** fix base path handling in bidi ([#21611](https://github.com/appium/appium/issues/21611)) ([dad0757](https://github.com/appium/appium/commit/dad07575c9d754751160a53e0fb8053bbddac75b))
## [3.0.2](https://github.com/appium/appium/compare/appium@3.0.1...appium@3.0.2) (2025-09-09)
@@ -7,8 +7,8 @@ title: Appium Protocol
}
</style>
The following is a list of endpoints used in Appium that are defined in the Appium extension of the
W3C WebDriver protocol.
The following is a list of endpoints supported in Appium, that are defined in the Appium extension
of the W3C WebDriver protocol.
### getAppiumSessions
@@ -8,7 +8,7 @@ title: JSON Wire Protocol
</style>
The following is a list of legacy [JSON Wire Protocol (JSONWP)](https://www.selenium.dev/documentation/legacy/json_wire_protocol/)
endpoints used in Appium.
endpoints supported in Appium.
### getSession
@@ -8,7 +8,7 @@ title: Mobile JSON Wire Protocol
</style>
The following is a list of legacy [Mobile JSON Wire Protocol (MJSONWP)](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md)
endpoints used in Appium.
endpoints supported in Appium.
### getRotation
+439 -2
View File
@@ -7,7 +7,7 @@ title: Other Protocols
}
</style>
The following is a list of endpoints used in Appium that are defined in other protocols.
The following is a list of endpoints supported in Appium that are defined in other protocols.
## Chromedriver Protocol
@@ -40,6 +40,441 @@ for a list of available methods and their parameters.
`any` - the result of executing the CDP method
## Compute Pressure Protocol
The [Compute Pressure protocol](https://www.w3.org/TR/compute-pressure/) is an extension of the W3C
WebDriver protocol.
### createVirtualPressureSource
```
POST /session/:sessionId/pressuresource
```
> Compute Pressure documentation: [Create Virtual Pressure Source](https://www.w3.org/TR/compute-pressure/#create-virtual-pressure-source)
Creates a new virtual pressure source.
#### Parameters
|<div style="width:6em">Name</div>|Description|Type|Default|
|--|--|--|--|
|`type`|Type of pressure source to create|string||
|`supported?`|Whether the pressure source should be configured as supported|boolean|`true`|
#### Response
`null`
### updateVirtualPressureSource
```
POST /session/:sessionId/pressuresource/:pressureSourceType
```
> Compute Pressure documentation: [Update Virtual Pressure Source](https://www.w3.org/TR/compute-pressure/#update-virtual-pressure-source)
Updates the state of a virtual pressure source with the type identified by `:pressureSourceType`.
#### Parameters
|Name|Description|Type|
|--|--|--|
|`sample`|Pressure state. Supported values are `nominal`, `fair`, `serious`, or `critical`.|string|
#### Response
`null`
### deleteVirtualPressureSource
```
DELETE /session/:sessionId/pressuresource/:pressureSourceType
```
> Compute Pressure documentation: [Delete Virtual Pressure Source](https://www.w3.org/TR/compute-pressure/#delete-virtual-pressure-source)
Deletes the virtual pressure source with the type identified by `:pressureSourceType`.
#### Response
`null`
## Custom Handlers Protocol
The [Custom Handlers protocol](https://html.spec.whatwg.org/multipage/system-state.html#user-agent-automation)
is an extension of the W3C WebDriver protocol, defined by the HTML Standard specification.
### setRPHRegistrationMode
```
POST /session/:sessionId/custom-handlers/set-mode
```
> Custom Handlers documentation: [Set RPH Registration Mode](https://html.spec.whatwg.org/multipage/system-state.html#user-agent-automation)
Sets the protocol handler automation mode, for processing registrations of custom protocol handlers.
By default, this mode is set to `none`.
#### Parameters
|Name|Description|Type|
|--|--|--|
|`mode`|Automation mode to set. Supported values are `autoAccept`, `autoReject`, or `none`.|string|
#### Response
`null`
## Device Posture Protocol
The [Device Posture protocol](https://www.w3.org/TR/device-posture/) is an extension of the W3C
WebDriver protocol.
### setDevicePosture
```
POST /session/:sessionId/deviceposture
```
> Device Posture documentation: [Set Device Posture](https://www.w3.org/TR/device-posture/#set-device-posture)
Sets the device posture, overriding the posture set by the device hardware.
#### Parameters
|Name|Description|Type|
|--|--|--|
|`posture`|Posture to which the device should be set. Supported values are `continuous` or `folded`.|string|
#### Response
`null`
### clearDevicePosture
```
DELETE /session/:sessionId/deviceposture
```
> Device Posture documentation: [Clear Device Posture](https://www.w3.org/TR/device-posture/#clear-device-posture)
Clears the previously set device posture, returning posture control back to the device hardware.
#### Response
`null`
## Federated Credential Management Protocol
The [Federated Credential Management protocol](https://www.w3.org/TR/fedcm-1) (FedCM) is an
extension of the W3C WebDriver protocol. Clients can enable this protocol by using the
[`fedcm:accounts`](https://www.w3.org/TR/fedcm-1/#webdriver-capability) capability.
### fedCMCancelDialog
```
POST /session/:sessionId/fedcm/canceldialog
```
> FedCM documentation: [Cancel Dialog](https://www.w3.org/TR/fedcm-1/#webdriver-canceldialog)
Cancels the currently open FedCM dialog.
#### Response
`null`
### fedCMSelectAccount
```
POST /session/:sessionId/fedcm/selectaccount
```
> FedCM documentation: [Select Account](https://www.w3.org/TR/fedcm-1/#webdriver-selectaccount)
Selects an account to use for the currently open FedCM dialog.
#### Parameters
|Name|Description|Type|
|--|--|--|
|`accountIndex`|Index of the account in the list of available accounts|number|
#### Response
`null`
### fedCMClickDialogButton
```
POST /session/:sessionId/fedcm/clickdialogbutton
```
> FedCM documentation: [Click Dialog Button](https://www.w3.org/TR/fedcm-1/#webdriver-clickdialogbutton)
Clicks a button in the currently open FedCM dialog.
#### Parameters
|Name|Description|Type|
|--|--|--|
|`dialogButton`|Identifier of the button to click. Must be set to `ConfirmIdpLoginContinue`.|string|
#### Response
`null`
### fedCMGetAccounts
```
GET /session/:sessionId/fedcm/accountlist
```
> FedCM documentation: [Account List](https://www.w3.org/TR/fedcm-1/#webdriver-accountlist)
Retrieves all accounts that the user can select in the currently open FedCM dialog.
#### Response
`FedCMAccount[]` - an array of objects, where each object includes the following properties:
|<div style="width:10em">Name</div>|Description|Type|
|--|--|--|
|`accountId`|Account ID|string|
|`email`|Account email|string|
|`name`|Account name|string|
|`givenName?`|Account given name|string|
|`pictureUrl?`|Account picture URL|string|
|`idpConfigUrl`|URL of the identity provider configuration file|string|
|`loginState`|Login state. Set to `SignUp` if the account is not connected, otherwise `SignIn`.|string|
|`termsOfServiceUrl?`|Terms of Service URL of the website, if `loginState` is set to `SignUp`|string|
|`privacyPolicyUrl?`|Privacy Policy URL of the website, if `loginState` is set to `SignUp`|string|
### fedCMGetTitle
```
GET /session/:sessionId/fedcm/gettitle
```
> FedCM documentation: [Get Title](https://www.w3.org/TR/fedcm-1/#webdriver-gettitle)
Retrieves the title and subtitle (if one exists) of the currently open FedCM dialog.
#### Response
`FedCMDialogTitle` - an object with the following properties:
|Name|Description|Type|
|--|--|--|
|`title`|Dialog title|string|
|`subtitle?`|Dialog subtitle|string|
### fedCMGetDialogType
```
GET /session/:sessionId/fedcm/getdialogtype
```
> FedCM documentation: [Get Dialog Type](https://www.w3.org/TR/fedcm-1/#webdriver-getdialogtype)
Retrieves the type of the currently open FedCM dialog.
#### Response
`string` - can be set to `AutoReauthn`, `AccountChooser`, or `ConfirmIdpLogin`
### fedCMSetDelayEnabled
```
POST /session/:sessionId/fedcm/setdelayenabled
```
> FedCM documentation: [Set Delay Enabled](https://www.w3.org/TR/fedcm-1/#webdriver-setdelayenabled)
Sets the state of the promise rejection delay, which is used to prevent information leakage about
the logged in state of the user.
#### Parameters
|Name|Description|Type|
|--|--|--|
|`enabled`|Whether to enable the promise rejection delay|boolean|
#### Response
`null`
### fedCMResetCooldown
```
POST /session/:sessionId/fedcm/resetcooldown
```
> FedCM documentation: [Reset Cooldown](https://www.w3.org/TR/fedcm-1/#webdriver-resetcooldown)
Resets the cooldown delay used after dismissing a FedCM dialog.
#### Response
`null`
## Generic Sensor Protocol
The [Generic Sensor protocol](https://www.w3.org/TR/generic-sensor/) is an extension of the W3C
WebDriver protocol.
### createVirtualSensor
```
POST /session/:sessionId/sensor
```
> Generic Sensor documentation: [Create Virtual Sensor](https://www.w3.org/TR/generic-sensor/#create-virtual-sensor-command)
Creates a new virtual sensor.
#### Parameters
|<div style="width:12em">Name</div>|Description|Type|Default|
|--|--|--|--|
|`type`|Type of sensor to create|string||
|`connected?`|Whether the sensor should be configured as connected|boolean|`true`|
|`maxSamplingFrequency?`|Maximum sensor sampling frequency|number||
|`minSamplingFrequency?`|Minimum sensor sampling frequency|number||
#### Response
`null`
### getVirtualSensorInfo
```
GET /session/:sessionId/sensor/:sensorType
```
> Generic Sensor documentation: [Get Virtual Sensor Information](https://www.w3.org/TR/generic-sensor/#get-virtual-sensor-information-command)
Retrieves information about the virtual sensor with the type identified by `:sensorType`.
#### Response
`GetVirtualSensorInfoResponse` - an object containing the `requestedSamplingFrequency` key, whose
value is the requested sampling frequency of the sensor type
### updateVirtualSensorReading
```
POST /session/:sessionId/sensor/:sensorType
```
> Generic Sensor documentation: [Update Virtual Sensor Reading](https://www.w3.org/TR/generic-sensor/#update-virtual-sensor-reading-command)
Updates the virtual sensor with the type identified by `:sensorType` with a new reading.
#### Parameters
|Name|Description|Type|
|--|--|--|
|`reading`|Object containing reading properties specific to the sensor type|object|
#### Response
`null`
### deleteVirtualSensor
```
DELETE /session/:sessionId/sensor/:sensorType
```
> Generic Sensor documentation: [Delete Virtual Sensor](https://www.w3.org/TR/generic-sensor/#delete-virtual-sensor-command)
Deletes the virtual sensor with the type identified by `:sensorType`.
#### Response
`null`
## Permissions Protocol
The [Permissions protocol](https://www.w3.org/TR/permissions/) is an extension of the W3C WebDriver
protocol.
### setPermissions
```
POST /session/:sessionId/permissions
```
> Permissions documentation: [Set Permission](https://www.w3.org/TR/permissions/#webdriver-command-set-permission)
Simulates user modification of the permission state of a PermissionDescriptor (a permissible feature
with optional additional properties).
#### Parameters
|<div style="width:6em">Name</div>|Description|Type|
|--|--|--|
|`descriptor`|Object specifying the feature name in its `name` key, along with any other keys for additional properties|object|
|`state`|New permission state for this descriptor. Supported values are: `granted`, `denied`, or `prompt`.|string|
#### Response
`null`
## Reporting Protocol
The [Reporting protocol](https://www.w3.org/TR/reporting-1/) is an extension of the W3C WebDriver
protocol.
### generateTestReport
```
POST /session/:sessionId/reporting/generate_test_report
```
> Reporting documentation: [Generate Test Report](https://www.w3.org/TR/reporting-1/#generate-test-report-command)
Simulates the generation of a test report, which can be retrieved by registered reporting observers.
#### Parameters
|Name|Description|Type|Default|
|--|--|--|--|
|`message`|Message displayed in the report|string||
|`group?`|Destination group to deliver the report to|string|`default`|
#### Response
`null`
## Secure Payment Confirmation Protocol
The [Secure Payment Confirmation protocol](https://www.w3.org/TR/secure-payment-confirmation) (SPC)
is an extension of the W3C WebDriver protocol.
### setSPCTransactionMode
```
POST /session/:sessionId/secure-payment-confirmation/set-mode
```
> SPC documentation: [Set SPC Transaction Mode](https://www.w3.org/TR/secure-payment-confirmation/#sctn-automation-set-spc-transaction-mode)
Sets the transaction automation mode, for automated handling of transaction confirmation prompts.
By default, this mode is set to `none`.
#### Parameters
|Name|Description|Type|
|--|--|--|
|`mode`|Automation mode to set. Supported values are `autoAccept`, `autoChooseToAuthAnotherWay`, `autoReject`, or `autoOptOut`.|string|
#### Response
`null`
## Selenium Protocol
The Selenium protocol is an extension of the W3C WebDriver protocol, supported in Appium clients
@@ -91,7 +526,9 @@ Retrieves the available log types that can be used to call the [`getLog`](#getlo
## Web Authentication Protocol
The [Web Authentication protocol](https://w3c.github.io/webauthn/) (WebAuthn) is an extension of
the W3C WebDriver protocol.
the W3C WebDriver protocol. Clients can enable this protocol by using the
[`webauthn:virtualAuthenticators`](https://w3c.github.io/webauthn/#sctn-automation-webdriver-capability)
capability.
### addVirtualAuthenticator
@@ -8,7 +8,7 @@ title: WebDriver Protocol
</style>
The following is a list of [W3C WebDriver protocol](https://w3c.github.io/webdriver/) endpoints
used in Appium.
supported in Appium.
!!! info
@@ -1070,3 +1070,45 @@ identified by `:elementId`.
#### Response
`string` - a base64-encoded PNG image
### printPage
```
POST /session/:sessionId/print
```
> WebDriver documentation: [Print Page](https://w3c.github.io/webdriver/#print-page)
Prints the page by rendering it as a paginated PDF document.
#### Parameters
|<div style="width:7em">Name</div>|Description|<div style="width:9em">Type</div>|Default|
|--|--|--|--|
|`orientation?`|Page orientation. Supported values are `portrait` or `landscape`.|string|`portrait`|
|`scale?`|Page scale. Supported values are in the range `[0.1, 2]`.|number|`1`|
|`background?`|Whether to include background images|boolean|`false`|
|`page?`|Object specifying the page width and height|[`PrintPageSize`](#printpagesize)|`{}`|
|`margin?`|Object specifying the page margins|[`PrintPageMargins`](#printpagemargins)|`{}`|
|`shrinkToFit?`|Whether to resize page contents to match `PrintPageSize.width`|boolean|`true`|
|`pageRanges?`|Array of pages to be printed, for example, `[1, 4, '8-9']`|array|`[]`|
##### `PrintPageSize`
|Name|Description|Type|Default|
|--|--|--|--|
|`width?`|Page width. Must be greater than or equal to `(2.54 / 72)`.|number|`21.59`|
|`height?`|Page height. Must be greater than or equal to `(2.54 / 72)`.|number|`27.94`|
##### `PrintPageMargins`
|Name|Description|Type|Default|
|--|--|--|--|
|`top?`|Page top margin. Must be greater than or equal to `0`.|number|`1`|
|`bottom?`|Page bottom margin. Must be greater than or equal to `0`.|number|`1`|
|`left?`|Page left margin. Must be greater than or equal to `0`.|number|`1`|
|`right?`|Page right margin. Must be greater than or equal to `0`.|number|`1`|
#### Response
`string` - a base64-encoded PDF document
@@ -20,7 +20,7 @@ mentioned below.
Installs the following extensions for browser webview testing:
* Drivers: `safari`[^1], `gecko`, `chromium`
* Plugins: `images`
* Plugins: `images`, `inspector`
#### Usage
@@ -33,7 +33,7 @@ appium setup browser
Installs the following extensions for desktop application testing:
* Drivers: `mac2`[^1], `windows`[^2]
* Plugins: `images`
* Plugins: `images`, `inspector`
#### Usage
@@ -46,7 +46,7 @@ appium setup desktop
Installs the following extensions for mobile testing:
* Drivers: `uiautomator2`, `xcuitest`[^1], `espresso`
* Plugins: `images`
* Plugins: `images`, `inspector`
#### Usage
@@ -8,8 +8,8 @@ title: Appium Protocol
}
</style>
The following is a list of endpoints used in Appium that are defined in the Appium extension of the
W3C WebDriver protocol.
The following is a list of endpoints supported in Appium, that are defined in the Appium extension
of the W3C WebDriver protocol.
### getAppiumSessions
@@ -9,7 +9,7 @@ title: JSON Wire Protocol
</style>
The following is a list of legacy [JSON Wire Protocol (JSONWP)](https://www.selenium.dev/documentation/legacy/json_wire_protocol/)
endpoints used in Appium.
endpoints supported in Appium.
### getSession
@@ -9,7 +9,7 @@ title: Mobile JSON Wire Protocol
</style>
The following is a list of legacy [Mobile JSON Wire Protocol (MJSONWP)](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md)
endpoints used in Appium.
endpoints supported in Appium.
### getRotation
+439 -2
View File
@@ -8,7 +8,7 @@ title: Other Protocols
}
</style>
The following is a list of endpoints used in Appium that are defined in other protocols.
The following is a list of endpoints supported in Appium that are defined in other protocols.
## Chromedriver Protocol
@@ -41,6 +41,441 @@ for a list of available methods and their parameters.
`any` - the result of executing the CDP method
## Compute Pressure Protocol
The [Compute Pressure protocol](https://www.w3.org/TR/compute-pressure/) is an extension of the W3C
WebDriver protocol.
### createVirtualPressureSource
```
POST /session/:sessionId/pressuresource
```
> Compute Pressure documentation: [Create Virtual Pressure Source](https://www.w3.org/TR/compute-pressure/#create-virtual-pressure-source)
Creates a new virtual pressure source.
#### Parameters
| <div style="width:6em">Name</div> | Description | Type | Default |
| --------------------------------- | ------------------------------------------------------------- | ------- | ------- |
| `type` | Type of pressure source to create | string | |
| `supported?` | Whether the pressure source should be configured as supported | boolean | `true` |
#### Response
`null`
### updateVirtualPressureSource
```
POST /session/:sessionId/pressuresource/:pressureSourceType
```
> Compute Pressure documentation: [Update Virtual Pressure Source](https://www.w3.org/TR/compute-pressure/#update-virtual-pressure-source)
Updates the state of a virtual pressure source with the type identified by `:pressureSourceType`.
#### Parameters
| Name | Description | Type |
| -------- | ----------------------------------------------------------------------------------------------------------------- | ------ |
| `sample` | Pressure state. Supported values are `nominal`, `fair`, `serious`, or `critical`. | string |
#### Response
`null`
### deleteVirtualPressureSource
```
DELETE /session/:sessionId/pressuresource/:pressureSourceType
```
> Compute Pressure documentation: [Delete Virtual Pressure Source](https://www.w3.org/TR/compute-pressure/#delete-virtual-pressure-source)
Deletes the virtual pressure source with the type identified by `:pressureSourceType`.
#### Response
`null`
## Custom Handlers Protocol
The [Custom Handlers protocol](https://html.spec.whatwg.org/multipage/system-state.html#user-agent-automation)
is an extension of the W3C WebDriver protocol, defined by the HTML Standard specification.
### setRPHRegistrationMode
```
POST /session/:sessionId/custom-handlers/set-mode
```
> Custom Handlers documentation: [Set RPH Registration Mode](https://html.spec.whatwg.org/multipage/system-state.html#user-agent-automation)
Sets the protocol handler automation mode, for processing registrations of custom protocol handlers.
By default, this mode is set to `none`.
#### Parameters
| Name | Description | Type |
| ------ | ------------------------------------------------------------------------------------------------------------------- | ------ |
| `mode` | Automation mode to set. Supported values are `autoAccept`, `autoReject`, or `none`. | string |
#### Response
`null`
## Device Posture Protocol
The [Device Posture protocol](https://www.w3.org/TR/device-posture/) is an extension of the W3C
WebDriver protocol.
### setDevicePosture
```
POST /session/:sessionId/deviceposture
```
> Device Posture documentation: [Set Device Posture](https://www.w3.org/TR/device-posture/#set-device-posture)
Sets the device posture, overriding the posture set by the device hardware.
#### Parameters
| Name | Description | Type |
| --------- | ------------------------------------------------------------------------------------------------------------------------- | ------ |
| `posture` | Posture to which the device should be set. Supported values are `continuous` or `folded`. | string |
#### Response
`null`
### clearDevicePosture
```
DELETE /session/:sessionId/deviceposture
```
> Device Posture documentation: [Clear Device Posture](https://www.w3.org/TR/device-posture/#clear-device-posture)
Clears the previously set device posture, returning posture control back to the device hardware.
#### Response
`null`
## Federated Credential Management Protocol
The [Federated Credential Management protocol](https://www.w3.org/TR/fedcm-1) (FedCM) is an
extension of the W3C WebDriver protocol. Clients can enable this protocol by using the
[`fedcm:accounts`](https://www.w3.org/TR/fedcm-1/#webdriver-capability) capability.
### fedCMCancelDialog
```
POST /session/:sessionId/fedcm/canceldialog
```
> FedCM documentation: [Cancel Dialog](https://www.w3.org/TR/fedcm-1/#webdriver-canceldialog)
Cancels the currently open FedCM dialog.
#### Response
`null`
### fedCMSelectAccount
```
POST /session/:sessionId/fedcm/selectaccount
```
> FedCM documentation: [Select Account](https://www.w3.org/TR/fedcm-1/#webdriver-selectaccount)
Selects an account to use for the currently open FedCM dialog.
#### Parameters
| Name | Description | Type |
| -------------- | ------------------------------------------------------ | ------ |
| `accountIndex` | Index of the account in the list of available accounts | number |
#### Response
`null`
### fedCMClickDialogButton
```
POST /session/:sessionId/fedcm/clickdialogbutton
```
> FedCM documentation: [Click Dialog Button](https://www.w3.org/TR/fedcm-1/#webdriver-clickdialogbutton)
Clicks a button in the currently open FedCM dialog.
#### Parameters
| Name | Description | Type |
| -------------- | ------------------------------------------------------------------------------------------------------------ | ------ |
| `dialogButton` | Identifier of the button to click. Must be set to `ConfirmIdpLoginContinue`. | string |
#### Response
`null`
### fedCMGetAccounts
```
GET /session/:sessionId/fedcm/accountlist
```
> FedCM documentation: [Account List](https://www.w3.org/TR/fedcm-1/#webdriver-accountlist)
Retrieves all accounts that the user can select in the currently open FedCM dialog.
#### Response
`FedCMAccount[]` - an array of objects, where each object includes the following properties:
| <div style="width:10em">Name</div> | Description | Type |
| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ------ |
| `accountId` | Account ID | string |
| `email` | Account email | string |
| `name` | Account name | string |
| `givenName?` | Account given name | string |
| `pictureUrl?` | Account picture URL | string |
| `idpConfigUrl` | URL of the identity provider configuration file | string |
| `loginState` | Login state. Set to `SignUp` if the account is not connected, otherwise `SignIn`. | string |
| `termsOfServiceUrl?` | Terms of Service URL of the website, if `loginState` is set to `SignUp` | string |
| `privacyPolicyUrl?` | Privacy Policy URL of the website, if `loginState` is set to `SignUp` | string |
### fedCMGetTitle
```
GET /session/:sessionId/fedcm/gettitle
```
> FedCM documentation: [Get Title](https://www.w3.org/TR/fedcm-1/#webdriver-gettitle)
Retrieves the title and subtitle (if one exists) of the currently open FedCM dialog.
#### Response
`FedCMDialogTitle` - an object with the following properties:
| Name | Description | Type |
| ----------- | --------------- | ------ |
| `title` | Dialog title | string |
| `subtitle?` | Dialog subtitle | string |
### fedCMGetDialogType
```
GET /session/:sessionId/fedcm/getdialogtype
```
> FedCM documentation: [Get Dialog Type](https://www.w3.org/TR/fedcm-1/#webdriver-getdialogtype)
Retrieves the type of the currently open FedCM dialog.
#### Response
`string` - can be set to `AutoReauthn`, `AccountChooser`, or `ConfirmIdpLogin`
### fedCMSetDelayEnabled
```
POST /session/:sessionId/fedcm/setdelayenabled
```
> FedCM documentation: [Set Delay Enabled](https://www.w3.org/TR/fedcm-1/#webdriver-setdelayenabled)
Sets the state of the promise rejection delay, which is used to prevent information leakage about
the logged in state of the user.
#### Parameters
| Name | Description | Type |
| --------- | --------------------------------------------- | ------- |
| `enabled` | Whether to enable the promise rejection delay | boolean |
#### Response
`null`
### fedCMResetCooldown
```
POST /session/:sessionId/fedcm/resetcooldown
```
> FedCM documentation: [Reset Cooldown](https://www.w3.org/TR/fedcm-1/#webdriver-resetcooldown)
Resets the cooldown delay used after dismissing a FedCM dialog.
#### Response
`null`
## Generic Sensor Protocol
The [Generic Sensor protocol](https://www.w3.org/TR/generic-sensor/) is an extension of the W3C
WebDriver protocol.
### createVirtualSensor
```
POST /session/:sessionId/sensor
```
> Generic Sensor documentation: [Create Virtual Sensor](https://www.w3.org/TR/generic-sensor/#create-virtual-sensor-command)
Creates a new virtual sensor.
#### Parameters
| <div style="width:12em">Name</div> | Description | Type | Default |
| ---------------------------------- | ---------------------------------------------------- | ------- | ------- |
| `type` | Type of sensor to create | string | |
| `connected?` | Whether the sensor should be configured as connected | boolean | `true` |
| `maxSamplingFrequency?` | Maximum sensor sampling frequency | number | |
| `minSamplingFrequency?` | Minimum sensor sampling frequency | number | |
#### Response
`null`
### getVirtualSensorInfo
```
GET /session/:sessionId/sensor/:sensorType
```
> Generic Sensor documentation: [Get Virtual Sensor Information](https://www.w3.org/TR/generic-sensor/#get-virtual-sensor-information-command)
Retrieves information about the virtual sensor with the type identified by `:sensorType`.
#### Response
`GetVirtualSensorInfoResponse` - an object containing the `requestedSamplingFrequency` key, whose
value is the requested sampling frequency of the sensor type
### updateVirtualSensorReading
```
POST /session/:sessionId/sensor/:sensorType
```
> Generic Sensor documentation: [Update Virtual Sensor Reading](https://www.w3.org/TR/generic-sensor/#update-virtual-sensor-reading-command)
Updates the virtual sensor with the type identified by `:sensorType` with a new reading.
#### Parameters
| Name | Description | Type |
| --------- | ---------------------------------------------------------------- | ------ |
| `reading` | Object containing reading properties specific to the sensor type | object |
#### Response
`null`
### deleteVirtualSensor
```
DELETE /session/:sessionId/sensor/:sensorType
```
> Generic Sensor documentation: [Delete Virtual Sensor](https://www.w3.org/TR/generic-sensor/#delete-virtual-sensor-command)
Deletes the virtual sensor with the type identified by `:sensorType`.
#### Response
`null`
## Permissions Protocol
The [Permissions protocol](https://www.w3.org/TR/permissions/) is an extension of the W3C WebDriver
protocol.
### setPermissions
```
POST /session/:sessionId/permissions
```
> Permissions documentation: [Set Permission](https://www.w3.org/TR/permissions/#webdriver-command-set-permission)
Simulates user modification of the permission state of a PermissionDescriptor (a permissible feature
with optional additional properties).
#### Parameters
| <div style="width:6em">Name</div> | Description | Type |
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
| `descriptor` | Object specifying the feature name in its `name` key, along with any other keys for additional properties | object |
| `state` | New permission state for this descriptor. Supported values are: `granted`, `denied`, or `prompt`. | string |
#### Response
`null`
## Reporting Protocol
The [Reporting protocol](https://www.w3.org/TR/reporting-1/) is an extension of the W3C WebDriver
protocol.
### generateTestReport
```
POST /session/:sessionId/reporting/generate_test_report
```
> Reporting documentation: [Generate Test Report](https://www.w3.org/TR/reporting-1/#generate-test-report-command)
Simulates the generation of a test report, which can be retrieved by registered reporting observers.
#### Parameters
| Name | Description | Type | Default |
| --------- | ------------------------------------------ | ------ | --------- |
| `message` | Message displayed in the report | string | |
| `group?` | Destination group to deliver the report to | string | `default` |
#### Response
`null`
## Secure Payment Confirmation Protocol
The [Secure Payment Confirmation protocol](https://www.w3.org/TR/secure-payment-confirmation) (SPC)
is an extension of the W3C WebDriver protocol.
### setSPCTransactionMode
```
POST /session/:sessionId/secure-payment-confirmation/set-mode
```
> SPC documentation: [Set SPC Transaction Mode](https://www.w3.org/TR/secure-payment-confirmation/#sctn-automation-set-spc-transaction-mode)
Sets the transaction automation mode, for automated handling of transaction confirmation prompts.
By default, this mode is set to `none`.
#### Parameters
| Name | Description | Type |
| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
| `mode` | Automation mode to set. Supported values are `autoAccept`, `autoChooseToAuthAnotherWay`, `autoReject`, or `autoOptOut`. | string |
#### Response
`null`
## Selenium Protocol
The Selenium protocol is an extension of the W3C WebDriver protocol, supported in Appium clients
@@ -92,7 +527,9 @@ Retrieves the available log types that can be used to call the [`getLog`](#getlo
## Web Authentication Protocol
The [Web Authentication protocol](https://w3c.github.io/webauthn/) (WebAuthn) is an extension of
the W3C WebDriver protocol.
the W3C WebDriver protocol. Clients can enable this protocol by using the
[`webauthn:virtualAuthenticators`](https://w3c.github.io/webauthn/#sctn-automation-webdriver-capability)
capability.
### addVirtualAuthenticator
@@ -9,7 +9,7 @@ title: WebDriver Protocol
</style>
The following is a list of [W3C WebDriver protocol](https://w3c.github.io/webdriver/) endpoints
used in Appium.
supported in Appium.
!!! info
@@ -1070,3 +1070,45 @@ identified by `:elementId`.
#### Response
`string` - a base64-encoded PNG image
### printPage
```
POST /session/:sessionId/print
```
> WebDriver documentation: [Print Page](https://w3c.github.io/webdriver/#print-page)
Prints the page by rendering it as a paginated PDF document.
#### Parameters
| <div style="width:7em">Name</div> | Description | <div style="width:9em">Type</div> | Default |
| --------------------------------- | ------------------------------------------------------------------------------------------------- | --------------------------------------- | ---------- |
| `orientation?` | Page orientation. Supported values are `portrait` or `landscape`. | string | `portrait` |
| `scale?` | Page scale. Supported values are in the range `[0.1, 2]`. | number | `1` |
| `background?` | Whether to include background images | boolean | `false` |
| `page?` | Object specifying the page width and height | [`PrintPageSize`](#printpagesize) | `{}` |
| `margin?` | Object specifying the page margins | [`PrintPageMargins`](#printpagemargins) | `{}` |
| `shrinkToFit?` | Whether to resize page contents to match `PrintPageSize.width` | boolean | `true` |
| `pageRanges?` | Array of pages to be printed, for example, `[1, 4, '8-9']` | array | `[]` |
##### `PrintPageSize`
| Name | Description | Type | Default |
| --------- | -------------------------------------------------------------------------------------------- | ------ | ------- |
| `width?` | Page width. Must be greater than or equal to `(2.54 / 72)`. | number | `21.59` |
| `height?` | Page height. Must be greater than or equal to `(2.54 / 72)`. | number | `27.94` |
##### `PrintPageMargins`
| Name | Description | Type | Default |
| --------- | ----------------------------------------------------------------------------------------- | ------ | ------- |
| `top?` | Page top margin. Must be greater than or equal to `0`. | number | `1` |
| `bottom?` | Page bottom margin. Must be greater than or equal to `0`. | number | `1` |
| `left?` | Page left margin. Must be greater than or equal to `0`. | number | `1` |
| `right?` | Page right margin. Must be greater than or equal to `0`. | number | `1` |
#### Response
`string` - a base64-encoded PDF document
@@ -21,7 +21,7 @@ mentioned below.
Installs the following extensions for browser webview testing:
- Drivers: `safari`[^1], `gecko`, `chromium`
- Plugins: `images`
- Plugins: `images`, `inspector`
#### Usage
@@ -34,7 +34,7 @@ appium setup browser
Installs the following extensions for desktop application testing:
- Drivers: `mac2`[^1], `windows`[^2]
- Plugins: `images`
- Plugins: `images`, `inspector`
#### Usage
@@ -47,7 +47,7 @@ appium setup desktop
Installs the following extensions for mobile testing:
- Drivers: `uiautomator2`, `xcuitest`[^1], `espresso`
- Plugins: `images`
- Plugins: `images`, `inspector`
#### Usage
+17 -17
View File
@@ -9,40 +9,40 @@ theme:
nav:
- 欢迎使用: index.md
- 博客: blog/index.md
- 简介:
- 简介:
- intro/index.md
- 背景:
- 背景:
- intro/appium.md
- intro/drivers.md
- intro/clients.md
- intro/history.md
- 快速开始:
- 快速开始:
- quickstart/index.md
- quickstart/requirements.md
- quickstart/install.md
- quickstart/uiauto2-driver.md
- 写一个测试:
- 写一个测试:
- quickstart/test-js.md
- quickstart/test-py.md
- quickstart/test-java.md
- quickstart/test-rb.md
- quickstart/test-dotnet.md
- quickstart/next-steps.md
- 生态系统:
- 生态系统:
- ecosystem/index.md
- ecosystem/drivers.md
- ecosystem/clients.md
- ecosystem/plugins.md
- ecosystem/tools.md
- Reference:
- 参考:
- reference/index.md
- Command Line Interface:
- 命令行界面:
- reference/cli/index.md
- reference/cli/server.md
- reference/cli/extensions.md
- reference/cli/setup.md
- reference/cli/env-vars.md
- API Endpoints:
- API 端点:
- reference/api/index.md
- reference/api/webdriver.md
- reference/api/bidi.md
@@ -51,11 +51,11 @@ nav:
- reference/api/appium.md
- reference/api/others.md
- reference/api/plugins.md
- 指南:
- 迁移:
- 指南:
- 迁移:
- guides/migrating-2-to-3.md
- guides/migrating-1-to-2.md
- 服务器/驱动程序配置:
- 服务器/驱动程序配置:
- guides/managing-exts.md
- guides/branch-testing.md
- guides/config.md
@@ -65,24 +65,24 @@ nav:
- guides/grid.md
- guides/caching.md
- guides/tls.md
- 会话配置:
- 会话配置:
- guides/caps.md
- guides/settings.md
- guides/execute-methods.md
- guides/context.md
- guides/event-timing.md
- More Resources:
- 更多资源:
- resources/index.md
- 开发:
- 开发:
- developing/index.md
- developing/build-drivers.md
- developing/build-plugins.md
- developing/build-docs.md
- developing/build-doctor-checks.md
- developing/sensitive.md
- 开发者参考:
- 开发者参考:
- developing/config-system.md
- Contributing:
- 贡献:
- contributing/index.md
- Sponsors:
- 赞助者:
- sponsors/index.md
@@ -36,7 +36,7 @@ Don't miss this chance to contribute to the Appium community and showcase your e
## How to Submit Your Proposal
Visit our website at [https://appiumconf.com/](https://appiumconf.com/) and Submit a Proposal. We're excited to see your innovative ideas and experiences with Appium!
Visit our website at [https://appiumconf.com/](https://appiumconf.com/) and [Submit a Proposal](https://confengine.com/conferences/appium-conf-2024/proposals?utm_medium=referal&utm_source=appium.io&utm_campaign=launch). We're excited to see your innovative ideas and experiences with Appium!
## Stay Tuned
+44 -70
View File
@@ -1,59 +1,45 @@
---
hide:
- navigation
- 导航栏
title: Contributing to Appium
title: 对Appium 的贡献
---
The Appium project would not exist without the many contributions of code, documentation,
maintenance, and support from companies and volunteers. As such, we welcome contributions!
Appium项目离不开来自公司和志愿者的代码、文档、维护和支持的众多贡献。 因此,我们欢迎贡献!
There are a lot of different ways to help the project - see below for everything you can do and the
processes to follow for each contribution method. Note that no matter how you contribute, your
participation is governed by our [Code of Conduct](https://github.com/appium/appium/blob/master/CONDUCT.md).
有许多不同的方式可以帮助项目——请参阅下方了解您可以做的一切以及每个贡献方法的流程。 请注意,无论您如何贡献,您的参与都受我们的[行为准则](https://github.com/appium/appium/blob/master/CONDUCT.md)管辖。
## Join the Discussion Forum
## 加入讨论论坛
You don't need to know the internals of Appium to be able to contribute! If you have experience with
using Appium and feel like sharing your knowledge with others, consider helping out users on the
Appium forums at [discuss.appium.io](https://discuss.appium.io/). Hop on over and see if there are
any questions that you can answer.
您不需要了解Appium的内部机制就能做出贡献! 如果您有使用Appium的经验,并愿意与他人分享您的知识,请考虑在Appium论坛[discuss.appium.io](https://discuss.appium.io/)上帮助用户。 快去看看是否有您能回答的问题。
## Report Bugs or Feature Requests
## 报告错误或功能请求
If you've encountered a bug, or have a cool feature in mind that you think Appium should support,
make sure to let us know at our [GitHub issue tracker](https://github.com/appium/appium/issues).
Please use the appropriate issue form template when creating your issue.
如果您遇到了一个bug,或者有一个很酷的功能想法,认为Appium应该支持,请务必在我们的[GitHub issue tracker](https://github.com/appium/appium/issues)上告诉我们。
请在创建issue时使用适当的issue表单模板。
## Triage Issues
## 对问题分类
In addition to creating issues, you can also help us investigate already reported issues. All you
need is enough familiarity with Appium to try and reproduce bugs.
除了创建issue,您还可以帮助我们调查已报告的问题。 您只需要对Appium有足够的熟悉程度来尝试重现bug。
You can get started by checking our [GitHub issue tracker](https://github.com/appium/appium/issues)
for issues with labels such as `Needs Triage` or `Needs Info`, and leaving relevant comments:
您可以通过检查我们的[GitHub issue tracker](https://github.com/appium/appium/issues)中带有标签如`Needs Triage`或`Needs Info`的问题开始,并留下相关评论:
- If the issue is a duplicate, drop a link to the original issue
- If the user has not provided enough information (such as Appium logs), ask them for more details
- If you can reproduce the problem on your own environment, provide all the information that you think
would help us track down the cause of the issue
- 如果问题是重复的,请提供指向原始issue的链接
- 如果用户没有提供足够的信息(如Appium日志),请向他们询问更多细节
- 如果您能在自己的环境中重现问题,请提供您认为有助于我们追踪问题原因的所有信息
For further information on triaging Appium issues (for any Appium project repository), please contact
any member of the [Technical Committee](https://github.com/appium/appium/blob/master/GOVERNANCE.md#the-technical-committee).
有关对Appium问题进行分类的更多信息(适用于任何Appium项目仓库),请联系[技术委员会](https://github.com/appium/appium/blob/master/GOVERNANCE.md#the-technical-committee)的任何成员。
## Contribute Code
## 贡献代码
We are always open to pull requests for improving the Appium code or documentation!
我们始终欢迎用于改进Appium代码或文档的拉取请求!
!!! info
Developer information may not be kept up to date as frequently as user-facing information, or
it may be most relevant in its current form on the online repository, not in this published
version. Make sure to check the repo or discuss with maintainers. We would be glad to help
new contributors get started!
开发者信息可能不像面向用户的信息那样频繁更新,或者它在在线仓库中的当前形式可能最相关,而不是在这个发布的版本中。请务必检查仓库或与维护者讨论。我们很乐意帮助新贡献者入门!
Start by cloning the repository (we recommend [forking](https://github.com/appium/appium/fork)
it first):
首先克隆仓库(我们建议先[fork](https://github.com/appium/appium/fork)
它):
```sh
git clone https://github.com/appium/appium.git
@@ -62,35 +48,35 @@ 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).
如果您是 VS Code 用户,您可以使用 [Runme](https://runme.dev/api/runme?repository=https%3A%2F%2Fgithub.com%2Fappium%2Fappium.git&fileToOpen=packages%2Fappium%2Fdocs%2Fen%2Fcontributing%2Findex.md) 轻松地查看项目。
Install dependencies:
安装依赖:
```sh
npm install
```
From here on there are several things you can do.
接下来你可以做几件事情。
Build the project:
构建项目:
```sh
npm run build
```
Build the project and watch for changes:
构建项目并监视更改:
```sh
npm run dev
```
Start the locally built Appium server:
启动本地 Appium 服务器:
```sh
npm start
```
Run various tests:
运行测试:
```sh
npm run lint
@@ -102,57 +88,45 @@ npm run test:quick # unit and types
npm run test:slow # everything
```
You can also run tests for specific workspaces, e.g.:
您也可以运行特定工作区的测试,例如:
```sh
export APPIUM_WORKSPACE=@appium/base-driver
npm run test:unit -w $APPIUM_WORKSPACE
```
### Documentation
### 文档
The documentation for this project is [available in the project repository itself](https://github.com/appium/appium/tree/master/packages/appium/docs).
It is contained in Markdown files, which are built by our documentation system in the
`@appium/docutils` module. This module is based on [MkDocs](https://www.mkdocs.org/) and therefore
requires [Python](https://www.python.org/) to be installed on your system.
此项目的文档位于项目[仓库本身](https://github.com/appium/appium/tree/master/packages/appium/docs)中。
它包含在Markdown文件中,这些文件由`@appium/docutils`模块中的文档系统构建。 该模块基于[MkDocs](https://www.mkdocs.org/),因此需要在您的系统上安装[Python](https://www.python.org/)。
Install Python dependencies:
安装 Python 依赖:
```sh
npm run install-docs-deps
```
After making your changes, you can run the documentation server in dev mode:
安装 Python 依赖:
```sh
npm run dev:docs
```
You can then view the documentation at `http://127.0.0.1:8000/docs/en`.
然后你可以在 `http://127.0.1:8000/docs/en` 中查看文档。
## Translating Appium Documentation
## 翻译Appium 文档
The process of Appium documents localization into languages other than English is automated and is done via
the [Crowdin Translations Management System](https://crowdin.com). Do not edit any translated documents
directly in the GitHub Appium repository as they are going to be replaced with ones exported from Crowdin
during an upcoming sync.
Appium文档本地化为英语以外语言的过程是自动化的,通过[Crowdin翻译管理系统](https://crowdin.com)完成。 请勿直接在GitHub Appium仓库中编辑任何翻译文档,因为它们将在即将进行的同步中被从Crowdin导出的文档替换。
### Where To Start
### 从哪里开始
If you would like to contribute to the translation of Appium documents into your language then simply join
the translators group for the [Appium Documentation](https://crowdin.com/project/appium-documentation)
Crowdin project, and start translating documents there. If you see that your language is missing from
the list of available Crowdin languages then simply let us know by creating an
[issue](https://github.com/appium/appium/issues).
如果您想为Appium文档翻译成您的语言做出贡献,只需加入[Appium Documentation](https://crowdin.com/project/appium-documentation) Crowdin项目的翻译者组,然后在那里开始翻译文档。 如果您看到您的语言在Crowdin可用语言列表中缺失,请通过创建[issue](https://github.com/appium/appium/issues)告诉我们。
### Source Language Updates
### 源语言更新
Changes in documents are synchronized to Crowdin automatically via the `Update Crowdin English Docs` GitHub action.
This action is triggered automatically as soon as there are any changes under `packages/appium/docs/en/**.md`
or `packages/appium/docs/mkdocs-en.yml`.
文档中的更改通过 `Update Crowdin English Docs GitHub` action自动同步到Crowdin。
一旦 `packages/appium/docs/en/**.md` 或 `packages/appium/docs/mkdocs-en.yml` 下有任何更改,此action就会自动触发。
### Fetching Translated Documents
### 获取翻译文档
In order to fetch translated files from Crowdin to the GitHub repository it is necessary to trigger
the `Sync Crowdin Docs Translations` action. This action should also automatically create a PR with
corresponding translated resources included.
为了从Crowdin获取翻译文件到GitHub仓库,需要触发 `Sync Crowdin Docs Translations` action。 此action还会自动创建一个包含相应翻译资源的PR。
@@ -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
@@ -21,13 +21,13 @@ The interface defines the following methods and properties:
- `diagnose(): Promise<DoctorCheckResult>`: Contains the code to diagnose a possible issue
- `fix(): Promise<string|null>`: Either fixes the actual problem if `hasAutofix()` returns true or
returns a string description for possible manual fixes. If this method throws an exception named
`FixSkippedError` and `hasAutofix()` returns true then the result of the method invocation
is going to be ignored.
returns a string description for possible manual fixes. If this method throws an exception named
`FixSkippedError` and `hasAutofix()` returns true then the result of the method invocation
is going to be ignored.
- `hasAutofix(): boolean`: Whether calling `fix()` would resolve the found issue
- `isOptional(): boolean`: Whether the found issue can be ignored and is not a showstopper
- `log: AppiumLogger`: May be used for logging. This property may be assigned
by the instance itself or by the Appium server if it is left unassigned.
by the instance itself or by the Appium server if it is left unassigned.
The `DoctorCheckResult` object returned by the `diagnose()` method must contain the following properties:
@@ -579,7 +579,7 @@ three ways:
1. Extending the classic WebDriver protocol and creating client-side plugins to access the extensions via the classic HTTP interface
2. Extending the WebDriver BiDi protocol with new modules and methods, accessed from a client via the BiDi interface
3. Overloading the Execute Script command by defining Execute
Methods
Methods
If you want to follow the first path, you can direct Appium to recognize new methods and add them
to its set of allowed HTTP routes and command names. You do this by assigning the `newMethodMap`
@@ -685,17 +685,17 @@ async execute(script, args) {
A couple notes about this system:
1. The arguments array sent via the call to Execute Script must contain only zero or one element(s). The
first item in the list is considered to be the parameters object for your method. These parameters
will be parsed, validated, and then applied to your overload method in the order specified in
`executeMethodMap` (the order specified in the `required` parameters list, followed by the
`optional` parameters list). I.e., this framework assumes only a single actual argument sent in via
Execute Script (and this argument should be an object with keys/values representing the
parameters your execute method expects).
first item in the list is considered to be the parameters object for your method. These parameters
will be parsed, validated, and then applied to your overload method in the order specified in
`executeMethodMap` (the order specified in the `required` parameters list, followed by the
`optional` parameters list). I.e., this framework assumes only a single actual argument sent in via
Execute Script (and this argument should be an object with keys/values representing the
parameters your execute method expects).
2. Appium does not automatically implement `execute` (the Execute Script handler) for you. You may
wish, for example, to only call the `executeMethod` helper function when you're not in proxy
mode!
wish, for example, to only call the `executeMethod` helper function when you're not in proxy
mode!
3. The `executeMethod` helper will reject with an error if a script name doesn't match one of the
script names defined as a command in `executeMethodMap`, or if there are missing parameters.
script names defined as a command in `executeMethodMap`, or if there are missing parameters.
One of the nice things about the Execute Method strategy is that methods implemented in this way
will be available via the classic or BiDi interfaces (since they will result in the same Appium
@@ -770,7 +770,7 @@ that multiple simultaneous sessions don't use the same resources:
1. Have your users specify resource IDs via capabilities (`appium:driverPort` etc)
2. Just always use free resources (find a new random port for each session)
3. Have each driver express what resources it is using, then examine currently-used resources from
other drivers when a new session begins.
other drivers when a new session begins.
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:
@@ -236,13 +236,13 @@ upstream server. In this case, we might run into a problem, because the plugin n
handle that command! The way Appium handles this is as follows:
1. When a command comes in, before deciding whether to proxy the command, the main protocol handler
checks to see whether a plugin would handle the command.
checks to see whether a plugin would handle the command.
2. If a plugin would _not_ handle the command--all proceeds as normal, and the request is either
proxied or not, based on the driver's proxy mode.
proxied or not, based on the driver's proxy mode.
3. If a plugin _would_ handle the command, then the proxy behavior is skipped for the time being,
and wrapped up as the `next` function sent to the plugin. So if you have a command handler in
your plugin, and you want to be sure that the default driver proxying _does_ take place, then
simply `await next()` instead of (or in addition to) whatever your plugin handler is doing.
and wrapped up as the `next` function sent to the plugin. So if you have a command handler in
your plugin, and you want to be sure that the default driver proxying _does_ take place, then
simply `await next()` instead of (or in addition to) whatever your plugin handler is doing.
### Throw WebDriver-specific errors
@@ -331,7 +331,7 @@ drivers, you can create new commands in one of two ways, just as is possible for
1. Extending the WebDriver protocol and creating client-side plugins to access the extensions
2. Extending the WebDriver BiDi protocol with new modules and methods, accessed from a client via the BiDi interface
3. Overloading the Execute Script command by defining Execute
Methods
Methods
#### Extending the HTTP Protocol
@@ -458,10 +458,10 @@ inside the plugin class:
1. The `executeMethodMap`, defined in just the same way as for drivers
2. The implementation of the command method as defined in `executeMethodMap` (in this case,
`plugMeIn`)
`plugMeIn`)
3. The overriding/handling of the `execute` command. Just like any plugin command handlers, the
first two arguments are `next` and `driver`, followed by the script name and args. `BasePlugin`
implements a helper method which we can simply call with all of these arguments.
first two arguments are `next` and `driver`, followed by the script name and args. `BasePlugin`
implements a helper method which we can simply call with all of these arguments.
Overriding Execute Methods from drivers works as you'd expect: if your plugin defines an Execute
Method with the same name as that of a driver, your command (in this case `plugMeIn`) will be
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Masking Sensitive Log Data
---
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Managing Contexts
---
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Execute Methods
---
@@ -9,10 +10,10 @@ 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.
@@ -133,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.
+194 -194
View File
@@ -151,285 +151,285 @@ Icons are used to indicate endpoint support in either certain drivers, or in the
</div>
- `GET /sessions`
- :octicons-arrow-right-24: `GET /appium/sessions` :simple-appium:
- :octicons-arrow-right-24: `GET /appium/sessions` :simple-appium:
- `POST /session/:sessionId/accept_alert`
- :octicons-arrow-right-24: `POST /session/:sessionId/alert/accept` :simple-appium:
- :octicons-arrow-right-24: `mobile: alert` [execute method](./execute-methods.md) :material-apple:
- :octicons-arrow-right-24: `mobile: acceptAlert` execute method :material-android:
- :octicons-arrow-right-24: `POST /session/:sessionId/alert/accept` :simple-appium:
- :octicons-arrow-right-24: `mobile: alert` [execute method](./execute-methods.md) :material-apple:
- :octicons-arrow-right-24: `mobile: acceptAlert` execute method :material-android:
- `GET /session/:sessionId/alert_text`
- :octicons-arrow-right-24: `GET /session/:sessionId/alert/text` :simple-appium:
- :octicons-arrow-right-24: `GET /session/:sessionId/alert/text` :simple-appium:
- `POST /session/:sessionId/alert_text`
- :octicons-arrow-right-24: `POST /session/:sessionId/alert/text` :simple-appium:
- :octicons-arrow-right-24: `POST /session/:sessionId/alert/text` :simple-appium:
- `POST /session/:sessionId/appium/app/background`
- :octicons-arrow-right-24: `mobile: backgroundApp` execute method :material-apple: :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: backgroundApp` execute method :material-apple: :material-android: :material-coffee:
- `POST /session/:sessionId/appium/app/close`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `mobile: terminateApp` execute method :material-apple: :material-android: :material-coffee:
- :octicons-arrow-right-24: `macos: terminateApp` execute method :material-apple-finder:
- :octicons-arrow-right-24: `windows: closeApp` execute method :material-microsoft-windows:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `mobile: terminateApp` execute method :material-apple: :material-android: :material-coffee:
- :octicons-arrow-right-24: `macos: terminateApp` execute method :material-apple-finder:
- :octicons-arrow-right-24: `windows: closeApp` execute method :material-microsoft-windows:
- `POST /session/:sessionId/appium/app/end_test_coverage`
- :octicons-arrow-right-24: `mobile: shell` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: shell` execute method :material-android: :material-coffee:
- `POST /session/:sessionId/appium/app/launch`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `mobile: launchApp` execute method :material-apple:
- :octicons-arrow-right-24: `mobile: activateApp` or `mobile: startActivity` execute methods :material-android: :material-coffee:
- :octicons-arrow-right-24: `macos: launchApp` or `macos: activateApp` execute methods :material-apple-finder:
- :octicons-arrow-right-24: `windows: launchApp` execute method :material-microsoft-windows:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `mobile: launchApp` execute method :material-apple:
- :octicons-arrow-right-24: `mobile: activateApp` or `mobile: startActivity` execute methods :material-android: :material-coffee:
- :octicons-arrow-right-24: `macos: launchApp` or `macos: activateApp` execute methods :material-apple-finder:
- :octicons-arrow-right-24: `windows: launchApp` execute method :material-microsoft-windows:
- `POST /session/:sessionId/appium/app/reset`
- :octicons-arrow-right-24: `mobile: clearApp` execute method :material-apple: [^sim] :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: clearApp` execute method :material-apple: [^sim] :material-android: :material-coffee:
- `POST /session/:sessionId/appium/app/strings`
- :octicons-arrow-right-24: `mobile: getAppStrings` execute method :material-apple: :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: getAppStrings` execute method :material-apple: :material-android: :material-coffee:
- `GET /session/:sessionId/appium/device/app_state`
- :octicons-arrow-right-24: `POST /session/:sessionId/appium/device/app_state` :simple-appium:
- :octicons-arrow-right-24: `mobile: queryAppState` execute method :material-apple: :material-android: :material-coffee:
- :octicons-arrow-right-24: `macos: queryAppState` execute method :material-apple-finder:
- :octicons-arrow-right-24: `POST /session/:sessionId/appium/device/app_state` :simple-appium:
- :octicons-arrow-right-24: `mobile: queryAppState` execute method :material-apple: :material-android: :material-coffee:
- :octicons-arrow-right-24: `macos: queryAppState` execute method :material-apple-finder:
- `GET /session/:sessionId/appium/device/current_activity`
- :octicons-arrow-right-24: `mobile: getCurrentActivity` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: getCurrentActivity` execute method :material-android: :material-coffee:
- `GET /session/:sessionId/appium/device/current_package`
- :octicons-arrow-right-24: `mobile: getCurrentPackage` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: getCurrentPackage` execute method :material-android: :material-coffee:
- `GET /session/:sessionId/appium/device/display_density`
- :octicons-arrow-right-24: `mobile: getDisplayDensity` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: getDisplayDensity` execute method :material-android: :material-coffee:
- `POST /session/:sessionId/appium/device/finger_print`
- :octicons-arrow-right-24: `mobile: fingerPrint` execute method :material-android: [^sim] :material-coffee: [^sim]
- :octicons-arrow-right-24: `mobile: fingerPrint` execute method :material-android: [^sim] :material-coffee: [^sim]
- `POST /session/:sessionId/appium/device/get_clipboard`
- :octicons-check-24: Moved to drivers: :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: getClipboard` execute method :material-apple: :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: getPasteboard` execute method :material-apple: [^sim]
- :octicons-arrow-right-24: `windows: getClipboard` execute method :material-microsoft-windows:
- :octicons-check-24: Moved to drivers: :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: getClipboard` execute method :material-apple: :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: getPasteboard` execute method :material-apple: [^sim]
- :octicons-arrow-right-24: `windows: getClipboard` execute method :material-microsoft-windows:
- `POST /session/:sessionId/appium/device/gsm_call`
- :octicons-arrow-right-24: `mobile: gsmCall` execute method :material-android: [^sim] :material-coffee: [^sim]
- :octicons-arrow-right-24: `mobile: gsmCall` execute method :material-android: [^sim] :material-coffee: [^sim]
- `POST /session/:sessionId/appium/device/gsm_signal`
- :octicons-arrow-right-24: `mobile: gsmSignal` execute method :material-android: [^sim] :material-coffee: [^sim]
- :octicons-arrow-right-24: `mobile: gsmSignal` execute method :material-android: [^sim] :material-coffee: [^sim]
- `POST /session/:sessionId/appium/device/gsm_voice`
- :octicons-arrow-right-24: `mobile: gsmVoice` execute method :material-android: [^sim] :material-coffee: [^sim]
- :octicons-arrow-right-24: `mobile: gsmVoice` execute method :material-android: [^sim] :material-coffee: [^sim]
- `POST /session/:sessionId/appium/device/is_locked`
- :octicons-arrow-right-24: `mobile: isLocked` execute method :material-apple: :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: isLocked` execute method :material-apple: :material-android: :material-coffee:
- `POST /session/:sessionId/appium/device/keyevent`
- :octicons-arrow-right-24: `mobile: keys` execute method :material-apple: (iPadOS only)
- :octicons-arrow-right-24: `mobile: pressKey` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `macos: keys` execute method :material-apple-finder:
- :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
- :octicons-arrow-right-24: `mobile: keys` execute method :material-apple: (iPadOS only)
- :octicons-arrow-right-24: `mobile: pressKey` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `macos: keys` execute method :material-apple-finder:
- :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
- `POST /session/:sessionId/appium/device/lock`
- :octicons-arrow-right-24: `mobile: lock` execute method :material-apple: :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: lock` execute method :material-apple: :material-android: :material-coffee:
- `POST /session/:sessionId/appium/device/long_press_keycode`
- :octicons-arrow-right-24: `mobile: pressKey` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: pressKey` execute method :material-android: :material-coffee:
- `POST /session/:sessionId/appium/device/network_speed`
- :octicons-arrow-right-24: `mobile: networkSpeed` execute method :material-android: [^sim] :material-coffee: [^sim]
- :octicons-arrow-right-24: `mobile: networkSpeed` execute method :material-android: [^sim] :material-coffee: [^sim]
- `POST /session/:sessionId/appium/device/open_notifications`
- :octicons-arrow-right-24: `mobile: statusBar` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: openNotifications` execute method :material-android:
- :octicons-arrow-right-24: `mobile: statusBar` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: openNotifications` execute method :material-android:
- `POST /session/:sessionId/appium/device/power_ac`
- :octicons-arrow-right-24: `mobile: powerAC` execute method :material-android: [^sim] :material-coffee: [^sim]
- :octicons-arrow-right-24: `mobile: powerAC` execute method :material-android: [^sim] :material-coffee: [^sim]
- `POST /session/:sessionId/appium/device/power_capacity`
- :octicons-arrow-right-24: `mobile: powerCapacity` execute method :material-android: [^sim] :material-coffee: [^sim]
- :octicons-arrow-right-24: `mobile: powerCapacity` execute method :material-android: [^sim] :material-coffee: [^sim]
- `POST /session/:sessionId/appium/device/press_keycode`
- :octicons-arrow-right-24: `mobile: keys` execute method :material-apple: (iPadOS only)
- :octicons-arrow-right-24: `mobile: pressKey` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `macos: keys` execute method :material-apple-finder:
- :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
- :octicons-arrow-right-24: `mobile: keys` execute method :material-apple: (iPadOS only)
- :octicons-arrow-right-24: `mobile: pressKey` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `macos: keys` execute method :material-apple-finder:
- :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
- `POST /session/:sessionId/appium/device/send_sms`
- :octicons-arrow-right-24: `mobile: sendSms` execute method :material-android: [^sim] :material-coffee: [^sim]
- :octicons-arrow-right-24: `mobile: sendSms` execute method :material-android: [^sim] :material-coffee: [^sim]
- `POST /session/:sessionId/appium/device/set_clipboard`
- :octicons-arrow-right-24: `mobile: setClipboard` execute method :material-apple: :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: setPasteboard` execute method :material-apple: [^sim]
- :octicons-arrow-right-24: `windows: setClipboard` execute method :material-microsoft-windows:
- :octicons-arrow-right-24: `mobile: setClipboard` execute method :material-apple: :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: setPasteboard` execute method :material-apple: [^sim]
- :octicons-arrow-right-24: `windows: setClipboard` execute method :material-microsoft-windows:
- `POST /session/:sessionId/appium/device/shake`
- :octicons-arrow-right-24: `mobile: shake` execute method :material-apple: [^sim]
- :octicons-arrow-right-24: `mobile: shake` execute method :material-apple: [^sim]
- `POST /session/:sessionId/appium/device/start_activity`
- :octicons-arrow-right-24: `mobile: startActivity` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: startActivity` execute method :material-android: :material-coffee:
- `GET /session/:sessionId/appium/device/system_bars`
- :octicons-arrow-right-24: `mobile: deviceScreenInfo` execute method :material-apple:
- :octicons-arrow-right-24: `mobile: getSystemBars` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: deviceScreenInfo` execute method :material-apple:
- :octicons-arrow-right-24: `mobile: getSystemBars` execute method :material-android: :material-coffee:
- `POST /session/:sessionId/appium/device/toggle_airplane_mode`
- :octicons-arrow-right-24: `mobile: setConnectivity` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: setConnectivity` execute method :material-android: :material-coffee:
- `POST /session/:sessionId/appium/device/toggle_data`
- :octicons-arrow-right-24: `mobile: setConnectivity` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: setConnectivity` execute method :material-android: :material-coffee:
- `POST /session/:sessionId/appium/device/toggle_location_services`
- :octicons-arrow-right-24: `mobile: toggleGps` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: toggleGps` execute method :material-android: :material-coffee:
- `POST /session/:sessionId/appium/device/toggle_wifi`
- :octicons-arrow-right-24: `mobile: setConnectivity` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: setConnectivity` execute method :material-android: :material-coffee:
- `POST /session/:sessionId/appium/device/unlock`
- :octicons-arrow-right-24: `mobile: unlock` execute method :material-apple: :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: unlock` execute method :material-apple: :material-android: :material-coffee:
- `POST /session/:sessionId/appium/element/:elementId/value`
- :octicons-arrow-right-24: `POST /session/:sessionId/element/:elementId/value` :simple-appium:
- :octicons-arrow-right-24: `POST /session/:sessionId/element/:elementId/value` :simple-appium:
- `POST /session/:sessionId/appium/element/:elementId/replace_value`
- :octicons-arrow-right-24: `POST /session/:sessionId/element/:elementId/value` :simple-appium:
- :octicons-arrow-right-24: `POST /session/:sessionId/element/:elementId/value` :simple-appium:
- `POST /session/:sessionId/appium/getPerformanceData`
- :octicons-arrow-right-24: `mobile: getPerformanceData` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: getPerformanceData` execute method :material-android: :material-coffee:
- `POST /session/:sessionId/appium/performanceData/types`
- :octicons-arrow-right-24: `mobile: getPerformanceDataTypes` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `mobile: getPerformanceDataTypes` execute method :material-android: :material-coffee:
- `POST /session/:sessionId/appium/receive_async_response`
- :octicons-arrow-right-24: `POST /session/:sessionId/execute/async` :simple-appium:
- :octicons-arrow-right-24: `POST /session/:sessionId/execute/async` :simple-appium:
- `POST /session/:sessionId/appium/simulator/toggle_touch_id_enrollment`
- :octicons-arrow-right-24: `mobile: enrollBiometric` execute method :material-apple: [^sim]
- :octicons-arrow-right-24: `mobile: enrollBiometric` execute method :material-apple: [^sim]
- `POST /session/:sessionId/appium/simulator/touch_id`
- :octicons-arrow-right-24: `mobile: sendBiometricMatch` execute method :material-apple: [^sim]
- :octicons-arrow-right-24: `mobile: sendBiometricMatch` execute method :material-apple: [^sim]
- `POST /session/:sessionId/appium/start_recording_screen`
- :octicons-check-24: Moved to drivers: :material-apple: :material-android: :material-coffee: :material-apple-finder: :material-microsoft-windows:
- :octicons-arrow-right-24: `mobile: startXCTestScreenRecording` execute method :material-apple:
- :octicons-arrow-right-24: `mobile: startMediaProjectionRecording` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `macos: startRecordingScreen` or `macos: startNativeScreenRecording` execute methods :material-apple-finder:
- :octicons-arrow-right-24: `windows: startRecordingScreen` execute method :material-microsoft-windows:
- :octicons-check-24: Moved to drivers: :material-apple: :material-android: :material-coffee: :material-apple-finder: :material-microsoft-windows:
- :octicons-arrow-right-24: `mobile: startXCTestScreenRecording` execute method :material-apple:
- :octicons-arrow-right-24: `mobile: startMediaProjectionRecording` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `macos: startRecordingScreen` or `macos: startNativeScreenRecording` execute methods :material-apple-finder:
- :octicons-arrow-right-24: `windows: startRecordingScreen` execute method :material-microsoft-windows:
- `POST /session/:sessionId/appium/stop_recording_screen`
- :octicons-check-24: Moved to drivers: :material-apple: :material-android: :material-coffee: :material-apple-finder: :material-microsoft-windows:
- :octicons-arrow-right-24: `mobile: stopXCTestScreenRecording` execute method :material-apple:
- :octicons-arrow-right-24: `mobile: stopMediaProjectionRecording` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `macos: stopRecordingScreen` or `macos: stopNativeScreenRecording` execute methods :material-apple-finder:
- :octicons-arrow-right-24: `windows: stopRecordingScreen` execute method :material-microsoft-windows:
- :octicons-check-24: Moved to drivers: :material-apple: :material-android: :material-coffee: :material-apple-finder: :material-microsoft-windows:
- :octicons-arrow-right-24: `mobile: stopXCTestScreenRecording` execute method :material-apple:
- :octicons-arrow-right-24: `mobile: stopMediaProjectionRecording` execute method :material-android: :material-coffee:
- :octicons-arrow-right-24: `macos: stopRecordingScreen` or `macos: stopNativeScreenRecording` execute methods :material-apple-finder:
- :octicons-arrow-right-24: `windows: stopRecordingScreen` execute method :material-microsoft-windows:
- `GET /session/:sessionId/application_cache/status`
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- `POST /session/:sessionId/buttondown`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: [W3C Actions API](https://www.selenium.dev/documentation/webdriver/actions_api/) (`pointerDown`) :simple-appium:
- :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: [W3C Actions API](https://www.selenium.dev/documentation/webdriver/actions_api/) (`pointerDown`) :simple-appium:
- :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
- `POST /session/:sessionId/buttonup`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerUp`) :simple-appium:
- :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerUp`) :simple-appium:
- :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
- `POST /session/:sessionId/click`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerDown` & `pointerUp`) :simple-appium:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerDown` & `pointerUp`) :simple-appium:
- `POST /session/:sessionId/dismiss_alert`
- :octicons-arrow-right-24: `POST /session/:sessionId/alert/dismiss` :simple-appium:
- :octicons-arrow-right-24: `POST /session/:sessionId/alert/dismiss` :simple-appium:
- `POST /session/:sessionId/doubleclick`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerDown` & `pointerUp`) :simple-appium:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerDown` & `pointerUp`) :simple-appium:
- `POST /session/:sessionId/element/active`
- :octicons-arrow-right-24: `GET /session/:sessionId/element/active` :simple-appium:
- :octicons-arrow-right-24: `GET /session/:sessionId/element/active` :simple-appium:
- `GET /session/:sessionId/element/:elementId/equals/:otherId`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- `GET /session/:sessionId/element/:elementId/location`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `GET /session/:sessionId/element/:elementId/rect` :simple-appium:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `GET /session/:sessionId/element/:elementId/rect` :simple-appium:
- `GET /session/:sessionId/element/:elementId/location_in_view`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- `GET /session/:sessionId/element/:elementId/pageIndex`
- :octicons-no-entry-24: MJSONWP protocol command with no direct replacement
- :octicons-no-entry-24: MJSONWP protocol command with no direct replacement
- `GET /session/:sessionId/element/:elementId/size`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `GET /session/:sessionId/element/:elementId/rect` :simple-appium:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `GET /session/:sessionId/element/:elementId/rect` :simple-appium:
- `POST /session/:sessionId/element/:elementId/submit`
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- `POST /session/:sessionId/execute`
- :octicons-arrow-right-24: `POST /session/:sessionId/execute/sync` :simple-appium:
- :octicons-arrow-right-24: `POST /session/:sessionId/execute/sync` :simple-appium:
- `POST /session/:sessionId/execute_async`
- :octicons-arrow-right-24: `POST /session/:sessionId/execute/async` :simple-appium:
- :octicons-arrow-right-24: `POST /session/:sessionId/execute/async` :simple-appium:
- `POST /session/:sessionId/keys`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`keyDown` & `keyUp`) :simple-appium:
- Selenium-based clients can also use [Send Keys](https://www.selenium.dev/documentation/webdriver/actions_api/keyboard/#send-keys)
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`keyDown` & `keyUp`) :simple-appium:
- Selenium-based clients can also use [Send Keys](https://www.selenium.dev/documentation/webdriver/actions_api/keyboard/#send-keys)
- `GET /session/:sessionId/local_storage`
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- `POST /session/:sessionId/local_storage`
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- `DELETE /session/:sessionId/local_storage`
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- `GET /session/:sessionId/local_storage/key/:key`
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- `DELETE /session/:sessionId/local_storage/key/:key`
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- `GET /session/:sessionId/local_storage/size`
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- `POST /session/:sessionId/log`
- :octicons-arrow-right-24: `POST /session/:sessionId/se/log` :simple-appium:
- :octicons-arrow-right-24: `POST /session/:sessionId/se/log` :simple-appium:
- `GET /session/:sessionId/log/types`
- :octicons-arrow-right-24: `GET /session/:sessionId/se/log/types` :simple-appium:
- :octicons-arrow-right-24: `GET /session/:sessionId/se/log/types` :simple-appium:
- `POST /session/:sessionId/moveto`
- :octicons-arrow-right-24: W3C Actions API (`pointerMove`) :simple-appium:
- Selenium-based clients can also use [Move by Offset](https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#move-by-offset)
- :octicons-arrow-right-24: W3C Actions API (`pointerMove`) :simple-appium:
- Selenium-based clients can also use [Move by Offset](https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#move-by-offset)
- `GET /session/:sessionId/screenshot/:elementId`
- :octicons-arrow-right-24: `GET /session/:sessionId/element/:elementId/screenshot` :simple-appium:
- :octicons-arrow-right-24: `GET /session/:sessionId/element/:elementId/screenshot` :simple-appium:
- `GET /session/:sessionId/session_storage`
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- `POST /session/:sessionId/session_storage`
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- `DELETE /session/:sessionId/session_storage`
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- `GET /session/:sessionId/session_storage/key/:key`
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- `DELETE /session/:sessionId/session_storage/key/:key`
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- `GET /session/:sessionId/session_storage/size`
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- :octicons-no-entry-24: JSONWP protocol command with no direct replacement
- `POST /session/:sessionId/timeouts/async_script`
- :octicons-arrow-right-24: `POST /session/:sessionId/timeouts` :simple-appium:
- :octicons-arrow-right-24: `POST /session/:sessionId/timeouts` :simple-appium:
- `POST /session/:sessionId/timeouts/implicit_wait`
- :octicons-arrow-right-24: `POST /session/:sessionId/timeouts` :simple-appium:
- :octicons-arrow-right-24: `POST /session/:sessionId/timeouts` :simple-appium:
- `POST /session/:sessionId/touch/click`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerDown` & `pointerUp`) :simple-appium:
- Selenium-based clients can also use [Click and Release](https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#click-and-release)
- :octicons-arrow-right-24: `mobile: tap` or `mobile: tapWithNumberOfTaps` execute methods :material-apple:
- :octicons-arrow-right-24: `mobile: clickGesture` execute method :material-android:
- :octicons-arrow-right-24: `mobile: clickAction` execute method :material-coffee:
- :octicons-arrow-right-24: `macos: click`, `macos: rightClick`, `macos: press` or `macos: tap` execute methods :material-apple-finder:
- :octicons-arrow-right-24: `windows: click` execute method :material-microsoft-windows:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerDown` & `pointerUp`) :simple-appium:
- Selenium-based clients can also use [Click and Release](https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#click-and-release)
- :octicons-arrow-right-24: `mobile: tap` or `mobile: tapWithNumberOfTaps` execute methods :material-apple:
- :octicons-arrow-right-24: `mobile: clickGesture` execute method :material-android:
- :octicons-arrow-right-24: `mobile: clickAction` execute method :material-coffee:
- :octicons-arrow-right-24: `macos: click`, `macos: rightClick`, `macos: press` or `macos: tap` execute methods :material-apple-finder:
- :octicons-arrow-right-24: `windows: click` execute method :material-microsoft-windows:
- `POST /session/:sessionId/touch/doubleclick`
- :octicons-arrow-right-24: W3C Actions API (`pointerDown` & `pointerUp`) :simple-appium:
- Selenium-based clients can also use [Double Click](https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#double-click)
- :octicons-arrow-right-24: `mobile: doubleTap` or `mobile: tapWithNumberOfTaps` execute methods :material-apple:
- :octicons-arrow-right-24: `mobile: doubleClickGesture` execute method :material-android:
- :octicons-arrow-right-24: `mobile: clickAction` execute method :material-coffee:
- :octicons-arrow-right-24: `macos: doubleClick` or `macos: doubleTap` execute methods :material-apple-finder:
- :octicons-arrow-right-24: `windows: click` execute method :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerDown` & `pointerUp`) :simple-appium:
- Selenium-based clients can also use [Double Click](https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#double-click)
- :octicons-arrow-right-24: `mobile: doubleTap` or `mobile: tapWithNumberOfTaps` execute methods :material-apple:
- :octicons-arrow-right-24: `mobile: doubleClickGesture` execute method :material-android:
- :octicons-arrow-right-24: `mobile: clickAction` execute method :material-coffee:
- :octicons-arrow-right-24: `macos: doubleClick` or `macos: doubleTap` execute methods :material-apple-finder:
- :octicons-arrow-right-24: `windows: click` execute method :material-microsoft-windows:
- `POST /session/:sessionId/touch/down`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerDown`) :simple-appium:
- :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerDown`) :simple-appium:
- :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
- `POST /session/:sessionId/touch/flick`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerDown`, `pointerMove` & `pointerUp`) :simple-appium:
- :octicons-arrow-right-24: `mobile: flingGesture` execute method :material-android:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerDown`, `pointerMove` & `pointerUp`) :simple-appium:
- :octicons-arrow-right-24: `mobile: flingGesture` execute method :material-android:
- `POST /session/:sessionId/touch/longclick`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerDown`, `pause` & `pointerUp`) :simple-appium:
- :octicons-arrow-right-24: `mobile: touchAndHold` execute method :material-apple:
- :octicons-arrow-right-24: `mobile: longClickGesture` execute method :material-android:
- :octicons-arrow-right-24: `mobile: clickAction` execute method :material-coffee:
- :octicons-arrow-right-24: `macos: press` execute method :material-apple-finder:
- :octicons-arrow-right-24: `windows: click` execute method :material-microsoft-windows:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerDown`, `pause` & `pointerUp`) :simple-appium:
- :octicons-arrow-right-24: `mobile: touchAndHold` execute method :material-apple:
- :octicons-arrow-right-24: `mobile: longClickGesture` execute method :material-android:
- :octicons-arrow-right-24: `mobile: clickAction` execute method :material-coffee:
- :octicons-arrow-right-24: `macos: press` execute method :material-apple-finder:
- :octicons-arrow-right-24: `windows: click` execute method :material-microsoft-windows:
- `POST /session/:sessionId/touch/multi/perform`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `POST /session/:sessionId/actions` :simple-appium:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `POST /session/:sessionId/actions` :simple-appium:
- `POST /session/:sessionId/touch/move`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerMove`) :simple-appium:
- Selenium-based clients can also use [Move by Offset](https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#move-by-offset)
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerMove`) :simple-appium:
- Selenium-based clients can also use [Move by Offset](https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#move-by-offset)
- `POST /session/:sessionId/touch/perform`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `POST /session/:sessionId/actions` :simple-appium:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `POST /session/:sessionId/actions` :simple-appium:
- `POST /session/:sessionId/touch/scroll`
- :octicons-arrow-right-24: W3C Actions API (`pointerDown`, `pointerMove` & `pointerUp`) :simple-appium:
- :octicons-arrow-right-24: `mobile: scroll` or `mobile: swipe` execute methods :material-apple:
- :octicons-arrow-right-24: `mobile: scrollGesture` or `mobile: swipeGesture` execute methods :material-android:
- :octicons-arrow-right-24: `mobile: swipe` execute method :material-coffee:
- :octicons-arrow-right-24: `macos: scroll` or `macos: swipe` execute methods :material-apple-finder:
- :octicons-arrow-right-24: `windows: scroll` execute method :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerDown`, `pointerMove` & `pointerUp`) :simple-appium:
- :octicons-arrow-right-24: `mobile: scroll` or `mobile: swipe` execute methods :material-apple:
- :octicons-arrow-right-24: `mobile: scrollGesture` or `mobile: swipeGesture` execute methods :material-android:
- :octicons-arrow-right-24: `mobile: swipe` execute method :material-coffee:
- :octicons-arrow-right-24: `macos: scroll` or `macos: swipe` execute methods :material-apple-finder:
- :octicons-arrow-right-24: `windows: scroll` execute method :material-microsoft-windows:
- `POST /session/:sessionId/touch/up`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerUp`) :simple-appium:
- :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: W3C Actions API (`pointerUp`) :simple-appium:
- :octicons-arrow-right-24: `windows: keys` execute method :material-microsoft-windows:
- `GET /session/:sessionId/window_handle`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `GET /session/:sessionId/window` :simple-appium:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `GET /session/:sessionId/window` :simple-appium:
- `GET /session/:sessionId/window_handles`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `GET /session/:sessionId/window/handles` :simple-appium:
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `GET /session/:sessionId/window/handles` :simple-appium:
- `GET /session/:sessionId/window/handle`
- :octicons-arrow-right-24: `GET /session/:sessionId/window` :simple-appium:
- :octicons-arrow-right-24: `GET /session/:sessionId/window` :simple-appium:
- `POST /session/:sessionId/window/:windowhandle/maximize`
- :octicons-arrow-right-24: `POST /session/:sessionId/window/maximize` :simple-appium:
- :fontawesome-solid-triangle-exclamation: Only supported for the current window
- :octicons-arrow-right-24: `POST /session/:sessionId/window/maximize` :simple-appium:
- :fontawesome-solid-triangle-exclamation: Only supported for the current window
- `GET /session/:sessionId/window/:windowhandle/position`
- :octicons-arrow-right-24: `GET /session/:sessionId/window/rect` :simple-appium:
- :fontawesome-solid-triangle-exclamation: Only supported for the current window
- :octicons-arrow-right-24: `GET /session/:sessionId/window/rect` :simple-appium:
- :fontawesome-solid-triangle-exclamation: Only supported for the current window
- `POST /session/:sessionId/window/:windowhandle/position`
- :octicons-arrow-right-24: `POST /session/:sessionId/window/rect` :simple-appium:
- :fontawesome-solid-triangle-exclamation: Only supported for the current window
- :octicons-arrow-right-24: `POST /session/:sessionId/window/rect` :simple-appium:
- :fontawesome-solid-triangle-exclamation: Only supported for the current window
- `GET /session/:sessionId/window/:windowhandle/size`
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `GET /session/:sessionId/window/rect` :simple-appium:
- :fontawesome-solid-triangle-exclamation: Only supported for the current window
- :octicons-check-24: Moved to drivers: :material-microsoft-windows:
- :octicons-arrow-right-24: `GET /session/:sessionId/window/rect` :simple-appium:
- :fontawesome-solid-triangle-exclamation: Only supported for the current window
### Modified
@@ -438,22 +438,22 @@ parameters (note that no new parameters have been added). Each endpoint lists th
longer accepts, as well as the parameters it continues to accept in Appium 3.
- `POST /session`
- :octicons-x-24: `desiredCapabilities`, `requiredCapabilities`
- :octicons-check-24: `capabilities`
- :octicons-x-24: `desiredCapabilities`, `requiredCapabilities`
- :octicons-check-24: `capabilities`
- `POST /session/:sessionId/alert/text`
- :octicons-x-24: `value`
- :octicons-check-24: `text`
- :octicons-x-24: `value`
- :octicons-check-24: `text`
- `GET /session/:sessionId/appium/device/system_time`
- :octicons-x-24: `format`
- :octicons-check-24: None
- :octicons-x-24: `format`
- :octicons-check-24: None
- `POST /session/:sessionId/element/:elementId/value`
- :octicons-x-24: `value`
- :octicons-check-24: `text`
- :octicons-x-24: `value`
- :octicons-check-24: `text`
- `POST /session/:sessionId/timeouts`
- :octicons-x-24: `type`, `ms`
- :octicons-check-24: `script`, `pageLoad`, `implicit`
- :octicons-x-24: `type`, `ms`
- :octicons-check-24: `script`, `pageLoad`, `implicit`
- `POST /session/:sessionId/window`
- :octicons-x-24: `name`
- :octicons-check-24: `handle`
- :octicons-x-24: `name`
- :octicons-check-24: `handle`
[^sim]: Supported in emulators/simulators only
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Session Settings
---
+1
View File
@@ -1,6 +1,7 @@
---
hide:
- toc
title: SSL/TLS/SPDY Support
---
+6 -6
View File
@@ -1,6 +1,6 @@
---
hide:
- navigation
- 导航栏
- toc
title: 欢迎使用
@@ -44,11 +44,11 @@ title: 欢迎使用
- 查看 [**简介**](./intro/index.md) 以确保您理解关键概念
- 通过 [**快速开始**](./quickstart/index.md) 来设置并运行一个基本的 Android 测试
- 访问 [**生态系统**](./ecosystem/index.md) 页面,获取您可能想要使用的驱动程序、客户端和插件列表
- Consult the [**Reference**](./reference/index.md) page for information on the Appium CLI and supported endpoints
- Read the different [**Guides**](./guides/migrating-2-to-3.md) for a variety of instructions, tips and tricks
- Check out various third-party [**Resources**](./resources/index.md) to explore Appium around the web
- 访问 [**Reference**](./reference/index.md) 页面获取Appium CLI 和支持的端点信息
- 阅读不同版本的 [**指南**](./guides/migrating-2-to-3.md),了解各版本的说明、提示和技巧
- 查看各种第三方 [**资源**](./resources/index.md) 以探索网络上的 Appium
- 要创建自己的 Appium 扩展,请参阅 [**开发者**](./developing/index.md) 文档
- For contributions to Appium itself, refer to the [**Contributing**](./contributing/index.md) page
- Have a look at the [**Appium Blog**](./blog/index.md) to learn what's new in the project
- 有关对 Appium 的贡献,请查阅 [**贡献**](./contributing/index.md) 页面
- 查看 [**Appium博客**](./blog/index.md) ,了解项目中的新内容
</div>
+3 -2
View File
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Intro to Appium Clients
---
@@ -111,8 +112,8 @@ System.Console.WriteLine(driver.PageSource);
Each of these scripts, despite being in different languages, does the same thing under the hood:
1. Call `Find Element` with a `using` parameter of `xpath` and a `value` parameter expressing the
XPath query used to find an element. (If you're confused about these terms, you might find an
introduction to Appium or Selenium useful)
XPath query used to find an element. (If you're confused about these terms, you might find an
introduction to Appium or Selenium useful)
2. Call `Click Element` with the ID of the element found in the previous call.
3. Call `Get Element Text` with the ID of the same element, and print it to the console.
4. Call `Get Page Source` to retrieve the page/app source and print it to the console.
+1
View File
@@ -1,6 +1,7 @@
---
hide:
- toc
title: Appium in a Nutshell
---
+12 -18
View File
@@ -2,28 +2,22 @@
hide:
- toc
title: Getting Started
title: 入门指南
---
Let's get up and running with Appium! To successfully use this quickstart, it's recommended that
you first have read the [Introduction](../intro/index.md), so that you understand the concepts involved in
running Appium and writing Appium scripts.
让我们开始使用Appium! 为了成功使用此快速入门,建议您首先阅读[介绍](../intro/index.md),以便了解运行Appium和编写Appium脚本的概念。
The basic plan for this quickstart is as follows:
此快速入门的基本计划如下:
1. Install Appium
2. Install an Appium driver and its dependencies
- This guide provides instructions for the [UiAutomator2 driver](https://github.com/appium/appium-uiautomator2-driver)
3. Install an Appium client library in your language of choice
- This guide contains options for JavaScript, Python, Java, Ruby, and .NET
4. Write and run a simple Appium automation script using a sample application
1. 安装Appium
2. 安装Appium驱动程序及其依赖项
- 本指南提供了[UiAutomator2 驱动程序](https://github.com/appium/appium-uiautomator2-driver) 的说明
3. 在您选择的语言中安装Appium客户端库
- 本指南包含JavaScript、Python、Java、Ruby和.NET的选项
4. 使用示例应用程序编写并运行简单的Appium自动化脚本
### Requirements
### 系统需求
Before getting started, make sure your system satisfies the
[requirements](../quickstart/requirements.md) for running the Appium server. Additional requirements
will be discussed in conjunction with installing the UiAutomator2 driver. The guide also assumes
you have basic command line proficiency on your platform, for example being able to run commands, set
and persist environment variables, etc...
在开始之前,请确保您的系统满足运行Appium服务器的[要求](../quickstart/requirements.md)。 其他要求将在安装UiAutomator2驱动程序时讨论。 本指南还假设您在平台上具有基本的命令行熟练度,例如能够运行命令、设置和持久化环境变量等...
Now you're ready to get started! So head on over to [Installing Appium](./install.md).
现在您准备开始了! 前往安装[Appium](./install.md)。
+13 -20
View File
@@ -2,42 +2,39 @@
hide:
- toc
title: Install Appium
title: 安装Appium
---
!!! info
!!! 信息
```
Before installing, make sure to check the [System Requirements](./requirements.md).
安装前,请确保检查 [系统要求] (./requirements.md)。
```
Appium can be installed globally using `npm`:
Appium 可以使用 "npm" 在全局安装:
```bash
npm install -g appium
```
!!! note
!!! 备注
```
Other package managers are not currently supported.
目前不支持其他软件包管理。
```
## Starting Appium
## 启动Appium
Appium can be started [using the command line](../reference/cli/index.md):
Appium 可以使用 [命令行](../reference/cli/index.md) 启动:
```
appium
```
This launches the Appium server process, which loads all the installed Appium drivers, and
begins waiting for new session requests from client connections (such as test automation scripts).
Since the server process is independent from its clients, it must be explicitly launched before
attempting to start a new session.
这会启动Appium服务器进程,该进程加载所有已安装的Appium驱动程序,并开始等待来自客户端连接(如测试自动化脚本)的新会话请求。
由于服务器进程独立于其客户端,因此必须在尝试启动新会话之前明确启动它。
When the server is launched, the console log will list all the valid URLs that clients can use to
connect to this server:
当服务器启动时,控制台日志将列出客户端可以用来连接到此服务器的所有有效URL:
```
[Appium] You can provide the following URLs in your client code to connect to this server:
@@ -45,10 +42,6 @@ connect to this server:
(... any other URLs ...)
```
Once a client requests a new session, the Appium server process will start logging all details about
this session until its termination. Keep this in mind - if you ever encounter issues with Appium
tests, you can always check the server log for more details.
一旦客户端请求新会话,Appium服务器进程将开始记录此会话的所有详细信息,直到其终止。 请记住这一点——如果您遇到Appium测试的问题,您可以随时检查服务器日志以获取更多详细信息。
So what's next? Even though Appium is installed and running, it does not come bundled with any
drivers, which means it cannot automate anything yet. We will therefore set up automation for
Android - continue to [Installing the UiAutomator2 Driver](./uiauto2-driver.md).
接下来是什么? 即使Appium已安装并运行,它也不捆绑任何驱动程序,这意味着它还不能自动化任何东西。 因此,我们将为Android设置自动化——继续[安装UiAutomator2驱动程序](./uiauto2-driver.md)。
@@ -1,22 +1,19 @@
---
hide:
- toc
title: Next Steps
title: 下一步
---
Now that you've successfully set up your system for Android automation and run a simple test,
you'll want to continue exploring this documentation. In particular, these are good guides and
reference materials especially for beginners:
现在您已成功为Android自动化设置了系统并运行了一个简单的测试,您将希望继续探索此文档。 特别是,这些是适合初学者的优秀指南和参考资料: 特别是,这些是适合初学者的优秀指南和参考资料:
- The [Ecosystem](../ecosystem/index.md) page: browse the available drivers, clients, plugins, and tools
- [Managing Appium Drivers and Plugins](../guides/managing-exts.md)
- [Capabilities](../guides/caps.md)
- [Settings](../guides/settings.md)
- [生态系统](../ecosystem/index.md) 页面:浏览可用的驱动程序、客户端、插件和工具
- [管理Appium驱动程序和插件](../guides/managing-exts.md)
- [功能](../guides/caps.md)
- [设置](../guides/settings.md)
You'll also find that the [Appium Inspector](https://github.com/appium/appium-inspector) is an
indispensable tool for writing Appium tests, as it enables visual inspection of apps and
helps you to discover element locators for use in your test scripts.
您还会发现[Appium Inspector](https://github.com/appium/appium-inspector)是编写Appium测试不可或缺的工具,因为它允许对应用进行视觉检查,并帮助您发现测试脚本中使用的元素定位器。
You might also take advantage of one of the many online Appium courses available to you.
您还可以利用众多可用的在线Appium课程之一。
Good luck and have fun!
祝您好运,玩得开心!
@@ -2,28 +2,20 @@
hide:
- toc
title: System Requirements
title: 系统要求
---
The basic requirements for the Appium server are:
Appium 服务器的基本要求如下:
- A macOS, Linux, or Windows operating system
- [Node.js](https://nodejs.org) version in the [SemVer](https://semver.org) range `^20.19.0 || ^22.12.0 || >=24.0.0`
- LTS is recommended
- [`npm`](https://npmjs.com) version `>=10` (`npm` is usually bundled with Node.js, but can be upgraded
independently)
- macOS、Linux 或 Windows 操作系统
- [Node.js](https://nodejs.org) 版本在 [SemVer](https://semver.org) 范围 `^20.19.0 || ^22.12.0 || >=24.0.0`
- 推荐使用 LTS 版本
- [`npm`](https://npmjs.com) 版本 `>=10`(`npm` 通常与 Node.js 捆绑,但可以独立升级)
By itself, Appium is relatively lightweight and doesn't have significant disk space or RAM
requirements. It can even be run in resource-constrained environments like Raspberry Pi, so long as
Node.js is available.
Appium 本身相对轻量,没有显著的磁盘空间或 RAM 要求。 即使在资源受限的环境如 Raspberry Pi 中,只要有 Node.js 就可以运行。
### Driver Requirements
### 驱动程序要求
Drivers for automating specific platforms will likely have other requirements. Refer to the
documentation of the [Appium driver(s)](../ecosystem/drivers.md) for that platform for additional
dependencies. It is almost universally the case that Appium drivers for a given platform will
require the developer toolchain and SDKs for that platform to be installed.
用于自动化特定平台的驱动程序可能有其他要求。 请参考该平台的 [Appium 驱动程序](../ecosystem/drivers.md) 文档以获取其他依赖项。 普遍的情况是,给定平台的 Appium 驱动程序需要安装该平台的开发者工具链和 SDK。
In order to assist with driver requirements, each (official) driver comes with the Appium Doctor tool,
which allows to verify if all requirements have been set up. Learn more about how to use this tool in
the [Command-Line Usage documentation](../reference/cli/extensions.md#doctor).
为了帮助处理驱动程序要求,每个(官方)驱动程序都附带 Appium Doctor 工具,它允许验证是否已设置所有要求。 了解如何使用此工具的更多信息,请参阅 [命令行使用文档](../reference/cli/extensions.md#doctor)。
@@ -2,13 +2,13 @@
hide:
- toc
title: Write a Test (.NET)
title: 编写测试 (.NET)
---
The [Appium .NET Client](https://github.com/appium/dotnet-client/) is
an official Appium client in C#. This driver is an extension of the Selenium C# client. It has all the functionalities of the regular driver, but add Appium-specific methods on top of this. The driver is available on the public NuGet Gallery as [Appium.WebDriver](https://www.nuget.org/packages/Appium.WebDriver/).
[Appium .NET Client](https://github.com/appium/dotnet-client/) 是
官方的 Appium C# 客户端。 这个驱动程序是 Selenium C# 客户端的扩展。 它具有常规驱动程序的所有功能,但在之上添加了 Appium 特定的方法。 该驱动程序在公共 NuGet Gallery 上作为 [Appium.WebDriver](https://www.nuget.org/packages/Appium.WebDriver/) 提供。
Now, we get inside the directory and create a new [NUnit](https://nunit.org/) project. We will also add the references to the Appium.Net driver, and other dependencies.
现在,我们进入目录并创建一个新的 [NUnit](https://nunit.org/) 项目。 我们还将添加对 Appium.Net 驱动程序和其他依赖项的引用。
```bash
cd dotnet-client
@@ -16,12 +16,12 @@ dotnet new nunit --name appiumtest
cd appiumtest
# This will install the latest 5.x version
# 这将安装最新的 5.x 版本
dotnet add package Appium.WebDriver --prerelease
dotnet add package Newtonsoft.Json --version 13.0.3
```
Once this is done, your project should have a placeholder file `UnitTest1.cs`. We will replace the code to include the OpenQA namespaces, an initialization of the driver, and the actual test.
完成后,您的项目应该有一个占位符文件 `UnitTest1.cs`。 我们将替换代码以包含 OpenQA 命名空间、驱动程序的初始化以及实际测试。
```C# title="UnitTest1.cs"
using OpenQA.Selenium;
@@ -69,39 +69,31 @@ public class Tests
}
```
!!! note
!!! 备注
```
It's not within the scope of this guide to give a complete run-down on the dotnet client
library or everything that's happening here, so we'll leave the code itself unexplained in
detail for now. You may want to read up particularly on Appium
[Capabilities](../guides/caps.md) in addition to familiarizing yourself with the
[dotnet client driver documentation](https://github.com/appium/dotnet-client/) for a fuller explanation
of the various API commands you see and what their purpose is.
这份指南的范围不包括对 dotnet 客户端库或此处发生的一切进行完整说明,因此我们暂时不对代码本身进行详细解释。您可能需要特别阅读 Appium [Capabilities](../guides/caps.md),以及熟悉 [dotnet 客户端驱动程序文档](https://github.com/appium/dotnet-client/) 以获得对您看到的各种 API 命令及其目的的更全面解释。
```
Basically, this code is doing the following:
基本上,此代码执行以下操作:
1. Defining a set of "Capabilities" (parameters) to send to the Appium server so Appium knows what
kind of thing you want to automate. Some of these parameters can be overridden using environment variables.
2. Starting an Appium session on the built-in Android settings app.
3. Finding the "Apps" list item and clicking it.
4. Ending the Appium session.
1. 定义一组"Capabilities"(参数)发送到 Appium 服务器,以便 Appium 知道您想要自动化什么。 有些参数可以使用环境变量覆盖。
2. 在内置的 Android 设置应用上启动 Appium 会话。
3. 查找"Apps"列表项并点击它。
4. 结束 Appium 会话。
That's it! Let's give it a try. Before you run the test, make sure that you have an Appium server
running in another terminal session, otherwise you'll get an error about not being able to connect
to one. Then, you can execute the script:
就是这样! 让我们试试。 在运行测试之前,请确保在另一个终端会话中运行 Appium 服务器,否则您会收到无法连接的错误。 然后,您可以执行脚本:
```bash
dotnet test
# Example output:
# 示例输出:
# Starting test execution, please wait...
# A total of 1 test files matched the specified pattern.
# Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: 323 ms - appiumtest.dll (net7.0)
```
If all goes well, you'll see the Settings app open up and navigate to the "Apps" view in the emulator before the app closes again.
如果一切顺利,您将看到设置应用打开并在模拟器中导航到"Apps"视图,然后应用再次关闭。
Congratulations, you've started your Appium journey! Read on for some [next steps](./next-steps.md) to explore.
恭喜,您已经开始了 Appium 之旅! 继续阅读一些 [后续步骤](./next-steps.md) 以进行探索。
+11 -13
View File
@@ -1,22 +1,20 @@
---
hide:
- toc
title: Write a Test (Java)
title: 编写测试 (Java)
---
The Appium team maintains an official [client](https://github.com/appium/java-client) for the Java programming language.
It is built on top of [Selenium](https://github.com/SeleniumHQ/selenium).
You can also use this client in your Kotlin projects.
Appium 团队维护了一个官方的 [客户端](https://github.com/appium/java-client) 用于 Java 编程语言。
它建立在 [Selenium](https://github.com/SeleniumHQ/selenium) 之上。
您也可以在 Kotlin 项目中使用此客户端。
Follow the [Add Appium java client to your test framework](https://github.com/appium/java-client#add-appium-java-client-to-your-test-framework)
tutorial in order to connect the library to your test framework sources.
按照 [将 Appium Java 客户端添加到您的测试框架](https://github.com/appium/java-client#add-appium-java-client-to-your-test-framework) 教程将库连接到您的测试框架源代码。
The Appium Java client has dedicated classes to support most of the official Appium drivers. For other drivers
you could simply use the [AppiumDriver](https://github.com/appium/java-client/blob/master/src/main/java/io/appium/java_client/AppiumDriver.java) class
or build your custom derivatives from it. Check the [Drivers Support](https://github.com/appium/java-client#drivers-support)
article to learn more about the current driver class implementations.
Appium Java 客户端具有专用类来支持大多数官方 Appium 驱动程序。 对于其他驱动程序,您可以简单地使用 [AppiumDriver](https://github.com/appium/java-client/blob/master/src/main/java/io/appium/java_client/AppiumDriver.java) 类
或从中构建自定义派生类。 查看 [驱动程序支持](https://github.com/appium/java-client#drivers-support) 文章以了解当前驱动程序类实现的更多信息。
Follow the [Usage Examples](https://github.com/appium/java-client#usage-examples) article in order understand
how to invoke Java client features from your test framework.
按照 [使用示例](https://github.com/appium/java-client#usage-examples) 文章以了解
如何从您的测试框架调用 Java 客户端功能。
Once you've managed to successfully run a test, you can read on for some [next steps](./next-steps.md) to explore.
一旦您成功运行了一个测试,您可以继续阅读一些 [后续步骤](./next-steps.md) 以进行探索。
+17 -32
View File
@@ -2,36 +2,30 @@
hide:
- toc
title: Write a Test (JS)
title: 编写测试 (JS)
---
To write an Appium test in JavaScript (Node.js), we need to choose an Appium-compatible client
library. The best-maintained library and the one the Appium team recommends using is
[WebdriverIO](https://webdriver.io), so let's use that. Since we already have Appium installed we
know our Node and NPM requirements are already satisfied. So just create a new project directory
somewhere on your computer and then initialize a new Node.js project in it:
要在 JavaScript (Node.js) 中编写 Appium 测试,我们需要选择一个与 Appium 兼容的客户端库。 维护最好的库,也是 Appium 团队推荐使用的,是 [WebdriverIO](https://webdriver.io),所以让我们使用它。 由于我们已经安装了 Appium,我们知道我们的 Node 和 NPM 已经满足要求。 所以在您的计算机上某个地方创建一个新的项目目录,然后在其中初始化一个新的 Node.js 项目:
```bash
npm init
```
It doesn't really matter what you put in the prompts, just so long as you end up with a valid
`package.json`.
提示中输入什么并不重要,只要最终得到一个有效的 `package.json`。
Now, install the `webdriverio` package via NPM:
现在,通过 NPM 安装 `webdriverio` 包:
```bash
npm i --save-dev webdriverio
```
Once this is done, your `package.json` file should include a section like the following:
完成后,您的 `package.json` 文件应该包含如下部分:
```json title="package.json"
--8<-- "./sample-code/quickstarts/js/package.json"
```
Now it's time to type up the test itself. Create a new file called `test.js` with the following
contents:
现在是编写测试本身的时候了。 创建一个名为 `test.js` 的新文件,内容如下:
```js title="test.js"
--8<-- "./sample-code/quickstarts/js/test.js"
@@ -40,38 +34,29 @@ contents:
!!! note
```
It's not within the scope of this guide to give a complete run-down on the WebdriverIO client
library or everything that's happening here, so we'll leave the code itself unexplained in
detail for now. You may want to read up particularly on Appium
[Capabilities](../guides/caps.md) in addition to familiarizing yourself with the excellent
[WebdriverIO documentation](https://webdriver.io/docs/gettingstarted) for a fuller explanation
of the various API commands you see and what their purpose is.
这份指南的范围不包括对 WebdriverIO 客户端库或此处发生的一切进行完整说明,因此我们暂时不对代码本身进行详细解释。您可能需要特别阅读 Appium [Capabilities](../guides/caps.md),以及熟悉优秀的 [WebdriverIO 文档](https://webdriver.io/docs/gettingstarted) 以获得对您看到的各种 API 命令及其目的的更全面解释。
```
!!! note
```
The sample code is available from [GitHub Appium repository](https://github.com/appium/appium/tree/master/packages/appium/sample-code/quickstarts/js).
示例代码可从 [GitHub Appium 仓库](https://github.com/appium/appium/tree/master/packages/appium/sample-code/quickstarts/js) 获取。
```
Basically, this code is doing the following:
基本上,此代码执行以下操作:
1. Defining a set of "Capabilities" (parameters) to send to the Appium server so Appium knows what
kind of thing you want to automate.
2. Starting an Appium session on the built-in Android settings app.
3. Finding the "Apps" list item and clicking it.
4. Pausing for a moment purely for visual effect.
5. Ending the Appium session.
1. 定义一组"Capabilities"(参数)发送到 Appium 服务器,以便 Appium 知道您想要自动化什么。
2. 在内置的 Android 设置应用上启动 Appium 会话。
3. 查找"Apps"列表项并点击它。
4. 暂停片刻纯粹为了视觉效果。
5. 结束 Appium 会话。
That's it! Let's give it a try. Before you run the test, make sure that you have an Appium server
running in another terminal session, otherwise you'll get an error about not being able to connect
to one. Then, you can execute the script:
就是这样! 让我们试试。 在运行测试之前,请确保在另一个终端会话中运行 Appium 服务器,否则您会收到无法连接的错误。 然后,您可以执行脚本:
```bash
node test.js
```
If all goes well, you'll see the Settings app open up and navigate to the "Apps" view before the
app closes again.
如果一切顺利,您将看到设置应用打开并导航到"Apps"视图,然后应用再次关闭。
Congratulations, you've started your Appium journey! Read on for some [next steps](./next-steps.md) to explore.
恭喜,您已经开始了 Appium 之旅! 继续阅读一些 [后续步骤](./next-steps.md) 以进行探索。
+22 -28
View File
@@ -2,21 +2,21 @@
hide:
- toc
title: Write a Test (Python)
title: 编写测试 (Python)
---
The [Appium Python Client](https://github.com/appium/python-client) is
an official Appium client in Python, which is available via pypi under the [Appium-Python-Client](https://pypi.org/project/Appium-Python-Client/) package name.
It inherits from the [Selenium Python Binding](https://pypi.org/project/selenium/),
so installing the Appium Python Client includes the selenium binding.
[Appium Python Client](https://github.com/appium/python-client) 是
官方的 Python Appium 客户端,可通过 pypi 以 [Appium-Python-Client](https://pypi.org/project/Appium-Python-Client/) 包名获取。
它继承自 [Selenium Python Binding](https://pypi.org/project/selenium/),
因此安装 Appium Python Client 包括 selenium 绑定。
```bash
pip install Appium-Python-Client
```
This example uses Python's built-in `unittest` module, though you can use any Python test framework you want.
The Appium Python client adds the `appium:` vendor prefix automatically.
You usually do not need to worry about the prefix.
此示例使用 Python 的内置 `unittest` 模块,您也可以使用任何您想要的 Python 测试框架。
Appium Python 客户端自动添加 `appium:` 前缀。
您通常不需要担心前缀。
```python title="test.py"
--8<-- "./sample-code/quickstarts/py/test.py"
@@ -25,39 +25,33 @@ You usually do not need to worry about the prefix.
!!! note
```
It's not within the scope of this guide to give a complete run-down on the Python client
library or everything that's happening here, so we'll leave the code itself unexplained in detail for now.
这份指南的范围不包括对 Python 客户端库或此处发生的一切进行完整说明,因此我们暂时不对代码本身进行详细解释。
- You may want to read up particularly on Appium [Capabilities](../guides/caps.md).
- [functional test code](https://github.com/appium/python-client/tree/master/test/functional) in Python Client GitHub repository should help to find more working example.
- [Documentation](https://appium.github.io/python-client-sphinx/) also helps to find methods
defined in the Appium Python Client.
- 您可能需要特别阅读 Appium [Capabilities](../guides/caps.md)。
- Python Client GitHub 仓库中的 [功能测试代码](https://github.com/appium/python-client/tree/master/test/functional) 应该有助于找到更多工作示例。
- [文档](https://appium.github.io/python-client-sphinx/) 也有助于找到 Appium Python Client 中定义的方法。
```
!!! note
```
The sample code is available from [GitHub Appium repository](https://github.com/appium/appium/tree/master/packages/appium/sample-code/quickstarts/py).
示例代码可从 [GitHub Appium 仓库](https://github.com/appium/appium/tree/master/packages/appium/sample-code/quickstarts/py) 获取。
```
Basically, this code is doing the following:
基本上,此代码执行以下操作:
1. Defining a set of "Capabilities" (parameters) to send to the Appium server so Appium knows what
kind of thing you want to automate.
2. Starting an Appium session on the built-in Android settings app.
3. Finding the "Apps" list item and clicking it.
4. Pausing for a moment purely for visual effect.
5. Ending the Appium session.
1. 定义一组"Capabilities"(参数)发送到 Appium 服务器,以便 Appium 知道您想要自动化什么。
2. 在内置的 Android 设置应用上启动 Appium 会话。
3. 查找"Apps"列表项并点击它。
4. 暂停片刻纯粹为了视觉效果。
5. 结束 Appium 会话。
That's it! Let's give it a try. Before you run the test, make sure that you have an Appium server
running in another terminal session, otherwise you'll get an error about not being able to connect
to one. Then, you can execute the script:
就是这样! 让我们试试。 在运行测试之前,请确保在另一个终端会话中运行 Appium 服务器,否则您会收到无法连接的错误。 然后,您可以执行脚本:
```bash
python test.py
```
If all goes well, you'll see the Settings app open up and navigate to the "Apps" view before the
app closes again.
如果一切顺利,您将看到设置应用打开并导航到"Apps"视图,然后应用再次关闭。
Congratulations, you've started your Appium journey! Read on for some [next steps](./next-steps.md) to explore.
恭喜,您已经开始了 Appium 之旅! 继续阅读一些 [后续步骤](./next-steps.md) 以进行探索。
+26 -31
View File
@@ -2,18 +2,18 @@
hide:
- toc
title: Write a Test (Ruby)
title: 编写测试 (Ruby)
---
The [AppiumLib](https://github.com/appium/ruby_lib) and the [AppiumLibCore](https://github.com/appium/ruby_lib_core) (**recommended**) are official Appium client libraries in Ruby, which are available via gem under the [appium_lib](https://rubygems.org/gems/appium_lib) and the [appium_lib_core](https://rubygems.org/gems/appium_lib_core) package names. The appium_lib_core inherits from the Selenium Ruby Binding, and the appium_lib inherits from the appium_lib_core, so installing these libraries include the selenium binding. We recommend `appium_lib_core` if you need a less complex client-side solution. The `appium_lib` has some useful methods the core does not have, but for the cost of greater complexity and historical methods which may not work in the latest environment.
[AppiumLib](https://github.com/appium/ruby_lib) 和 [AppiumLibCore](https://github.com/appium/ruby_lib_core)(**推荐**)是 Ruby 中的官方 Appium 客户端库,可通过 gem 以 [appium_lib](https://rubygems.org/gems/appium_lib) 和 [appium_lib_core](https://rubygems.org/gems/appium_lib_core) 包名获取。 appium_lib_core 继承自 Selenium Ruby Binding,而 appium_lib 继承自 appium_lib_core,因此安装这些库包括 selenium 绑定。 如果您需要一个不太复杂的客户端解决方案,我们推荐 `appium_lib_core`。 `appium_lib` 有一些核心没有的有用方法,但代价是更大的复杂性和可能在最新环境中不工作的历史方法。
As the first step, let's initialize a Gemfile to manage the dependency:
作为第一步,让我们初始化一个 Gemfile 来管理依赖项:
```bash
bundle init
```
Then, you could add Appium Ruby Client dependency as below:
然后,您可以如下添加 Appium Ruby Client 依赖项:
```bash
bundle add appium_lib_core
@@ -21,24 +21,24 @@ bundle add appium_lib_core
# bundle add appium_lib
```
Test code example below uses `test-unit` module, thus please run:
下面的测试代码示例使用 `test-unit` 模块,因此请运行:
```bash
bundle add test-unit
```
Once these steps has done, your `Gemfile` file should include:
一旦这些步骤完成,您的 `Gemfile` 文件应该包含:
```ruby title="Gemfile"
--8<-- "./sample-code/quickstarts/rb/Gemfile"
```
The `appium_lib_core` is the main part as an Appium client.
`appium_lib` has various helper methods, but the driver instance was ordinary designed to be used as a global variable. It could causes an issue to handle the instance.
`appium_lib_core` does not have such a global variable.
`appium_lib_core` 是作为 Appium 客户端的主要部分。
`appium_lib` 有各种辅助方法,但驱动程序实例通常被设计为全局变量使用。 它可能导致处理实例的问题。
`appium_lib_core` 没有这样的全局变量。
This example is by the `appium_lib_core` with `test-unit` gem module.
Tes code in `appium_lib` should be similar.
此示例使用 `appium_lib_core` 和 `test-unit` gem 模块。
在 `appium_lib` 中的测试代码应该类似。
```ruby title="test.rb"
--8<-- "./sample-code/quickstarts/rb/test.rb"
@@ -47,39 +47,34 @@ Tes code in `appium_lib` should be similar.
!!! note
```
It's not within the scope of this guide to give a complete run-down on the Ruby client
library or everything that's happening here, so we'll leave the code itself unexplained in detail for now.
这份指南的范围不包括对 Ruby 客户端库或此处发生的一切进行完整说明,因此我们暂时不对代码本身进行详细解释。
- You may want to read up particularly on Appium [Capabilities](../guides/caps.md).
- [functional test code](https://github.com/appium/ruby_lib_core/tree/master/test/functional) in the appium_lib_core GitHub repository should help to find more working example.
- Documentation [appium_lib_core](https://www.rubydoc.info/github/appium/ruby_lib_core) and [appium_lib](https://www.rubydoc.info/github/appium/ruby_lib) also helps to find available methods.
- 您可能需要特别阅读 Appium [Capabilities](../guides/caps.md)。
- appium_lib_core GitHub 仓库中的 [功能测试代码](https://github.com/appium/ruby_lib_core/tree/master/test/functional) 应该有助于找到更多工作示例。
- 文档 [appium_lib_core](https://www.rubydoc.info/github/appium/ruby_lib_core) 和 [appium_lib](https://www.rubydoc.info/github/appium/ruby_lib) 也有助于找到可用方法。
```
!!! note
```
The sample code is available from [GitHub Appium repository](https://github.com/appium/appium/tree/master/packages/appium/sample-code/quickstarts/rb).
示例代码可从 [GitHub Appium 仓库](https://github.com/appium/appium/tree/master/packages/appium/sample-code/quickstarts/rb) 获取。
```
Basically, this code is doing the following:
基本上,此代码执行以下操作:
1. Defining a set of "Capabilities" (parameters) to send to the Appium server so Appium knows what
kind of thing you want to automate.
2. Starting an Appium session on the built-in Android settings app.
3. Finding the "Apps" list item and clicking it.
4. Pausing for a moment purely for visual effect.
5. Ending the Appium session.
1. 定义一组"Capabilities"(参数)发送到 Appium 服务器,以便 Appium 知道您想要自动化什么。
2. 在内置的 Android 设置应用上启动 Appium 会话。
3. 查找"Apps"列表项并点击它。
4. 暂停片刻纯粹为了视觉效果。
5. 结束 Appium 会话。
That's it! Let's give it a try. Before you run the test, make sure that you have an Appium server
running in another terminal session, otherwise you'll get an error about not being able to connect
to one. Then, you can execute the script:
就是这样! 让我们试试。 在运行测试之前,请确保在另一个终端会话中运行 Appium 服务器,否则您会收到无法连接的错误。 然后,您可以执行脚本:
```bash
# Please run "bundle install" first if your environment has not run the installation command yet.
# 如果您的环境尚未运行安装命令,请先运行 "bundle install"。
bundle exec ruby test.rb
```
If all goes well, you'll see the Settings app open up and navigate to the "Apps" view before the
app closes again.
如果一切顺利,您将看到设置应用打开并导航到"Apps"视图,然后应用再次关闭。
Congratulations, you've started your Appium journey! Read on for some [next steps](./next-steps.md) to explore.
恭喜,您已经开始了 Appium 之旅! 继续阅读一些 [后续步骤](./next-steps.md) 以进行探索。
@@ -8,8 +8,8 @@ title: Appium Protocol
}
</style>
The following is a list of endpoints used in Appium that are defined in the Appium extension of the
W3C WebDriver protocol.
The following is a list of endpoints supported in Appium, that are defined in the Appium extension
of the W3C WebDriver protocol.
### getAppiumSessions
@@ -9,7 +9,7 @@ title: JSON Wire Protocol
</style>
The following is a list of legacy [JSON Wire Protocol (JSONWP)](https://www.selenium.dev/documentation/legacy/json_wire_protocol/)
endpoints used in Appium.
endpoints supported in Appium.
### getSession
@@ -9,7 +9,7 @@ title: Mobile JSON Wire Protocol
</style>
The following is a list of legacy [Mobile JSON Wire Protocol (MJSONWP)](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md)
endpoints used in Appium.
endpoints supported in Appium.
### getRotation
+439 -2
View File
@@ -8,7 +8,7 @@ title: Other Protocols
}
</style>
The following is a list of endpoints used in Appium that are defined in other protocols.
The following is a list of endpoints supported in Appium that are defined in other protocols.
## Chromedriver Protocol
@@ -41,6 +41,441 @@ for a list of available methods and their parameters.
`any` - the result of executing the CDP method
## Compute Pressure Protocol
The [Compute Pressure protocol](https://www.w3.org/TR/compute-pressure/) is an extension of the W3C
WebDriver protocol.
### createVirtualPressureSource
```
POST /session/:sessionId/pressuresource
```
> Compute Pressure documentation: [Create Virtual Pressure Source](https://www.w3.org/TR/compute-pressure/#create-virtual-pressure-source)
Creates a new virtual pressure source.
#### Parameters
| <div style="width:6em">Name</div> | Description | Type | Default |
| --------------------------------- | ------------------------------------------------------------- | ------- | ------- |
| `type` | Type of pressure source to create | string | |
| `supported?` | Whether the pressure source should be configured as supported | boolean | `true` |
#### Response
`null`
### updateVirtualPressureSource
```
POST /session/:sessionId/pressuresource/:pressureSourceType
```
> Compute Pressure documentation: [Update Virtual Pressure Source](https://www.w3.org/TR/compute-pressure/#update-virtual-pressure-source)
Updates the state of a virtual pressure source with the type identified by `:pressureSourceType`.
#### Parameters
| Name | Description | Type |
| -------- | ----------------------------------------------------------------------------------------------------------------- | ------ |
| `sample` | Pressure state. Supported values are `nominal`, `fair`, `serious`, or `critical`. | string |
#### Response
`null`
### deleteVirtualPressureSource
```
DELETE /session/:sessionId/pressuresource/:pressureSourceType
```
> Compute Pressure documentation: [Delete Virtual Pressure Source](https://www.w3.org/TR/compute-pressure/#delete-virtual-pressure-source)
Deletes the virtual pressure source with the type identified by `:pressureSourceType`.
#### Response
`null`
## Custom Handlers Protocol
The [Custom Handlers protocol](https://html.spec.whatwg.org/multipage/system-state.html#user-agent-automation)
is an extension of the W3C WebDriver protocol, defined by the HTML Standard specification.
### setRPHRegistrationMode
```
POST /session/:sessionId/custom-handlers/set-mode
```
> Custom Handlers documentation: [Set RPH Registration Mode](https://html.spec.whatwg.org/multipage/system-state.html#user-agent-automation)
Sets the protocol handler automation mode, for processing registrations of custom protocol handlers.
By default, this mode is set to `none`.
#### Parameters
| Name | Description | Type |
| ------ | ------------------------------------------------------------------------------------------------------------------- | ------ |
| `mode` | Automation mode to set. Supported values are `autoAccept`, `autoReject`, or `none`. | string |
#### Response
`null`
## Device Posture Protocol
The [Device Posture protocol](https://www.w3.org/TR/device-posture/) is an extension of the W3C
WebDriver protocol.
### setDevicePosture
```
POST /session/:sessionId/deviceposture
```
> Device Posture documentation: [Set Device Posture](https://www.w3.org/TR/device-posture/#set-device-posture)
Sets the device posture, overriding the posture set by the device hardware.
#### Parameters
| Name | Description | Type |
| --------- | ------------------------------------------------------------------------------------------------------------------------- | ------ |
| `posture` | Posture to which the device should be set. Supported values are `continuous` or `folded`. | string |
#### Response
`null`
### clearDevicePosture
```
DELETE /session/:sessionId/deviceposture
```
> Device Posture documentation: [Clear Device Posture](https://www.w3.org/TR/device-posture/#clear-device-posture)
Clears the previously set device posture, returning posture control back to the device hardware.
#### Response
`null`
## Federated Credential Management Protocol
The [Federated Credential Management protocol](https://www.w3.org/TR/fedcm-1) (FedCM) is an
extension of the W3C WebDriver protocol. Clients can enable this protocol by using the
[`fedcm:accounts`](https://www.w3.org/TR/fedcm-1/#webdriver-capability) capability.
### fedCMCancelDialog
```
POST /session/:sessionId/fedcm/canceldialog
```
> FedCM documentation: [Cancel Dialog](https://www.w3.org/TR/fedcm-1/#webdriver-canceldialog)
Cancels the currently open FedCM dialog.
#### Response
`null`
### fedCMSelectAccount
```
POST /session/:sessionId/fedcm/selectaccount
```
> FedCM documentation: [Select Account](https://www.w3.org/TR/fedcm-1/#webdriver-selectaccount)
Selects an account to use for the currently open FedCM dialog.
#### Parameters
| Name | Description | Type |
| -------------- | ------------------------------------------------------ | ------ |
| `accountIndex` | Index of the account in the list of available accounts | number |
#### Response
`null`
### fedCMClickDialogButton
```
POST /session/:sessionId/fedcm/clickdialogbutton
```
> FedCM documentation: [Click Dialog Button](https://www.w3.org/TR/fedcm-1/#webdriver-clickdialogbutton)
Clicks a button in the currently open FedCM dialog.
#### Parameters
| Name | Description | Type |
| -------------- | ------------------------------------------------------------------------------------------------------------ | ------ |
| `dialogButton` | Identifier of the button to click. Must be set to `ConfirmIdpLoginContinue`. | string |
#### Response
`null`
### fedCMGetAccounts
```
GET /session/:sessionId/fedcm/accountlist
```
> FedCM documentation: [Account List](https://www.w3.org/TR/fedcm-1/#webdriver-accountlist)
Retrieves all accounts that the user can select in the currently open FedCM dialog.
#### Response
`FedCMAccount[]` - an array of objects, where each object includes the following properties:
| <div style="width:10em">Name</div> | Description | Type |
| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ------ |
| `accountId` | Account ID | string |
| `email` | Account email | string |
| `name` | Account name | string |
| `givenName?` | Account given name | string |
| `pictureUrl?` | Account picture URL | string |
| `idpConfigUrl` | URL of the identity provider configuration file | string |
| `loginState` | Login state. Set to `SignUp` if the account is not connected, otherwise `SignIn`. | string |
| `termsOfServiceUrl?` | Terms of Service URL of the website, if `loginState` is set to `SignUp` | string |
| `privacyPolicyUrl?` | Privacy Policy URL of the website, if `loginState` is set to `SignUp` | string |
### fedCMGetTitle
```
GET /session/:sessionId/fedcm/gettitle
```
> FedCM documentation: [Get Title](https://www.w3.org/TR/fedcm-1/#webdriver-gettitle)
Retrieves the title and subtitle (if one exists) of the currently open FedCM dialog.
#### Response
`FedCMDialogTitle` - an object with the following properties:
| Name | Description | Type |
| ----------- | --------------- | ------ |
| `title` | Dialog title | string |
| `subtitle?` | Dialog subtitle | string |
### fedCMGetDialogType
```
GET /session/:sessionId/fedcm/getdialogtype
```
> FedCM documentation: [Get Dialog Type](https://www.w3.org/TR/fedcm-1/#webdriver-getdialogtype)
Retrieves the type of the currently open FedCM dialog.
#### Response
`string` - can be set to `AutoReauthn`, `AccountChooser`, or `ConfirmIdpLogin`
### fedCMSetDelayEnabled
```
POST /session/:sessionId/fedcm/setdelayenabled
```
> FedCM documentation: [Set Delay Enabled](https://www.w3.org/TR/fedcm-1/#webdriver-setdelayenabled)
Sets the state of the promise rejection delay, which is used to prevent information leakage about
the logged in state of the user.
#### Parameters
| Name | Description | Type |
| --------- | --------------------------------------------- | ------- |
| `enabled` | Whether to enable the promise rejection delay | boolean |
#### Response
`null`
### fedCMResetCooldown
```
POST /session/:sessionId/fedcm/resetcooldown
```
> FedCM documentation: [Reset Cooldown](https://www.w3.org/TR/fedcm-1/#webdriver-resetcooldown)
Resets the cooldown delay used after dismissing a FedCM dialog.
#### Response
`null`
## Generic Sensor Protocol
The [Generic Sensor protocol](https://www.w3.org/TR/generic-sensor/) is an extension of the W3C
WebDriver protocol.
### createVirtualSensor
```
POST /session/:sessionId/sensor
```
> Generic Sensor documentation: [Create Virtual Sensor](https://www.w3.org/TR/generic-sensor/#create-virtual-sensor-command)
Creates a new virtual sensor.
#### Parameters
| <div style="width:12em">Name</div> | Description | Type | Default |
| ---------------------------------- | ---------------------------------------------------- | ------- | ------- |
| `type` | Type of sensor to create | string | |
| `connected?` | Whether the sensor should be configured as connected | boolean | `true` |
| `maxSamplingFrequency?` | Maximum sensor sampling frequency | number | |
| `minSamplingFrequency?` | Minimum sensor sampling frequency | number | |
#### Response
`null`
### getVirtualSensorInfo
```
GET /session/:sessionId/sensor/:sensorType
```
> Generic Sensor documentation: [Get Virtual Sensor Information](https://www.w3.org/TR/generic-sensor/#get-virtual-sensor-information-command)
Retrieves information about the virtual sensor with the type identified by `:sensorType`.
#### Response
`GetVirtualSensorInfoResponse` - an object containing the `requestedSamplingFrequency` key, whose
value is the requested sampling frequency of the sensor type
### updateVirtualSensorReading
```
POST /session/:sessionId/sensor/:sensorType
```
> Generic Sensor documentation: [Update Virtual Sensor Reading](https://www.w3.org/TR/generic-sensor/#update-virtual-sensor-reading-command)
Updates the virtual sensor with the type identified by `:sensorType` with a new reading.
#### Parameters
| Name | Description | Type |
| --------- | ---------------------------------------------------------------- | ------ |
| `reading` | Object containing reading properties specific to the sensor type | object |
#### Response
`null`
### deleteVirtualSensor
```
DELETE /session/:sessionId/sensor/:sensorType
```
> Generic Sensor documentation: [Delete Virtual Sensor](https://www.w3.org/TR/generic-sensor/#delete-virtual-sensor-command)
Deletes the virtual sensor with the type identified by `:sensorType`.
#### Response
`null`
## Permissions Protocol
The [Permissions protocol](https://www.w3.org/TR/permissions/) is an extension of the W3C WebDriver
protocol.
### setPermissions
```
POST /session/:sessionId/permissions
```
> Permissions documentation: [Set Permission](https://www.w3.org/TR/permissions/#webdriver-command-set-permission)
Simulates user modification of the permission state of a PermissionDescriptor (a permissible feature
with optional additional properties).
#### Parameters
| <div style="width:6em">Name</div> | Description | Type |
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
| `descriptor` | Object specifying the feature name in its `name` key, along with any other keys for additional properties | object |
| `state` | New permission state for this descriptor. Supported values are: `granted`, `denied`, or `prompt`. | string |
#### Response
`null`
## Reporting Protocol
The [Reporting protocol](https://www.w3.org/TR/reporting-1/) is an extension of the W3C WebDriver
protocol.
### generateTestReport
```
POST /session/:sessionId/reporting/generate_test_report
```
> Reporting documentation: [Generate Test Report](https://www.w3.org/TR/reporting-1/#generate-test-report-command)
Simulates the generation of a test report, which can be retrieved by registered reporting observers.
#### Parameters
| Name | Description | Type | Default |
| --------- | ------------------------------------------ | ------ | --------- |
| `message` | Message displayed in the report | string | |
| `group?` | Destination group to deliver the report to | string | `default` |
#### Response
`null`
## Secure Payment Confirmation Protocol
The [Secure Payment Confirmation protocol](https://www.w3.org/TR/secure-payment-confirmation) (SPC)
is an extension of the W3C WebDriver protocol.
### setSPCTransactionMode
```
POST /session/:sessionId/secure-payment-confirmation/set-mode
```
> SPC documentation: [Set SPC Transaction Mode](https://www.w3.org/TR/secure-payment-confirmation/#sctn-automation-set-spc-transaction-mode)
Sets the transaction automation mode, for automated handling of transaction confirmation prompts.
By default, this mode is set to `none`.
#### Parameters
| Name | Description | Type |
| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
| `mode` | Automation mode to set. Supported values are `autoAccept`, `autoChooseToAuthAnotherWay`, `autoReject`, or `autoOptOut`. | string |
#### Response
`null`
## Selenium Protocol
The Selenium protocol is an extension of the W3C WebDriver protocol, supported in Appium clients
@@ -92,7 +527,9 @@ Retrieves the available log types that can be used to call the [`getLog`](#getlo
## Web Authentication Protocol
The [Web Authentication protocol](https://w3c.github.io/webauthn/) (WebAuthn) is an extension of
the W3C WebDriver protocol.
the W3C WebDriver protocol. Clients can enable this protocol by using the
[`webauthn:virtualAuthenticators`](https://w3c.github.io/webauthn/#sctn-automation-webdriver-capability)
capability.
### addVirtualAuthenticator
@@ -9,7 +9,7 @@ title: WebDriver Protocol
</style>
The following is a list of [W3C WebDriver protocol](https://w3c.github.io/webdriver/) endpoints
used in Appium.
supported in Appium.
!!! info
@@ -1070,3 +1070,45 @@ identified by `:elementId`.
#### Response
`string` - a base64-encoded PNG image
### printPage
```
POST /session/:sessionId/print
```
> WebDriver documentation: [Print Page](https://w3c.github.io/webdriver/#print-page)
Prints the page by rendering it as a paginated PDF document.
#### Parameters
| <div style="width:7em">Name</div> | Description | <div style="width:9em">Type</div> | Default |
| --------------------------------- | ------------------------------------------------------------------------------------------------- | --------------------------------------- | ---------- |
| `orientation?` | Page orientation. Supported values are `portrait` or `landscape`. | string | `portrait` |
| `scale?` | Page scale. Supported values are in the range `[0.1, 2]`. | number | `1` |
| `background?` | Whether to include background images | boolean | `false` |
| `page?` | Object specifying the page width and height | [`PrintPageSize`](#printpagesize) | `{}` |
| `margin?` | Object specifying the page margins | [`PrintPageMargins`](#printpagemargins) | `{}` |
| `shrinkToFit?` | Whether to resize page contents to match `PrintPageSize.width` | boolean | `true` |
| `pageRanges?` | Array of pages to be printed, for example, `[1, 4, '8-9']` | array | `[]` |
##### `PrintPageSize`
| Name | Description | Type | Default |
| --------- | -------------------------------------------------------------------------------------------- | ------ | ------- |
| `width?` | Page width. Must be greater than or equal to `(2.54 / 72)`. | number | `21.59` |
| `height?` | Page height. Must be greater than or equal to `(2.54 / 72)`. | number | `27.94` |
##### `PrintPageMargins`
| Name | Description | Type | Default |
| --------- | ----------------------------------------------------------------------------------------- | ------ | ------- |
| `top?` | Page top margin. Must be greater than or equal to `0`. | number | `1` |
| `bottom?` | Page bottom margin. Must be greater than or equal to `0`. | number | `1` |
| `left?` | Page left margin. Must be greater than or equal to `0`. | number | `1` |
| `right?` | Page right margin. Must be greater than or equal to `0`. | number | `1` |
#### Response
`string` - a base64-encoded PDF document
@@ -21,7 +21,7 @@ mentioned below.
Installs the following extensions for browser webview testing:
- Drivers: `safari`[^1], `gecko`, `chromium`
- Plugins: `images`
- Plugins: `images`, `inspector`
#### Usage
@@ -34,7 +34,7 @@ appium setup browser
Installs the following extensions for desktop application testing:
- Drivers: `mac2`[^1], `windows`[^2]
- Plugins: `images`
- Plugins: `images`, `inspector`
#### Usage
@@ -47,7 +47,7 @@ appium setup desktop
Installs the following extensions for mobile testing:
- Drivers: `uiautomator2`, `xcuitest`[^1], `espresso`
- Plugins: `images`
- Plugins: `images`, `inspector`
#### Usage
+1 -1
View File
@@ -34,7 +34,7 @@ const DRIVERS_ONLY_WINDOWS = ['windows'];
/**
* Plugin names listed in KNOWN_PLUGINS to install by default.
*/
export const DEFAULT_PLUGINS = ['images'];
export const DEFAULT_PLUGINS = ['images', 'inspector'];
/**
* Return a list of drivers available for current host platform.
+1 -1
View File
@@ -118,7 +118,7 @@ function executeMethodMapToCommandsInfo(emm: ExecuteMethodMap<any>): RestMethods
const result: RestMethodsToCommandsMap = {};
for (const [name, info] of _.toPairs(emm)) {
result[name] = {
command: info.command,
command: info.command as string,
deprecated: info.deprecated,
info: info.info,
params: toRestCommandParams(info.params),
+7 -5
View File
@@ -27,7 +27,7 @@ import {
} from './config';
import {readConfigFile} from './config-file';
import {loadExtensions, getActivePlugins, getActiveDrivers} from './extension';
import {SERVER_SUBCOMMAND, LONG_STACKTRACE_LIMIT} from './constants';
import {SERVER_SUBCOMMAND, LONG_STACKTRACE_LIMIT, BIDI_BASE_PATH} from './constants';
import registerNode from './grid-register';
import {getDefaultsForSchema, validate as validateSchema} from './schema/schema';
import {
@@ -400,6 +400,7 @@ async function main(args) {
extraMethodMap,
cliArgs: parsedArgs,
};
const normalizedBasePath = normalizeBasePath(parsedArgs.basePath);
for (const timeoutArgName of ['keepAliveTimeout', 'requestTimeout']) {
if (_.isInteger(parsedArgs[timeoutArgName])) {
serverOpts[timeoutArgName] = parsedArgs[timeoutArgName] * 1000;
@@ -411,8 +412,9 @@ async function main(args) {
bidiServer.on('error', appiumDriver.onBidiServerError.bind(appiumDriver));
try {
server = await baseServer(serverOpts);
server.addWebSocketHandler('/bidi', bidiServer);
server.addWebSocketHandler('/bidi/:sessionId', bidiServer);
const bidiBasePath = `${normalizedBasePath}${BIDI_BASE_PATH}`;
server.addWebSocketHandler(bidiBasePath, bidiServer);
server.addWebSocketHandler(`${bidiBasePath}/:sessionId`, bidiServer);
} catch (err) {
logger.error(
`Could not configure Appium server. It's possible that a driver or plugin tried ` +
@@ -438,7 +440,7 @@ async function main(args) {
parsedArgs.nodeconfig,
parsedArgs.address,
parsedArgs.port,
parsedArgs.basePath,
normalizedBasePath,
);
}
} catch (err) {
@@ -464,7 +466,7 @@ async function main(args) {
const protocol = server.isSecure() ? 'https' : 'http';
const address = net.isIPv6(parsedArgs.address) ? `[${parsedArgs.address}]` : parsedArgs.address;
logServerAddress(
`${protocol}://${address}:${parsedArgs.port}${normalizeBasePath(parsedArgs.basePath)}`,
`${protocol}://${address}:${parsedArgs.port}${normalizedBasePath}`,
);
driverConfig.print();
-5
View File
@@ -484,11 +484,6 @@ export function isBroadcastIp(address) {
* @typedef {import('@appium/types').ConstraintsToCaps<C>} ConstraintsToCaps
*/
/**
* @template T
* @typedef {import('type-fest').StringKeyOf<T>} StringKeyOf
*/
/**
* @typedef {import('@appium/types').Constraints} Constraints
*/
+12 -12
View File
@@ -1,6 +1,6 @@
{
"name": "appium",
"version": "3.0.2",
"version": "3.1.0",
"description": "Automation for Apps.",
"keywords": [
"automation",
@@ -60,32 +60,32 @@
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@appium/base-driver": "^10.0.1",
"@appium/base-plugin": "^3.0.2",
"@appium/docutils": "^2.1.0",
"@appium/logger": "^2.0.1",
"@appium/base-driver": "^10.1.0",
"@appium/base-plugin": "^3.0.3",
"@appium/docutils": "^2.1.1",
"@appium/logger": "^2.0.2",
"@appium/schema": "^1.0.0",
"@appium/support": "^7.0.1",
"@appium/types": "^1.0.1",
"@appium/support": "^7.0.2",
"@appium/types": "^1.1.0",
"@sidvind/better-ajv-errors": "4.0.0",
"ajv": "8.17.1",
"ajv-formats": "3.0.1",
"argparse": "2.0.1",
"async-lock": "1.4.1",
"asyncbox": "3.0.0",
"axios": "1.11.0",
"axios": "1.12.2",
"bluebird": "3.7.2",
"lilconfig": "3.1.3",
"lodash": "4.17.21",
"lru-cache": "11.2.1",
"lru-cache": "11.2.2",
"ora": "5.4.1",
"package-changed": "3.0.0",
"resolve-from": "5.0.0",
"semver": "7.7.2",
"semver": "7.7.3",
"source-map-support": "0.5.21",
"teen_process": "3.0.1",
"type-fest": "4.41.0",
"winston": "3.17.0",
"type-fest": "5.0.1",
"winston": "3.18.3",
"wrap-ansi": "7.0.0",
"ws": "8.18.3",
"yaml": "2.8.1"
@@ -1,5 +1,5 @@
{
"devDependencies": {
"webdriverio": "9.19.2"
"webdriverio": "9.20.0"
}
}
@@ -111,14 +111,9 @@ describe('Driver CLI', function () {
});
it('should show updates for installed drivers with --updates', async function () {
if (process.env.CI) {
// FIXME XXX this test won't work until multiple versions of fake driver have been
// published which support appium 3
return this.skip();
}
if (system.isWindows()) {
// TODO figure out why this isn't working on windows
// TODO: Windows path handling may need fixes in npm exec or extension command parsing
return this.skip();
}
const versions = /** @type {string[]} */ (
@@ -143,7 +138,10 @@ describe('Driver CLI', function () {
/** @type {Record<string,import('appium/lib/cli/extension-command').InstalledExtensionListData>} */ (
await runList(['--updates'])
);
const updateVersion = String(fake.updateVersion || fake.unsafeUpdateVersion);
const updateVersion = fake.updateVersion || fake.unsafeUpdateVersion;
if (!updateVersion) {
throw new Error(`No update version found. Expected an update from ${penultimateFakeDriverVersionAsOfRightNow} to a newer version, but got null. This might indicate the update check is not working properly.`);
}
util.compareVersions(
String(updateVersion),
'>',
@@ -641,6 +641,39 @@ describe('FakeDriver via HTTP', function () {
result.should.eql('this is from bidi');
});
});
describe('Bidi protocol with base path', function () {
const basePath = '/wd/hub';
withServer({basePath});
const capabilities = {...caps, webSocketUrl: true, 'appium:runClock': true};
/** @type import('webdriverio').Browser **/
let driver;
beforeEach(async function () {
driver = await wdio({...wdOpts, path: basePath, capabilities});
});
afterEach(async function () {
if (driver) {
await driver.deleteSession();
}
});
it('should respond with bidi specific capability when a driver supports it', async function () {
should.exist(driver.capabilities.webSocketUrl);
});
it('should interpret the bidi protocol and let the driver handle it by command', async function () {
should.not.exist(await driver.getUrl());
await driver.browsingContextNavigate({
context: 'foo',
url: 'https://appium.io',
wait: 'complete',
});
await driver.getUrl().should.eventually.eql('https://appium.io');
});
});
});
describe('Bidi over SSL', function () {
+1 -1
View File
@@ -121,7 +121,7 @@ async function _runAppiumJson(appiumHome, args) {
/**
* Runs the `appium` executable with the given args in JSON mode.
* Will reject with the contents of `STDOUT` (which were to be pasred) if parsing into JSON fails.
* Will reject with the contents of `STDOUT` (which were to be parsed) if parsing into JSON fails.
*
* The caller must wrap the call (in parens) with a docstring containing a return type.
* i.e., add `@type {MyType}` tag.
+1 -1
View File
@@ -3,7 +3,7 @@ import _ from 'lodash';
import { AppiumConfigJsonSchema } from '@appium/schema';
// this must be a `require` because babel will not compile `node_modules`
// TOOD: consider just copying this into fixtures so we can make it ESM
// TODO: consider just copying this into fixtures so we can make it ESM
const {default: fakeDriverSchema} = require('@appium/fake-driver/build/lib/fake-driver-schema');
const schema = _.cloneDeep(AppiumConfigJsonSchema);
@@ -549,7 +549,7 @@ describe('Manifest', function () {
expect(manifest.getExtensionData(DRIVER_TYPE)).to.have.property('myDriver');
});
describe('when the underyling implementation emits "error"', function () {
describe('when the underlying implementation emits "error"', function () {
beforeEach(function () {
// @ts-expect-error
MockGlob.callsFake(() => {
+15
View File
@@ -3,6 +3,21 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [10.1.0](https://github.com/appium/appium/compare/@appium/base-driver@10.0.1...@appium/base-driver@10.1.0) (2025-10-08)
### Features
* add 21 WebDriver extension endpoints ([#21577](https://github.com/appium/appium/issues/21577)) ([7f906fc](https://github.com/appium/appium/commit/7f906fcf9a0dd84f348b0b3a79da818281f21835))
* add W3C printPage endpoint ([#21576](https://github.com/appium/appium/issues/21576)) ([cbea4f2](https://github.com/appium/appium/commit/cbea4f2e97d2d291bd67fd98359b37caab1b21fa))
### Bug Fixes
* **base-driver,relaxed-caps-plugin,types:** add missing W3C caps ([#21642](https://github.com/appium/appium/issues/21642)) ([e6635b7](https://github.com/appium/appium/commit/e6635b737d0f42d8fd38c3d8bea70067d2e7c87a))
## [10.0.1](https://github.com/appium/appium/compare/@appium/base-driver@10.0.0...@appium/base-driver@10.0.1) (2025-09-09)
@@ -68,7 +68,7 @@ GET | `session/{sessionId}/alert_text` | G
POST | `session/{sessionId}/alert_text` | Sends keystrokes to the currently displayed dialog
POST | `session/{sessionId}/accept_alert` | Accepts the currently displayed alert dialog.
POST | `session/{sessionId}/dismiss_alert` | Dismisses the currently displayed alert dialog.
POST | `session/{sessionId}/moveto` | Move the pointer by an offset of the specificed element.
POST | `session/{sessionId}/moveto` | Move the pointer by an offset of the specified element.
POST | `session/{sessionId}/click` | Click on the current pointer position.
POST | `session/{sessionId}/touch/click` | Single tap on the touch enabled device.
POST | `session/{sessionId}/touch/down` | Finger down on the screen.
@@ -112,14 +112,14 @@ POST | `session/{sessionId}/appium/device/is_locked` | C
POST | `session/{sessionId}/appium/start_recording_screen` | start recording the screen.
POST | `session/{sessionId}/appium/stop_recording_screen` | stop recording the screen.
POST | `session/{sessionId}/appium/performanceData/types` | returns the information types of the system state which is supported to read as like cpu, memory, network traffic, and battery.
POST | `session/{sessionId}/appium/getPerformanceData` | returns the information of the system state which is supported to read as like cpu, memory, network traffic, and battery.
POST | `session/{sessionId}/appium/getPerformanceData` | returns the information of the system state which is supported to read as like cpu, memory, network traffic, and battery.
POST | `session/{sessionId}/appium/device/press_keycode` | Press a particular key code on the device.
POST | `session/{sessionId}/appium/device/long_press_keycode` | Press and hold a particular key code on the device.
POST | `session/{sessionId}/appium/device/keyevent` | Send a key code to the device.
GET | `session/{sessionId}/appium/device/current_activity` | Retrieve the current activity running on the device.
GET | `session/{sessionId}/appium/device/current_package` | Retrieve the current package running on the device.
POST | `session/{sessionId}/appium/device/install_app` | Install the given app onto the device.
POST | `session/{sessionId}/appium/device/remove_app` | Remote an app from the device.
POST | `session/{sessionId}/appium/device/remove_app` | Remove an app from the device.
POST | `session/{sessionId}/appium/device/app_installed` | Check whether the specified app is installed on the device.
POST | `session/{sessionId}/appium/device/hide_keyboard` | Hide the soft keyboard.
GET | `session/{sessionId}/appium/device/is_keyboard_shown` | Whether or not the soft keyboard is shown.
@@ -6,7 +6,7 @@ import type {
StandardCapabilities,
} from '@appium/types';
import type {
StringKeyOf,
KeyAsString,
MergeExclusive,
} from 'type-fest';
import _ from 'lodash';
@@ -112,7 +112,7 @@ export function validateCaps<C extends Constraints>(
/**
* Standard, non-prefixed capabilities
* @see https://www.w3.org/TR/webdriver/#dfn-table-of-standard-capabilities)
* @see https://www.w3.org/TR/webdriver2/#dfn-table-of-standard-capabilities)
*/
export const STANDARD_CAPS = Object.freeze(
new Set(
@@ -125,9 +125,11 @@ export const STANDARD_CAPS = Object.freeze(
'proxy',
'setWindowRect',
'timeouts',
'strictFileInteractability',
'unhandledPromptBehavior',
'userAgent',
'webSocketUrl',
]) as StringKeyOf<StandardCapabilities>[]
]) as KeyAsString<StandardCapabilities>[]
)
);
@@ -155,7 +157,7 @@ export function stripAppiumPrefixes<C extends Constraints>(caps: NSCapabilities<
// Strip out the 'appium:' prefix
for (const prefixedCap of prefixedCaps) {
const strippedCapName = prefixedCap.substring(APPIUM_VENDOR_PREFIX.length) as StringKeyOf<Capabilities<C>>;
const strippedCapName = prefixedCap.substring(APPIUM_VENDOR_PREFIX.length) as KeyAsString<Capabilities<C>>;
// If it's standard capability that was prefixed, add it to an array of incorrectly prefixed capabilities
if (isStandardCap(strippedCapName)) {
@@ -59,13 +59,13 @@ process.on('exit', () => {
});
/**
* Perform inital application package configuration
* Perform initial application package configuration
* to prepare it for the further consumption by a driver:
*
* - Manages caching logic
* - Downloads the app from a remote URL to the local filesystem
* - Determines package name
* - Checks basic requiremenets on the application package
* - Checks basic requirements on the application package
*
* @param {string} app
* @param {string|string[]|import('@appium/types').ConfigureAppOptions} options
@@ -3,7 +3,7 @@
import _ from 'lodash';
/**
* Determine whether the given agument is valid
* Determine whether the given argument is valid
* W3C capabilities instance.
*
* @param {any} caps
@@ -59,7 +59,7 @@ export function fixCaps(oldCaps, desiredCapConstraints, log) {
}
// int capabilities are often sent in as strings by frameworks
let intCaps = /** @type {import('type-fest').StringKeyOf<typeof caps>[]} */ (
let intCaps = /** @type {import('type-fest').KeyAsString<typeof caps>[]} */ (
_.keys(_.pickBy(desiredCapConstraints, (k) => k.isNumber === true))
);
for (let cap of intCaps) {
+267 -171
View File
@@ -16,14 +16,8 @@ const COMMAND_NAMES_CACHE = new LRUCache({
*/
export const METHOD_MAP = /** @type {const} */ ({
//
// W3C WebDriver
// https://www.w3.org/TR/webdriver1/
// #region W3C WebDriver
// https://www.w3.org/TR/webdriver2/
//
'/status': {
GET: {command: 'getStatus'},
},
'/session': {
POST: {
command: 'createSession',
@@ -33,10 +27,13 @@ export const METHOD_MAP = /** @type {const} */ ({
},
},
'/session/:sessionId': {
// TODO: Decide on the future of this route later
// TODO: JSONWP route, remove in the future
GET: {command: 'getSession', deprecated: true},
DELETE: {command: 'deleteSession'},
},
'/status': {
GET: {command: 'getStatus'},
},
'/session/:sessionId/timeouts': {
GET: {command: 'getTimeouts'},
POST: {
@@ -46,9 +43,6 @@ export const METHOD_MAP = /** @type {const} */ ({
},
},
},
'/session/:sessionId/window/handles': {
GET: {command: 'getWindowHandles'},
},
'/session/:sessionId/url': {
GET: {command: 'getUrl'},
POST: {command: 'setUrl', payloadParams: {required: ['url']}},
@@ -62,15 +56,8 @@ export const METHOD_MAP = /** @type {const} */ ({
'/session/:sessionId/refresh': {
POST: {command: 'refresh'},
},
'/session/:sessionId/screenshot': {
GET: {command: 'getScreenshot'},
},
'/session/:sessionId/frame': {
POST: {command: 'setFrame', payloadParams: {required: ['id']}},
},
'/session/:sessionId/frame/parent': {
POST: {command: 'switchToParentFrame'},
'/session/:sessionId/title': {
GET: {command: 'title'},
},
'/session/:sessionId/window': {
GET: {command: 'getWindowHandle'},
@@ -82,6 +69,25 @@ export const METHOD_MAP = /** @type {const} */ ({
},
DELETE: {command: 'closeWindow'},
},
'/session/:sessionId/window/handles': {
GET: {command: 'getWindowHandles'},
},
'/session/:sessionId/window/new': {
POST: {command: 'createNewWindow', payloadParams: {optional: ['type']}},
},
'/session/:sessionId/frame': {
POST: {command: 'setFrame', payloadParams: {required: ['id']}},
},
'/session/:sessionId/frame/parent': {
POST: {command: 'switchToParentFrame'},
},
'/session/:sessionId/window/rect': {
GET: {command: 'getWindowRect'},
POST: {
command: 'setWindowRect',
payloadParams: {optional: ['x', 'y', 'width', 'height']},
},
},
'/session/:sessionId/window/maximize': {
POST: {command: 'maximizeWindow'},
},
@@ -91,23 +97,11 @@ export const METHOD_MAP = /** @type {const} */ ({
'/session/:sessionId/window/fullscreen': {
POST: {command: 'fullScreenWindow'},
},
'/session/:sessionId/window/new': {
POST: {command: 'createNewWindow', payloadParams: {optional: ['type']}},
'/session/:sessionId/element/active': {
GET: {command: 'active'},
},
'/session/:sessionId/cookie': {
GET: {command: 'getCookies'},
POST: {command: 'setCookie', payloadParams: {required: ['cookie']}},
DELETE: {command: 'deleteCookies'},
},
'/session/:sessionId/cookie/:name': {
GET: {command: 'getCookie'},
DELETE: {command: 'deleteCookie'},
},
'/session/:sessionId/source': {
GET: {command: 'getPageSource'},
},
'/session/:sessionId/title': {
GET: {command: 'title'},
'/session/:sessionId/element/:elementId/shadow': {
GET: {command: 'elementShadowRoot'},
},
'/session/:sessionId/element': {
POST: {
@@ -121,12 +115,6 @@ export const METHOD_MAP = /** @type {const} */ ({
payloadParams: {required: ['using', 'value']},
},
},
'/session/:sessionId/element/active': {
GET: {command: 'active'},
},
'/session/:sessionId/element/:elementId': {
GET: {},
},
'/session/:sessionId/element/:elementId/element': {
POST: {
command: 'findElementFromElement',
@@ -139,41 +127,6 @@ export const METHOD_MAP = /** @type {const} */ ({
payloadParams: {required: ['using', 'value']},
},
},
'/session/:sessionId/element/:elementId/click': {
POST: {command: 'click'},
},
'/session/:sessionId/element/:elementId/text': {
GET: {command: 'getText'},
},
'/session/:sessionId/element/:elementId/value': {
POST: {
command: 'setValue',
payloadParams: {
required: ['text'],
},
},
},
'/session/:sessionId/element/:elementId/name': {
GET: {command: 'getName'},
},
'/session/:sessionId/element/:elementId/clear': {
POST: {command: 'clear'},
},
'/session/:sessionId/element/:elementId/selected': {
GET: {command: 'elementSelected'},
},
'/session/:sessionId/element/:elementId/enabled': {
GET: {command: 'elementEnabled'},
},
'/session/:sessionId/element/:elementId/attribute/:name': {
GET: {command: 'getAttribute'},
},
'/session/:sessionId/element/:elementId/displayed': {
GET: {command: 'elementDisplayed'},
},
'/session/:sessionId/element/:elementId/shadow': {
GET: {command: 'elementShadowRoot'},
},
'/session/:sessionId/shadow/:shadowId/element': {
POST: {
command: 'findElementFromShadowRoot',
@@ -186,39 +139,55 @@ export const METHOD_MAP = /** @type {const} */ ({
payloadParams: {required: ['using', 'value']},
},
},
'/session/:sessionId/element/:elementId/css/:propertyName': {
GET: {command: 'getCssProperty'},
'/session/:sessionId/element/:elementId/selected': {
GET: {command: 'elementSelected'},
},
'/session/:sessionId/element/:elementId/displayed': {
GET: {command: 'elementDisplayed'},
},
'/session/:sessionId/element/:elementId/attribute/:name': {
GET: {command: 'getAttribute'},
},
'/session/:sessionId/element/:elementId/property/:name': {
GET: {command: 'getProperty'},
},
'/session/:sessionId/element/:elementId/css/:propertyName': {
GET: {command: 'getCssProperty'},
},
'/session/:sessionId/element/:elementId/text': {
GET: {command: 'getText'},
},
'/session/:sessionId/element/:elementId/name': {
GET: {command: 'getName'},
},
'/session/:sessionId/element/:elementId/rect': {
GET: {command: 'getElementRect'},
},
'/session/:sessionId/element/:elementId/enabled': {
GET: {command: 'elementEnabled'},
},
'/session/:sessionId/element/:elementId/computedrole': {
GET: {command: 'getComputedRole'},
},
'/session/:sessionId/element/:elementId/computedlabel': {
GET: {command: 'getComputedLabel'},
},
'/session/:sessionId/actions': {
POST: {command: 'performActions', payloadParams: {required: ['actions']}},
DELETE: {command: 'releaseActions'},
'/session/:sessionId/element/:elementId/click': {
POST: {command: 'click'},
},
'/session/:sessionId/alert/text': {
GET: {command: 'getAlertText'},
'/session/:sessionId/element/:elementId/clear': {
POST: {command: 'clear'},
},
'/session/:sessionId/element/:elementId/value': {
POST: {
command: 'setAlertText',
command: 'setValue',
payloadParams: {
required: ['text'],
},
},
},
'/session/:sessionId/alert/accept': {
POST: {command: 'postAcceptAlert'},
},
'/session/:sessionId/alert/dismiss': {
POST: {command: 'postDismissAlert'},
},
'/session/:sessionId/element/:elementId/rect': {
GET: {command: 'getElementRect'},
'/session/:sessionId/source': {
GET: {command: 'getPageSource'},
},
'/session/:sessionId/execute/sync': {
POST: {command: 'execute', payloadParams: {required: ['script', 'args']}},
@@ -229,20 +198,60 @@ export const METHOD_MAP = /** @type {const} */ ({
payloadParams: {required: ['script', 'args']},
},
},
'/session/:sessionId/cookie': {
GET: {command: 'getCookies'},
POST: {command: 'setCookie', payloadParams: {required: ['cookie']}},
DELETE: {command: 'deleteCookies'},
},
'/session/:sessionId/cookie/:name': {
GET: {command: 'getCookie'},
DELETE: {command: 'deleteCookie'},
},
'/session/:sessionId/actions': {
POST: {command: 'performActions', payloadParams: {required: ['actions']}},
DELETE: {command: 'releaseActions'},
},
'/session/:sessionId/alert/dismiss': {
POST: {command: 'postDismissAlert'},
},
'/session/:sessionId/alert/accept': {
POST: {command: 'postAcceptAlert'},
},
'/session/:sessionId/alert/text': {
GET: {command: 'getAlertText'},
POST: {
command: 'setAlertText',
payloadParams: {
required: ['text'],
},
},
},
'/session/:sessionId/screenshot': {
GET: {command: 'getScreenshot'},
},
'/session/:sessionId/element/:elementId/screenshot': {
GET: {command: 'getElementScreenshot'},
},
'/session/:sessionId/window/rect': {
GET: {command: 'getWindowRect'},
'/session/:sessionId/print': {
POST: {
command: 'setWindowRect',
payloadParams: {optional: ['x', 'y', 'width', 'height']},
},
command: 'printPage',
payloadParams: {
optional: [
'orientation',
'scale',
'background',
'page',
'margin',
'shrinkToFit',
'pageRanges',
],
}
}
},
// #endregion
//
// Appium specific
//
// #region JSONWP
// https://www.selenium.dev/documentation/legacy/json_wire_protocol/
'/session/:sessionId/ime/available_engines': {
GET: {command: 'availableIMEEngines', deprecated: true},
},
@@ -262,9 +271,12 @@ export const METHOD_MAP = /** @type {const} */ ({
deprecated: true,
},
},
'/session/:sessionId/rotation': {
GET: {command: 'getRotation'},
POST: {command: 'setRotation', payloadParams: {required: ['x', 'y', 'z']}},
'/session/:sessionId/orientation': {
GET: {command: 'getOrientation'},
POST: {
command: 'setOrientation',
payloadParams: {required: ['orientation']}
},
},
'/session/:sessionId/location': {
GET: {
@@ -277,12 +289,13 @@ export const METHOD_MAP = /** @type {const} */ ({
deprecated: true,
},
},
'/session/:sessionId/orientation': {
GET: {command: 'getOrientation'},
POST: {
command: 'setOrientation',
payloadParams: {required: ['orientation']}
},
// #endregion
// #region MJSONWP
// https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md
'/session/:sessionId/rotation': {
GET: {command: 'getRotation'},
POST: {command: 'setRotation', payloadParams: {required: ['x', 'y', 'z']}},
},
'/session/:sessionId/context': {
GET: {command: 'getCurrentContext'},
@@ -299,33 +312,38 @@ export const METHOD_MAP = /** @type {const} */ ({
deprecated: true,
},
},
'/session/:sessionId/receive_async_response': {
POST: {
command: 'receiveAsyncResponse',
payloadParams: {required: ['status', 'value']},
deprecated: true,
},
},
// #endregion
// #region Appium
'/appium/sessions': {
GET: {command: 'getAppiumSessions'},
},
'/session/:sessionId/appium/capabilities': {
GET: {command: 'getAppiumSessionCapabilities'}
},
'/session/:sessionId/appium/settings': {
POST: {command: 'updateSettings', payloadParams: {required: ['settings']}},
GET: {command: 'getSettings'},
},
'/session/:sessionId/appium/commands': {
GET: {command: 'listCommands'},
},
'/session/:sessionId/appium/extensions': {
GET: {command: 'listExtensions'},
},
'/session/:sessionId/appium/events': {
POST: {command: 'getLogEvents', payloadParams: {optional: ['type']}},
},
'/session/:sessionId/appium/log_event': {
POST: {
command: 'logCustomEvent',
payloadParams: {required: ['vendor', 'event']},
},
},
'/session/:sessionId/appium/device/system_time': {
GET: {command: 'getDeviceTime'},
POST: {command: 'getDeviceTime', payloadParams: {optional: ['format']}},
},
// #region Applications Management
'/session/:sessionId/appium/device/install_app': {
POST: {
command: 'installApp',
payloadParams: {
required: ['appPath'],
optional: ['options'],
},
},
},
'/session/:sessionId/appium/device/activate_app': {
POST: {
command: 'activateApp',
@@ -335,15 +353,6 @@ export const METHOD_MAP = /** @type {const} */ ({
},
},
},
'/session/:sessionId/appium/device/remove_app': {
POST: {
command: 'removeApp',
payloadParams: {
required: [['appId'], ['bundleId']],
optional: ['options'],
},
},
},
'/session/:sessionId/appium/device/terminate_app': {
POST: {
command: 'terminateApp',
@@ -353,14 +362,6 @@ export const METHOD_MAP = /** @type {const} */ ({
},
},
},
'/session/:sessionId/appium/device/app_installed': {
POST: {
command: 'isAppInstalled',
payloadParams: {
required: [['appId'], ['bundleId']],
},
},
},
'/session/:sessionId/appium/device/app_state': {
POST: {
command: 'queryAppState',
@@ -369,7 +370,32 @@ export const METHOD_MAP = /** @type {const} */ ({
},
},
},
// #endregion
'/session/:sessionId/appium/device/install_app': {
POST: {
command: 'installApp',
payloadParams: {
required: ['appPath'],
optional: ['options'],
},
},
},
'/session/:sessionId/appium/device/remove_app': {
POST: {
command: 'removeApp',
payloadParams: {
required: [['appId'], ['bundleId']],
optional: ['options'],
},
},
},
'/session/:sessionId/appium/device/app_installed': {
POST: {
command: 'isAppInstalled',
payloadParams: {
required: [['appId'], ['bundleId']],
},
},
},
'/session/:sessionId/appium/device/hide_keyboard': {
POST: {
command: 'hideKeyboard',
@@ -388,48 +414,75 @@ export const METHOD_MAP = /** @type {const} */ ({
'/session/:sessionId/appium/device/pull_folder': {
POST: {command: 'pullFolder', payloadParams: {required: ['path']}},
},
'/session/:sessionId/appium/settings': {
POST: {command: 'updateSettings', payloadParams: {required: ['settings']}},
GET: {command: 'getSettings'},
},
'/session/:sessionId/appium/events': {
POST: {command: 'getLogEvents', payloadParams: {optional: ['type']}},
},
'/session/:sessionId/appium/log_event': {
// #endregion
// #region Unknown
'/session/:sessionId/receive_async_response': {
POST: {
command: 'logCustomEvent',
payloadParams: {required: ['vendor', 'event']},
command: 'receiveAsyncResponse',
payloadParams: {required: ['status', 'value']},
deprecated: true,
},
},
// #region Inspector
'/session/:sessionId/appium/commands': {
GET: {command: 'listCommands'},
},
'/session/:sessionId/appium/extensions': {
GET: {command: 'listExtensions'},
'/session/:sessionId/element/:elementId': {
GET: {},
},
// #endregion
//
// 3rd party vendor/protocol support
//
// #region Selenium/Chromium browsers
// #region Other Protocols
// Selenium/Chromium browsers
'/session/:sessionId/se/log': {
POST: {command: 'getLog', payloadParams: {required: ['type']}},
},
'/session/:sessionId/se/log/types': {
GET: {command: 'getLogTypes'},
},
// #endregion
// #region chromium devtools
// Chromium devtools
// https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/server/http_handler.cc
'/session/:sessionId/:vendor/cdp/execute': {
POST: {command: 'executeCdp', payloadParams: {required: ['cmd', 'params']}},
},
// #endregion
// #region Webauthn
// Reporting
// https://www.w3.org/TR/reporting-1/
'/session/:sessionId/reporting/generate_test_report': {
POST: {
command: 'generateTestReport',
payloadParams: {required: ['message'], optional: ['group']},
},
},
// Permissions
// https://www.w3.org/TR/permissions/
'/session/:sessionId/permissions': {
POST: {command: 'setPermissions', payloadParams: {required: ['descriptor', 'state']}},
},
// Device Posture
// https://www.w3.org/TR/device-posture/
'/session/:sessionId/deviceposture': {
POST: {command: 'setDevicePosture', payloadParams: {required: ['posture']}},
DELETE: {command: 'clearDevicePosture'},
},
// Generic Sensor
// https://www.w3.org/TR/generic-sensor/
'/session/:sessionId/sensor': {
POST: {
command: 'createVirtualSensor',
payloadParams: {
required: ['type'],
optional: ['connected', 'maxSamplingFrequency', 'minSamplingFrequency'],
},
},
},
'/session/:sessionId/sensors/:sensorType': {
GET: {command: 'getVirtualSensorInfo'},
POST: {command: 'updateVirtualSensorReading', payloadParams: {required: ['reading']}},
DELETE: {command: 'deleteVirtualSensor'},
},
// Custom Handlers
// https://html.spec.whatwg.org/multipage/system-state.html#user-agent-automation
'/session/:sessionId/custom-handlers/set-mode': {
POST: {command: 'setRPHRegistrationMode', payloadParams: {required: ['mode']}},
},
// Webauthn
// https://www.w3.org/TR/webauthn-2/#sctn-automation-add-virtual-authenticator
'/session/:sessionId/webauthn/authenticator': {
POST: {
@@ -469,6 +522,49 @@ export const METHOD_MAP = /** @type {const} */ ({
},
},
},
// Secure Payment Confirmation
// https://www.w3.org/TR/secure-payment-confirmation/
'/session/:sessionId/secure-payment-confirmation/set-mode': {
POST: {command: 'setSPCTransactionMode', payloadParams: {required: ['mode']}},
},
// Federated Credential Management
// https://www.w3.org/TR/fedcm-1/
'/session/:sessionId/fedcm/canceldialog': {
POST: {command: 'fedCMCancelDialog'},
},
'/session/:sessionId/fedcm/selectaccount': {
POST: {command: 'fedCMSelectAccount', payloadParams: {required: ['accountIndex']}},
},
'/session/:sessionId/fedcm/clickdialogbutton': {
POST: {command: 'fedCMClickDialogButton', payloadParams: {required: ['dialogButton']}},
},
'/session/:sessionId/fedcm/accountlist': {
GET: {command: 'fedCMGetAccounts'},
},
'/session/:sessionId/fedcm/gettitle': {
GET: {command: 'fedCMGetTitle'},
},
'/session/:sessionId/fedcm/getdialogtype': {
GET: {command: 'fedCMGetDialogType'},
},
'/session/:sessionId/fedcm/setdelayenabled': {
POST: {command: 'fedCMSetDelayEnabled', payloadParams: {required: ['enabled']}},
},
'/session/:sessionId/fedcm/resetcooldown': {
POST: {command: 'fedCMResetCooldown'},
},
// Compute Pressure
// https://www.w3.org/TR/compute-pressure/
'/session/:sessionId/pressuresource': {
POST: {
command: 'createVirtualPressureSource',
payloadParams: {required: ['type'], optional: ['supported']},
},
},
'/session/:sessionId/pressuresource/:pressureSourceType': {
POST: {command: 'updateVirtualPressureSource', payloadParams: {required: ['sample']}},
DELETE: {command: 'deleteVirtualPressureSource'},
},
// #endregion
});
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/base-driver",
"version": "10.0.1",
"version": "10.1.0",
"description": "Base driver class for Appium drivers",
"keywords": [
"automation",
@@ -44,25 +44,25 @@
"test:types": "tsd"
},
"dependencies": {
"@appium/support": "^7.0.1",
"@appium/types": "^1.0.1",
"@appium/support": "^7.0.2",
"@appium/types": "^1.1.0",
"@colors/colors": "1.6.0",
"async-lock": "1.4.1",
"asyncbox": "3.0.0",
"axios": "1.11.0",
"axios": "1.12.2",
"bluebird": "3.7.2",
"body-parser": "2.2.0",
"express": "5.1.0",
"fastest-levenshtein": "1.0.16",
"http-status-codes": "2.3.0",
"lodash": "4.17.21",
"lru-cache": "11.2.1",
"lru-cache": "11.2.2",
"method-override": "3.0.0",
"morgan": "1.10.1",
"path-to-regexp": "8.3.0",
"serve-favicon": "2.5.1",
"source-map-support": "0.5.21",
"type-fest": "4.41.0"
"type-fest": "5.0.1"
},
"optionalDependencies": {
"spdy": "4.0.2"
@@ -41,7 +41,7 @@ describe('Routes', function () {
}
let hash = shasum.digest('hex').substring(0, 8);
// Modify the hash whenever the protocol has intentionally been modified.
hash.should.equal('7ff9afce');
hash.should.equal('510cbe79');
});
});
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.0.3](https://github.com/appium/appium/compare/@appium/base-plugin@3.0.2...@appium/base-plugin@3.0.3) (2025-10-08)
**Note:** Version bump only for package @appium/base-plugin
## [3.0.2](https://github.com/appium/appium/compare/@appium/base-plugin@3.0.1...@appium/base-plugin@3.0.2) (2025-09-09)
**Note:** Version bump only for package @appium/base-plugin
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/base-plugin",
"version": "3.0.2",
"version": "3.0.3",
"description": "The base plugin used to create Appium plugins",
"keywords": [
"automation",
@@ -40,8 +40,8 @@
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@appium/base-driver": "^10.0.1",
"@appium/support": "^7.0.1"
"@appium/base-driver": "^10.1.0",
"@appium/support": "^7.0.2"
},
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.1.1](https://github.com/appium/appium/compare/@appium/docutils@2.1.0...@appium/docutils@2.1.1) (2025-10-08)
**Note:** Version bump only for package @appium/docutils
## [2.1.0](https://github.com/appium/appium/compare/@appium/docutils@2.0.1...@appium/docutils@2.1.0) (2025-09-09)
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/docutils",
"version": "2.1.0",
"version": "2.1.1",
"description": "Documentation generation utilities for Appium and related projects",
"keywords": [
"automation",
@@ -48,7 +48,7 @@
"start": "node ./build/lib/cli/index.js"
},
"dependencies": {
"@appium/support": "^7.0.1",
"@appium/support": "^7.0.2",
"chalk": "4.1.2",
"consola": "3.4.2",
"diff": "8.0.2",
@@ -58,7 +58,7 @@
"read-pkg": "5.2.0",
"source-map-support": "0.5.21",
"teen_process": "3.0.1",
"type-fest": "4.41.0",
"type-fest": "5.0.1",
"yaml": "2.8.1",
"yargs": "18.0.0",
"yargs-parser": "22.0.0"
+1 -1
View File
@@ -1,5 +1,5 @@
mkdocs==1.6.1
mkdocs-git-revision-date-localized-plugin==1.4.7
mkdocs-material==9.6.19
mkdocs-material==9.6.21
mkdocs-redirects==1.2.2
mike==2.1.3
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.0.3](https://github.com/appium/appium/compare/@appium/driver-test-support@1.0.2...@appium/driver-test-support@1.0.3) (2025-10-08)
**Note:** Version bump only for package @appium/driver-test-support
## [1.0.2](https://github.com/appium/appium/compare/@appium/driver-test-support@1.0.1...@appium/driver-test-support@1.0.2) (2025-09-09)
**Note:** Version bump only for package @appium/driver-test-support
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/driver-test-support",
"version": "1.0.2",
"version": "1.0.3",
"description": "Test utilities for Appium drivers",
"keywords": [
"automation",
@@ -41,16 +41,16 @@
},
"types": "./build/lib/index.d.ts",
"dependencies": {
"@appium/types": "^1.0.1",
"axios": "1.11.0",
"@appium/types": "^1.1.0",
"axios": "1.12.2",
"bluebird": "3.7.2",
"chai": "6.0.1",
"chai": "6.2.0",
"chai-as-promised": "8.0.2",
"get-port": "5.1.1",
"lodash": "4.17.21",
"sinon": "21.0.0",
"source-map-support": "0.5.21",
"type-fest": "4.41.0"
"type-fest": "5.0.1"
},
"peerDependencies": {
"appium": "^3.0.0-beta.0",
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.0.3](https://github.com/appium/appium/compare/@appium/eslint-config-appium-ts@2.0.2...@appium/eslint-config-appium-ts@2.0.3) (2025-10-08)
**Note:** Version bump only for package @appium/eslint-config-appium-ts
## [2.0.2](https://github.com/appium/appium/compare/@appium/eslint-config-appium-ts@2.0.1...@appium/eslint-config-appium-ts@2.0.2) (2025-09-09)
**Note:** Version bump only for package @appium/eslint-config-appium-ts
@@ -1,7 +1,7 @@
{
"name": "@appium/eslint-config-appium-ts",
"type": "module",
"version": "2.0.2",
"version": "2.0.3",
"description": "Shared ESLint config for Appium projects (TypeScript version)",
"keywords": [
"eslint",
@@ -29,14 +29,14 @@
"test:smoke": "exit 0"
},
"dependencies": {
"@eslint/compat": "1.3.2",
"@eslint/js": "9.35.0",
"@eslint/compat": "1.4.0",
"@eslint/js": "9.37.0",
"eslint-config-prettier": "10.1.8",
"eslint-import-resolver-typescript": "4.4.4",
"eslint-plugin-import": "2.32.0",
"eslint-plugin-mocha": "10.5.0",
"eslint-plugin-promise": "7.2.1",
"typescript-eslint": "8.43.0"
"typescript-eslint": "8.46.0"
},
"peerDependencies": {
"eslint": "^9.0.0"
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [5.0.2](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@5.0.1...@appium/execute-driver-plugin@5.0.2) (2025-10-08)
**Note:** Version bump only for package @appium/execute-driver-plugin
## [5.0.1](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@5.0.0...@appium/execute-driver-plugin@5.0.1) (2025-09-09)
**Note:** Version bump only for package @appium/execute-driver-plugin
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/execute-driver-plugin",
"version": "5.0.1",
"version": "5.0.2",
"description": "Plugin for batching and executing Appium driver commands",
"keywords": [
"automation",
@@ -41,7 +41,7 @@
"bluebird": "3.7.2",
"lodash": "4.17.21",
"source-map-support": "0.5.21",
"webdriverio": "9.19.2"
"webdriverio": "9.20.0"
},
"peerDependencies": {
"appium": "^3.0.0-beta.0"
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [6.0.1](https://github.com/appium/appium/compare/@appium/fake-driver@6.0.0...@appium/fake-driver@6.0.1) (2025-10-08)
**Note:** Version bump only for package @appium/fake-driver
## [6.0.0](https://github.com/appium/appium/compare/@appium/fake-driver@6.0.0-rc.1...@appium/fake-driver@6.0.0) (2025-08-18)
**Note:** Version bump only for package @appium/fake-driver
+2 -2
View File
@@ -62,6 +62,7 @@ export class FakeDriver extends BaseDriver {
/** @type {boolean} */
_clockRunning = false;
constructor(
opts = /** @type {import('@appium/types').InitialOpts} */ ({}),
shouldValidateCaps = true,
@@ -118,8 +119,7 @@ export class FakeDriver extends BaseDriver {
* @returns {Promise<[string,FakeDriverCaps]>}
*/
async createSession(w3cCapabilities1, w3cCapabilities2, w3cCapabilities3, driverData = []) {
// TODO add validation on caps.app that we will get for free from
// BaseDriver
// BaseDriver automatically validates capabilities using desiredCapConstraints
// check to see if any other sessions have set uniqueApp. If so, emulate
// not being able to start a session because of system resources
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/fake-driver",
"version": "6.0.0",
"version": "6.0.1",
"description": "Mock driver used internally by Appium for testing. Ignore",
"keywords": [
"automation",
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [4.0.3](https://github.com/appium/appium/compare/@appium/fake-plugin@4.0.2...@appium/fake-plugin@4.0.3) (2025-10-08)
**Note:** Version bump only for package @appium/fake-plugin
## [4.0.2](https://github.com/appium/appium/compare/@appium/fake-plugin@4.0.1...@appium/fake-plugin@4.0.2) (2025-09-09)
**Note:** Version bump only for package @appium/fake-plugin
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/fake-plugin",
"version": "4.0.2",
"version": "4.0.3",
"description": "A fake Appium plugin",
"keywords": [
"automation",
@@ -39,8 +39,8 @@
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@appium/base-plugin": "^3.0.2",
"@appium/support": "^7.0.1",
"@appium/base-plugin": "^3.0.3",
"@appium/support": "^7.0.2",
"bluebird": "3.7.2",
"lodash": "4.17.21",
"source-map-support": "0.5.21"
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [4.0.2](https://github.com/appium/appium/compare/@appium/images-plugin@4.0.1...@appium/images-plugin@4.0.2) (2025-10-08)
**Note:** Version bump only for package @appium/images-plugin
## [4.0.1](https://github.com/appium/appium/compare/@appium/images-plugin@4.0.0...@appium/images-plugin@4.0.1) (2025-09-09)
**Note:** Version bump only for package @appium/images-plugin
+1 -1
View File
@@ -421,7 +421,7 @@ export default class ImageElementFinder {
*/
/**
* Get a image that will be used for template maching.
* Get a image that will be used for template matching.
* Returns scaled image if scale ratio is provided.
*
* @param {Buffer} template - image used as a template to be
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/images-plugin",
"version": "4.0.1",
"version": "4.0.2",
"description": "Plugin for working with images and image elements in Appium",
"keywords": [
"automation",
@@ -39,11 +39,11 @@
"test:unit": "mocha \"./test/unit/**/*.spec.*js\""
},
"dependencies": {
"@appium/opencv": "^4.0.1",
"@appium/support": "^7.0.1",
"@appium/opencv": "^4.0.2",
"@appium/support": "^7.0.2",
"lodash": "4.17.21",
"lru-cache": "11.2.1",
"sharp": "0.34.3",
"lru-cache": "11.2.2",
"sharp": "0.34.4",
"source-map-support": "0.5.21"
},
"peerDependencies": {
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.0.2](https://github.com/appium/appium/compare/@appium/logger@2.0.1...@appium/logger@2.0.2) (2025-10-08)
**Note:** Version bump only for package @appium/logger
## [2.0.1](https://github.com/appium/appium/compare/@appium/logger@2.0.0...@appium/logger@2.0.1) (2025-09-09)
**Note:** Version bump only for package @appium/logger
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/logger",
"version": "2.0.1",
"version": "2.0.2",
"author": "https://github.com/appium",
"description": "A Universal Logger For The Appium Ecosystem",
"repository": {
@@ -29,7 +29,7 @@
"dependencies": {
"console-control-strings": "1.1.0",
"lodash": "4.17.21",
"lru-cache": "11.2.1",
"lru-cache": "11.2.2",
"set-blocking": "2.0.0"
},
"license": "ISC",
+2 -2
View File
@@ -414,7 +414,7 @@ describe('basic', function () {
log = new Log();
});
it('to nonexistant level', function() {
it('to nonexistent level', function() {
log.emitLog({ prefix: 'test', level: 'asdf' });
});
});
@@ -424,7 +424,7 @@ describe('basic', function () {
log = new Log();
});
it('with nonexistant stream', function() {
it('with nonexistent stream', function() {
log.stream = null;
(log._format('message') === undefined).should.be.true;
});
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [4.0.2](https://github.com/appium/appium/compare/@appium/opencv@4.0.1...@appium/opencv@4.0.2) (2025-10-08)
**Note:** Version bump only for package @appium/opencv
## [4.0.1](https://github.com/appium/appium/compare/@appium/opencv@4.0.0...@appium/opencv@4.0.1) (2025-09-09)
**Note:** Version bump only for package @appium/opencv
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/opencv",
"version": "4.0.1",
"version": "4.0.2",
"description": "OpenCV-related helper library",
"keywords": [
"automation",
@@ -44,7 +44,7 @@
"bluebird": "3.7.2",
"lodash": "4.17.21",
"opencv-bindings": "4.5.5",
"sharp": "0.34.3",
"sharp": "0.34.4",
"source-map-support": "0.5.21"
},
"engines": {
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.0.2](https://github.com/appium/appium/compare/@appium/plugin-test-support@1.0.1...@appium/plugin-test-support@1.0.2) (2025-10-08)
**Note:** Version bump only for package @appium/plugin-test-support
## [1.0.1](https://github.com/appium/appium/compare/@appium/plugin-test-support@1.0.0...@appium/plugin-test-support@1.0.1) (2025-09-09)
**Note:** Version bump only for package @appium/plugin-test-support
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/plugin-test-support",
"version": "1.0.1",
"version": "1.0.2",
"description": "Testing utilities for Appium plugins",
"keywords": [
"automation",
@@ -41,7 +41,7 @@
"test:unit": "exit 0"
},
"dependencies": {
"@appium/types": "^1.0.1",
"@appium/types": "^1.1.0",
"get-port": "5.1.1",
"log-symbols": "4.1.0",
"source-map-support": "0.5.21",
@@ -3,6 +3,15 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.0.1](https://github.com/appium/appium/compare/@appium/relaxed-caps-plugin@2.0.0...@appium/relaxed-caps-plugin@2.0.1) (2025-10-08)
### Bug Fixes
* **base-driver,relaxed-caps-plugin,types:** add missing W3C caps ([#21642](https://github.com/appium/appium/issues/21642)) ([e6635b7](https://github.com/appium/appium/commit/e6635b737d0f42d8fd38c3d8bea70067d2e7c87a))
## [2.0.0](https://github.com/appium/appium/compare/@appium/relaxed-caps-plugin@2.0.0-rc.1...@appium/relaxed-caps-plugin@2.0.0) (2025-08-18)
**Note:** Version bump only for package @appium/relaxed-caps-plugin
@@ -1,6 +1,10 @@
import _ from 'lodash';
import { BasePlugin } from 'appium/plugin';
/**
* W3C standard capabilities
* @see https://www.w3.org/TR/webdriver2/#dfn-table-of-standard-capabilities)
*/
const STANDARD_CAPS = [
'browserName',
'browserVersion',
@@ -10,7 +14,10 @@ const STANDARD_CAPS = [
'proxy',
'setWindowRect',
'timeouts',
'strictFileInteractability',
'unhandledPromptBehavior',
'userAgent',
'webSocketUrl',
];
const VENDOR_PREFIX = 'appium';
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/relaxed-caps-plugin",
"version": "2.0.0",
"version": "2.0.1",
"description": "An Appium plugin that loosens requirements for vendor prefixes on caps",
"keywords": [
"automation",
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.0.2](https://github.com/appium/appium/compare/@appium/storage-plugin@1.0.1...@appium/storage-plugin@1.0.2) (2025-10-08)
**Note:** Version bump only for package @appium/storage-plugin
## [1.0.1](https://github.com/appium/appium/compare/@appium/storage-plugin@1.0.0...@appium/storage-plugin@1.0.1) (2025-09-09)
**Note:** Version bump only for package @appium/storage-plugin
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/storage-plugin",
"version": "1.0.1",
"version": "1.0.2",
"description": "Server-side storage plugin for Appium",
"keywords": [
"automation",
@@ -41,11 +41,11 @@
"test:e2e": "mocha --timeout 20s --slow 10s \"./test/e2e/**/*.spec.*js\""
},
"dependencies": {
"@appium/support": "^7.0.1",
"@appium/support": "^7.0.2",
"async-lock": "1.4.1",
"bluebird": "3.7.2",
"lodash": "4.17.21",
"lru-cache": "11.2.1",
"lru-cache": "11.2.2",
"rimraf": "6.0.1",
"source-map-support": "0.5.21",
"ws": "8.18.3"
@@ -62,7 +62,7 @@ describe('storage', function () {
(await fs.exists(path.join(storageRoot, tmpName))).should.be.false;
});
it('should only reset parital files if shouldPreserveFiles requested', async function () {
it('should only reset partial files if shouldPreserveFiles requested', async function () {
const name = 'foo.bar';
const tmpName = 'bar.baz.filepart';
await fs.writeFile(path.join(storageRoot, name), Buffer.alloc(1));
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [7.0.2](https://github.com/appium/appium/compare/@appium/support@7.0.1...@appium/support@7.0.2) (2025-10-08)
**Note:** Version bump only for package @appium/support
## [7.0.1](https://github.com/appium/appium/compare/@appium/support@7.0.0...@appium/support@7.0.1) (2025-09-09)
**Note:** Version bump only for package @appium/support
+1 -1
View File
@@ -28,7 +28,7 @@ async function parseXmlPlistFile(plistFilename) {
* @returns {Promise<any>} parsed plist JS Object
*/
async function parsePlistFile(plist, mustExist = true, quiet = true) {
// handle nonexistant file
// handle nonexistent file
if (!(await fs.exists(plist))) {
if (mustExist) {
throw log.errorWithException(`Plist file doesn't exist: '${plist}'`);

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