mirror of
https://github.com/appium/appium.git
synced 2026-11-01 14:58:00 +08:00
Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
715fd03c45 | ||
|
|
8a664a4eef | ||
|
|
dc24864cbb | ||
|
|
c102d8fd8e | ||
|
|
703085bc54 | ||
|
|
47497bc8da |
Generated
+73
-73
@@ -57,7 +57,7 @@
|
||||
"cross-env": "7.0.3",
|
||||
"eslint": "9.20.1",
|
||||
"eslint-config-prettier": "10.0.1",
|
||||
"eslint-import-resolver-typescript": "3.8.2",
|
||||
"eslint-import-resolver-typescript": "3.8.3",
|
||||
"eslint-plugin-import": "2.31.0",
|
||||
"eslint-plugin-mocha": "10.5.0",
|
||||
"eslint-plugin-promise": "7.2.1",
|
||||
@@ -9546,9 +9546,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-import-resolver-typescript": {
|
||||
"version": "3.8.2",
|
||||
"resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.2.tgz",
|
||||
"integrity": "sha512-o0nvXxsatYCDTzI1K5b3aYGQ6PjpDGJEVN86zqJw5SEewhmmggfRTotd2dqWr2t2zbeYpIEWGTCkgtUpIEIcaQ==",
|
||||
"version": "3.8.3",
|
||||
"resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.3.tgz",
|
||||
"integrity": "sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@nolyfill/is-core-module": "1.0.39",
|
||||
@@ -9557,7 +9557,7 @@
|
||||
"get-tsconfig": "^4.10.0",
|
||||
"is-bun-module": "^1.0.2",
|
||||
"stable-hash": "^0.0.4",
|
||||
"tinyglobby": "^0.2.11"
|
||||
"tinyglobby": "^0.2.12"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.18.0 || >=16.0.0"
|
||||
@@ -18988,9 +18988,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/tinyglobby": {
|
||||
"version": "0.2.11",
|
||||
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.11.tgz",
|
||||
"integrity": "sha512-32TmKeeKUahv0Go8WmQgiEp9Y21NuxjwjqiRC1nrUB51YacfSwuB44xgXD+HdIppmMRgjQNPdrHyA6vIybYZ+g==",
|
||||
"version": "0.2.12",
|
||||
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
|
||||
"integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"fdir": "^6.4.3",
|
||||
@@ -20937,17 +20937,17 @@
|
||||
}
|
||||
},
|
||||
"packages/appium": {
|
||||
"version": "2.16.0",
|
||||
"version": "2.16.1",
|
||||
"hasInstallScript": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@appium/base-driver": "^9.16.0",
|
||||
"@appium/base-plugin": "^2.3.1",
|
||||
"@appium/docutils": "^1.0.30",
|
||||
"@appium/base-driver": "^9.16.1",
|
||||
"@appium/base-plugin": "^2.3.2",
|
||||
"@appium/docutils": "^1.0.31",
|
||||
"@appium/logger": "^1.6.1",
|
||||
"@appium/schema": "^0.8.0",
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/schema": "^0.8.1",
|
||||
"@appium/support": "^6.0.5",
|
||||
"@appium/types": "^0.25.1",
|
||||
"@sidvind/better-ajv-errors": "3.0.1",
|
||||
"ajv": "8.17.1",
|
||||
"ajv-formats": "3.0.1",
|
||||
@@ -21040,11 +21040,11 @@
|
||||
},
|
||||
"packages/base-driver": {
|
||||
"name": "@appium/base-driver",
|
||||
"version": "9.16.0",
|
||||
"version": "9.16.1",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/support": "^6.0.5",
|
||||
"@appium/types": "^0.25.1",
|
||||
"@colors/colors": "1.6.0",
|
||||
"async-lock": "1.4.1",
|
||||
"asyncbox": "3.0.0",
|
||||
@@ -21101,11 +21101,11 @@
|
||||
},
|
||||
"packages/base-plugin": {
|
||||
"name": "@appium/base-plugin",
|
||||
"version": "2.3.1",
|
||||
"version": "2.3.2",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@appium/base-driver": "^9.16.0",
|
||||
"@appium/support": "^6.0.4"
|
||||
"@appium/base-driver": "^9.16.1",
|
||||
"@appium/support": "^6.0.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
@@ -21114,11 +21114,11 @@
|
||||
},
|
||||
"packages/docutils": {
|
||||
"name": "@appium/docutils",
|
||||
"version": "1.0.30",
|
||||
"version": "1.0.31",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/tsconfig": "^0.3.3",
|
||||
"@appium/support": "^6.0.5",
|
||||
"@appium/tsconfig": "^0.3.4",
|
||||
"@sliphua/lilconfig-ts-loader": "3.2.2",
|
||||
"chalk": "4.1.2",
|
||||
"consola": "3.4.0",
|
||||
@@ -21251,10 +21251,10 @@
|
||||
},
|
||||
"packages/driver-test-support": {
|
||||
"name": "@appium/driver-test-support",
|
||||
"version": "0.7.5",
|
||||
"version": "0.7.6",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/types": "^0.25.1",
|
||||
"axios": "1.7.9",
|
||||
"bluebird": "3.7.2",
|
||||
"chai": "5.2.0",
|
||||
@@ -21918,11 +21918,11 @@
|
||||
},
|
||||
"packages/fake-plugin": {
|
||||
"name": "@appium/fake-plugin",
|
||||
"version": "3.2.1",
|
||||
"version": "3.2.2",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@appium/base-plugin": "^2.3.1",
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/base-plugin": "^2.3.2",
|
||||
"@appium/support": "^6.0.5",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
"source-map-support": "0.5.21"
|
||||
@@ -21937,11 +21937,11 @@
|
||||
},
|
||||
"packages/images-plugin": {
|
||||
"name": "@appium/images-plugin",
|
||||
"version": "3.0.28",
|
||||
"version": "3.0.29",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@appium/opencv": "^3.0.8",
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/support": "^6.0.5",
|
||||
"lodash": "4.17.21",
|
||||
"lru-cache": "10.4.3",
|
||||
"sharp": "0.33.5",
|
||||
@@ -22134,10 +22134,10 @@
|
||||
},
|
||||
"packages/plugin-test-support": {
|
||||
"name": "@appium/plugin-test-support",
|
||||
"version": "0.3.50",
|
||||
"version": "0.3.51",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/types": "^0.25.1",
|
||||
"get-port": "5.1.1",
|
||||
"log-symbols": "4.1.0",
|
||||
"source-map-support": "0.5.21",
|
||||
@@ -22170,7 +22170,7 @@
|
||||
},
|
||||
"packages/schema": {
|
||||
"name": "@appium/schema",
|
||||
"version": "0.8.0",
|
||||
"version": "0.8.1",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"json-schema": "0.4.0",
|
||||
@@ -22196,12 +22196,12 @@
|
||||
},
|
||||
"packages/support": {
|
||||
"name": "@appium/support",
|
||||
"version": "6.0.4",
|
||||
"version": "6.0.5",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@appium/logger": "^1.6.1",
|
||||
"@appium/tsconfig": "^0.3.3",
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/tsconfig": "^0.3.4",
|
||||
"@appium/types": "^0.25.1",
|
||||
"@colors/colors": "1.6.0",
|
||||
"archiver": "7.0.1",
|
||||
"axios": "1.7.9",
|
||||
@@ -22457,10 +22457,10 @@
|
||||
},
|
||||
"packages/test-support": {
|
||||
"name": "@appium/test-support",
|
||||
"version": "3.1.4",
|
||||
"version": "3.1.5",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/support": "^6.0.5",
|
||||
"@colors/colors": "1.6.0",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
@@ -22479,7 +22479,7 @@
|
||||
},
|
||||
"packages/tsconfig": {
|
||||
"name": "@appium/tsconfig",
|
||||
"version": "0.3.3",
|
||||
"version": "0.3.4",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@tsconfig/node14": "14.1.2"
|
||||
@@ -22491,12 +22491,12 @@
|
||||
},
|
||||
"packages/types": {
|
||||
"name": "@appium/types",
|
||||
"version": "0.25.0",
|
||||
"version": "0.25.1",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@appium/logger": "^1.6.1",
|
||||
"@appium/schema": "^0.8.0",
|
||||
"@appium/tsconfig": "^0.3.3",
|
||||
"@appium/schema": "^0.8.1",
|
||||
"@appium/tsconfig": "^0.3.4",
|
||||
"type-fest": "4.35.0"
|
||||
},
|
||||
"engines": {
|
||||
@@ -22518,7 +22518,7 @@
|
||||
},
|
||||
"packages/universal-xml-plugin": {
|
||||
"name": "@appium/universal-xml-plugin",
|
||||
"version": "1.0.28",
|
||||
"version": "1.0.29",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@xmldom/xmldom": "0.9.7",
|
||||
@@ -22591,8 +22591,8 @@
|
||||
"@appium/base-driver": {
|
||||
"version": "file:packages/base-driver",
|
||||
"requires": {
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/support": "^6.0.5",
|
||||
"@appium/types": "^0.25.1",
|
||||
"@colors/colors": "1.6.0",
|
||||
"async-lock": "1.4.1",
|
||||
"asyncbox": "3.0.0",
|
||||
@@ -22637,15 +22637,15 @@
|
||||
"@appium/base-plugin": {
|
||||
"version": "file:packages/base-plugin",
|
||||
"requires": {
|
||||
"@appium/base-driver": "^9.16.0",
|
||||
"@appium/support": "^6.0.4"
|
||||
"@appium/base-driver": "^9.16.1",
|
||||
"@appium/support": "^6.0.5"
|
||||
}
|
||||
},
|
||||
"@appium/docutils": {
|
||||
"version": "file:packages/docutils",
|
||||
"requires": {
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/tsconfig": "^0.3.3",
|
||||
"@appium/support": "^6.0.5",
|
||||
"@appium/tsconfig": "^0.3.4",
|
||||
"@sliphua/lilconfig-ts-loader": "3.2.2",
|
||||
"chalk": "4.1.2",
|
||||
"consola": "3.4.0",
|
||||
@@ -22721,7 +22721,7 @@
|
||||
"@appium/driver-test-support": {
|
||||
"version": "file:packages/driver-test-support",
|
||||
"requires": {
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/types": "^0.25.1",
|
||||
"axios": "1.7.9",
|
||||
"bluebird": "3.7.2",
|
||||
"chai": "5.2.0",
|
||||
@@ -23140,8 +23140,8 @@
|
||||
"@appium/fake-plugin": {
|
||||
"version": "file:packages/fake-plugin",
|
||||
"requires": {
|
||||
"@appium/base-plugin": "^2.3.1",
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/base-plugin": "^2.3.2",
|
||||
"@appium/support": "^6.0.5",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
"source-map-support": "0.5.21"
|
||||
@@ -23151,7 +23151,7 @@
|
||||
"version": "file:packages/images-plugin",
|
||||
"requires": {
|
||||
"@appium/opencv": "^3.0.8",
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/support": "^6.0.5",
|
||||
"lodash": "4.17.21",
|
||||
"lru-cache": "10.4.3",
|
||||
"sharp": "0.33.5",
|
||||
@@ -23296,7 +23296,7 @@
|
||||
"@appium/plugin-test-support": {
|
||||
"version": "file:packages/plugin-test-support",
|
||||
"requires": {
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/types": "^0.25.1",
|
||||
"get-port": "5.1.1",
|
||||
"log-symbols": "4.1.0",
|
||||
"source-map-support": "0.5.21",
|
||||
@@ -23328,8 +23328,8 @@
|
||||
"version": "file:packages/support",
|
||||
"requires": {
|
||||
"@appium/logger": "^1.6.1",
|
||||
"@appium/tsconfig": "^0.3.3",
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/tsconfig": "^0.3.4",
|
||||
"@appium/types": "^0.25.1",
|
||||
"@colors/colors": "1.6.0",
|
||||
"archiver": "7.0.1",
|
||||
"axios": "1.7.9",
|
||||
@@ -23507,7 +23507,7 @@
|
||||
"@appium/test-support": {
|
||||
"version": "file:packages/test-support",
|
||||
"requires": {
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/support": "^6.0.5",
|
||||
"@colors/colors": "1.6.0",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
@@ -23526,8 +23526,8 @@
|
||||
"version": "file:packages/types",
|
||||
"requires": {
|
||||
"@appium/logger": "^1.6.1",
|
||||
"@appium/schema": "^0.8.0",
|
||||
"@appium/tsconfig": "^0.3.3",
|
||||
"@appium/schema": "^0.8.1",
|
||||
"@appium/tsconfig": "^0.3.4",
|
||||
"type-fest": "4.35.0"
|
||||
},
|
||||
"dependencies": {
|
||||
@@ -27412,13 +27412,13 @@
|
||||
"appium": {
|
||||
"version": "file:packages/appium",
|
||||
"requires": {
|
||||
"@appium/base-driver": "^9.16.0",
|
||||
"@appium/base-plugin": "^2.3.1",
|
||||
"@appium/docutils": "^1.0.30",
|
||||
"@appium/base-driver": "^9.16.1",
|
||||
"@appium/base-plugin": "^2.3.2",
|
||||
"@appium/docutils": "^1.0.31",
|
||||
"@appium/logger": "^1.6.1",
|
||||
"@appium/schema": "^0.8.0",
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/schema": "^0.8.1",
|
||||
"@appium/support": "^6.0.5",
|
||||
"@appium/types": "^0.25.1",
|
||||
"@sidvind/better-ajv-errors": "3.0.1",
|
||||
"ajv": "8.17.1",
|
||||
"ajv-formats": "3.0.1",
|
||||
@@ -29956,9 +29956,9 @@
|
||||
}
|
||||
},
|
||||
"eslint-import-resolver-typescript": {
|
||||
"version": "3.8.2",
|
||||
"resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.2.tgz",
|
||||
"integrity": "sha512-o0nvXxsatYCDTzI1K5b3aYGQ6PjpDGJEVN86zqJw5SEewhmmggfRTotd2dqWr2t2zbeYpIEWGTCkgtUpIEIcaQ==",
|
||||
"version": "3.8.3",
|
||||
"resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.3.tgz",
|
||||
"integrity": "sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==",
|
||||
"requires": {
|
||||
"@nolyfill/is-core-module": "1.0.39",
|
||||
"debug": "^4.3.7",
|
||||
@@ -29966,7 +29966,7 @@
|
||||
"get-tsconfig": "^4.10.0",
|
||||
"is-bun-module": "^1.0.2",
|
||||
"stable-hash": "^0.0.4",
|
||||
"tinyglobby": "^0.2.11"
|
||||
"tinyglobby": "^0.2.12"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
@@ -36197,9 +36197,9 @@
|
||||
}
|
||||
},
|
||||
"tinyglobby": {
|
||||
"version": "0.2.11",
|
||||
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.11.tgz",
|
||||
"integrity": "sha512-32TmKeeKUahv0Go8WmQgiEp9Y21NuxjwjqiRC1nrUB51YacfSwuB44xgXD+HdIppmMRgjQNPdrHyA6vIybYZ+g==",
|
||||
"version": "0.2.12",
|
||||
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
|
||||
"integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
|
||||
"requires": {
|
||||
"fdir": "^6.4.3",
|
||||
"picomatch": "^4.0.2"
|
||||
|
||||
+1
-1
@@ -129,7 +129,7 @@
|
||||
"cross-env": "7.0.3",
|
||||
"eslint": "9.20.1",
|
||||
"eslint-config-prettier": "10.0.1",
|
||||
"eslint-import-resolver-typescript": "3.8.2",
|
||||
"eslint-import-resolver-typescript": "3.8.3",
|
||||
"eslint-plugin-import": "2.31.0",
|
||||
"eslint-plugin-mocha": "10.5.0",
|
||||
"eslint-plugin-promise": "7.2.1",
|
||||
|
||||
@@ -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.16.1](https://github.com/appium/appium/compare/appium@2.16.0...appium@2.16.1) (2025-02-20)
|
||||
|
||||
**Note:** Version bump only for package appium
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.16.0](https://github.com/appium/appium/compare/appium@2.15.0...appium@2.16.0) (2025-02-19)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "appium",
|
||||
"version": "2.16.0",
|
||||
"version": "2.16.1",
|
||||
"description": "Automation for Apps.",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -60,13 +60,13 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/base-driver": "^9.16.0",
|
||||
"@appium/base-plugin": "^2.3.1",
|
||||
"@appium/docutils": "^1.0.30",
|
||||
"@appium/base-driver": "^9.16.1",
|
||||
"@appium/base-plugin": "^2.3.2",
|
||||
"@appium/docutils": "^1.0.31",
|
||||
"@appium/logger": "^1.6.1",
|
||||
"@appium/schema": "^0.8.0",
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/schema": "^0.8.1",
|
||||
"@appium/support": "^6.0.5",
|
||||
"@appium/types": "^0.25.1",
|
||||
"@sidvind/better-ajv-errors": "3.0.1",
|
||||
"ajv": "8.17.1",
|
||||
"ajv-formats": "3.0.1",
|
||||
|
||||
@@ -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.
|
||||
|
||||
## [9.16.1](https://github.com/appium/appium/compare/@appium/base-driver@9.16.0...@appium/base-driver@9.16.1) (2025-02-20)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **base-driver:** Optimize the logic of getUrlForProxy ([#21018](https://github.com/appium/appium/issues/21018)) ([8a664a4](https://github.com/appium/appium/commit/8a664a4eef97f45c5bdf7f19708149488b63d7fc))
|
||||
|
||||
|
||||
|
||||
## [9.16.0](https://github.com/appium/appium/compare/@appium/base-driver@9.15.0...@appium/base-driver@9.16.0) (2025-02-19)
|
||||
|
||||
|
||||
|
||||
@@ -9,16 +9,19 @@ import {
|
||||
errorFromW3CJsonCode,
|
||||
getResponseForW3CError,
|
||||
} from '../protocol/errors';
|
||||
import {routeToCommandName} from '../protocol';
|
||||
import {isSessionCommand, routeToCommandName} from '../protocol';
|
||||
import {MAX_LOG_BODY_LENGTH, DEFAULT_BASE_PATH, PROTOCOLS} from '../constants';
|
||||
import ProtocolConverter from './protocol-converter';
|
||||
import {formatResponseValue, formatStatus} from '../protocol/helpers';
|
||||
import http from 'http';
|
||||
import https from 'https';
|
||||
import { match as pathToRegexMatch } from 'path-to-regexp';
|
||||
import nodeUrl from 'node:url';
|
||||
|
||||
|
||||
const DEFAULT_LOG = logger.getLogger('WD Proxy');
|
||||
const DEFAULT_REQUEST_TIMEOUT = 240000;
|
||||
const COMMAND_WITH_SESSION_ID_MATCHER = pathToRegexMatch('/session/:sessionId{/*command}');
|
||||
|
||||
const {MJSONWP, W3C} = PROTOCOLS;
|
||||
|
||||
@@ -111,26 +114,6 @@ class JWProxy {
|
||||
this._activeRequests = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if the given endpoint started with '/session' and
|
||||
* it could have session id after the path.
|
||||
* e.g.
|
||||
* - should return true
|
||||
* - /session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200
|
||||
* - /session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200/url
|
||||
* - should return false
|
||||
* - /session
|
||||
* - /sessions
|
||||
* - /session/
|
||||
* - /status
|
||||
* - /appium/sessions
|
||||
* @param {string} endpoint
|
||||
* @returns {boolean}
|
||||
*/
|
||||
endpointRequiresSessionId(endpoint) {
|
||||
return !!(pathToRegexMatch('/session/:sessionId{/*command}')(endpoint));
|
||||
}
|
||||
|
||||
set downstreamProtocol(value) {
|
||||
this._downstreamProtocol = value;
|
||||
this.protocolConverter.downstreamProtocol = value;
|
||||
@@ -140,67 +123,61 @@ class JWProxy {
|
||||
return this._downstreamProtocol;
|
||||
}
|
||||
|
||||
getUrlForProxy(url) {
|
||||
if (url === '') {
|
||||
url = '/';
|
||||
/**
|
||||
*
|
||||
* @param {string} url
|
||||
* @param {string} [method]
|
||||
* @returns {string}
|
||||
*/
|
||||
getUrlForProxy(url, method) {
|
||||
const parsedUrl = nodeUrl.parse(url || '/');
|
||||
if (
|
||||
!parsedUrl.href || !parsedUrl.pathname
|
||||
|| (parsedUrl.protocol && !['http:', 'https:'].includes(parsedUrl.protocol))
|
||||
) {
|
||||
throw new Error(`Did not know how to proxy the url '${url}'`);
|
||||
}
|
||||
const proxyBase = `${this.scheme}://${this.server}:${this.port}${this.base}`;
|
||||
const endpointRe = '(/(session|status|appium))';
|
||||
let remainingUrl = '';
|
||||
if (/^http/.test(url)) {
|
||||
const first = new RegExp(`(https?://.+)${endpointRe}`).exec(url);
|
||||
if (!first) {
|
||||
throw new Error('Got a complete url but could not extract JWP endpoint');
|
||||
}
|
||||
remainingUrl = url.replace(first[1], '');
|
||||
} else if (new RegExp('^/').test(url)) {
|
||||
remainingUrl = url;
|
||||
} else {
|
||||
throw new Error(`Did not know what to do with url '${url}'`);
|
||||
const pathname = this.reqBasePath && parsedUrl.pathname.startsWith(this.reqBasePath)
|
||||
? parsedUrl.pathname.replace(this.reqBasePath, '')
|
||||
: parsedUrl.pathname;
|
||||
const match = COMMAND_WITH_SESSION_ID_MATCHER(pathname);
|
||||
const normalizedPathname = _.trimEnd(
|
||||
match && _.isArray(match.params?.command)
|
||||
? `/${match.params.command.join('/')}`
|
||||
: pathname,
|
||||
'/'
|
||||
);
|
||||
const commandName = normalizedPathname
|
||||
? routeToCommandName(
|
||||
normalizedPathname,
|
||||
/** @type {import('@appium/types').HTTPMethod | undefined} */ (method)
|
||||
)
|
||||
: '';
|
||||
const requiresSessionId = !commandName || (commandName && isSessionCommand(commandName));
|
||||
const proxyPrefix = `${this.scheme}://${this.server}:${this.port}${this.base}`;
|
||||
let proxySuffix = normalizedPathname ? `/${_.trimStart(normalizedPathname, '/')}` : '';
|
||||
if (parsedUrl.search) {
|
||||
proxySuffix += parsedUrl.search;
|
||||
}
|
||||
|
||||
const stripPrefixRe = new RegExp('^.*?(/(session|status|appium).*)$');
|
||||
if (stripPrefixRe.test(remainingUrl)) {
|
||||
remainingUrl = /** @type {RegExpExecArray} */ (stripPrefixRe.exec(remainingUrl))[1];
|
||||
if (!requiresSessionId) {
|
||||
return `${proxyPrefix}${proxySuffix}`;
|
||||
}
|
||||
|
||||
if (!new RegExp(endpointRe).test(remainingUrl)) {
|
||||
remainingUrl = `/session/${this.sessionId}${remainingUrl}`;
|
||||
if (!this.sessionId) {
|
||||
throw new ReferenceError(`Session ID is not set, but saw a URL that requires it (${url})`);
|
||||
}
|
||||
|
||||
const requiresSessionId = this.endpointRequiresSessionId(remainingUrl);
|
||||
|
||||
if (requiresSessionId && this.sessionId === null) {
|
||||
throw new Error('Trying to proxy a session command without session id');
|
||||
}
|
||||
|
||||
const sessionBaseRe = new RegExp('^/session/([^/]+)');
|
||||
if (sessionBaseRe.test(remainingUrl)) {
|
||||
if (this.sessionId === null) {
|
||||
throw new ReferenceError(
|
||||
`Session ID is not set, but saw a URL path referencing a session (${remainingUrl}). This may be a bug in your client.`
|
||||
);
|
||||
}
|
||||
// we have something like /session/:id/foobar, so we need to replace
|
||||
// the session id
|
||||
const match = sessionBaseRe.exec(remainingUrl);
|
||||
// TODO: if `requiresSessionId` is `false` and `sessionId` is `null`, this is a bug.
|
||||
// are we sure `sessionId` is not `null`?
|
||||
remainingUrl = remainingUrl.replace(
|
||||
/** @type {RegExpExecArray} */ (match)[1],
|
||||
/** @type {string} */ (this.sessionId)
|
||||
);
|
||||
} else if (requiresSessionId) {
|
||||
throw new Error(`Could not find :session section for url: ${remainingUrl}`);
|
||||
}
|
||||
remainingUrl = remainingUrl.replace(/\/$/, ''); // can't have trailing slashes
|
||||
|
||||
return proxyBase + remainingUrl;
|
||||
return `${proxyPrefix}/session/${this.sessionId}${proxySuffix}`;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {string} url
|
||||
* @param {string} method
|
||||
* @param {any} body
|
||||
* @returns {Promise<any>}
|
||||
*/
|
||||
async proxy(url, method, body = null) {
|
||||
method = method.toUpperCase();
|
||||
const newUrl = this.getUrlForProxy(url);
|
||||
const newUrl = this.getUrlForProxy(url, method);
|
||||
const truncateBody = (content) =>
|
||||
_.truncate(_.isString(content) ? content : JSON.stringify(content), {
|
||||
length: MAX_LOG_BODY_LENGTH,
|
||||
|
||||
@@ -4,6 +4,12 @@ import _ from 'lodash';
|
||||
import {util} from '@appium/support';
|
||||
import {PROTOCOLS, DEFAULT_BASE_PATH} from '../constants';
|
||||
import {match} from 'path-to-regexp';
|
||||
import { LRUCache } from 'lru-cache';
|
||||
|
||||
/** @type {LRUCache<string, string>} */
|
||||
const COMMAND_NAMES_CACHE = new LRUCache({
|
||||
max: 1024,
|
||||
});
|
||||
|
||||
const SET_ALERT_TEXT_PAYLOAD_PARAMS = {
|
||||
validate: (jsonObj) =>
|
||||
@@ -941,7 +947,7 @@ export const ALL_COMMANDS = _.flatMap(_.values(METHOD_MAP).map(_.values))
|
||||
/**
|
||||
*
|
||||
* @param {string} endpoint
|
||||
* @param {import('@appium/types').HTTPMethod} method
|
||||
* @param {import('@appium/types').HTTPMethod} [method]
|
||||
* @param {string} [basePath=DEFAULT_BASE_PATH]
|
||||
* @returns {string|undefined}
|
||||
*/
|
||||
@@ -959,22 +965,46 @@ export function routeToCommandName(endpoint, method, basePath = DEFAULT_BASE_PAT
|
||||
throw new Error(`'${endpoint}' cannot be translated to a command name: ${err.message}`);
|
||||
}
|
||||
|
||||
const normalizedMethod = _.toUpper(method);
|
||||
const cacheKey = toCommandNameCacheKey(normalizedPathname, normalizedMethod);
|
||||
if (COMMAND_NAMES_CACHE.has(cacheKey)) {
|
||||
return COMMAND_NAMES_CACHE.get(cacheKey) || undefined;
|
||||
}
|
||||
|
||||
/** @type {string[]} */
|
||||
const possiblePathnames = [];
|
||||
if (!normalizedPathname.startsWith('/session/')) {
|
||||
possiblePathnames.push(`/session/any-session-id${normalizedPathname}`);
|
||||
}
|
||||
possiblePathnames.push(normalizedPathname);
|
||||
const normalizedMethod = _.toUpper(method);
|
||||
for (const [routePath, routeSpec] of _.toPairs(METHOD_MAP)) {
|
||||
const routeMatcher = match(routePath);
|
||||
if (possiblePathnames.some((pp) => routeMatcher(pp))) {
|
||||
const commandName = routeSpec?.[normalizedMethod]?.command;
|
||||
const commandForAnyMethod = () => _.first(
|
||||
(_.keys(routeSpec) ?? []).map((key) => routeSpec[key]?.command)
|
||||
);
|
||||
const commandName = normalizedMethod
|
||||
? routeSpec?.[normalizedMethod]?.command
|
||||
: commandForAnyMethod();
|
||||
if (commandName) {
|
||||
COMMAND_NAMES_CACHE.set(cacheKey, commandName);
|
||||
return commandName;
|
||||
}
|
||||
}
|
||||
}
|
||||
// storing an empty string means we did not find any match for this set of arguments
|
||||
// and we want to cache this result
|
||||
COMMAND_NAMES_CACHE.set(cacheKey, '');
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {string} endpoint
|
||||
* @param {string} [method]
|
||||
* @returns {string}
|
||||
*/
|
||||
function toCommandNameCacheKey(endpoint, method) {
|
||||
return `${endpoint}:${method ?? ''}`;
|
||||
}
|
||||
|
||||
// driver commands that do not require a session to already exist
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/base-driver",
|
||||
"version": "9.16.0",
|
||||
"version": "9.16.1",
|
||||
"description": "Base driver class for Appium drivers",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -44,8 +44,8 @@
|
||||
"test:types": "tsd"
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/support": "^6.0.5",
|
||||
"@appium/types": "^0.25.1",
|
||||
"@colors/colors": "1.6.0",
|
||||
"async-lock": "1.4.1",
|
||||
"asyncbox": "3.0.0",
|
||||
|
||||
@@ -61,58 +61,72 @@ describe('proxy', function () {
|
||||
});
|
||||
describe('getUrlForProxy', function () {
|
||||
it('should modify session id, host, and port', function () {
|
||||
let j = mockProxy({sessionId: '123'});
|
||||
j.getUrlForProxy('http://host.com:1234/session/456/element/200/value').should.eql(
|
||||
`http://${TEST_HOST}:${port}/session/123/element/200/value`
|
||||
);
|
||||
mockProxy({sessionId: '123'})
|
||||
.getUrlForProxy('http://host.com:1234/session/456/element/200/value', 'POST').should.eql(
|
||||
`http://${TEST_HOST}:${port}/session/123/element/200/value`
|
||||
);
|
||||
});
|
||||
it('should prepend scheme, host and port if not provided', function () {
|
||||
let j = mockProxy({sessionId: '123'});
|
||||
j.getUrlForProxy('/session/456/element/200/value').should.eql(
|
||||
j.getUrlForProxy('/session/456/element/200/value', 'POST').should.eql(
|
||||
`http://${TEST_HOST}:${port}/session/123/element/200/value`
|
||||
);
|
||||
j.getUrlForProxy('/session/456/appium/settings', 'POST').should.eql(
|
||||
`http://${TEST_HOST}:${port}/session/123/appium/settings`
|
||||
);
|
||||
});
|
||||
it('should prepend scheme, host, port and session if not provided', function () {
|
||||
mockProxy({sessionId: '123'})
|
||||
.getUrlForProxy('/element/200/value', 'POST').should.eql(
|
||||
`http://${TEST_HOST}:${port}/session/123/element/200/value`
|
||||
);
|
||||
});
|
||||
it('should keep query parameters', function () {
|
||||
mockProxy({sessionId: '123'})
|
||||
.getUrlForProxy('/element/200/value?foo=1&bar=2', 'POST').should.eql(
|
||||
`http://${TEST_HOST}:${port}/session/123/element/200/value?foo=1&bar=2`
|
||||
);
|
||||
});
|
||||
it('should respect nonstandard incoming request base path', function () {
|
||||
let j = mockProxy({sessionId: '123', reqBasePath: ''});
|
||||
j.getUrlForProxy('/session/456/element/200/value').should.eql(
|
||||
`http://${TEST_HOST}:${port}/session/123/element/200/value`
|
||||
);
|
||||
mockProxy({sessionId: '123', reqBasePath: ''})
|
||||
.getUrlForProxy('/session/456/element/200/value', 'POST').should.eql(
|
||||
`http://${TEST_HOST}:${port}/session/123/element/200/value`
|
||||
);
|
||||
|
||||
j = mockProxy({sessionId: '123', reqBasePath: '/my/base/path'});
|
||||
j.getUrlForProxy('/my/base/path/session/456/element/200/value').should.eql(
|
||||
`http://${TEST_HOST}:${port}/session/123/element/200/value`
|
||||
);
|
||||
mockProxy({sessionId: '123', reqBasePath: '/my/base/path'})
|
||||
.getUrlForProxy('/my/base/path/session/456/element/200/value', 'POST').should.eql(
|
||||
`http://${TEST_HOST}:${port}/session/123/element/200/value`
|
||||
);
|
||||
|
||||
mockProxy({reqBasePath: '/my/base/path'})
|
||||
.getUrlForProxy('/my/base/path/session', 'POST').should.eql(
|
||||
`http://${TEST_HOST}:${port}/session`
|
||||
);
|
||||
});
|
||||
it('should work with urls which do not have session ids', function () {
|
||||
let j = mockProxy({sessionId: '123'});
|
||||
j.getUrlForProxy('http://host.com:1234/session').should.eql(
|
||||
j.getUrlForProxy('http://host.com:1234/session', 'POST').should.eql(
|
||||
`http://${TEST_HOST}:${port}/session`
|
||||
);
|
||||
|
||||
let newUrl = j.getUrlForProxy('/session');
|
||||
newUrl.should.eql(`http://${TEST_HOST}:${port}/session`);
|
||||
j.getUrlForProxy('/session', 'POST')
|
||||
.should.eql(`http://${TEST_HOST}:${port}/session`);
|
||||
j.getUrlForProxy('/appium/sessions', 'GET')
|
||||
.should.eql(`http://${TEST_HOST}:${port}/appium/sessions`);
|
||||
});
|
||||
it('should throw an error if url requires a sessionId but its null', function () {
|
||||
let j = mockProxy();
|
||||
let e;
|
||||
try {
|
||||
j.getUrlForProxy('/session/456/element/200/value');
|
||||
j.getUrlForProxy('/session/456/element/200/value', 'POST');
|
||||
} catch (err) {
|
||||
e = err;
|
||||
}
|
||||
should.exist(e);
|
||||
e.message.should.contain('without session id');
|
||||
e.message.should.contain('not set');
|
||||
});
|
||||
it('should not throw an error if url does not require a session id and its null', function () {
|
||||
let j = mockProxy();
|
||||
let newUrl = j.getUrlForProxy('/status');
|
||||
|
||||
should.exist(newUrl);
|
||||
});
|
||||
it('should not throw an error if url does not require a session id with appium vendor prefix and its null', function () {
|
||||
let j = mockProxy();
|
||||
let newUrl = j.getUrlForProxy('/appium/something');
|
||||
|
||||
let newUrl = mockProxy().getUrlForProxy('/status', 'GET');
|
||||
should.exist(newUrl);
|
||||
});
|
||||
});
|
||||
@@ -215,30 +229,4 @@ describe('proxy', function () {
|
||||
res.sentBody.should.eql({value: {message: 'chrome not reachable'}});
|
||||
});
|
||||
});
|
||||
describe('endpointRequiresSessionId', function () {
|
||||
const j = mockProxy({sessionId: '123'});
|
||||
|
||||
[
|
||||
'/session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200',
|
||||
'/session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200/',
|
||||
'/session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200/url',
|
||||
'/session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200/element/3d001db2-7987-42a7-975d-8d5d5304083f',
|
||||
].forEach(function (endpoint) {
|
||||
it(`should be true with ${endpoint}`, function () {
|
||||
j.endpointRequiresSessionId(endpoint).should.be.true;
|
||||
});
|
||||
});
|
||||
|
||||
[
|
||||
'/session',
|
||||
'/session/',
|
||||
'/sessions',
|
||||
'/appium/sessions',
|
||||
'/status',
|
||||
].forEach(function (endpoint) {
|
||||
it(`should be false with ${endpoint}`, function () {
|
||||
j.endpointRequiresSessionId(endpoint).should.be.false;
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -37,7 +37,7 @@ describe('JWProxy', function () {
|
||||
it('should translate host and port', function () {
|
||||
let incomingUrl = PROXY_STATUS_URL;
|
||||
let j = createJWProxy();
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl);
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl, 'GET');
|
||||
proxyUrl.should.equal(testStatusURL);
|
||||
});
|
||||
it('should translate the scheme', function () {
|
||||
@@ -49,21 +49,21 @@ describe('JWProxy', function () {
|
||||
it('should translate the base', function () {
|
||||
let incomingUrl = PROXY_STATUS_URL;
|
||||
let j = createJWProxy({base: ''});
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl);
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl, 'GET');
|
||||
proxyUrl.should.equal(testStatusURL);
|
||||
});
|
||||
it('should translate the session id', function () {
|
||||
let incomingUrl = createProxyURL('foobar', 'element');
|
||||
let j = createJWProxy({sessionId: 'barbaz'});
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl);
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl, 'POST');
|
||||
proxyUrl.should.equal(createTestURL('barbaz', 'element'));
|
||||
});
|
||||
it('should error when translating session commands without session id', function () {
|
||||
let incomingUrl = createProxyURL('foobar', 'element');
|
||||
let j = createJWProxy();
|
||||
(() => {
|
||||
j.getUrlForProxy(incomingUrl);
|
||||
}).should.throw('session id');
|
||||
j.getUrlForProxy(incomingUrl, 'POST');
|
||||
}).should.throw('not set');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -71,7 +71,7 @@ describe('JWProxy', function () {
|
||||
it('should proxy /status', function () {
|
||||
let incomingUrl = '/status';
|
||||
let j = createJWProxy();
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl);
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl, 'GET');
|
||||
proxyUrl.should.equal(testStatusURL);
|
||||
});
|
||||
it('should proxy /session', function () {
|
||||
@@ -83,64 +83,64 @@ describe('JWProxy', function () {
|
||||
it('should proxy /sessions', function () {
|
||||
let incomingUrl = '/sessions';
|
||||
let j = createJWProxy();
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl);
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl, 'GET');
|
||||
proxyUrl.should.equal(createTestURL('', 'sessions'));
|
||||
});
|
||||
it('should proxy session commands based off /session', function () {
|
||||
let incomingUrl = '/session/foobar/element';
|
||||
let j = createJWProxy({sessionId: 'barbaz'});
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl);
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl, 'POST');
|
||||
proxyUrl.should.equal(createTestURL('barbaz', 'element'));
|
||||
});
|
||||
it('should error session commands based off /session without session id', function () {
|
||||
let incomingUrl = '/session/foobar/element';
|
||||
let j = createJWProxy();
|
||||
(() => {
|
||||
j.getUrlForProxy(incomingUrl);
|
||||
}).should.throw('session id');
|
||||
j.getUrlForProxy(incomingUrl, 'POST');
|
||||
}).should.throw('not set');
|
||||
});
|
||||
it('should proxy session commands based off ', function () {
|
||||
let incomingUrl = '/session/3d001db2-7987-42a7-975d-8d5d5304083f/timeouts/implicit_wait';
|
||||
let j = createJWProxy({sessionId: '123'});
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl);
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl, 'POST');
|
||||
proxyUrl.should.equal(createTestURL('123', 'timeouts/implicit_wait'));
|
||||
});
|
||||
it('should proxy session commands based off /session as ""', function () {
|
||||
let incomingUrl = '';
|
||||
let j = createJWProxy();
|
||||
(() => {
|
||||
j.getUrlForProxy(incomingUrl);
|
||||
}).should.throw('session id');
|
||||
j.getUrlForProxy(incomingUrl, 'GET');
|
||||
}).should.throw('not set');
|
||||
j = createJWProxy({sessionId: '123'});
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl);
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl, 'GET');
|
||||
proxyUrl.should.equal(createTestSessionURL('123'));
|
||||
});
|
||||
it('should proxy session commands without /session', function () {
|
||||
let incomingUrl = '/element';
|
||||
let j = createJWProxy({sessionId: 'barbaz'});
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl);
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl, 'POST');
|
||||
proxyUrl.should.equal(createTestURL('barbaz', 'element'));
|
||||
});
|
||||
it(`should proxy session commands when '/session' is in the url`, function () {
|
||||
let incomingUrl =
|
||||
'/session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200/cookie/session-something-or-other';
|
||||
let j = createJWProxy({sessionId: 'barbaz'});
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl);
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl, 'POST');
|
||||
proxyUrl.should.equal(createTestURL('barbaz', 'cookie/session-something-or-other'));
|
||||
});
|
||||
it(`should proxy session commands when '/session' is in the url and not base on the original url`, function () {
|
||||
let incomingUrl =
|
||||
'/session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200/cookie/session-something-or-other';
|
||||
let j = createJWProxy({sessionId: 'barbaz'});
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl);
|
||||
let proxyUrl = j.getUrlForProxy(incomingUrl, 'POST');
|
||||
proxyUrl.should.equal(createTestURL('barbaz', 'cookie/session-something-or-other'));
|
||||
});
|
||||
it('should error session commands without /session without session id', function () {
|
||||
let incomingUrl = '/element';
|
||||
let j = createJWProxy();
|
||||
(() => {
|
||||
j.getUrlForProxy(incomingUrl);
|
||||
}).should.throw('session id');
|
||||
j.getUrlForProxy(incomingUrl, 'POST');
|
||||
}).should.throw('not set');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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.3.2](https://github.com/appium/appium/compare/@appium/base-plugin@2.3.1...@appium/base-plugin@2.3.2) (2025-02-20)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.3.1](https://github.com/appium/appium/compare/@appium/base-plugin@2.3.0...@appium/base-plugin@2.3.1) (2025-02-19)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/base-plugin",
|
||||
"version": "2.3.1",
|
||||
"version": "2.3.2",
|
||||
"description": "The base plugin used to create Appium 2.0 plugins",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -40,8 +40,8 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/base-driver": "^9.16.0",
|
||||
"@appium/support": "^6.0.4"
|
||||
"@appium/base-driver": "^9.16.1",
|
||||
"@appium/support": "^6.0.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.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.
|
||||
|
||||
## [1.0.31](https://github.com/appium/appium/compare/@appium/docutils@1.0.30...@appium/docutils@1.0.31) (2025-02-20)
|
||||
|
||||
**Note:** Version bump only for package @appium/docutils
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [1.0.30](https://github.com/appium/appium/compare/@appium/docutils@1.0.29...@appium/docutils@1.0.30) (2025-02-19)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/docutils",
|
||||
"version": "1.0.30",
|
||||
"version": "1.0.31",
|
||||
"description": "Documentation generation utilities for Appium and related projects",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -48,8 +48,8 @@
|
||||
"start": "node ./build/lib/cli/index.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/tsconfig": "^0.3.3",
|
||||
"@appium/support": "^6.0.5",
|
||||
"@appium/tsconfig": "^0.3.4",
|
||||
"@sliphua/lilconfig-ts-loader": "3.2.2",
|
||||
"chalk": "4.1.2",
|
||||
"consola": "3.4.0",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
mkdocs==1.6.1
|
||||
mkdocs-git-revision-date-localized-plugin==1.3.0
|
||||
mkdocs-material==9.6.4
|
||||
mkdocs-material==9.6.5
|
||||
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.
|
||||
|
||||
## [0.7.6](https://github.com/appium/appium/compare/@appium/driver-test-support@0.7.5...@appium/driver-test-support@0.7.6) (2025-02-20)
|
||||
|
||||
**Note:** Version bump only for package @appium/driver-test-support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.7.5](https://github.com/appium/appium/compare/@appium/driver-test-support@0.7.4...@appium/driver-test-support@0.7.5) (2025-02-19)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/driver-test-support",
|
||||
"version": "0.7.5",
|
||||
"version": "0.7.6",
|
||||
"description": "Test utilities for Appium drivers",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -41,7 +41,7 @@
|
||||
},
|
||||
"types": "./build/lib/index.d.ts",
|
||||
"dependencies": {
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/types": "^0.25.1",
|
||||
"axios": "1.7.9",
|
||||
"bluebird": "3.7.2",
|
||||
"chai": "5.2.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.
|
||||
|
||||
## [3.2.2](https://github.com/appium/appium/compare/@appium/fake-plugin@3.2.1...@appium/fake-plugin@3.2.2) (2025-02-20)
|
||||
|
||||
**Note:** Version bump only for package @appium/fake-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.2.1](https://github.com/appium/appium/compare/@appium/fake-plugin@3.2.0...@appium/fake-plugin@3.2.1) (2025-02-19)
|
||||
|
||||
**Note:** Version bump only for package @appium/fake-plugin
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/fake-plugin",
|
||||
"version": "3.2.1",
|
||||
"version": "3.2.2",
|
||||
"description": "A fake Appium 2.0 plugin",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -39,8 +39,8 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/base-plugin": "^2.3.1",
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/base-plugin": "^2.3.2",
|
||||
"@appium/support": "^6.0.5",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
"source-map-support": "0.5.21"
|
||||
|
||||
@@ -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.29](https://github.com/appium/appium/compare/@appium/images-plugin@3.0.28...@appium/images-plugin@3.0.29) (2025-02-20)
|
||||
|
||||
**Note:** Version bump only for package @appium/images-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.28](https://github.com/appium/appium/compare/@appium/images-plugin@3.0.27...@appium/images-plugin@3.0.28) (2025-02-19)
|
||||
|
||||
**Note:** Version bump only for package @appium/images-plugin
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/images-plugin",
|
||||
"version": "3.0.28",
|
||||
"version": "3.0.29",
|
||||
"description": "Plugin for working with images and image elements in Appium",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -40,7 +40,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/opencv": "^3.0.8",
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/support": "^6.0.5",
|
||||
"lodash": "4.17.21",
|
||||
"lru-cache": "10.4.3",
|
||||
"sharp": "0.33.5",
|
||||
|
||||
@@ -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.
|
||||
|
||||
## [0.3.51](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.50...@appium/plugin-test-support@0.3.51) (2025-02-20)
|
||||
|
||||
**Note:** Version bump only for package @appium/plugin-test-support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.3.50](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.49...@appium/plugin-test-support@0.3.50) (2025-02-19)
|
||||
|
||||
**Note:** Version bump only for package @appium/plugin-test-support
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/plugin-test-support",
|
||||
"version": "0.3.50",
|
||||
"version": "0.3.51",
|
||||
"description": "Testing utilities for Appium plugins",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -41,7 +41,7 @@
|
||||
"test:unit": "exit 0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/types": "^0.25.1",
|
||||
"get-port": "5.1.1",
|
||||
"log-symbols": "4.1.0",
|
||||
"source-map-support": "0.5.21",
|
||||
|
||||
@@ -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.
|
||||
|
||||
## [0.8.1](https://github.com/appium/appium/compare/@appium/schema@0.8.0...@appium/schema@0.8.1) (2025-02-20)
|
||||
|
||||
**Note:** Version bump only for package @appium/schema
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.8.0](https://github.com/appium/appium/compare/@appium/schema@0.7.1...@appium/schema@0.8.0) (2025-02-19)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/schema",
|
||||
"version": "0.8.0",
|
||||
"version": "0.8.1",
|
||||
"description": "Appium Configuration Schema",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -19,7 +19,7 @@
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/appium/appium.git",
|
||||
"directory": "schema"
|
||||
"directory": "packages/schema"
|
||||
},
|
||||
"license": "Apache-2.0",
|
||||
"author": "https://github.com/appium",
|
||||
|
||||
@@ -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.5](https://github.com/appium/appium/compare/@appium/support@6.0.4...@appium/support@6.0.5) (2025-02-20)
|
||||
|
||||
**Note:** Version bump only for package @appium/support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [6.0.4](https://github.com/appium/appium/compare/@appium/support@6.0.3...@appium/support@6.0.4) (2025-02-19)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/support",
|
||||
"version": "6.0.4",
|
||||
"version": "6.0.5",
|
||||
"description": "Support libs used across appium packages",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -42,8 +42,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/logger": "^1.6.1",
|
||||
"@appium/tsconfig": "^0.3.3",
|
||||
"@appium/types": "^0.25.0",
|
||||
"@appium/tsconfig": "^0.3.4",
|
||||
"@appium/types": "^0.25.1",
|
||||
"@colors/colors": "1.6.0",
|
||||
"archiver": "7.0.1",
|
||||
"axios": "1.7.9",
|
||||
|
||||
@@ -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.1.5](https://github.com/appium/appium/compare/@appium/test-support@3.1.4...@appium/test-support@3.1.5) (2025-02-20)
|
||||
|
||||
**Note:** Version bump only for package @appium/test-support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.1.4](https://github.com/appium/appium/compare/@appium/test-support@3.1.3...@appium/test-support@3.1.4) (2025-02-19)
|
||||
|
||||
**Note:** Version bump only for package @appium/test-support
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/test-support",
|
||||
"version": "3.1.4",
|
||||
"version": "3.1.5",
|
||||
"description": "A collection of test utilities used across Appium packages",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -45,7 +45,7 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/support": "^6.0.4",
|
||||
"@appium/support": "^6.0.5",
|
||||
"@colors/colors": "1.6.0",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
|
||||
@@ -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.
|
||||
|
||||
## [0.3.4](https://github.com/appium/appium/compare/@appium/tsconfig@0.3.3...@appium/tsconfig@0.3.4) (2025-02-20)
|
||||
|
||||
**Note:** Version bump only for package @appium/tsconfig
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.3.3](https://github.com/appium/appium/compare/@appium/tsconfig@0.3.2...@appium/tsconfig@0.3.3) (2024-04-08)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/tsconfig",
|
||||
"version": "0.3.3",
|
||||
"version": "0.3.4",
|
||||
"description": "Shared TypeScript Config for Appium",
|
||||
"main": "tsconfig.json",
|
||||
"keywords": [
|
||||
@@ -21,6 +21,11 @@
|
||||
"bugs": {
|
||||
"url": "https://github.com/appium/appium/issues"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/appium/appium.git",
|
||||
"directory": "packages/tsconfig"
|
||||
},
|
||||
"homepage": "https://appium.io",
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.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.
|
||||
|
||||
## [0.25.1](https://github.com/appium/appium/compare/@appium/types@0.25.0...@appium/types@0.25.1) (2025-02-20)
|
||||
|
||||
**Note:** Version bump only for package @appium/types
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.25.0](https://github.com/appium/appium/compare/@appium/types@0.24.0...@appium/types@0.25.0) (2025-02-19)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/types",
|
||||
"version": "0.25.0",
|
||||
"version": "0.25.1",
|
||||
"description": "Various type declarations used across Appium",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -39,8 +39,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/logger": "^1.6.1",
|
||||
"@appium/schema": "^0.8.0",
|
||||
"@appium/tsconfig": "^0.3.3",
|
||||
"@appium/schema": "^0.8.1",
|
||||
"@appium/tsconfig": "^0.3.4",
|
||||
"type-fest": "4.35.0"
|
||||
},
|
||||
"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.29](https://github.com/appium/appium/compare/@appium/universal-xml-plugin@1.0.28...@appium/universal-xml-plugin@1.0.29) (2025-02-20)
|
||||
|
||||
**Note:** Version bump only for package @appium/universal-xml-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [1.0.28](https://github.com/appium/appium-plugins/compare/@appium/universal-xml-plugin@1.0.27...@appium/universal-xml-plugin@1.0.28) (2025-02-19)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/universal-xml-plugin",
|
||||
"version": "1.0.28",
|
||||
"version": "1.0.29",
|
||||
"description": "Appium plugin for making XML source and XPath queries the same across iOS and Android",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -18,7 +18,8 @@
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/appium/appium-plugins.git"
|
||||
"url": "https://github.com/appium/appium.git",
|
||||
"directory": "packages/universal-xml-plugin"
|
||||
},
|
||||
"license": "Apache-2.0",
|
||||
"author": "https://github.com/appium",
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ Appium extension authors--or anyone else--may use this config as well.
|
||||
- `:enableVulnerabilityAlerts` - For "security" purposes
|
||||
- `:rebaseStalePrs` - Renovate will automatically rebase its PRs
|
||||
- `:semanticCommits` - Renovate will use semantic commit messages
|
||||
- `:semanticPrefixChore` - Renovate's PRs have the `chore` prefix in its semantic commit message
|
||||
- `:semanticCommitTypeAll(chore)` - Renovate's PRs have the `chore` prefix in its semantic commit message
|
||||
|
||||
### Custom Rules
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
":enableVulnerabilityAlerts",
|
||||
":rebaseStalePrs",
|
||||
":semanticCommits",
|
||||
":semanticPrefixChore"
|
||||
":semanticCommitTypeAll(chore)"
|
||||
],
|
||||
"packageRules": [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user