mirror of
https://github.com/appium/appium.git
synced 2026-11-04 16:25:32 +08:00
Compare commits
210
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
407706cf5e | ||
|
|
72f32848b6 | ||
|
|
572037a0e2 | ||
|
|
d7cf013401 | ||
|
|
eb5ec8940a | ||
|
|
9f655f6f85 | ||
|
|
38ef95fe09 | ||
|
|
4d48010a30 | ||
|
|
b4b20e05fd | ||
|
|
5be7f5d319 | ||
|
|
d44e66977c | ||
|
|
1f368828e6 | ||
|
|
b8368bb666 | ||
|
|
d55f13b2ed | ||
|
|
5899c2db93 | ||
|
|
1be08eca81 | ||
|
|
d5af68ecdd | ||
|
|
59ef09d955 | ||
|
|
ee8425a001 | ||
|
|
3936cb43dc | ||
|
|
f88bd3cb88 | ||
|
|
665219b7e0 | ||
|
|
b8f2dd8508 | ||
|
|
b139a2d313 | ||
|
|
26ab0ef759 | ||
|
|
85d06086dd | ||
|
|
a6d49c1ac8 | ||
|
|
dde504d501 | ||
|
|
9a0c059c3a | ||
|
|
c928a75f4a | ||
|
|
b4369473ee | ||
|
|
66626d26e5 | ||
|
|
7cb1621e80 | ||
|
|
03f8dc9b18 | ||
|
|
63d7550d02 | ||
|
|
a74132cc96 | ||
|
|
5f9aa955f1 | ||
|
|
de057fa8b0 | ||
|
|
cf792279b1 | ||
|
|
2687fa47a0 | ||
|
|
984e54a7ae | ||
|
|
cf17ec7a80 | ||
|
|
17e0dc03f4 | ||
|
|
caa4e586b1 | ||
|
|
7fc7446612 | ||
|
|
111b05c922 | ||
|
|
bd6ab81c94 | ||
|
|
3ce4f96e0b | ||
|
|
471e95504c | ||
|
|
47765747b6 | ||
|
|
2448fa0145 | ||
|
|
e7df8823e8 | ||
|
|
b126df6234 | ||
|
|
0e6c3eede2 | ||
|
|
3da17b6ecd | ||
|
|
636d6b3802 | ||
|
|
97c8ab5384 | ||
|
|
79378e4c20 | ||
|
|
df07665509 | ||
|
|
68456b8aea | ||
|
|
8529e360be | ||
|
|
91bb539420 | ||
|
|
3f6c61a084 | ||
|
|
82b024c77e | ||
|
|
7f7939dc62 | ||
|
|
8eb4e888f6 | ||
|
|
7516d4135a | ||
|
|
c4ef218006 | ||
|
|
917084ccca | ||
|
|
c905be032f | ||
|
|
e1ccdd2d48 | ||
|
|
dcf58168d6 | ||
|
|
7bee9ccc89 | ||
|
|
e4ae2772ac | ||
|
|
ef673786f4 | ||
|
|
98017937f7 | ||
|
|
26ded7a4cc | ||
|
|
d1705e2818 | ||
|
|
32677efe87 | ||
|
|
1fd29c7012 | ||
|
|
0d5a0a5727 | ||
|
|
f59e84e24c | ||
|
|
39cb9069a6 | ||
|
|
e808f14bf6 | ||
|
|
f837a6a9ea | ||
|
|
1c6b3216ab | ||
|
|
d49289b0ae | ||
|
|
7a23f11aab | ||
|
|
f4055bced2 | ||
|
|
ed8a91e721 | ||
|
|
f890d15de9 | ||
|
|
e04e4e902a | ||
|
|
b25e0fd576 | ||
|
|
6c034aa84a | ||
|
|
e21785a5e4 | ||
|
|
bd7b42007d | ||
|
|
28f0926bf8 | ||
|
|
d722ecc292 | ||
|
|
670a77b021 | ||
|
|
0755246be7 | ||
|
|
41cb869453 | ||
|
|
ea8c74b372 | ||
|
|
50d6181187 | ||
|
|
a059b12cb4 | ||
|
|
d25a0fca9b | ||
|
|
0db8dc7790 | ||
|
|
f92640a824 | ||
|
|
42c0bd370e | ||
|
|
383fee4e11 | ||
|
|
5951027ce7 | ||
|
|
889a533eef | ||
|
|
d83d436d01 | ||
|
|
bd8a92f588 | ||
|
|
db5a6323e6 | ||
|
|
2f56b05619 | ||
|
|
1e5201afad | ||
|
|
9ef18310da | ||
|
|
db0eec05c5 | ||
|
|
fc9a93fee0 | ||
|
|
7b40a3225e | ||
|
|
9cc598a92c | ||
|
|
91320ddd02 | ||
|
|
23dc3d56ce | ||
|
|
35742f0962 | ||
|
|
52a6f96e08 | ||
|
|
d064dd1e8c | ||
|
|
7bf4d694d4 | ||
|
|
cdc7c09421 | ||
|
|
17c7a7cb29 | ||
|
|
3032b0009c | ||
|
|
6dacb5e70c | ||
|
|
5a8af1302f | ||
|
|
569db839f1 | ||
|
|
32e9191431 | ||
|
|
21b808d94f | ||
|
|
83cc668596 | ||
|
|
b92ab24a25 | ||
|
|
4c7661dd13 | ||
|
|
b14c03f38a | ||
|
|
0e1eb95006 | ||
|
|
edb490f359 | ||
|
|
202da83449 | ||
|
|
d10b4ba2c4 | ||
|
|
6cd2c547de | ||
|
|
95e3fd2612 | ||
|
|
795092a97f | ||
|
|
5936d53d78 | ||
|
|
5f75d8c8ce | ||
|
|
214e922c3e | ||
|
|
30425f9038 | ||
|
|
6313704ee5 | ||
|
|
fb0f8f776c | ||
|
|
faff8dc199 | ||
|
|
501395c948 | ||
|
|
759e06a940 | ||
|
|
966d305e5e | ||
|
|
f3b212ce05 | ||
|
|
6f0101eb63 | ||
|
|
9e4cff1595 | ||
|
|
63ef7eb2fb | ||
|
|
3dcbd6afe7 | ||
|
|
45abac485b | ||
|
|
1fdf117c63 | ||
|
|
d9711b4191 | ||
|
|
9b16f0d9ad | ||
|
|
da84efc42d | ||
|
|
7733b0de3b | ||
|
|
e8e0444bd2 | ||
|
|
c3bea4cf14 | ||
|
|
b85a6b939f | ||
|
|
0e94a33240 | ||
|
|
4efd0c5cad | ||
|
|
fcb42f0809 | ||
|
|
882bd06d1c | ||
|
|
a6d6480074 | ||
|
|
45f5660b94 | ||
|
|
7aabbc3115 | ||
|
|
2ef9cc5983 | ||
|
|
6ce45cf4f8 | ||
|
|
9a21dbacf2 | ||
|
|
9617974481 | ||
|
|
ca54b4f79a | ||
|
|
35f1dbabf6 | ||
|
|
c3dfade284 | ||
|
|
cbc1f500bc | ||
|
|
293c8031d9 | ||
|
|
43690a4c77 | ||
|
|
40873fb655 | ||
|
|
7d9065cf31 | ||
|
|
06218c0c6a | ||
|
|
348b297578 | ||
|
|
314e1b468a | ||
|
|
16a7899154 | ||
|
|
cc24a26c6a | ||
|
|
0f1c12d859 | ||
|
|
f4011f17d4 | ||
|
|
f7e47316c0 | ||
|
|
d2666f9eb5 | ||
|
|
ac73522351 | ||
|
|
5aaca9b11c | ||
|
|
9733c7715e | ||
|
|
5cd9ca5c21 | ||
|
|
7084d7cfdc | ||
|
|
b5460fc131 | ||
|
|
fc3ea5caa2 | ||
|
|
332cc48a09 | ||
|
|
83f24acd39 | ||
|
|
b08210a6f8 | ||
|
|
474f3ce092 | ||
|
|
9ef2533256 |
@@ -20,7 +20,7 @@ _Put an `x` in the boxes that apply. You can also fill these out after creating
|
||||
- [ ] I have signed the CLA
|
||||
- [ ] Lint and unit tests pass locally with my changes
|
||||
- [ ] I have added tests that prove my fix is effective or that my feature works
|
||||
- [ ] I have added necessary documentation (if appropriate)
|
||||
- [ ] I have added the necessary documentation (if appropriate)
|
||||
- [ ] Any dependent changes have been merged and published in downstream modules
|
||||
|
||||
## Further comments
|
||||
|
||||
@@ -13,4 +13,4 @@ jobs:
|
||||
name: Auto-Label PRs
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: fuxingloh/multi-labeler@v2
|
||||
- uses: fuxingloh/multi-labeler@v4
|
||||
|
||||
@@ -9,7 +9,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check for "On Hold" label
|
||||
uses: egmacke/action-check-label@v2
|
||||
uses: egmacke/action-check-label@v3
|
||||
with:
|
||||
label: On Hold
|
||||
state: absent
|
||||
|
||||
@@ -25,6 +25,6 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Validate Renovate Config
|
||||
uses: rinchsan/renovate-config-validator@v0.0.12
|
||||
uses: rinchsan/renovate-config-validator@v0.2.0
|
||||
with:
|
||||
pattern: '{.renovaterc.json,renovate/default.json}'
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
npm run lint:commit -- --edit ${1}
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
npm run lint:staged
|
||||
@@ -1,11 +0,0 @@
|
||||
module.exports = {
|
||||
extends: ['@commitlint/config-conventional'],
|
||||
rules: {
|
||||
'body-leading-blank': [0],
|
||||
'body-max-line-length': [0],
|
||||
'footer-max-line-length': [0],
|
||||
'header-max-length': [0],
|
||||
'subject-case': [0],
|
||||
'subject-full-stop': [0],
|
||||
},
|
||||
};
|
||||
Generated
+1884
-3829
File diff suppressed because it is too large
Load Diff
+20
-27
@@ -44,13 +44,10 @@
|
||||
"docs:preview": "npm run -w packages/appium build:docs:preview",
|
||||
"doctor": "node ./packages/doctor",
|
||||
"generate-docs": "npm run --workspace=packages/appium generate-docs",
|
||||
"husky-install": "husky install",
|
||||
"lint": "eslint .",
|
||||
"lint:ci": "eslint --quiet .",
|
||||
"lint:commit": "commitlint",
|
||||
"lint:fix": "run-s \"lint -- --fix\"",
|
||||
"lint:staged": "lint-staged",
|
||||
"prepare": "run-p husky-install rebuild",
|
||||
"prepare": "run-p rebuild",
|
||||
"prepublishOnly": "run-s rebuild",
|
||||
"preversion": "run-s rebuild",
|
||||
"version": "run-s sync-pkgs stage-synced-pkgs",
|
||||
@@ -84,51 +81,47 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@colors/colors": "1.6.0",
|
||||
"@commitlint/cli": "18.4.3",
|
||||
"@commitlint/config-conventional": "18.4.3",
|
||||
"@tsconfig/node14": "14.1.0",
|
||||
"@types/chai": "4.3.11",
|
||||
"@tsconfig/node14": "14.1.2",
|
||||
"@types/chai": "4.3.14",
|
||||
"@types/chai-as-promised": "7.1.8",
|
||||
"@types/diff": "5.0.9",
|
||||
"@types/mocha": "10.0.6",
|
||||
"@types/node": "20.10.6",
|
||||
"@types/semver": "7.5.6",
|
||||
"@types/sinon": "17.0.2",
|
||||
"@types/node": "20.12.7",
|
||||
"@types/semver": "7.5.8",
|
||||
"@types/sinon": "17.0.3",
|
||||
"@types/sinon-chai": "3.2.12",
|
||||
"@types/source-map-support": "0.5.10",
|
||||
"@types/teen_process": "2.0.4",
|
||||
"@types/ws": "8.5.10",
|
||||
"@types/yargs": "17.0.32",
|
||||
"@typescript-eslint/eslint-plugin": "6.17.0",
|
||||
"@typescript-eslint/parser": "6.17.0",
|
||||
"@typescript-eslint/eslint-plugin": "7.6.0",
|
||||
"@typescript-eslint/parser": "7.6.0",
|
||||
"asyncbox": "3.0.0",
|
||||
"chai": "4.3.10",
|
||||
"chai": "4.4.1",
|
||||
"chai-as-promised": "7.1.1",
|
||||
"chai-webdriverio-async": "2.8.0",
|
||||
"chai-webdriverio-async": "3.0.0",
|
||||
"conventional-changelog-conventionalcommits": "7.0.2",
|
||||
"cpy-cli": "5.0.0",
|
||||
"eslint": "8.56.0",
|
||||
"eslint": "8.57.0",
|
||||
"eslint-config-prettier": "9.1.0",
|
||||
"eslint-find-rules": "4.1.0",
|
||||
"eslint-import-resolver-typescript": "3.6.1",
|
||||
"eslint-plugin-import": "2.29.1",
|
||||
"eslint-plugin-mocha": "10.2.0",
|
||||
"eslint-plugin-mocha": "10.4.2",
|
||||
"eslint-plugin-promise": "6.1.1",
|
||||
"fancy-log": "2.0.0",
|
||||
"finalhandler": "1.2.0",
|
||||
"get-port": "5.1.1",
|
||||
"husky": "8.0.3",
|
||||
"json-schema-to-typescript": "13.1.1",
|
||||
"lerna": "8.0.1",
|
||||
"lint-staged": "15.2.0",
|
||||
"json-schema-to-typescript": "13.1.2",
|
||||
"lerna": "8.1.2",
|
||||
"log-symbols": "4.1.0",
|
||||
"midnight-smoker": "8.0.0",
|
||||
"mjpeg-consumer": "2.0.0",
|
||||
"mjpeg-server": "0.3.1",
|
||||
"mocha": "10.2.0",
|
||||
"mocha": "10.4.0",
|
||||
"mocha-chai-jest-snapshot": "1.1.4",
|
||||
"npm-run-all": "4.1.5",
|
||||
"prettier": "3.1.1",
|
||||
"npm-run-all2": "6.1.2",
|
||||
"prettier": "3.2.5",
|
||||
"rewiremock": "3.14.5",
|
||||
"rimraf": "5.0.5",
|
||||
"serve-static": "1.15.0",
|
||||
@@ -137,10 +130,10 @@
|
||||
"sync-monorepo-packages": "1.0.2",
|
||||
"through2": "4.0.2",
|
||||
"ts-node": "10.9.2",
|
||||
"tsd": "0.30.2",
|
||||
"typescript": "5.2.2",
|
||||
"tsd": "0.31.0",
|
||||
"typescript": "5.4.5",
|
||||
"validate.js": "0.13.1",
|
||||
"webdriverio": "8.27.0",
|
||||
"webdriverio": "8.36.0",
|
||||
"ws": "8.16.0",
|
||||
"yaml-js": "0.3.1"
|
||||
},
|
||||
|
||||
@@ -3,6 +3,93 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [2.5.3](https://github.com/appium/appium/compare/appium@2.5.2...appium@2.5.3) (2024-04-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.36.0 ([#19998](https://github.com/appium/appium/issues/19998)) ([72f3284](https://github.com/appium/appium/commit/72f32848b68e6ef8c047f700ffd0be7d68c49aba))
|
||||
|
||||
|
||||
|
||||
## [2.5.2](https://github.com/appium/appium/compare/appium@2.5.1...appium@2.5.2) (2024-04-08)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** make --log-filters work ([#19825](https://github.com/appium/appium/issues/19825)) ([0d5a0a5](https://github.com/appium/appium/commit/0d5a0a572787d913412bbfd70835e5ba8f94334c))
|
||||
* **appium:** update definitelytyped ([2687fa4](https://github.com/appium/appium/commit/2687fa47a0c2f11983e5ccb2ee17eaae9279469d))
|
||||
* **appium:** update definitelytyped ([68456b8](https://github.com/appium/appium/commit/68456b8aea3c6ae7225814748fb36d9d4117cc9f))
|
||||
* **appium:** update dependency ajv-formats to v3 ([#19957](https://github.com/appium/appium/issues/19957)) ([59ef09d](https://github.com/appium/appium/commit/59ef09d9558f1a6a9f4ee3d81d4cb0b7218706b4))
|
||||
* **appium:** update dependency winston to v3.12.0 ([8eb4e88](https://github.com/appium/appium/commit/8eb4e888f624acfc1d42977eeda2d4c1ae139efc))
|
||||
* **appium:** update dependency winston to v3.13.0 ([03f8dc9](https://github.com/appium/appium/commit/03f8dc9b18f226975f025ceda7e1d907de8b45d5))
|
||||
* **docutils:** update dependency lilconfig to v3.1.0 ([f92640a](https://github.com/appium/appium/commit/f92640a824644545b680e23c7f3ec7f51de9df98))
|
||||
* **docutils:** update dependency lilconfig to v3.1.1 ([e04e4e9](https://github.com/appium/appium/commit/e04e4e902a212cf17ca79b3edc0b7545a1af507b))
|
||||
* **docutils:** update dependency typescript to v5.4.2 ([#19876](https://github.com/appium/appium/issues/19876)) ([2448fa0](https://github.com/appium/appium/commit/2448fa0145620657ccc72b5637f1b7737fe52580))
|
||||
* **docutils:** update dependency yaml to v2.4.0 ([26ded7a](https://github.com/appium/appium/commit/26ded7a4cce1fa9bca28521e4b60cad0edacbe96))
|
||||
* **docutils:** update dependency yaml to v2.4.1 ([636d6b3](https://github.com/appium/appium/commit/636d6b3802268ec6532f9f3a958f304c6760d172))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.32.0 ([d25a0fc](https://github.com/appium/appium/commit/d25a0fca9b3a94880525fd956068f59427a40b26))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.32.1 ([ea8c74b](https://github.com/appium/appium/commit/ea8c74b372e73e88cf0303aa17db943014416e64))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.32.2 ([#19807](https://github.com/appium/appium/issues/19807)) ([6c034aa](https://github.com/appium/appium/commit/6c034aa84af573d36fa934c71d3d4ff328772553))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.32.3 ([f837a6a](https://github.com/appium/appium/commit/f837a6a9eaf34914ffdbfddcc3cb2f7e7427bc63))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.32.4 ([7516d41](https://github.com/appium/appium/commit/7516d4135a1eec37ba298f407254d825961795af))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.33.1 ([#19877](https://github.com/appium/appium/issues/19877)) ([0e6c3ee](https://github.com/appium/appium/commit/0e6c3eede250193fad390387ec494918367176d9))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.34.1 ([7fc7446](https://github.com/appium/appium/commit/7fc7446612f3257fa421dfec006d02730df10f59))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.35.1 ([63d7550](https://github.com/appium/appium/commit/63d7550d02f049a5c3bea5d27e7e8385d7698a4f))
|
||||
* **support:** update dependency @types/semver to v7.5.8 ([d1705e2](https://github.com/appium/appium/commit/d1705e2818d435b4c37cb70753af1de5427378e2))
|
||||
* **support:** update dependency axios to v1.6.8 ([bd6ab81](https://github.com/appium/appium/commit/bd6ab81c9408ab0f90fc25fc112f9257ec2973ad))
|
||||
|
||||
|
||||
|
||||
## [2.5.1](https://github.com/appium/appium/compare/appium@2.5.0...appium@2.5.1) (2024-02-13)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.31.1 ([db0eec0](https://github.com/appium/appium/commit/db0eec05c58fe970351a309a01507cad824bdad2))
|
||||
* **support:** update dependency @types/semver to v7.5.7 ([bd8a92f](https://github.com/appium/appium/commit/bd8a92f588d40c97fbe51f8bd3b7835c96e9fe8f))
|
||||
* **support:** update dependency semver to v7.6.0 ([7b40a32](https://github.com/appium/appium/commit/7b40a3225ebe0f5976a26d05db2f22ba7b13a130))
|
||||
|
||||
|
||||
|
||||
## [2.5.0](https://github.com/appium/appium/compare/appium@2.4.1...appium@2.5.0) (2024-02-06)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **appium:** Set a proper exit code if any of required doctor checks fails ([#19617](https://github.com/appium/appium/issues/19617)) ([f4011f1](https://github.com/appium/appium/commit/f4011f17d4d03bc854c43462848a4c38427acb85))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Tune warning messages about installed extensions ([#19612](https://github.com/appium/appium/issues/19612)) ([5cd9ca5](https://github.com/appium/appium/commit/5cd9ca5c21393c70d259f7525d2c9d35b7eeb2a2))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.27.2 ([35f1dba](https://github.com/appium/appium/commit/35f1dbabf6e852c4ae84ec128879bc7e61321a16))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.28.0 ([e8e0444](https://github.com/appium/appium/commit/e8e0444bd28d94963090065a813a4b10be665caa))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.28.6 ([da84efc](https://github.com/appium/appium/commit/da84efc42dd62b2be07a52dd4379791e2cef6eb2))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.28.8 ([1fdf117](https://github.com/appium/appium/commit/1fdf117c63f6e9871f4de3c0bd93ecbdb13a9235))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.29.0 ([6f0101e](https://github.com/appium/appium/commit/6f0101eb6343eb8b372e00a6b71d2b2ee909404c))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.29.1 ([fb0f8f7](https://github.com/appium/appium/commit/fb0f8f776c6a03174f4569efa60d817a930809cf))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.29.3 ([6dacb5e](https://github.com/appium/appium/commit/6dacb5e70ca3529a080f629f5245c2b676746e2c))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.29.7 ([52a6f96](https://github.com/appium/appium/commit/52a6f96e085ff13acdf8d5013673861b7e0da818))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.30.0 ([91320dd](https://github.com/appium/appium/commit/91320ddd02dca89a8cec258d0ab44a49d344d71c))
|
||||
* **support:** update dependency axios to v1.6.4 ([332cc48](https://github.com/appium/appium/commit/332cc48a09b5532a8d51f85f3a24785e2c754e00))
|
||||
* **support:** update dependency axios to v1.6.5 ([#19616](https://github.com/appium/appium/issues/19616)) ([ac73522](https://github.com/appium/appium/commit/ac73522351b31bd6c11972c61daa8b6b8d18fb91))
|
||||
* **support:** update dependency axios to v1.6.6 ([6313704](https://github.com/appium/appium/commit/6313704ee5a8ee3aee726eb512ef259b6fa1041c))
|
||||
* **support:** update dependency axios to v1.6.7 ([795092a](https://github.com/appium/appium/commit/795092a97f6d7569cccc4b5c166f52fef821514b))
|
||||
* **types:** update dependency type-fest to v4.10 ([#19694](https://github.com/appium/appium/issues/19694)) ([966d305](https://github.com/appium/appium/commit/966d305e5eade9369a3875243bcad951df88545c))
|
||||
* **types:** update dependency type-fest to v4.10.1 ([#19703](https://github.com/appium/appium/issues/19703)) ([501395c](https://github.com/appium/appium/commit/501395c9489320b84ab49ff78af4270f66070d62))
|
||||
|
||||
|
||||
|
||||
## [2.4.1](https://github.com/appium/appium/compare/appium@2.4.0...appium@2.4.1) (2024-01-04)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Properly handle version check for aliases ([474f3ce](https://github.com/appium/appium/commit/474f3ce092c68981655d9deba546a6202acea141))
|
||||
|
||||
|
||||
|
||||
## [2.4.0](https://github.com/appium/appium/compare/appium@2.3.0...appium@2.4.0) (2024-01-03)
|
||||
|
||||
|
||||
|
||||
@@ -10,6 +10,9 @@ theme:
|
||||
favicon: assets/images/appium-logo.png
|
||||
|
||||
plugins:
|
||||
blog:
|
||||
enabled: true
|
||||
post_excerpt: required
|
||||
redirects:
|
||||
redirect_maps:
|
||||
'intro/requirements.md': 'quickstart/requirements.md'
|
||||
@@ -34,7 +37,7 @@ extra:
|
||||
link: https://twitter.com/AppiumDevs
|
||||
alternate:
|
||||
- name: English
|
||||
link: /docs/en/
|
||||
link: /docs/en/
|
||||
lang: en
|
||||
- name: 日本
|
||||
link: /docs/ja/
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
authors:
|
||||
jlipps:
|
||||
name: "Jonathan Lipps"
|
||||
description: "Appium project lead. Learn more about Jonathan at https://jlipps.com"
|
||||
avatar: "https://gravatar.com/avatar/fdaadd825d92709bcf7fe76dffa12c40681c6108c67bcddf19478b2d00e3794b.jpg"
|
||||
slug: "jlipps"
|
||||
url: "https://jlipps.com"
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
# Appium Blog
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
---
|
||||
authors:
|
||||
- jlipps
|
||||
date: 2024-03-07
|
||||
---
|
||||
|
||||
# Hello World!
|
||||
|
||||
This is the first post in the Appium blog. There's not much to see here yet. We're creating this
|
||||
space so we can make announcements or post other news, or information about events, that don't
|
||||
really fit inside the documentation itself.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
Stay tuned for more!
|
||||
@@ -217,6 +217,10 @@ A possibly empty list of elements inside the shadow root matching the selector
|
||||
|
||||
Get the log for a given log type.
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
Please use the `/session/:sessionId/se/log` endpoint instead
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Parameters
|
||||
@@ -273,6 +277,10 @@ The event history for the session
|
||||
|
||||
Get available log types as a list of strings
|
||||
|
||||
!!! warning "Deprecated"
|
||||
|
||||
Please use the `/session/:sessionId/se/log/types` endpoint instead
|
||||
|
||||
<!-- comment source: method-signature -->
|
||||
|
||||
#### Response
|
||||
@@ -319,9 +327,22 @@ Get data for all sessions running on an Appium server
|
||||
|
||||
#### Response
|
||||
|
||||
`MultiSessionData`<`C`\>[]
|
||||
A list of session data objects.
|
||||
Each session data object will be returned with `id` and the session's capabilities as `capabilities` keys like an example below:
|
||||
|
||||
A list of session data objects
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id":"ba30c6da-c266-4734-8ddb-c16f5bb53e16",
|
||||
"capabilities":{ "platformName":"ios","browserName":"safari","automationName":"xcuitest","platformVersion":"17.2","deviceName":"iPhone 15" }
|
||||
},
|
||||
{
|
||||
"id":"1441110c-1ece-4e45-abbf-ebf404f45f0a",
|
||||
"capabilities":{ "platformName":"ios","browserName":"safari","automationName":"xcuitest","platformVersion":"17.0","deviceName":"iPhone 14" }
|
||||
},
|
||||
...
|
||||
]
|
||||
```
|
||||
|
||||
### `getSettings`
|
||||
|
||||
@@ -465,7 +486,9 @@ Set the various timeouts associated with a session
|
||||
|
||||
Set the implicit wait timeout
|
||||
|
||||
**`Deprecated`**
|
||||
!!! warning "Deprecated"
|
||||
|
||||
Please use the `/session/:sessionId/timeouts` endpoint instead
|
||||
|
||||
Use `timeouts` instead
|
||||
|
||||
@@ -506,7 +529,9 @@ Add a custom-named event to the Appium event log
|
||||
|
||||
Reset the current session (run the delete session and create session subroutines)
|
||||
|
||||
**`Deprecated`**
|
||||
!!! warning "Deprecated"
|
||||
|
||||
Please use each driver's launch, activate, terminate or cleanup method.
|
||||
|
||||
Use explicit session management commands instead
|
||||
|
||||
|
||||
@@ -58,20 +58,20 @@ work with certain versions of Appium). For Appium 2, for example, this would loo
|
||||
Your `package.json` must contain an `appium` field, like this (we call this the 'Appium extension
|
||||
metadata'):
|
||||
|
||||
```json
|
||||
{
|
||||
...,
|
||||
"appium": {
|
||||
"driverName": "fake",
|
||||
"automationName": "Fake",
|
||||
"platformNames": [
|
||||
"Fake"
|
||||
],
|
||||
"mainClass": "FakeDriver"
|
||||
},
|
||||
...
|
||||
}
|
||||
```
|
||||
```json
|
||||
{
|
||||
...,
|
||||
"appium": {
|
||||
"driverName": "fake",
|
||||
"automationName": "Fake",
|
||||
"platformNames": [
|
||||
"Fake"
|
||||
],
|
||||
"mainClass": "FakeDriver"
|
||||
},
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
The required subfields are:
|
||||
|
||||
@@ -130,12 +130,12 @@ like this:
|
||||
|
||||
```json
|
||||
{
|
||||
"devDependencies": {
|
||||
...,
|
||||
"appium": "^2.0.0",
|
||||
"your-driver": "file:.",
|
||||
...
|
||||
}
|
||||
"devDependencies": {
|
||||
...,
|
||||
"appium": "^2.0.0",
|
||||
"your-driver": "file:.",
|
||||
...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -657,6 +657,13 @@ A couple notes about this system:
|
||||
1. 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.
|
||||
|
||||
|
||||
### Build Appium Doctor checks
|
||||
|
||||
Your users can run `appium driver doctor <driverName>` to run installation and health checks. Visit
|
||||
the [Building Doctor Checks](./build-doctor-checks.md) guide for more information on this
|
||||
capability.
|
||||
|
||||
### Implement handling of Appium settings
|
||||
|
||||
Appium users can send parameters to your driver via CLI args as well as via capabilities. But these
|
||||
|
||||
@@ -412,6 +412,12 @@ Overriding Execute Methods from drivers works as you'd expect: if your plugin de
|
||||
Method with the same name as that of a driver, your command (in this case `plugMeIn`) will be
|
||||
called first. You can choose to run the driver's original behaviour via `next` if you want.
|
||||
|
||||
### Build Appium Doctor checks
|
||||
|
||||
Your users can run `appium plugin doctor <pluginName>` to run installation and health checks. Visit
|
||||
the [Building Doctor Checks](./build-doctor-checks.md) guide for more information on this
|
||||
capability.
|
||||
|
||||
### Update the Appium server object
|
||||
|
||||
You probably don't normally need to update the Appium server object (which is an
|
||||
|
||||
@@ -31,6 +31,7 @@ These clients are not maintained by the Appium team and can be used with other l
|
||||
|[WebdriverIO](https://webdriver.io/docs/appium)|Node.js|
|
||||
|[Nightwatch.js](https://nightwatchjs.org/guide/mobile-app-testing/introduction.html)|Node.js|
|
||||
|[RobotFramework](https://github.com/serhatbolsu/robotframework-appiumlibrary)|DSL|
|
||||
|[multicatch's appium-client](https://github.com/multicatch/appium-client)|Rust|
|
||||
|
||||
In general, any W3C WebDriver spec-compatible client will also integrate well with Appium, though
|
||||
some Appium-specific commands may not be implemented in other clients.
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: Local Validation Of Extension PRs
|
||||
---
|
||||
|
||||
Sometimes it might be necessary to validate if a remote driver or a plugin PR works for the particular local
|
||||
environment before it is merged or published. This tutorial describes how to achieve that.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Recent LTS version of NodeJS. Check [Node.js main page](https://nodejs.org) for the download link.
|
||||
- Recent version of the Appium server. Use the following commands to ensure you have
|
||||
the latest version installed: `npm uninstall appium` and `npm install -g appium`.
|
||||
- [Git](https://git-scm.com/) should be available locally.
|
||||
|
||||
## Installation
|
||||
|
||||
- [Check out]((https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/checking-out-pull-requests-locally)) the PR locally.
|
||||
There is also an option (although it is less flexible, because you won't be able to easily fetch
|
||||
any changes to this PR later) to simply [download](https://docs.github.com/en/repositories/working-with-files/using-files/downloading-source-code-archives) and unzip the sources
|
||||
locally. If you choose the later option then no `git` tool would be necessary.
|
||||
- Navigate to the local driver or plugin folder and run `npm i` from that folder.
|
||||
- Make sure you don't have the given driver or plugin already installed. Use the `appium driver uninstall <driver_name>`
|
||||
or `appium plugin uninstall <plugin_name>` CLI in order to delete any leftovers. The value of
|
||||
`<driver_name>`/`<plugin_name>` depends on the actual driver or plugin name the PR has been prepared for.
|
||||
If you are not sure which name you need to use then check the content of the `package.json` manifest,
|
||||
which must be always located under the root folder of the fetched sources. You should be looking for
|
||||
the `"appium" -> "driverName"` entry value there.
|
||||
- Change the current folder to the one, which is NOT the driver/plugin folder root or its subfolder.
|
||||
Also, make sure your current working folder does not contain any extra `package.json` file. If
|
||||
it does then simply navigate to any other folder that does not.
|
||||
- Run the following command in order to link the driver/plugin sources to the Appium server:
|
||||
`appium driver install --source=local <full_path_to_driver_folder_with_fetched_sources>` or
|
||||
`appium plugin install --source=local <full_path_to_plugin_folder_with_fetched_sources>`.
|
||||
- Stop the Appium server if it is running and start it again (`appium server --use-drivers=<driver_name>`)
|
||||
to check the list of loaded drivers. If the linking succeeded then you must see the driver name and the path to its
|
||||
parent folder in the server logs. In case of a plugin it is required to explicitly request
|
||||
this plugin to be loaded upon server startup: `appium server --use-plugins=<plugin_name>`.
|
||||
|
||||
## Update
|
||||
|
||||
After you have tested the PR and there are issues it might be necessary to update the local branch with
|
||||
the recent changes from Git. Follow the next steps for that:
|
||||
|
||||
- Navigate to the parent folder of your local driver/plugin and run `git pull`.
|
||||
- Stop Appium server if it is running.
|
||||
- Run `npm i` in the parent folder of your local driver/plugin to rebuild it and update any dependencies if necessary.
|
||||
- Start Appium server again similarly to how this is done in the corresponding [Installation](#installation) step above.
|
||||
|
||||
## Switching Back To a Stable Release
|
||||
|
||||
After the PR is merged there is no need to use the local plugin/driver deployment anymore, and it makes sense
|
||||
to switch back to the package managed by NPM. Follow the next steps for that:
|
||||
|
||||
- Unlink the installed driver/plugin from the server by running `appium driver uninstall <driver_name>` or
|
||||
`appium plugin uninstall <driver_name>`.
|
||||
- Delete the local source folder (`rm -rf <full_path_to_plugin_or_driver_folder_with_fetched_sources>`).
|
||||
- Install the driver or the plugin from NPM. Check the component README in order to find a proper command for that.
|
||||
@@ -32,7 +32,7 @@ driver install`.
|
||||
So, from a technical perspective, an Appium driver is just a bit of code that inherits from some
|
||||
other Appium code. That's it! Now, inheriting from `BaseDriver` actually gives us a lot, because
|
||||
`BaseDriver` is essentially an encapsulation of the entire WebDriver protocol. So all a driver
|
||||
needs to do to do something useful is to *implement* Node.js methods with names corresponding to
|
||||
needs to do something useful is to *implement* Node.js methods with names corresponding to
|
||||
their WebDriver protocol equivalents.
|
||||
|
||||
So let's say I wanted to do something with this empty driver; first I have to decide which
|
||||
|
||||
@@ -28,7 +28,13 @@ appium
|
||||
You should see some output that starts with a line like this:
|
||||
|
||||
```
|
||||
[Appium] Welcome to Appium v2.0.0
|
||||
[Appium] Welcome to Appium v2.4.1
|
||||
```
|
||||
|
||||
In order to update Appium using `npm`:
|
||||
|
||||
```bash
|
||||
npm update -g appium
|
||||
```
|
||||
|
||||
That's it! If you see this, the Appium server is up and running. Go ahead and quit
|
||||
|
||||
@@ -9,6 +9,7 @@ The basic requirements for the Appium server are:
|
||||
|
||||
* A macOS, Linux, or Windows operating system
|
||||
* [Node.js](https://nodejs.org) version in the [SemVer](https://semver.org) range `^14.17.0 || ^16.13.0 || >=18.0.0`
|
||||
* LTS is recommended
|
||||
* [`npm`](https://npmjs.com) version `>=8` (`npm` is usually bundled with Node.js, but can be upgraded
|
||||
independently)
|
||||
|
||||
|
||||
@@ -47,6 +47,11 @@ contents:
|
||||
[WebdriverIO documentation](https://webdriver.io/docs/gettingstarted) for a fuller explanation
|
||||
of the various API commands you see and what their purpose is.
|
||||
|
||||
!!! note
|
||||
|
||||
The sample code is available from [GitHub Appium repository](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
|
||||
@@ -68,4 +73,3 @@ If all goes well, you'll see the Settings app open up and navigate to the "Batte
|
||||
app closes again.
|
||||
|
||||
Congratulations, you've started your Appium journey! Read on for some [next steps](./next-steps.md) to explore.
|
||||
|
||||
|
||||
@@ -26,11 +26,17 @@ You usually do not need to worry about the prefix.
|
||||
|
||||
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.
|
||||
|
||||
- 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.
|
||||
|
||||
!!! note
|
||||
|
||||
The sample code is available from [GitHub Appium repository](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
|
||||
|
||||
@@ -6,12 +6,32 @@ title: Write a Test (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.
|
||||
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.
|
||||
|
||||
As the first step, let's initialize a Gemfile to manage the dependency:
|
||||
|
||||
```bash
|
||||
gem install appium_lib
|
||||
bundle init
|
||||
```
|
||||
|
||||
Then, you could add Appium Ruby Client dependency as below:
|
||||
|
||||
```bash
|
||||
bundle add appium_lib_core
|
||||
# or
|
||||
gem install appium_lib_core
|
||||
# bundle add appium_lib
|
||||
```
|
||||
|
||||
Test code example below uses `test-unit` module, thus please run:
|
||||
|
||||
```bash
|
||||
bundle add test-unit
|
||||
```
|
||||
|
||||
Once these steps has done, your `Gemfile` file should include:
|
||||
|
||||
```ruby title="Gemfile"
|
||||
--8<-- "./sample-code/quickstarts/rb/Gemfile"
|
||||
```
|
||||
|
||||
The `appium_lib_core` is the main part as an Appium client.
|
||||
@@ -21,7 +41,7 @@ The `appium_lib_core` is the main part as an Appium client.
|
||||
This example is by the `appium_lib_core` with `test-unit` gem module.
|
||||
Tes code in `appium_lib` should be similar.
|
||||
|
||||
```python title="test.py"
|
||||
```ruby title="test.rb"
|
||||
--8<-- "./sample-code/quickstarts/rb/test.rb"
|
||||
```
|
||||
|
||||
@@ -34,6 +54,10 @@ Tes code in `appium_lib` should be similar.
|
||||
- [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.
|
||||
|
||||
!!! note
|
||||
|
||||
The sample code is available from [GitHub Appium repository](https://github.com/appium/appium/tree/master/packages/appium/sample-code/quickstarts/rb).
|
||||
|
||||
|
||||
Basically, this code is doing the following:
|
||||
|
||||
@@ -49,7 +73,7 @@ running in another terminal session, otherwise you'll get an error about not bei
|
||||
to one. Then, you can execute the script:
|
||||
|
||||
```bash
|
||||
bundle install
|
||||
# Please run "bundle install" first if your environment has not run the installation command yet.
|
||||
bundle exec ruby test.rb
|
||||
```
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
# Blog
|
||||
|
||||
@@ -8,6 +8,7 @@ theme:
|
||||
language: en
|
||||
nav:
|
||||
- Welcome: index.md
|
||||
- Blog: blog/index.md
|
||||
- Introduction:
|
||||
- intro/index.md
|
||||
- Background:
|
||||
@@ -50,6 +51,7 @@ nav:
|
||||
- guides/migrating-1-to-2.md
|
||||
- Server/Driver Configuration:
|
||||
- guides/managing-exts.md
|
||||
- guides/branch-testing.md
|
||||
- guides/config.md
|
||||
- guides/security.md
|
||||
- guides/log-filters.md
|
||||
@@ -68,6 +70,7 @@ nav:
|
||||
- developing/build-drivers.md
|
||||
- developing/build-plugins.md
|
||||
- developing/build-docs.md
|
||||
- developing/build-doctor-checks.md
|
||||
- Contributing:
|
||||
- contributing/index.md
|
||||
- contributing/develop.md
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
# Blog
|
||||
|
||||
@@ -1,6 +1,36 @@
|
||||
---
|
||||
title: Appium文档
|
||||
hide:
|
||||
- navigation
|
||||
- toc
|
||||
|
||||
title: 欢迎
|
||||
---
|
||||
<style>
|
||||
.md-typeset h1 {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
<div style="text-align: center">
|
||||
<img src="assets/images/appium-logo-horiz.png" style="max-width: 400px;" />
|
||||
</div>
|
||||
|
||||
欢迎访问 Appium 文档!Appium 是一个开源项目和相关软件的生态系统。
|
||||
软件,旨在促进许多应用程序平台的用户界面自动化,包括移动平台(iOS、
|
||||
Android、Tizen)、浏览器(Chrome、Firefox、Safari)、桌面(macOS、Windows)、电视(Roku、tvOS、
|
||||
Android TV、三星)等!
|
||||
|
||||
TODO
|
||||
## 探索文档
|
||||
|
||||
<div class="grid cards" markdown>
|
||||
|
||||
- 查看 [__介绍__](./intro/index.md) 确保您理解关键概念
|
||||
- 通过 [__快速入门__](./quickstart/index.md) 来进行设置并运行基本的 Android 测试
|
||||
- 访问 [__生态系统__](./ecosystem/index.md) 页面,查看您可能需要使用的驱动程序、客户端和插件列表
|
||||
- 参考 [__CLI 参考__](./cli/index.md) 用于从命令行使用 Appium
|
||||
- 查看 [__命令说明__](./commands/index.md) Appium 和插件公开的命令列表
|
||||
- 阅读不同的 [__指南__](./guides/migrating-1-to-2.md) 来获取各种说明、技巧和窍门
|
||||
- 查阅各种第三方的 [__资源__](./resources.md) 来探索网上的Appium运用
|
||||
- 为了创建您自己的Appium拓展, 请查看 [__开发者__](./developing/index.md) 文档
|
||||
- 对 Appium 自身的贡献,请查阅 [__贡献__](./contributing/index.md) 页面
|
||||
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,29 @@
|
||||
---
|
||||
title: 快速开始
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: 快速入门介绍
|
||||
---
|
||||
|
||||
让我们开始使用 Appium!为了成功使用本快速入门介绍, 我们建议您
|
||||
首先阅读 [介绍](../intro/index.md), 以便您了解
|
||||
运行 Appium 和编写 Appium 脚本所涉及的概念。
|
||||
|
||||
TODO
|
||||
本快速入门课程的基本计划如下:
|
||||
|
||||
1. 安装 Appium
|
||||
1. 安装 Appium 驱动及其依赖项 (我们将使用 [UiAutomator2
|
||||
driver](https://github.com/appium/appium-uiautomator2-driver) 对于这些例子)
|
||||
1. 用你选择的语言安装 Appium 客户端库(本指南包含以下选项
|
||||
JavaScript、Python、Java、Ruby 和 .NET 的选项)。
|
||||
1. 使用示例应用程序编写并运行简单的 Appium 自动化脚本
|
||||
|
||||
### 要求
|
||||
|
||||
开始之前,请确保您的系统满足运行 Appium 服务器的
|
||||
[要求](../quickstart/requirements.md).其他要求
|
||||
将在安装 UiAutomator2 驱动程序时一并讨论。 本指南还假设
|
||||
您已熟练掌握您的操作系统平台上的基本命令行功能,例如可以运行命令行命令, 设置
|
||||
永久的系统变量, 等等...
|
||||
|
||||
现在你已经准备好开始了!请前往 [安装 Appium](./install.md)吧.
|
||||
|
||||
@@ -1,6 +1,41 @@
|
||||
---
|
||||
title: Install Appium
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: 安装 Appium
|
||||
---
|
||||
|
||||
!!! 信息
|
||||
|
||||
TODO
|
||||
安装前,请务必检查[系统要求](./requirements.md).
|
||||
|
||||
您可以使用 `npm` 在全局范围内安装 Appium:
|
||||
|
||||
```bash
|
||||
npm i -g appium
|
||||
```
|
||||
|
||||
!!! 注意
|
||||
|
||||
目前不支持其他软件包管理器。
|
||||
|
||||
安装完成后,您应该可以从命令行运行 Appium:
|
||||
|
||||
```
|
||||
appium
|
||||
```
|
||||
|
||||
你应该会看到一些输出结果,开头一行是这样的:
|
||||
|
||||
```
|
||||
[Appium] 欢迎来到 Appium v2.4.1
|
||||
```
|
||||
|
||||
为了更新Appiums使用 `npm`:
|
||||
|
||||
```bash
|
||||
npm update -g appium
|
||||
```
|
||||
|
||||
就是这样!如果你看到这个,说明 Appium 服务器已经启动并运行。按 (Ctrl-C)
|
||||
继续退出并跳转到到 [下一步](./uiauto2-driver.md), 在这里我们将安装一个用于自动运行 Android 应用程序的驱动程序.
|
||||
@@ -1,6 +1,23 @@
|
||||
---
|
||||
title: Next Steps
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: 下一步
|
||||
---
|
||||
|
||||
既然您已经成功配置了您的系统进行Android自动化并运行了一个简单的测试,
|
||||
您可能希望继续探索这份文档。特别是对于初学者,
|
||||
以下是一些很好的指南和参考资料:
|
||||
|
||||
TODO
|
||||
- 在 [生态系统](../ecosystem/index.md) 页面: 浏览可用的驱动程序, 客户端, 插件, 和工具
|
||||
- [管理Appium驱动程序与插件](../guides/managing-exts.md)
|
||||
- [能力](../guides/caps.md)
|
||||
- [设置](../guides/settings.md)
|
||||
|
||||
您还会发现[Appium 监测者](https://github.com/appium/appium-inspector) 编写 Appium 测试不可或缺的工具。
|
||||
是编写 Appium 测试不可或缺的工具,因为它可以对应用程序进行可视化检查,并
|
||||
帮助您发现可用于测试脚本的元素定位器。
|
||||
|
||||
您还可以利用为您提供的众多在线 Appium 课程之一。
|
||||
|
||||
祝你好运,玩得开心!
|
||||
|
||||
@@ -1,5 +1,23 @@
|
||||
---
|
||||
title: Write a Test (Java)
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: 编写一个测试(Java)
|
||||
---
|
||||
|
||||
TODO
|
||||
Appium 团队为 Java 编程语言维护一个官方[客户端](https://github.com/appium/java-client).
|
||||
它是建立在 [Selenium](https://github.com/SeleniumHQ/selenium)上的.
|
||||
您也可以在 Kotlin 项目中使用该客户端.
|
||||
|
||||
遵循[在测试框架中添加 Appium Java 客户端](https://github.com/appium/java-client#add-appium-java-client-to-your-test-framework)
|
||||
教程,以便将该库连接到测试框架源。
|
||||
|
||||
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)
|
||||
文章,了解有关当前驱动程序类实现的更多信息.
|
||||
|
||||
请参阅 [使用实例](https://github.com/appium/java-client#usage-examples) 一文,以了解
|
||||
如何从测试框架调用 Java 客户端功能。
|
||||
|
||||
成功运行测试后,您可以继续阅读以下内容 [下一步骤](./next-steps.md) 继续探索
|
||||
|
||||
@@ -1,6 +1,73 @@
|
||||
---
|
||||
title: Write a Test (JS)
|
||||
hide:
|
||||
- toc
|
||||
|
||||
title: 编写一个测试 (JS)
|
||||
---
|
||||
|
||||
要在 JavaScript(Node.js)中编写 Appium 测试,我们需要选择一个与 Appium 兼容的客户端
|
||||
库。维护最好的库和 Appium 团队推荐使用的库是
|
||||
[WebdriverIO](https://webdriver.io), 所有就让我们使用它吧。既然我们已经安装了 Appium,我们
|
||||
已经满足了 Node 和 NPM 的要求。因此,只需在计算机上创建一个新的项目目录
|
||||
然后在其中初始化一个新的 Node.js 项目:
|
||||
|
||||
TODO
|
||||
```bash
|
||||
npm init
|
||||
```
|
||||
|
||||
您在提示中输入什么内容并不重要,只要您最终得到一个有效的
|
||||
`package.json`.
|
||||
|
||||
|
||||
现在,通过 NPM 安装 `webdriverio` 软件包:
|
||||
|
||||
```bash
|
||||
npm i --save-dev webdriverio
|
||||
```
|
||||
|
||||
完成上述操作后,您的 `package.json` 文件应包含类似以下内容的部分:
|
||||
|
||||
```json title="package.json"
|
||||
--8<-- "./sample-code/quickstarts/js/package.json"
|
||||
```
|
||||
|
||||
现在是编写测试本身的时候了。创建一个名为 `test.js` 的新文件,内容如下:
|
||||
|
||||
```js title="test.js"
|
||||
--8<-- "./sample-code/quickstarts/js/test.js"
|
||||
```
|
||||
|
||||
!!! 注意
|
||||
|
||||
本指南的范围不包括完整介绍 WebdriverIO 客户端
|
||||
库或这里发生的一切,因此我们暂且不对代码本身进行详细解释。
|
||||
所以目前我们暂时不对代码本身进行详细解释。您可能需要特别阅读 Appium
|
||||
[能力](../guides/caps.md), 除了熟悉优秀的
|
||||
[WebdriverIO 文档](https://webdriver.io/docs/gettingstarted) 来获得更全面的解释,
|
||||
你还可以看到的各种 API 命令以及用途。
|
||||
|
||||
!!! 注意
|
||||
|
||||
示例代码可从 [GitHub Appium repository](https://github.com/appium/appium/tree/master/packages/appium/sample-code/quickstarts/js).
|
||||
|
||||
|
||||
基本上,这段代码正在执行以下操作:
|
||||
|
||||
1. 定义一组 "Capabilities" 能力值(参数),以便 Appium 知道您想自动执行哪种任务。
|
||||
要自动执行的任务。
|
||||
1. 在内置的 Android 设置应用程序上启动 Appium 会话。
|
||||
1. 找到 "Battery"列表项并点击它。
|
||||
1. 停顿片刻,纯粹是为了观察自动化视觉效果。
|
||||
1. 结束 Appium 会话。
|
||||
|
||||
就是这样!让我们试一试吧。运行测试前,请确保您的 Appium 服务器
|
||||
在另一个终端会话中运行,否则会出现一个有关无法连接到 Appium 服务器的错误。
|
||||
然后,你就可以执行脚本了:
|
||||
|
||||
```bash
|
||||
node test.js
|
||||
```
|
||||
|
||||
如果一切顺利,在应用再次关闭之前,你会看到 "设置 "应用打开并导航到 "Battery "视图
|
||||
|
||||
恭喜您,您已经开始了 Appium 之旅!请继续阅读一些 [下一步骤](./next-steps.md) 继续探索.
|
||||
|
||||
@@ -1,6 +1,20 @@
|
||||
---
|
||||
title: 更多 Appium 资源
|
||||
hide:
|
||||
- navigation
|
||||
- toc
|
||||
|
||||
title: 其他资源
|
||||
---
|
||||
|
||||
在这里,您可以找到网络上其他 Appium 资源的链接:
|
||||
|
||||
TODO
|
||||
## 网站
|
||||
|
||||
- [Appium Pro](https://appiumpro.com) - 是Appium其中一名维护者乔纳森-利普斯(Jonathan Lipps)撰写的博客和时事通讯。
|
||||
撰写的博客和时事通讯,其中包含大量实用指南
|
||||
|
||||
## 在线课程
|
||||
|
||||
- [Appium 和 Selenium 基础](https://ui.headspin.io/university/learn/appium-selenium-fundamentals-2020) - Jonathan Lipps 编写的学习 Python、Selenium 和 Appium 的综合视频课程
|
||||
- [使用 Appium 实现移动测试自动化](https://testautomationu.applitools.com/appium-java-tutorial/) - 由 Moataz Nabil 制作的视频课程
|
||||
- [高级Appoium](https://www.linkedin.com/learning/advanced-appium) - 乔纳森-利普斯(Jonathan Lipps)的视频课程
|
||||
|
||||
@@ -1085,7 +1085,7 @@ class AppiumDriver extends DriverCore {
|
||||
// is to do the proxy and retrieve the result internally so it can be passed to the plugin
|
||||
// in case it calls 'await next()'. This requires that the driver have defined
|
||||
// 'proxyCommand' and not just 'proxyReqRes'.
|
||||
if (!dstSession.proxyCommand) {
|
||||
if (!dstSession?.proxyCommand) {
|
||||
throw new NoDriverProxyCommandError();
|
||||
}
|
||||
return await dstSession.proxyCommand(
|
||||
@@ -1106,7 +1106,7 @@ class AppiumDriver extends DriverCore {
|
||||
}
|
||||
|
||||
// here we know that we are executing a session command, and have a valid session driver
|
||||
return await dstSession.executeCommand(cmd, ...args);
|
||||
return await (/** @type {any} */ (dstSession)).executeCommand(cmd, ...args);
|
||||
};
|
||||
|
||||
// now take our default behavior, wrap it with any number of plugin behaviors, and run it
|
||||
|
||||
@@ -67,10 +67,11 @@ export default class DriverCliCommand extends ExtensionCliCommand {
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs doctor checks for the given driver
|
||||
* Runs doctor checks for the given driver.
|
||||
*
|
||||
* @param {DriverDoctorOptions} opts
|
||||
* @returns {Promise<import('@appium/types').IDoctorCheck[]>}
|
||||
* @returns {Promise<number>} The amount of executed doctor checks.
|
||||
* @throws {Error} If any of the mandatory Doctor checks fails.
|
||||
*/
|
||||
async doctor({driver}) {
|
||||
return await super._doctor({
|
||||
|
||||
@@ -16,7 +16,7 @@ import {packageDidChange} from '../extension/package-changed';
|
||||
import {spawn} from 'child_process';
|
||||
import {inspect} from 'node:util';
|
||||
import {pathToFileURL} from 'url';
|
||||
import {Doctor} from '../doctor/doctor';
|
||||
import {Doctor, EXIT_CODE as DOCTOR_EXIT_CODE} from '../doctor/doctor';
|
||||
import {npmPackage} from '../utils';
|
||||
import semver from 'semver';
|
||||
|
||||
@@ -36,13 +36,17 @@ function receiptToManifest(receipt) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the remote extension version requirement
|
||||
* Fetches the remote extension version requirements
|
||||
*
|
||||
* @param {string} installSpec Extension name (could also contain the version suffix)
|
||||
* @param {string} pkgName Extension name
|
||||
* @param {string} [pkgVer] Extension version (if not provided then the latest is assumed)
|
||||
* @returns {Promise<[string, string|null]>}
|
||||
*/
|
||||
async function getRemoteExtensionVersionReq(installSpec) {
|
||||
const allDeps = await npm.getPackageInfo(installSpec, ['peerDependencies', 'dependencies']);
|
||||
async function getRemoteExtensionVersionReq(pkgName, pkgVer) {
|
||||
const allDeps = await npm.getPackageInfo(
|
||||
`${pkgName}${pkgVer ? `@${pkgVer}` : ``}`,
|
||||
['peerDependencies', 'dependencies']
|
||||
);
|
||||
const requiredVersionPair = _.flatMap(_.values(allDeps).map(_.toPairs))
|
||||
.find(([name]) => name === 'appium');
|
||||
return [npmPackage.version, requiredVersionPair ? requiredVersionPair[1] : null];
|
||||
@@ -246,13 +250,13 @@ class ExtensionCliCommand {
|
||||
* @param {InstallViaNpmArgs} installViaNpmOpts
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async _checkInstallCompatibility({installSpec, pkgName, installType}) {
|
||||
async _checkInstallCompatibility({installSpec, pkgName, pkgVer, installType}) {
|
||||
if (INSTALL_TYPE_NPM !== installType) {
|
||||
return;
|
||||
}
|
||||
|
||||
await spinWith(this.isJsonOutput, `Checking if '${pkgName}' is compatible`, async () => {
|
||||
const [serverVersion, extVersionRequirement] = await getRemoteExtensionVersionReq(installSpec);
|
||||
const [serverVersion, extVersionRequirement] = await getRemoteExtensionVersionReq(pkgName, pkgVer);
|
||||
if (serverVersion && extVersionRequirement && !semver.satisfies(serverVersion, extVersionRequirement)) {
|
||||
throw this._createFatalError(
|
||||
`'${installSpec}' cannot be installed because the server version it requires (${extVersionRequirement}) ` +
|
||||
@@ -738,10 +742,12 @@ class ExtensionCliCommand {
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs doctor checks for the given extension
|
||||
* Runs doctor checks for the given extension.
|
||||
*
|
||||
* @param {DoctorOptions} opts
|
||||
* @returns {Promise<import('@appium/types').IDoctorCheck[]>}
|
||||
* @returns {Promise<number>} The amount of Doctor checks that were
|
||||
* successfully loaded and executed for the given extension
|
||||
* @throws {Error} If any of the mandatory Doctor checks fails.
|
||||
*/
|
||||
async _doctor({installSpec}) {
|
||||
if (!this.config.isInstalled(installSpec)) {
|
||||
@@ -765,7 +771,7 @@ class ExtensionCliCommand {
|
||||
}
|
||||
if (!doctorSpec) {
|
||||
this.log.info(`The ${this.type} "${installSpec}" does not export any doctor checks`);
|
||||
return [];
|
||||
return 0;
|
||||
}
|
||||
if (!_.isPlainObject(doctorSpec) || !_.isArray(doctorSpec.checks)) {
|
||||
throw this._createFatalError(
|
||||
@@ -806,14 +812,17 @@ class ExtensionCliCommand {
|
||||
.filter(isDoctorCheck);
|
||||
if (_.isEmpty(checks)) {
|
||||
this.log.info(`The ${this.type} "${installSpec}" exports no valid doctor checks`);
|
||||
return [];
|
||||
return 0;
|
||||
}
|
||||
this.log.debug(
|
||||
`Running ${util.pluralize('doctor check', checks.length, true)} ` +
|
||||
`for the "${installSpec}" ${this.type}`
|
||||
);
|
||||
await new Doctor(checks).run();
|
||||
return checks;
|
||||
const exitCode = await new Doctor(checks).run();
|
||||
if (exitCode !== DOCTOR_EXIT_CODE.SUCCESS) {
|
||||
throw this._createFatalError('Treatment required');
|
||||
}
|
||||
return checks.length;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -69,7 +69,8 @@ export default class PluginCliCommand extends ExtensionCliCommand {
|
||||
* Runs doctor checks for the given plugin
|
||||
*
|
||||
* @param {PluginDoctorOptions} opts
|
||||
* @returns {Promise<import('@appium/types').IDoctorCheck[]>}
|
||||
* @returns {Promise<number>} The amount of executed doctor checks.
|
||||
* @throws {Error} If any of the mandatory Doctor checks fails.
|
||||
*/
|
||||
async doctor({plugin}) {
|
||||
return await super._doctor({
|
||||
|
||||
@@ -2,6 +2,11 @@ import '@colors/colors';
|
||||
import _ from 'lodash';
|
||||
import { util, doctor, logger } from '@appium/support';
|
||||
|
||||
export const EXIT_CODE = /** @type {const} */ Object.freeze({
|
||||
SUCCESS: 0,
|
||||
HAS_MAJOR_ISSUES: 127,
|
||||
});
|
||||
|
||||
export class Doctor {
|
||||
/**
|
||||
* @param {DoctorCheck[]} [checks=[]]
|
||||
@@ -68,7 +73,12 @@ export class Doctor {
|
||||
/** @type {string[]} */
|
||||
const fixMessages = [];
|
||||
for (const issue of issues) {
|
||||
const message = await issue.check.fix();
|
||||
let message;
|
||||
try {
|
||||
message = await issue.check.fix();
|
||||
} catch (e) {
|
||||
message = e.message;
|
||||
}
|
||||
if (message) {
|
||||
fixMessages.push(message);
|
||||
}
|
||||
@@ -84,7 +94,7 @@ export class Doctor {
|
||||
'The configuration cannot be automatically fixed, please do the following first:',
|
||||
], manualIssues);
|
||||
await handleIssues([
|
||||
'### Optional Manual Fixes ###',
|
||||
'### Optional Manual Fixes ###',
|
||||
'To fix these optional issues, please do the following manually:',
|
||||
], manualIssuesOptional);
|
||||
|
||||
@@ -127,6 +137,9 @@ export class Doctor {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {Promise<boolean>}
|
||||
*/
|
||||
async runAutoFixes() {
|
||||
const autoFixes = _.filter(this.foundIssues, (f) => f.check.hasAutofix());
|
||||
for (const f of autoFixes) {
|
||||
@@ -136,22 +149,30 @@ export class Doctor {
|
||||
if (_.find(autoFixes, (f) => !f.fixed)) {
|
||||
// a few issues remain.
|
||||
this.log.info('Bye! A few issues remain, fix manually and/or rerun doctor!');
|
||||
} else {
|
||||
// nothing left to fix.
|
||||
this.log.info('Bye! All issues have been fixed!');
|
||||
this.log.info('');
|
||||
return false;
|
||||
}
|
||||
// nothing left to fix.
|
||||
this.log.info('Bye! All issues have been fixed!');
|
||||
this.log.info('');
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {Promise<EXIT_CODE[keyof EXIT_CODE]>}
|
||||
*/
|
||||
async run() {
|
||||
await this.diagnose();
|
||||
if (this.reportSuccess()) {
|
||||
return;
|
||||
return EXIT_CODE.SUCCESS;
|
||||
}
|
||||
if (await this.reportManualIssues()) {
|
||||
return;
|
||||
return EXIT_CODE.HAS_MAJOR_ISSUES;
|
||||
}
|
||||
await this.runAutoFixes();
|
||||
if (!await this.runAutoFixes()) {
|
||||
return EXIT_CODE.HAS_MAJOR_ISSUES;
|
||||
}
|
||||
return EXIT_CODE.SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -311,7 +311,9 @@ export class ExtensionConfig {
|
||||
const invalidFieldsText = invalidFields.map((field) => `"${field}"`).join(', ');
|
||||
|
||||
warnings.push(
|
||||
`${extTypeText} "${extName}" (package \`${pkgName}\`) has ${invalidFieldsEnumerationText} (${invalidFieldsText}) in \`extensions.yaml\`; this may cause upgrades done via the \`appium\` CLI tool to fail. Please reinstall with \`appium ${this.extensionType} uninstall ${extName}\` and \`appium ${this.extensionType} install ${extName}\` to attempt a fix.`
|
||||
`${extTypeText} "${extName}" (package \`${pkgName}\`) has ${invalidFieldsEnumerationText} (${invalidFieldsText}) in \`extensions.yaml\`; ` +
|
||||
`this may cause upgrades done via the \`appium\` CLI tool to fail. Please reinstall with \`appium ${this.extensionType} uninstall ` +
|
||||
`${extName}\` and \`appium ${this.extensionType} install ${extName}\` to attempt a fix.`
|
||||
);
|
||||
}
|
||||
|
||||
@@ -331,16 +333,16 @@ export class ExtensionConfig {
|
||||
);
|
||||
if (extListData?.installed) {
|
||||
const {updateVersion, upToDate} = extListData;
|
||||
if (!upToDate) {
|
||||
if (!upToDate && updateVersion) {
|
||||
warnings.push(
|
||||
createPeerWarning(
|
||||
`its peer dependency on older Appium v${appiumVersion}. Please upgrade \`${pkgName}\` to v${updateVersion} or newer.`
|
||||
`its peer dependency on Appium ${appiumVersion}. Try to upgrade \`${pkgName}\` to v${updateVersion} or newer.`
|
||||
)
|
||||
);
|
||||
} else {
|
||||
warnings.push(
|
||||
createPeerWarning(
|
||||
`its peer dependency on older Appium v${appiumVersion}. Please ask the developer of \`${pkgName}\` to update the peer dependency on Appium to v${APPIUM_VER}.`
|
||||
`its peer dependency on Appium ${appiumVersion}. Please install a compatible version of the ${_.toLower(extTypeText)}.`
|
||||
)
|
||||
);
|
||||
}
|
||||
@@ -354,13 +356,15 @@ export class ExtensionConfig {
|
||||
if (!extListData?.upToDate && extListData?.updateVersion) {
|
||||
warnings.push(
|
||||
createPeerWarning(
|
||||
`an invalid or missing peer dependency on Appium. A newer version of \`${pkgName}\` is available; please attempt to upgrade "${extName}" to v${extListData.updateVersion} or newer.`
|
||||
`an invalid or missing peer dependency on Appium. A newer version of \`${pkgName}\` is available; ` +
|
||||
`please attempt to upgrade "${extName}" to v${extListData.updateVersion} or newer.`
|
||||
)
|
||||
);
|
||||
} else {
|
||||
warnings.push(
|
||||
createPeerWarning(
|
||||
`an invalid or missing peer dependency on Appium. Please ask the developer of \`${pkgName}\` to add a peer dependency on \`^appium@${APPIUM_VER}\`.`
|
||||
`an invalid or missing peer dependency on Appium. ` +
|
||||
`Please ask the developer of \`${pkgName}\` to add a peer dependency on \`^appium@${APPIUM_VER}\`.`
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -248,10 +248,10 @@ async function init(args) {
|
||||
`Found no log filtering rules in '${serverArgs.logFilters}'. Is that expected?`,
|
||||
);
|
||||
} else {
|
||||
// Filtering aims to "hide" these values from the log,
|
||||
// so it would be nice to not show them in the log as well.
|
||||
logger.info(
|
||||
`Loaded ${util.pluralize('filtering rule', rules.length, true)} from '${
|
||||
serverArgs.logFilters
|
||||
}'`,
|
||||
`Loaded ${util.pluralize('filtering rule', rules.length, true)}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ import {ArgumentTypeError} from 'argparse';
|
||||
import _ from 'lodash';
|
||||
import {formatErrors as formatErrors} from '../config-file';
|
||||
import {flattenSchema, validate} from './schema';
|
||||
import {transformers} from './cli-transformers';
|
||||
import {transformers, parseCsvLine} from './cli-transformers';
|
||||
|
||||
/**
|
||||
* This module concerns functions which convert schema definitions to
|
||||
@@ -136,13 +136,19 @@ function subSchemaToArgDef(subSchema, argSpec) {
|
||||
}
|
||||
|
||||
case TYPENAMES.OBJECT: {
|
||||
argTypeFunction = transformers.json;
|
||||
argTypeFunction = _.flow(transformers.json, (o) => {
|
||||
// Arrays and plain strings are also valid JSON
|
||||
if (!_.isPlainObject(o)) {
|
||||
throw new ArgumentTypeError(`'${_.truncate(o, {length: 100})}' must be a plain object`);;
|
||||
}
|
||||
return o;
|
||||
});
|
||||
break;
|
||||
}
|
||||
|
||||
// arrays are treated as CSVs, because `argparse` doesn't handle array data.
|
||||
case TYPENAMES.ARRAY: {
|
||||
argTypeFunction = transformers.csv;
|
||||
argTypeFunction = parseCsvLine;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -182,12 +188,13 @@ function subSchemaToArgDef(subSchema, argSpec) {
|
||||
argOpts.metavar = screamingSnakeCase(name);
|
||||
}
|
||||
|
||||
// the validity of "appiumCliTransformer" should already have been determined
|
||||
// by ajv during schema validation in `finalizeSchema()`. the `array` &
|
||||
// `object` types have already added a formatter (see above, so we don't do it
|
||||
// twice).
|
||||
if (type !== TYPENAMES.ARRAY && type !== TYPENAMES.OBJECT && appiumCliTransformer) {
|
||||
argTypeFunction = _.flow(argTypeFunction ?? _.identity, transformers[appiumCliTransformer]);
|
||||
if (appiumCliTransformer && transformers[appiumCliTransformer]) {
|
||||
if (type === TYPENAMES.ARRAY) {
|
||||
const csvTransformer = /** @type {(x: string) => string[]} */ (argTypeFunction);
|
||||
argTypeFunction = (val) => _.flatMap(csvTransformer(val).map(transformers[appiumCliTransformer]));
|
||||
} else {
|
||||
argTypeFunction = _.flow(argTypeFunction ?? _.identity, transformers[appiumCliTransformer]);
|
||||
}
|
||||
}
|
||||
|
||||
if (argTypeFunction) {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import {ArgumentTypeError} from 'argparse';
|
||||
import {readFileSync, existsSync} from 'fs';
|
||||
import _ from 'lodash';
|
||||
|
||||
/**
|
||||
* This module provides custom keywords for Appium schemas, as well as
|
||||
@@ -16,7 +15,7 @@ import _ from 'lodash';
|
||||
* @param {string} value
|
||||
* @returns {string[]}
|
||||
*/
|
||||
function parseCsvLine(value) {
|
||||
export function parseCsvLine(value) {
|
||||
return value
|
||||
.split(',')
|
||||
.map((v) => v.trim())
|
||||
@@ -71,7 +70,6 @@ export const transformers = {
|
||||
}
|
||||
loadedFromFile = true;
|
||||
}
|
||||
|
||||
try {
|
||||
return loadedFromFile ? parseCsvFile(csv) : parseCsvLine(csv);
|
||||
} catch (err) {
|
||||
@@ -104,14 +102,10 @@ export const transformers = {
|
||||
loadedFromFile = true;
|
||||
}
|
||||
try {
|
||||
const result = JSON.parse(json);
|
||||
if (!_.isPlainObject(result)) {
|
||||
throw new Error(`'${_.truncate(result, {length: 100})}' is not an object`);
|
||||
}
|
||||
return result;
|
||||
return JSON.parse(json);
|
||||
} catch (e) {
|
||||
const msg = loadedFromFile
|
||||
? `The provided value of '${jsonOrPath}' must be a valid JSON`
|
||||
? `'${jsonOrPath}' must be a valid JSON`
|
||||
: `The provided value must be a valid JSON`;
|
||||
throw new TypeError(`${msg}. Original error: ${e.message}`);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "appium",
|
||||
"version": "2.4.0",
|
||||
"version": "2.5.3",
|
||||
"description": "Automation for Apps.",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -60,41 +60,41 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/base-driver": "^9.5.0",
|
||||
"@appium/base-plugin": "^2.2.26",
|
||||
"@appium/docutils": "^1.0.2",
|
||||
"@appium/base-driver": "^9.5.4",
|
||||
"@appium/base-plugin": "^2.2.30",
|
||||
"@appium/docutils": "^1.0.6",
|
||||
"@appium/schema": "~0.5.0",
|
||||
"@appium/support": "^4.2.0",
|
||||
"@appium/types": "^0.16.0",
|
||||
"@appium/support": "^4.2.4",
|
||||
"@appium/types": "^0.16.2",
|
||||
"@sidvind/better-ajv-errors": "2.1.3",
|
||||
"@types/argparse": "2.0.14",
|
||||
"@types/argparse": "2.0.16",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"@types/fancy-log": "2.0.2",
|
||||
"@types/semver": "7.5.6",
|
||||
"@types/semver": "7.5.8",
|
||||
"@types/teen_process": "2.0.4",
|
||||
"@types/wrap-ansi": "3.0.0",
|
||||
"ajv": "8.12.0",
|
||||
"ajv-formats": "2.1.1",
|
||||
"ajv-formats": "3.0.1",
|
||||
"argparse": "2.0.1",
|
||||
"async-lock": "1.4.1",
|
||||
"asyncbox": "3.0.0",
|
||||
"axios": "1.6.3",
|
||||
"axios": "1.6.8",
|
||||
"bluebird": "3.7.2",
|
||||
"cross-env": "7.0.3",
|
||||
"lilconfig": "3.0.0",
|
||||
"lilconfig": "3.1.1",
|
||||
"lodash": "4.17.21",
|
||||
"npmlog": "7.0.1",
|
||||
"ora": "5.4.1",
|
||||
"package-changed": "3.0.0",
|
||||
"resolve-from": "5.0.0",
|
||||
"semver": "7.5.4",
|
||||
"semver": "7.6.0",
|
||||
"source-map-support": "0.5.21",
|
||||
"teen_process": "2.1.1",
|
||||
"type-fest": "4.9.0",
|
||||
"winston": "3.11.0",
|
||||
"type-fest": "4.10.1",
|
||||
"winston": "3.13.0",
|
||||
"wrap-ansi": "7.0.0",
|
||||
"ws": "8.16.0",
|
||||
"yaml": "2.3.4"
|
||||
"yaml": "2.4.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"devDependencies": {
|
||||
"webdriverio": "8.27.0"
|
||||
"webdriverio": "8.36.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -423,8 +423,8 @@ describe('Driver CLI', function () {
|
||||
|
||||
describe('when the driver defines doctor checks', function () {
|
||||
it('should load and run them', async function () {
|
||||
const checks = await runDoctor([driverName]);
|
||||
checks.length.should.eql(2);
|
||||
const checksLen = await runDoctor([driverName]);
|
||||
checksLen.should.eql(2);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -592,8 +592,8 @@ describe('FakeDriver via HTTP', function () {
|
||||
collectedEvents.should.not.be.empty;
|
||||
|
||||
// finally unsubscribe and wait and assert that some events have been collected
|
||||
collectedEvents = [];
|
||||
await driver.sessionUnsubscribe({events: ['clock.currentTime']});
|
||||
collectedEvents = [];
|
||||
await B.delay(750);
|
||||
collectedEvents.should.be.empty;
|
||||
});
|
||||
|
||||
@@ -239,7 +239,7 @@ describe('ExtensionConfig', function () {
|
||||
await expect(
|
||||
config.getGenericConfigWarnings(extData, extData.pkgName)
|
||||
).to.eventually.eql([
|
||||
`Driver "${extData.pkgName}" (package \`${extData.pkgName}\`) may be incompatible with the current version of Appium (v${APPIUM_VER}) due to its peer dependency on older Appium v${extData.appiumVersion}. Please upgrade \`${extData.pkgName}\` to v${updateVersion} or newer.`,
|
||||
`Driver "${extData.pkgName}" (package \`${extData.pkgName}\`) may be incompatible with the current version of Appium (v${APPIUM_VER}) due to its peer dependency on Appium ${extData.appiumVersion}. Try to upgrade \`${extData.pkgName}\` to v${updateVersion} or newer.`,
|
||||
]);
|
||||
});
|
||||
});
|
||||
@@ -254,7 +254,7 @@ describe('ExtensionConfig', function () {
|
||||
await expect(
|
||||
config.getGenericConfigWarnings(extData, extData.pkgName)
|
||||
).to.eventually.eql([
|
||||
`Driver "${extData.pkgName}" (package \`${extData.pkgName}\`) may be incompatible with the current version of Appium (v${APPIUM_VER}) due to its peer dependency on older Appium v${extData.appiumVersion}. Please ask the developer of \`${extData.pkgName}\` to update the peer dependency on Appium to v${APPIUM_VER}.`,
|
||||
`Driver "${extData.pkgName}" (package \`${extData.pkgName}\`) may be incompatible with the current version of Appium (v${APPIUM_VER}) due to its peer dependency on Appium ${extData.appiumVersion}. Please install a compatible version of the driver.`,
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -4,7 +4,6 @@ import _ from 'lodash';
|
||||
import {PLUGIN_TYPE} from '../../../lib/constants';
|
||||
import {finalizeSchema, registerSchema, resetSchema} from '../../../lib/schema';
|
||||
import {toParserArgs} from '../../../lib/schema/cli-args';
|
||||
import {transformers} from '../../../lib/schema/cli-transformers';
|
||||
|
||||
const {expect} = chai;
|
||||
|
||||
@@ -63,7 +62,7 @@ describe('cli-args', function () {
|
||||
});
|
||||
|
||||
it('should use the `json` transformer', function () {
|
||||
expect(result['--plugin-blob-foo']).to.have.property('type', transformers.json);
|
||||
expect(result['--plugin-blob-foo']).to.have.property('type');
|
||||
});
|
||||
|
||||
it('should contain a SCREAMING_SNAKE_CASE `metavar` prop', function () {
|
||||
@@ -78,7 +77,7 @@ describe('cli-args', function () {
|
||||
});
|
||||
|
||||
it('should use the `csv` transformer', function () {
|
||||
expect(result['--plugin-blob-foo']).to.have.property('type', transformers.csv);
|
||||
expect(result['--plugin-blob-foo']).to.have.property('type');
|
||||
});
|
||||
|
||||
it('should contain a SCREAMING_SNAKE_CASE `metavar` prop', function () {
|
||||
@@ -211,11 +210,11 @@ describe('cli-args', function () {
|
||||
|
||||
it('should error if the value is not valid for the transformer', function () {
|
||||
const schema = {
|
||||
properties: {foo: {type: 'string', appiumCliTransformer: 'json'}},
|
||||
properties: {foo: {type: 'object'}},
|
||||
type: 'object',
|
||||
};
|
||||
result = getArgs({schema, extName, extType});
|
||||
expect(() => result['--plugin-blob-foo'].type('123')).to.throw(/must be a valid json/i);
|
||||
expect(() => result['--plugin-blob-foo'].type('123')).to.throw(/must be a plain object/i);
|
||||
});
|
||||
|
||||
// this is unlikely to happen, but I want to establish the behavior as defined.
|
||||
|
||||
@@ -82,12 +82,10 @@ describe('utils', function () {
|
||||
'appium:foo2': 'bar2',
|
||||
}
|
||||
);
|
||||
res.error.should.eql({
|
||||
jsonwpCode: 61,
|
||||
error: 'invalid argument',
|
||||
w3cStatus: 400,
|
||||
_stacktrace: null,
|
||||
});
|
||||
res.error.jsonwpCode.should.eql(61);
|
||||
res.error.error.should.eql('invalid argument');
|
||||
res.error.w3cStatus.should.eql(400);
|
||||
_.isNull(res.error._stacktrace).should.be.true;
|
||||
});
|
||||
it('should reject if W3C caps are not passing constraints', function () {
|
||||
const err = parseCapsForInnerDriver(undefined, W3C_CAPS, {
|
||||
@@ -101,14 +99,13 @@ describe('utils', function () {
|
||||
...W3C_CAPS,
|
||||
firstMatch: [{foo: 'bar'}, {'appium:hello': 'world'}],
|
||||
};
|
||||
parseCapsForInnerDriver(BASE_CAPS, w3cCaps, {
|
||||
const error = parseCapsForInnerDriver(BASE_CAPS, w3cCaps, {
|
||||
hello: {presence: true},
|
||||
}).error.should.eql({
|
||||
jsonwpCode: 61,
|
||||
error: 'invalid argument',
|
||||
w3cStatus: 400,
|
||||
_stacktrace: null,
|
||||
});
|
||||
}).error;
|
||||
error.jsonwpCode.should.eql(61);
|
||||
error.error.should.eql('invalid argument');
|
||||
error.w3cStatus.should.eql(400);
|
||||
_.isNull(error._stacktrace).should.be.true;
|
||||
});
|
||||
it('should add appium prefixes to W3C caps that are not standard in W3C', function () {
|
||||
parseCapsForInnerDriver(undefined, {
|
||||
|
||||
@@ -3,6 +3,53 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [9.5.4](https://github.com/appium/appium/compare/@appium/base-driver@9.5.3...@appium/base-driver@9.5.4) (2024-04-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* do not print deprecation errors for non-provided caps ([#19986](https://github.com/appium/appium/issues/19986)) ([9f655f6](https://github.com/appium/appium/commit/9f655f6f852bc10ca1f51529183c7c44eb4c79ea))
|
||||
|
||||
|
||||
|
||||
## [9.5.3](https://github.com/appium/appium/compare/@appium/base-driver@9.5.2...@appium/base-driver@9.5.3) (2024-04-08)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **base-driver:** update dependency express to v4.18.3 ([917084c](https://github.com/appium/appium/commit/917084ccca23c5483e7d83ce97721061dd2fe345))
|
||||
* **base-driver:** update dependency express to v4.19.1 ([a74132c](https://github.com/appium/appium/commit/a74132cc96d201bb5c7b7f11a7e3b1b79e7d2424))
|
||||
* **base-driver:** update dependency express to v4.19.2 ([7cb1621](https://github.com/appium/appium/commit/7cb1621e80bc4225c48833cc2bd02fe80dccd382))
|
||||
* **base-driver:** update dependency path-to-regexp to v6.2.2 ([#19979](https://github.com/appium/appium/issues/19979)) ([b8368bb](https://github.com/appium/appium/commit/b8368bb666fda44e3b0c45cc7307bff69fe40202))
|
||||
* **docutils:** update dependency typescript to v5.4.2 ([#19876](https://github.com/appium/appium/issues/19876)) ([2448fa0](https://github.com/appium/appium/commit/2448fa0145620657ccc72b5637f1b7737fe52580))
|
||||
* **driver-test-support:** update definitelytyped ([4776574](https://github.com/appium/appium/commit/47765747b66c5e0076f6ffe4619d6b98a42aee29))
|
||||
* **support:** update dependency axios to v1.6.8 ([bd6ab81](https://github.com/appium/appium/commit/bd6ab81c9408ab0f90fc25fc112f9257ec2973ad))
|
||||
|
||||
|
||||
|
||||
## [9.5.2](https://github.com/appium/appium/compare/@appium/base-driver@9.5.1...@appium/base-driver@9.5.2) (2024-02-13)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-driver
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [9.5.1](https://github.com/appium/appium/compare/@appium/base-driver@9.5.0...@appium/base-driver@9.5.1) (2024-02-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **images-plugin:** update dependency lru-cache to v10 ([#19723](https://github.com/appium/appium/issues/19723)) ([202da83](https://github.com/appium/appium/commit/202da83449073ddb3da8fb2cfbcfce482a5ecd40))
|
||||
* **support:** update dependency axios to v1.6.4 ([332cc48](https://github.com/appium/appium/commit/332cc48a09b5532a8d51f85f3a24785e2c754e00))
|
||||
* **support:** update dependency axios to v1.6.5 ([#19616](https://github.com/appium/appium/issues/19616)) ([ac73522](https://github.com/appium/appium/commit/ac73522351b31bd6c11972c61daa8b6b8d18fb91))
|
||||
* **support:** update dependency axios to v1.6.6 ([6313704](https://github.com/appium/appium/commit/6313704ee5a8ee3aee726eb512ef259b6fa1041c))
|
||||
* **support:** update dependency axios to v1.6.7 ([795092a](https://github.com/appium/appium/commit/795092a97f6d7569cccc4b5c166f52fef821514b))
|
||||
* **types:** update dependency type-fest to v4.10 ([#19694](https://github.com/appium/appium/issues/19694)) ([966d305](https://github.com/appium/appium/commit/966d305e5eade9369a3875243bcad951df88545c))
|
||||
* **types:** update dependency type-fest to v4.10.1 ([#19703](https://github.com/appium/appium/issues/19703)) ([501395c](https://github.com/appium/appium/commit/501395c9489320b84ab49ff78af4270f66070d62))
|
||||
|
||||
|
||||
|
||||
## [9.5.0](https://github.com/appium/appium/compare/@appium/base-driver@9.4.4...@appium/base-driver@9.5.0) (2024-01-03)
|
||||
|
||||
|
||||
|
||||
+98
-169
@@ -1,34 +1,54 @@
|
||||
// @ts-check
|
||||
|
||||
import type {
|
||||
Constraints,
|
||||
NSCapabilities,
|
||||
Capabilities,
|
||||
W3CCapabilities,
|
||||
StandardCapabilities,
|
||||
} from '@appium/types';
|
||||
import type {
|
||||
StringKeyOf,
|
||||
MergeExclusive,
|
||||
} from 'type-fest';
|
||||
import _ from 'lodash';
|
||||
import {validator} from './desired-caps';
|
||||
import {util} from '@appium/support';
|
||||
import log from './logger';
|
||||
import {errors} from '../protocol/errors';
|
||||
|
||||
const APPIUM_VENDOR_PREFIX = 'appium:';
|
||||
const PREFIXED_APPIUM_OPTS_CAP = `${APPIUM_VENDOR_PREFIX}options`;
|
||||
export const APPIUM_VENDOR_PREFIX = 'appium:';
|
||||
export const PREFIXED_APPIUM_OPTS_CAP = `${APPIUM_VENDOR_PREFIX}options`;
|
||||
|
||||
export type ParsedCaps<C extends Constraints> = {
|
||||
allFirstMatchCaps: NSCapabilities<C>[];
|
||||
validatedFirstMatchCaps: Capabilities<C>[];
|
||||
requiredCaps: NSCapabilities<C>;
|
||||
matchedCaps: Capabilities<C> | null;
|
||||
validationErrors: string[];
|
||||
};
|
||||
export type ValidateCapsOpts = {
|
||||
/** if true, skip the presence constraint */
|
||||
skipPresenceConstraint?: boolean | undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes primary caps object and merges it into a secondary caps object.
|
||||
* @template {Constraints} T
|
||||
* @template {Constraints} U
|
||||
* @template {Capabilities<T>} Primary
|
||||
* @template {Capabilities<U>} Secondary
|
||||
* @param {Primary} [primary]
|
||||
* @param {Secondary} [secondary]
|
||||
* @returns {MergeExclusive<Primary, Secondary>}
|
||||
*
|
||||
* @see https://www.w3.org/TR/webdriver/#dfn-merging-capabilities)
|
||||
*/
|
||||
function mergeCaps(
|
||||
primary = /** @type {Primary} */ ({}),
|
||||
secondary = /** @type {Secondary} */ ({})
|
||||
) {
|
||||
let result = /** @type {MergeExclusive<Primary, Secondary>} */ ({
|
||||
export function mergeCaps<
|
||||
T extends Constraints,
|
||||
U extends Constraints,
|
||||
Primary extends Capabilities<T>,
|
||||
Secondary extends Capabilities<U>
|
||||
>(
|
||||
primary: Primary | undefined = {} as Primary,
|
||||
secondary: Secondary | undefined = {} as Secondary
|
||||
): MergeExclusive<Primary, Secondary> {
|
||||
const result = ({
|
||||
...primary,
|
||||
});
|
||||
}) as MergeExclusive<Primary, Secondary>;
|
||||
|
||||
for (let [name, value] of Object.entries(secondary)) {
|
||||
for (const [name, value] of Object.entries(secondary)) {
|
||||
// Overwriting is not allowed. Primary and secondary must have different properties (w3c rule 4.4)
|
||||
if (!_.isUndefined(primary[name])) {
|
||||
throw new errors.InvalidArgumentError(
|
||||
@@ -37,7 +57,7 @@ function mergeCaps(
|
||||
)}) and secondary (${JSON.stringify(secondary)}) object`
|
||||
);
|
||||
}
|
||||
result[/** @type {keyof typeof result} */ (name)] = value;
|
||||
result[name as keyof typeof result] = value;
|
||||
}
|
||||
|
||||
return result;
|
||||
@@ -45,21 +65,20 @@ function mergeCaps(
|
||||
|
||||
/**
|
||||
* Validates caps against a set of constraints
|
||||
* @template {Constraints} C
|
||||
* @param {Capabilities<C>} caps
|
||||
* @param {C} [constraints]
|
||||
* @param {ValidateCapsOpts} [opts]
|
||||
* @returns {Capabilities<C>}
|
||||
*/
|
||||
function validateCaps(caps, constraints = /** @type {C} */ ({}), opts = {}) {
|
||||
let {skipPresenceConstraint} = opts;
|
||||
export function validateCaps<C extends Constraints>(
|
||||
caps: Capabilities<C>,
|
||||
constraints: C | undefined = {} as C,
|
||||
opts: ValidateCapsOpts | undefined = {}
|
||||
): Capabilities<C> {
|
||||
const {skipPresenceConstraint} = opts;
|
||||
|
||||
if (!_.isPlainObject(caps)) {
|
||||
throw new errors.InvalidArgumentError(`must be a JSON object`);
|
||||
}
|
||||
|
||||
// Remove the 'presence' constraint if we're not checking for it
|
||||
constraints = /** @type {C} */ (
|
||||
constraints = (
|
||||
_.mapValues(
|
||||
constraints,
|
||||
skipPresenceConstraint
|
||||
@@ -73,16 +92,16 @@ function validateCaps(caps, constraints = /** @type {C} */ ({}), opts = {}) {
|
||||
return constraint;
|
||||
}
|
||||
)
|
||||
);
|
||||
) as C;
|
||||
|
||||
const validationErrors = validator.validate(_.pickBy(caps, util.hasValue), constraints, {
|
||||
fullMessages: false,
|
||||
});
|
||||
|
||||
if (validationErrors) {
|
||||
let message = [];
|
||||
for (let [attribute, reasons] of _.toPairs(validationErrors)) {
|
||||
for (let reason of reasons) {
|
||||
const message: string[] = [];
|
||||
for (const [attribute, reasons] of _.toPairs(validationErrors)) {
|
||||
for (const reason of (reasons as string[])) {
|
||||
message.push(`'${attribute}' ${reason}`);
|
||||
}
|
||||
}
|
||||
@@ -99,7 +118,7 @@ function validateCaps(caps, constraints = /** @type {C} */ ({}), opts = {}) {
|
||||
*/
|
||||
export const STANDARD_CAPS = Object.freeze(
|
||||
new Set(
|
||||
/** @type {StringKeyOf<import('@appium/types').StandardCapabilities>[]} */ ([
|
||||
([
|
||||
'browserName',
|
||||
'browserVersion',
|
||||
'platformName',
|
||||
@@ -110,29 +129,22 @@ export const STANDARD_CAPS = Object.freeze(
|
||||
'timeouts',
|
||||
'unhandledPromptBehavior',
|
||||
'webSocketUrl',
|
||||
])
|
||||
]) as StringKeyOf<StandardCapabilities>[]
|
||||
)
|
||||
);
|
||||
|
||||
const STANDARD_CAPS_LOWER = new Set([...STANDARD_CAPS].map((cap) => cap.toLowerCase()));
|
||||
|
||||
/**
|
||||
* @param {string} cap
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function isStandardCap(cap) {
|
||||
export function isStandardCap(cap: string): boolean {
|
||||
return STANDARD_CAPS_LOWER.has(cap.toLowerCase());
|
||||
}
|
||||
|
||||
/**
|
||||
* If the 'appium:' prefix was provided and it's a valid capability, strip out the prefix
|
||||
* @template {Constraints} C
|
||||
* @param {NSCapabilities<C>} caps
|
||||
* @see https://www.w3.org/TR/webdriver/#dfn-extension-capabilities
|
||||
* @internal
|
||||
* @returns {Capabilities<C>}
|
||||
*/
|
||||
function stripAppiumPrefixes(caps) {
|
||||
export function stripAppiumPrefixes<C extends Constraints>(caps: NSCapabilities<C>): Capabilities<C> {
|
||||
// split into prefixed and non-prefixed.
|
||||
// non-prefixed should be standard caps at this point
|
||||
const [prefixedCaps, nonPrefixedCaps] = _.partition(_.keys(caps), (cap) =>
|
||||
@@ -140,14 +152,12 @@ function stripAppiumPrefixes(caps) {
|
||||
);
|
||||
|
||||
// initialize this with the k/v pairs of the non-prefixed caps
|
||||
let strippedCaps = /** @type {Capabilities<C>} */ (_.pick(caps, nonPrefixedCaps));
|
||||
const badPrefixedCaps = [];
|
||||
const strippedCaps = (_.pick(caps, nonPrefixedCaps)) as Capabilities<C>;
|
||||
const badPrefixedCaps: string[] = [];
|
||||
|
||||
// Strip out the 'appium:' prefix
|
||||
for (let prefixedCap of prefixedCaps) {
|
||||
const strippedCapName = /** @type {StringKeyOf<Capabilities<C>>} */ (
|
||||
prefixedCap.substring(APPIUM_VENDOR_PREFIX.length)
|
||||
);
|
||||
for (const prefixedCap of prefixedCaps) {
|
||||
const strippedCapName = prefixedCap.substring(APPIUM_VENDOR_PREFIX.length) as StringKeyOf<Capabilities<C>>;
|
||||
|
||||
// If it's standard capability that was prefixed, add it to an array of incorrectly prefixed capabilities
|
||||
if (isStandardCap(strippedCapName)) {
|
||||
@@ -178,10 +188,13 @@ function stripAppiumPrefixes(caps) {
|
||||
|
||||
/**
|
||||
* Get an array of all the unprefixed caps that are being used in 'alwaysMatch' and all of the 'firstMatch' object
|
||||
* @template {Constraints} C
|
||||
* @param {W3CCapabilities<C>} caps A capabilities object
|
||||
*/
|
||||
function findNonPrefixedCaps({alwaysMatch = {}, firstMatch = []}) {
|
||||
export function findNonPrefixedCaps<C extends Constraints>(
|
||||
{
|
||||
alwaysMatch = {},
|
||||
firstMatch = []
|
||||
}: W3CCapabilities<C>
|
||||
): string[] {
|
||||
return _.chain([alwaysMatch, ...firstMatch])
|
||||
.reduce(
|
||||
(unprefixedCaps, caps) => [
|
||||
@@ -194,27 +207,15 @@ function findNonPrefixedCaps({alwaysMatch = {}, firstMatch = []}) {
|
||||
.value();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returned by {@linkcode parseCaps}
|
||||
* @template {Constraints} C
|
||||
* @typedef ParsedCaps
|
||||
* @property {NSCapabilities<C>[]} allFirstMatchCaps
|
||||
* @property {Capabilities<C>[]} validatedFirstMatchCaps
|
||||
* @property {NSCapabilities<C>} requiredCaps
|
||||
* @property {Capabilities<C>|null} matchedCaps
|
||||
* @property {string[]} validationErrors
|
||||
*/
|
||||
|
||||
/**
|
||||
* Parse capabilities
|
||||
* @template {Constraints} C
|
||||
* @param {W3CCapabilities<C>} caps
|
||||
* @param {C} [constraints]
|
||||
* @param {boolean} [shouldValidateCaps]
|
||||
* @see https://www.w3.org/TR/webdriver/#processing-capabilities
|
||||
* @returns {ParsedCaps<C>}
|
||||
*/
|
||||
function parseCaps(caps, constraints = /** @type {C} */ ({}), shouldValidateCaps = true) {
|
||||
export function parseCaps<C extends Constraints>(
|
||||
caps: W3CCapabilities<C>,
|
||||
constraints: C | undefined = {} as C,
|
||||
shouldValidateCaps: boolean | undefined = true
|
||||
): ParsedCaps<C> {
|
||||
// If capabilities request is not an object, return error (#1.1)
|
||||
if (!_.isPlainObject(caps)) {
|
||||
throw new errors.InvalidArgumentError(
|
||||
@@ -224,9 +225,9 @@ function parseCaps(caps, constraints = /** @type {C} */ ({}), shouldValidateCaps
|
||||
|
||||
// Let 'requiredCaps' be property named 'alwaysMatch' from capabilities request (#2)
|
||||
// and 'allFirstMatchCaps' be property named 'firstMatch' from capabilities request (#3)
|
||||
let {
|
||||
alwaysMatch: requiredCaps = /** @type {NSCapabilities<C>} */ ({}), // If 'requiredCaps' is undefined, set it to an empty JSON object (#2.1)
|
||||
firstMatch: allFirstMatchCaps = /** @type {NSCapabilities<C>[]} */ ([{}]), // If 'firstMatch' is undefined set it to a singleton list with one empty object (#3.1)
|
||||
const {
|
||||
alwaysMatch: requiredCaps = {} as NSCapabilities<C>, // If 'requiredCaps' is undefined, set it to an empty JSON object (#2.1)
|
||||
firstMatch: allFirstMatchCaps = [{}] as NSCapabilities<C>[], // If 'firstMatch' is undefined set it to a singleton list with one empty object (#3.1)
|
||||
} = caps;
|
||||
|
||||
// Reject 'firstMatch' argument if it's not an array (#3.2)
|
||||
@@ -247,7 +248,7 @@ function parseCaps(caps, constraints = /** @type {C} */ ({}), shouldValidateCaps
|
||||
}
|
||||
|
||||
// Check for non-prefixed, non-standard capabilities and log warnings if they are found
|
||||
let nonPrefixedCaps = findNonPrefixedCaps(caps);
|
||||
const nonPrefixedCaps = findNonPrefixedCaps(caps);
|
||||
if (!_.isEmpty(nonPrefixedCaps)) {
|
||||
throw new errors.InvalidArgumentError(
|
||||
`All non-standard capabilities should have a vendor prefix. The following capabilities did not have one: ${nonPrefixedCaps}`
|
||||
@@ -256,8 +257,7 @@ function parseCaps(caps, constraints = /** @type {C} */ ({}), shouldValidateCaps
|
||||
|
||||
// Strip out the 'appium:' prefix from all
|
||||
let strippedRequiredCaps = stripAppiumPrefixes(requiredCaps);
|
||||
/** @type {Capabilities<C>[]} */
|
||||
let strippedAllFirstMatchCaps = allFirstMatchCaps.map(stripAppiumPrefixes);
|
||||
const strippedAllFirstMatchCaps: Capabilities<C>[] = allFirstMatchCaps.map(stripAppiumPrefixes);
|
||||
|
||||
// Validate the requiredCaps. But don't validate 'presence' because if that constraint fails on 'alwaysMatch' it could still pass on one of the 'firstMatch' keys
|
||||
if (shouldValidateCaps) {
|
||||
@@ -267,14 +267,11 @@ function parseCaps(caps, constraints = /** @type {C} */ ({}), shouldValidateCaps
|
||||
}
|
||||
// Remove the 'presence' constraint for any keys that are already present in 'requiredCaps'
|
||||
// since we know that this constraint has already passed
|
||||
const filteredConstraints = /** @type {C} */ (
|
||||
_.omitBy(constraints, (_, key) => key in strippedRequiredCaps)
|
||||
);
|
||||
const filteredConstraints = _.omitBy(constraints, (_, key) => key in strippedRequiredCaps) as C;
|
||||
|
||||
// Validate all of the first match capabilities and return an array with only the valid caps (see spec #5)
|
||||
/** @type {string[]} */
|
||||
let validationErrors = [];
|
||||
let validatedFirstMatchCaps = _.compact(
|
||||
const validationErrors: string[] = [];
|
||||
const validatedFirstMatchCaps = _.compact(
|
||||
strippedAllFirstMatchCaps.map((firstMatchCaps) => {
|
||||
try {
|
||||
// Validate firstMatch caps
|
||||
@@ -285,17 +282,16 @@ function parseCaps(caps, constraints = /** @type {C} */ ({}), shouldValidateCaps
|
||||
validationErrors.push(e.message);
|
||||
}
|
||||
})
|
||||
);
|
||||
) as Capabilities<C>[];
|
||||
|
||||
/**
|
||||
* Try to merge requiredCaps with first match capabilities, break once it finds its first match
|
||||
* (see spec #6)
|
||||
* @type {ParsedCaps<C>['matchedCaps']}
|
||||
*/
|
||||
let matchedCaps = null;
|
||||
for (let firstMatchCaps of validatedFirstMatchCaps) {
|
||||
let matchedCaps: ParsedCaps<C>['matchedCaps'] = null;
|
||||
for (const firstMatchCaps of validatedFirstMatchCaps) {
|
||||
try {
|
||||
matchedCaps = mergeCaps(strippedRequiredCaps, firstMatchCaps);
|
||||
matchedCaps = mergeCaps(strippedRequiredCaps, firstMatchCaps) as ParsedCaps<C>['matchedCaps'];
|
||||
if (matchedCaps) {
|
||||
break;
|
||||
}
|
||||
@@ -317,18 +313,15 @@ function parseCaps(caps, constraints = /** @type {C} */ ({}), shouldValidateCaps
|
||||
|
||||
/**
|
||||
* Calls parseCaps and just returns the matchedCaps variable
|
||||
* @template {Constraints} C
|
||||
* @template {W3CCapabilities<C>} W3CCaps
|
||||
* @param {W3CCaps} w3cCaps
|
||||
* @param {C} [constraints]
|
||||
* @param {boolean} [shouldValidateCaps]
|
||||
* @returns {Capabilities<C>}
|
||||
*/
|
||||
function processCapabilities(
|
||||
w3cCaps,
|
||||
constraints = /** @type {C} */ ({}),
|
||||
shouldValidateCaps = true
|
||||
) {
|
||||
export function processCapabilities<
|
||||
C extends Constraints,
|
||||
W3CCaps extends W3CCapabilities<C>
|
||||
>(
|
||||
w3cCaps: W3CCaps,
|
||||
constraints: C | undefined = {} as C,
|
||||
shouldValidateCaps: boolean | undefined = true
|
||||
): Capabilities<C> {
|
||||
const {matchedCaps, validationErrors} = parseCaps(w3cCaps, constraints, shouldValidateCaps);
|
||||
|
||||
// If we found an error throw an exception
|
||||
@@ -346,18 +339,14 @@ function processCapabilities(
|
||||
}
|
||||
}
|
||||
|
||||
return /** @type {Capabilities<C>} */ (matchedCaps ?? {});
|
||||
return (matchedCaps ?? {}) as Capabilities<C>;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a copy of a "bare" (single-level, non-W3C) capabilities object which has taken everything
|
||||
* within the 'appium:options' capability and promoted it to the top level.
|
||||
*
|
||||
* @template {Constraints} C
|
||||
* @param {NSCapabilities<C>} obj
|
||||
* @return {NSCapabilities<C>} the capabilities with 'options' promoted if necessary
|
||||
*/
|
||||
function promoteAppiumOptionsForObject(obj) {
|
||||
export function promoteAppiumOptionsForObject<C extends Constraints>(obj: NSCapabilities<C>): NSCapabilities<C> {
|
||||
const appiumOptions = obj[PREFIXED_APPIUM_OPTS_CAP];
|
||||
if (!appiumOptions) {
|
||||
return obj;
|
||||
@@ -379,8 +368,8 @@ function promoteAppiumOptionsForObject(obj) {
|
||||
/**
|
||||
* @param {string} capName
|
||||
*/
|
||||
const shouldAddVendorPrefix = (capName) => !capName.startsWith(APPIUM_VENDOR_PREFIX);
|
||||
const verifyIfAcceptable = (/** @type {string} */ capName) => {
|
||||
const shouldAddVendorPrefix = (capName: string) => !capName.startsWith(APPIUM_VENDOR_PREFIX);
|
||||
const verifyIfAcceptable = (capName: string) => {
|
||||
if (!_.isString(capName)) {
|
||||
throw new errors.SessionNotCreatedError(
|
||||
`Capability names in ${PREFIXED_APPIUM_OPTS_CAP} must be strings. '${capName}' is unexpected`
|
||||
@@ -394,8 +383,8 @@ function promoteAppiumOptionsForObject(obj) {
|
||||
return capName;
|
||||
};
|
||||
const preprocessedOptions = _(appiumOptions)
|
||||
.mapKeys((value, /** @type {string} */ key) => verifyIfAcceptable(key))
|
||||
.mapKeys((value, key) => (shouldAddVendorPrefix(key) ? `${APPIUM_VENDOR_PREFIX}${key}` : key))
|
||||
.mapKeys((value, key: string) => verifyIfAcceptable(key))
|
||||
.mapKeys((value, key: string) => (shouldAddVendorPrefix(key) ? `${APPIUM_VENDOR_PREFIX}${key}` : key))
|
||||
.value();
|
||||
// warn if we are going to overwrite any keys on the base caps object
|
||||
const overwrittenKeys = _.intersection(Object.keys(obj), Object.keys(preprocessedOptions));
|
||||
@@ -406,7 +395,7 @@ function promoteAppiumOptionsForObject(obj) {
|
||||
);
|
||||
}
|
||||
return _.cloneDeep({
|
||||
.../** @type {NSCapabilities<C>} */ (_.omit(obj, PREFIXED_APPIUM_OPTS_CAP)),
|
||||
..._.omit(obj, PREFIXED_APPIUM_OPTS_CAP) as NSCapabilities<C>,
|
||||
...preprocessedOptions,
|
||||
});
|
||||
}
|
||||
@@ -414,13 +403,9 @@ function promoteAppiumOptionsForObject(obj) {
|
||||
/**
|
||||
* Return a copy of a capabilities object which has taken everything within the 'options'
|
||||
* capability and promoted it to the top level.
|
||||
*
|
||||
* @template {Constraints} C
|
||||
* @param {W3CCapabilities<C>} originalCaps
|
||||
* @return {W3CCapabilities<C>} the capabilities with 'options' promoted if necessary
|
||||
*/
|
||||
function promoteAppiumOptions(originalCaps) {
|
||||
const result = {};
|
||||
export function promoteAppiumOptions<C extends Constraints>(originalCaps: W3CCapabilities<C>): W3CCapabilities<C> {
|
||||
const result = {} as W3CCapabilities<C>;
|
||||
const {alwaysMatch, firstMatch} = originalCaps;
|
||||
if (_.isPlainObject(alwaysMatch)) {
|
||||
result.alwaysMatch = promoteAppiumOptionsForObject(alwaysMatch);
|
||||
@@ -434,59 +419,3 @@ function promoteAppiumOptions(originalCaps) {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export {
|
||||
parseCaps,
|
||||
processCapabilities,
|
||||
validateCaps,
|
||||
mergeCaps,
|
||||
APPIUM_VENDOR_PREFIX,
|
||||
findNonPrefixedCaps,
|
||||
isStandardCap,
|
||||
stripAppiumPrefixes,
|
||||
promoteAppiumOptions,
|
||||
promoteAppiumOptionsForObject,
|
||||
PREFIXED_APPIUM_OPTS_CAP,
|
||||
};
|
||||
|
||||
/**
|
||||
* @typedef {import('@appium/types').Constraints} Constraints
|
||||
* @typedef {import('@appium/types').Constraint} Constraint
|
||||
* @typedef {import('@appium/types').StringRecord} StringRecord
|
||||
* @typedef {import('@appium/types').BaseDriverCapConstraints} BaseDriverCapConstraints
|
||||
*/
|
||||
|
||||
/**
|
||||
* @template {Constraints} C
|
||||
* @typedef {import('@appium/types').ConstraintsToCaps<C>} ConstraintsToCaps
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef ValidateCapsOpts
|
||||
* @property {boolean} [skipPresenceConstraint] - if true, skip the presence constraint
|
||||
*/
|
||||
|
||||
/**
|
||||
* @template {Constraints} C
|
||||
* @typedef {import('@appium/types').NSCapabilities<C>} NSCapabilities
|
||||
*/
|
||||
|
||||
/**
|
||||
* @template {Constraints} C
|
||||
* @typedef {import('@appium/types').Capabilities<C>} Capabilities
|
||||
*/
|
||||
|
||||
/**
|
||||
* @template {Constraints} C
|
||||
* @typedef {import('@appium/types').W3CCapabilities<C>} W3CCapabilities
|
||||
*/
|
||||
|
||||
/**
|
||||
* @template T
|
||||
* @typedef {import('type-fest').StringKeyOf<T>} StringKeyOf
|
||||
*/
|
||||
|
||||
/**
|
||||
* @template T,U
|
||||
* @typedef {import('type-fest').MergeExclusive<T, U>} MergeExclusive<T,U>
|
||||
*/
|
||||
@@ -74,7 +74,8 @@ validator.validators.isArray = function isArray(value) {
|
||||
return 'must be of type array';
|
||||
};
|
||||
validator.validators.deprecated = function deprecated(value, options, key) {
|
||||
if (options) {
|
||||
// do not print caps that hasn't been provided.
|
||||
if (typeof value !== 'undefined' && options) {
|
||||
log.warn(`${key} is a deprecated capability`);
|
||||
}
|
||||
return null;
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import ES6Error from 'es6-error';
|
||||
import _ from 'lodash';
|
||||
import {util, logger} from '@appium/support';
|
||||
import {StatusCodes as HTTPStatusCodes} from 'http-status-codes';
|
||||
@@ -8,8 +7,36 @@ const w3cLog = logger.getLogger('W3C');
|
||||
|
||||
const W3C_UNKNOWN_ERROR = 'unknown error';
|
||||
|
||||
class BaseError extends Error {
|
||||
constructor(message = '') {
|
||||
super(message);
|
||||
/** @type {[string, () => any][]} */
|
||||
const propsMap = [
|
||||
['message', () => message],
|
||||
['name', () => this.constructor.name],
|
||||
['stack', () => (new Error(message)).stack],
|
||||
];
|
||||
// eslint-disable-next-line no-prototype-builtins
|
||||
const shouldSkipStack = Error.hasOwnProperty('captureStackTrace');
|
||||
for (const [propName, valueGetter] of propsMap) {
|
||||
if (propName === 'stack' && shouldSkipStack) {
|
||||
continue;
|
||||
}
|
||||
Object.defineProperty(this, propName, {
|
||||
configurable: true,
|
||||
enumerable: false,
|
||||
value: valueGetter(),
|
||||
writable: true,
|
||||
});
|
||||
}
|
||||
if (shouldSkipStack) {
|
||||
Error.captureStackTrace(this, this.constructor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// base error class for all of our errors
|
||||
export class ProtocolError extends ES6Error {
|
||||
export class ProtocolError extends BaseError {
|
||||
constructor(msg, jsonwpCode, w3cStatus, error) {
|
||||
super(msg);
|
||||
this.jsonwpCode = jsonwpCode;
|
||||
@@ -896,7 +923,7 @@ function generateBadParametersMessage(requiredParams, actualParams) {
|
||||
}
|
||||
|
||||
// Equivalent to W3C InvalidArgumentError
|
||||
export class BadParametersError extends ES6Error {
|
||||
export class BadParametersError extends BaseError {
|
||||
static error() {
|
||||
return 'invalid argument';
|
||||
}
|
||||
@@ -916,7 +943,7 @@ export class BadParametersError extends ES6Error {
|
||||
* In case of ProxyRequestError should fetch the actual error by calling `getActualError()`
|
||||
* for proxy failure to generate the client response.
|
||||
*/
|
||||
export class ProxyRequestError extends ES6Error {
|
||||
export class ProxyRequestError extends BaseError {
|
||||
constructor(err, responseError, httpStatus) {
|
||||
let responseErrorObj = util.safeJsonParse(responseError);
|
||||
if (!_.isPlainObject(responseErrorObj)) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/base-driver",
|
||||
"version": "9.5.0",
|
||||
"version": "9.5.4",
|
||||
"description": "Base driver class for Appium drivers",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -44,31 +44,30 @@
|
||||
"test:types": "tsd"
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/support": "^4.2.0",
|
||||
"@appium/types": "^0.16.0",
|
||||
"@appium/support": "^4.2.4",
|
||||
"@appium/types": "^0.16.2",
|
||||
"@colors/colors": "1.6.0",
|
||||
"@types/async-lock": "1.4.2",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"@types/express": "4.17.21",
|
||||
"@types/lodash": "4.14.202",
|
||||
"@types/lodash": "4.17.0",
|
||||
"@types/method-override": "0.0.35",
|
||||
"@types/serve-favicon": "2.5.7",
|
||||
"async-lock": "1.4.1",
|
||||
"asyncbox": "3.0.0",
|
||||
"axios": "1.6.3",
|
||||
"axios": "1.6.8",
|
||||
"bluebird": "3.7.2",
|
||||
"body-parser": "1.20.2",
|
||||
"es6-error": "4.1.1",
|
||||
"express": "4.18.2",
|
||||
"express": "4.19.2",
|
||||
"http-status-codes": "2.3.0",
|
||||
"lodash": "4.17.21",
|
||||
"lru-cache": "10.1.0",
|
||||
"lru-cache": "10.2.0",
|
||||
"method-override": "3.0.0",
|
||||
"morgan": "1.10.0",
|
||||
"path-to-regexp": "6.2.1",
|
||||
"path-to-regexp": "6.2.2",
|
||||
"serve-favicon": "2.5.0",
|
||||
"source-map-support": "0.5.21",
|
||||
"type-fest": "4.9.0",
|
||||
"type-fest": "4.10.1",
|
||||
"validate.js": "0.13.1"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
|
||||
@@ -3,6 +3,38 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [2.2.30](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.29...@appium/base-plugin@2.2.30) (2024-04-16)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.2.29](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.28...@appium/base-plugin@2.2.29) (2024-04-08)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.2.28](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.27...@appium/base-plugin@2.2.28) (2024-02-13)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.2.27](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.26...@appium/base-plugin@2.2.27) (2024-02-06)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.2.26](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.25...@appium/base-plugin@2.2.26) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/base-plugin",
|
||||
"version": "2.2.26",
|
||||
"version": "2.2.30",
|
||||
"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.5.0",
|
||||
"@appium/support": "^4.2.0"
|
||||
"@appium/base-driver": "^9.5.4",
|
||||
"@appium/support": "^4.2.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
|
||||
@@ -3,6 +3,48 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [2.0.35](https://github.com/appium/appium/compare/@appium/doctor@2.0.34...@appium/doctor@2.0.35) (2024-04-16)
|
||||
|
||||
**Note:** Version bump only for package @appium/doctor
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.0.34](https://github.com/appium/appium/compare/@appium/doctor@2.0.33...@appium/doctor@2.0.34) (2024-04-08)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **doctor:** update dependency appium-adb to v12.0.4 ([df07665](https://github.com/appium/appium/commit/df076655098db68c986079037a794ce3477314bd))
|
||||
* **doctor:** update dependency appium-adb to v12.0.5 ([a6d49c1](https://github.com/appium/appium/commit/a6d49c1ac84c98ebe085abf32161d2f39c172d5a))
|
||||
* **doctor:** update dependency appium-adb to v12.0.6 ([26ab0ef](https://github.com/appium/appium/commit/26ab0ef7595580722f9a63a1c1e5c3bbef3b18f1))
|
||||
* **doctor:** update dependency appium-adb to v12.0.7 ([3936cb4](https://github.com/appium/appium/commit/3936cb43dceb45e1386c9418453a0dd734e32215))
|
||||
* **doctor:** update dependency appium-adb to v12.0.8 ([1f36882](https://github.com/appium/appium/commit/1f368828e6b3093a7317853e94437bb79955c399))
|
||||
|
||||
|
||||
|
||||
## [2.0.33](https://github.com/appium/appium/compare/@appium/doctor@2.0.32...@appium/doctor@2.0.33) (2024-02-13)
|
||||
|
||||
**Note:** Version bump only for package @appium/doctor
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.0.32](https://github.com/appium/appium/compare/@appium/doctor@2.0.31...@appium/doctor@2.0.32) (2024-02-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **doctor:** update dependency appium-adb to v11.1.0 ([cbc1f50](https://github.com/appium/appium/commit/cbc1f500bc0721edcdf7f47af949ae113c038a46))
|
||||
* **doctor:** update dependency appium-adb to v12 ([#19648](https://github.com/appium/appium/issues/19648)) ([9617974](https://github.com/appium/appium/commit/961797448116b6be7b500a68b4202b969805825c))
|
||||
* **doctor:** update dependency appium-adb to v12.0.1 ([b85a6b9](https://github.com/appium/appium/commit/b85a6b939f688703522ebb6ddab19aa807c64dbe))
|
||||
* **doctor:** update dependency appium-adb to v12.0.2 ([5936d53](https://github.com/appium/appium/commit/5936d53d7856e6a2aa31236eaa0ea9afee737c95))
|
||||
* **doctor:** update dependency appium-adb to v12.0.3 ([#19722](https://github.com/appium/appium/issues/19722)) ([6cd2c54](https://github.com/appium/appium/commit/6cd2c547def390eb5d739d6245fe0bab1f99931a))
|
||||
|
||||
|
||||
|
||||
## [2.0.31](https://github.com/appium/appium/compare/@appium/doctor@2.0.30...@appium/doctor@2.0.31) (2024-01-03)
|
||||
|
||||
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
[](https://npmjs.org/package/@appium/doctor)
|
||||
[](https://npmjs.org/package/@appium/doctor)
|
||||
|
||||
> [!WARNING]
|
||||
> This package has been deprecated since the Appium server v 2.4.0 and will be removed in the future.
|
||||
> Use doctor checks (if any exist) integrated into your installed driver or plugin by
|
||||
> running `appium driver doctor <driver_name>` or `appium plugin doctor <plugin_name>`.
|
||||
|
||||
### Install
|
||||
|
||||
```
|
||||
|
||||
@@ -198,6 +198,9 @@ class Doctor {
|
||||
|
||||
async run() {
|
||||
log.info(`Appium Doctor v.${version}`);
|
||||
log.warn(`This package is deprecated since the Appium server version 2.4.0 and will be removed in the future.`);
|
||||
log.warn(`Use doctor checks (if any exist) integrated into your installed driver or plugin by ` +
|
||||
`running \`appium driver doctor <driver_name>\` or \`appium plugin doctor <plugin_name>\`.`);
|
||||
await this.diagnose();
|
||||
if (await this.reportSuccess(this.toFix.length, this.toFixOptionals.length)) {
|
||||
return;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/doctor",
|
||||
"version": "2.0.31",
|
||||
"version": "2.0.35",
|
||||
"description": "Test environment for fitness to run Appium",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -44,11 +44,11 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/support": "^4.2.0",
|
||||
"@appium/support": "^4.2.4",
|
||||
"@colors/colors": "1.6.0",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"@types/teen_process": "2.0.4",
|
||||
"appium-adb": "11.0.9",
|
||||
"appium-adb": "12.0.8",
|
||||
"bluebird": "3.7.2",
|
||||
"inquirer": "9.2.12",
|
||||
"lodash": "4.17.21",
|
||||
|
||||
@@ -3,6 +3,51 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.0.6](https://github.com/appium/appium/compare/@appium/docutils@1.0.5...@appium/docutils@1.0.6) (2024-04-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **docutils:** update dependency typescript to v5.4.5 ([#19993](https://github.com/appium/appium/issues/19993)) ([d7cf013](https://github.com/appium/appium/commit/d7cf01340199edc30cf7befe351865e7c9124d1a))
|
||||
|
||||
|
||||
|
||||
## [1.0.5](https://github.com/appium/appium/compare/@appium/docutils@1.0.4...@appium/docutils@1.0.5) (2024-04-08)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **docutils:** update dependency lilconfig to v3.1.0 ([f92640a](https://github.com/appium/appium/commit/f92640a824644545b680e23c7f3ec7f51de9df98))
|
||||
* **docutils:** update dependency lilconfig to v3.1.1 ([e04e4e9](https://github.com/appium/appium/commit/e04e4e902a212cf17ca79b3edc0b7545a1af507b))
|
||||
* **docutils:** update dependency typescript to v5.4.2 ([#19876](https://github.com/appium/appium/issues/19876)) ([2448fa0](https://github.com/appium/appium/commit/2448fa0145620657ccc72b5637f1b7737fe52580))
|
||||
* **docutils:** update dependency typescript to v5.4.3 ([cf79227](https://github.com/appium/appium/commit/cf792279b1df40f67fef0913b6f3e00a5a1a097d))
|
||||
* **docutils:** update dependency typescript to v5.4.4 ([5899c2d](https://github.com/appium/appium/commit/5899c2db93be1a72799f5c9d9cf9b0e731b5b1a1))
|
||||
* **docutils:** update dependency yaml to v2.4.0 ([26ded7a](https://github.com/appium/appium/commit/26ded7a4cce1fa9bca28521e4b60cad0edacbe96))
|
||||
* **docutils:** update dependency yaml to v2.4.1 ([636d6b3](https://github.com/appium/appium/commit/636d6b3802268ec6532f9f3a958f304c6760d172))
|
||||
|
||||
|
||||
|
||||
## [1.0.4](https://github.com/appium/appium/compare/@appium/docutils@1.0.3...@appium/docutils@1.0.4) (2024-02-13)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **docutils:** update dependency diff to v5.2.0 ([d83d436](https://github.com/appium/appium/commit/d83d436d01232463a48902964e5ef97334d047f9))
|
||||
* **support:** update dependency semver to v7.6.0 ([7b40a32](https://github.com/appium/appium/commit/7b40a3225ebe0f5976a26d05db2f22ba7b13a130))
|
||||
|
||||
|
||||
|
||||
## [1.0.3](https://github.com/appium/appium/compare/@appium/docutils@1.0.2...@appium/docutils@1.0.3) (2024-02-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **docutils:** change default alias type to `symlink` ([#19681](https://github.com/appium/appium/issues/19681)) ([d9711b4](https://github.com/appium/appium/commit/d9711b4191d19ed0b89944b2732a1a4f4c4d9c0b))
|
||||
* **types:** update dependency type-fest to v4.10 ([#19694](https://github.com/appium/appium/issues/19694)) ([966d305](https://github.com/appium/appium/commit/966d305e5eade9369a3875243bcad951df88545c))
|
||||
* **types:** update dependency type-fest to v4.10.1 ([#19703](https://github.com/appium/appium/issues/19703)) ([501395c](https://github.com/appium/appium/commit/501395c9489320b84ab49ff78af4270f66070d62))
|
||||
|
||||
|
||||
|
||||
## [1.0.2](https://github.com/appium/appium/compare/@appium/docutils@1.0.1...@appium/docutils@1.0.2) (2024-01-03)
|
||||
|
||||
|
||||
|
||||
@@ -14,7 +14,8 @@ This package does not need to be run directly. Instead, execute this command in
|
||||
npm run dev:docs:en
|
||||
```
|
||||
|
||||
Note that this will only build the English docs. See the `scripts` field of the `package.json` for
|
||||
> [!NOTE]
|
||||
> This will only build the English docs. See the `scripts` field of the `package.json` for
|
||||
other languages.
|
||||
|
||||
## Setup for Appium Drivers and Plugins
|
||||
|
||||
@@ -139,12 +139,6 @@ export async function deploy({
|
||||
const mikeArgs = [
|
||||
...argify(_.pickBy(mikeOpts, (value) => _.isNumber(value) || Boolean(value))),
|
||||
];
|
||||
if (alias) {
|
||||
mikeArgs.push('--update-aliases', version, alias);
|
||||
mikeArgs.push('--alias-type', aliasType);
|
||||
} else {
|
||||
mikeArgs.push(version);
|
||||
}
|
||||
stop(); // discard
|
||||
// unsure about how SIGHUP is handled here
|
||||
await doServe(mikePath, mikeArgs, serveOpts);
|
||||
@@ -159,8 +153,8 @@ export async function deploy({
|
||||
),
|
||||
];
|
||||
if (alias) {
|
||||
mikeArgs.push('--update-aliases', version, alias);
|
||||
mikeArgs.push('--alias-type', aliasType);
|
||||
mikeArgs.push('--update-aliases', '--alias-type', aliasType);
|
||||
mikeArgs.push(version, alias);
|
||||
} else {
|
||||
mikeArgs.push(version);
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
*/
|
||||
|
||||
import loadTs from '@sliphua/lilconfig-ts-loader';
|
||||
import {LogLevel} from 'consola';
|
||||
import {lilconfig, Loader} from 'lilconfig';
|
||||
import _ from 'lodash';
|
||||
import path from 'node:path';
|
||||
@@ -46,9 +45,9 @@ export async function findConfig(argv: string[] = hideBin(process.argv)) {
|
||||
|
||||
// if --verbose is used, set the log level to debug.
|
||||
// otherwise use --log-level or the default.
|
||||
let logLevel: LogLevel | keyof typeof LogLevelMap;
|
||||
let logLevel: keyof typeof LogLevelMap;
|
||||
if (preArgs.verbose) {
|
||||
logLevel = LogLevel.Debug;
|
||||
logLevel = 'debug';
|
||||
} else {
|
||||
// if the loglevel is valid, use it, otherwise use the default
|
||||
logLevel = isLogLevelString(preArgs.logLevel) ? preArgs.logLevel : DEFAULT_LOG_LEVEL;
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
* Constants used across various modules in this package
|
||||
* @module
|
||||
*/
|
||||
import {LogLevel} from 'consola';
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires -- Consola 3 import call is ESM
|
||||
const {LogLevels} = require('consola');
|
||||
import {readFileSync} from 'node:fs';
|
||||
import {fs} from '@appium/support';
|
||||
import path from 'node:path';
|
||||
@@ -108,7 +109,7 @@ export const REQUIREMENTS_TXT_PATH = path.join(PKG_ROOT_DIR, NAME_REQUIREMENTS_T
|
||||
* The default alias creation strategy to pass to `mike` when deploying
|
||||
* (`symlink`, `redirect` or `copy`)
|
||||
*/
|
||||
export const DEFAULT_DEPLOY_ALIAS_TYPE = 'redirect';
|
||||
export const DEFAULT_DEPLOY_ALIAS_TYPE = 'symlink';
|
||||
|
||||
/**
|
||||
* The default branch to deploy to
|
||||
@@ -134,11 +135,11 @@ export const DEFAULT_SERVE_HOST = 'localhost';
|
||||
* Mapping of `@appium/docutils`' log levels to `consola` log levels
|
||||
*/
|
||||
export const LogLevelMap = {
|
||||
silent: LogLevel.Silent,
|
||||
error: LogLevel.Error,
|
||||
warn: LogLevel.Warn,
|
||||
info: LogLevel.Info,
|
||||
debug: LogLevel.Debug,
|
||||
silent: LogLevels.silent,
|
||||
error: LogLevels.error,
|
||||
warn: LogLevels.warn,
|
||||
info: LogLevels.info,
|
||||
debug: LogLevels.debug,
|
||||
} as const;
|
||||
|
||||
/**
|
||||
|
||||
+15
-128
@@ -6,134 +6,17 @@
|
||||
* @module
|
||||
*/
|
||||
|
||||
import chalk, {type BackgroundColor, type ForegroundColor} from 'chalk';
|
||||
import consola, {
|
||||
type Consola,
|
||||
type ConsolaReporterLogObject,
|
||||
FancyReporter,
|
||||
type FancyReporterOptions,
|
||||
type LogLevel,
|
||||
type logType as LogType,
|
||||
} from 'consola';
|
||||
import figures from 'figures';
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires -- Consola 3 import call is ESM
|
||||
const {ConsolaInstance, createConsola, LogLevel} = require('consola');
|
||||
import _ from 'lodash';
|
||||
import logSymbols from 'log-symbols';
|
||||
import {DEFAULT_LOG_LEVEL, LogLevelMap} from './constants';
|
||||
|
||||
/**
|
||||
* This is a reporter for `consola` which uses some extra/custom icons and colors.
|
||||
*
|
||||
* @privateRemarks
|
||||
* I did not like that the default `FancyReport` logs errors in _green_ without any sort of icon.
|
||||
* Both `log-symbols` and `consola` consume `chalk`, so we do too. `consola` also depends on `figures`.
|
||||
*/
|
||||
class DocutilsReporter extends FancyReporter {
|
||||
/**
|
||||
* Mapping of log types (the name of the logging method called) to chalk fg colors
|
||||
*/
|
||||
static readonly TYPE_COLOR_MAP = {
|
||||
info: 'cyan',
|
||||
success: 'green',
|
||||
error: 'red',
|
||||
warn: 'yellow',
|
||||
} satisfies {[k in LogType]?: typeof ForegroundColor};
|
||||
|
||||
/**
|
||||
* Mapping of log levels to chalk fg colors
|
||||
*/
|
||||
static readonly LEVEL_COLORS = {
|
||||
0: 'red',
|
||||
1: 'yellow',
|
||||
2: 'white',
|
||||
3: 'green',
|
||||
} satisfies {[k in LogLevel]?: typeof ForegroundColor};
|
||||
|
||||
/**
|
||||
* Mapping of log types to icons/symbols
|
||||
*/
|
||||
static readonly TYPE_ICONS = {
|
||||
info: logSymbols.info,
|
||||
success: logSymbols.success,
|
||||
error: logSymbols.error,
|
||||
warn: logSymbols.warning,
|
||||
debug: figures('›'),
|
||||
trace: figures('›'),
|
||||
} satisfies {[k in LogType]?: string};
|
||||
|
||||
/**
|
||||
* Default color to use if we can't find a color for the log type or level
|
||||
*/
|
||||
static readonly DEFAULT_COLOR = 'grey';
|
||||
|
||||
/**
|
||||
* Type guard to check if a log type has a color
|
||||
* @param type A log type
|
||||
*/
|
||||
static hasTypeColor(type: LogType): type is keyof typeof DocutilsReporter.TYPE_COLOR_MAP {
|
||||
return type in DocutilsReporter.TYPE_COLOR_MAP;
|
||||
}
|
||||
|
||||
/**
|
||||
* Type guard to check if a log level has a color
|
||||
* @param level A log level
|
||||
*/
|
||||
static hasLevelColor(level: LogLevel): level is keyof typeof DocutilsReporter.LEVEL_COLORS {
|
||||
return level in DocutilsReporter.LEVEL_COLORS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Type guard to check if a log type has an icon
|
||||
* @param type A log type
|
||||
*/
|
||||
static hasTypeIcon(type: LogType): type is keyof typeof DocutilsReporter.TYPE_ICONS {
|
||||
return type in DocutilsReporter.TYPE_ICONS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prefixes the logging output with colors and symbols, depending on contents of `logObj`.
|
||||
* @param logObj Consola's log object
|
||||
* @param isBadge {@linkcode FancyReporter} uses this; I think it depends on the terminal width
|
||||
* @returns
|
||||
*/
|
||||
protected override formatType(logObj: ConsolaReporterLogObject, isBadge?: boolean): string {
|
||||
const {
|
||||
TYPE_COLOR_MAP,
|
||||
LEVEL_COLORS,
|
||||
TYPE_ICONS,
|
||||
hasTypeColor,
|
||||
hasLevelColor,
|
||||
hasTypeIcon,
|
||||
DEFAULT_COLOR,
|
||||
} = DocutilsReporter;
|
||||
|
||||
let typeColor: typeof ForegroundColor;
|
||||
if (hasTypeColor(logObj.type)) {
|
||||
typeColor = TYPE_COLOR_MAP[logObj.type];
|
||||
} else if (hasLevelColor(logObj.level)) {
|
||||
typeColor = LEVEL_COLORS[logObj.level];
|
||||
} else {
|
||||
typeColor = <typeof ForegroundColor>(
|
||||
((this.options as FancyReporterOptions).secondaryColor ?? DEFAULT_COLOR)
|
||||
);
|
||||
}
|
||||
|
||||
if (isBadge) {
|
||||
return chalk[('bg' + _.capitalize(typeColor)) as typeof BackgroundColor].black(
|
||||
` ${_.toUpper(logObj.type)}`
|
||||
);
|
||||
}
|
||||
|
||||
const type = hasTypeIcon(logObj.type) ? TYPE_ICONS[logObj.type] : logObj.type;
|
||||
return type ? chalk[typeColor](type) : '';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The global log level
|
||||
*
|
||||
* "Global" inasmuch as any logger created from the root logger will use this level.
|
||||
*/
|
||||
let globalLevel: LogLevel = LogLevelMap[DEFAULT_LOG_LEVEL];
|
||||
let globalLevel: typeof LogLevel = LogLevelMap[DEFAULT_LOG_LEVEL];
|
||||
|
||||
/**
|
||||
* Type guard to see if a string is a recognized log level
|
||||
@@ -144,20 +27,24 @@ export function isLogLevelString(level: any): level is keyof typeof LogLevelMap
|
||||
}
|
||||
|
||||
/**
|
||||
* The logger from which all loggers are created. This one uses a unique tag and our custom reporter.
|
||||
* The logger from which all loggers are created. This one uses a unique tag.
|
||||
*/
|
||||
const rootLogger = consola.create({
|
||||
const rootLogger = createConsola({
|
||||
defaults: {tag: 'docutils'},
|
||||
reporters: [new DocutilsReporter()],
|
||||
fancy: true,
|
||||
level: globalLevel,
|
||||
formatOptions: {
|
||||
colors: true,
|
||||
date: false,
|
||||
},
|
||||
});
|
||||
// this prevents logging before `initLogger` is called
|
||||
rootLogger.pause();
|
||||
rootLogger.pauseLogs();
|
||||
|
||||
/**
|
||||
* A map of tags to loggers
|
||||
*/
|
||||
const loggers: Map<string, WeakRef<Consola>> = new Map();
|
||||
const loggers: Map<string, WeakRef<typeof ConsolaInstance>> = new Map();
|
||||
|
||||
export function getLogger(tag: string, parent = rootLogger) {
|
||||
if (loggers.has(tag)) {
|
||||
@@ -179,15 +66,15 @@ export function getLogger(tag: string, parent = rootLogger) {
|
||||
*
|
||||
* @remarks Child loggers seem to inherit the "paused" state of the parent, so when this is called, we must resume all of them.
|
||||
*/
|
||||
export const initLogger = _.once((level: keyof typeof LogLevelMap | LogLevel) => {
|
||||
export const initLogger = _.once((level: keyof typeof LogLevelMap | typeof LogLevel) => {
|
||||
globalLevel = isLogLevelString(level) ? LogLevelMap[level] : level;
|
||||
rootLogger.level = globalLevel;
|
||||
rootLogger.resume();
|
||||
rootLogger.resumeLogs();
|
||||
for (const ref of loggers.values()) {
|
||||
const logger = ref.deref();
|
||||
if (logger) {
|
||||
logger.level = globalLevel;
|
||||
logger.resume();
|
||||
logger.resumeLogs();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/docutils",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.6",
|
||||
"description": "Documentation generation utilities for Appium and related projects",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -48,26 +48,24 @@
|
||||
"start": "node ./build/lib/cli/index.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/support": "^4.2.0",
|
||||
"@appium/tsconfig": "^0.x",
|
||||
"@appium/support": "^4.2.4",
|
||||
"@appium/tsconfig": "^0.3.3",
|
||||
"@sliphua/lilconfig-ts-loader": "3.2.2",
|
||||
"@types/which": "3.0.3",
|
||||
"chalk": "4.1.2",
|
||||
"consola": "2.15.3",
|
||||
"diff": "5.1.0",
|
||||
"figures": "3.2.0",
|
||||
"consola": "3.2.3",
|
||||
"diff": "5.2.0",
|
||||
"json5": "2.2.3",
|
||||
"lilconfig": "3.0.0",
|
||||
"lilconfig": "3.1.1",
|
||||
"lodash": "4.17.21",
|
||||
"log-symbols": "4.1.0",
|
||||
"pkg-dir": "5.0.0",
|
||||
"read-pkg": "5.2.0",
|
||||
"semver": "7.5.4",
|
||||
"semver": "7.6.0",
|
||||
"source-map-support": "0.5.21",
|
||||
"teen_process": "2.1.1",
|
||||
"type-fest": "4.9.0",
|
||||
"typescript": "5.2.2",
|
||||
"yaml": "2.3.4",
|
||||
"type-fest": "4.10.1",
|
||||
"typescript": "5.4.5",
|
||||
"yaml": "2.4.1",
|
||||
"yargs": "17.7.2",
|
||||
"yargs-parser": "21.1.1"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
mkdocs==1.5.3
|
||||
mkdocs-git-revision-date-localized-plugin==1.2.2
|
||||
mkdocs-material==9.5.3
|
||||
mkdocs-git-revision-date-localized-plugin==1.2.4
|
||||
mkdocs-material==9.5.17
|
||||
mkdocs-redirects==1.2.1
|
||||
mike==2.0.0
|
||||
|
||||
@@ -3,6 +3,32 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [0.4.22](https://github.com/appium/appium/compare/@appium/driver-test-support@0.4.21...@appium/driver-test-support@0.4.22) (2024-04-08)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **driver-test-support:** update definitelytyped ([4776574](https://github.com/appium/appium/commit/47765747b66c5e0076f6ffe4619d6b98a42aee29))
|
||||
* **support:** update dependency axios to v1.6.8 ([bd6ab81](https://github.com/appium/appium/commit/bd6ab81c9408ab0f90fc25fc112f9257ec2973ad))
|
||||
|
||||
|
||||
|
||||
## [0.4.21](https://github.com/appium/appium/compare/@appium/driver-test-support@0.4.20...@appium/driver-test-support@0.4.21) (2024-02-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **driver-test-support:** update dependency chai to v4.4.0 ([f7e4731](https://github.com/appium/appium/commit/f7e47316c0133a5bc6b658cfb97c1caa5d4272f7))
|
||||
* **driver-test-support:** update dependency chai to v4.4.1 ([ca54b4f](https://github.com/appium/appium/commit/ca54b4f79ac27f4c6bceaae5d97175afbdbea460))
|
||||
* **support:** update dependency axios to v1.6.4 ([332cc48](https://github.com/appium/appium/commit/332cc48a09b5532a8d51f85f3a24785e2c754e00))
|
||||
* **support:** update dependency axios to v1.6.5 ([#19616](https://github.com/appium/appium/issues/19616)) ([ac73522](https://github.com/appium/appium/commit/ac73522351b31bd6c11972c61daa8b6b8d18fb91))
|
||||
* **support:** update dependency axios to v1.6.6 ([6313704](https://github.com/appium/appium/commit/6313704ee5a8ee3aee726eb512ef259b6fa1041c))
|
||||
* **support:** update dependency axios to v1.6.7 ([795092a](https://github.com/appium/appium/commit/795092a97f6d7569cccc4b5c166f52fef821514b))
|
||||
* **types:** update dependency type-fest to v4.10 ([#19694](https://github.com/appium/appium/issues/19694)) ([966d305](https://github.com/appium/appium/commit/966d305e5eade9369a3875243bcad951df88545c))
|
||||
* **types:** update dependency type-fest to v4.10.1 ([#19703](https://github.com/appium/appium/issues/19703)) ([501395c](https://github.com/appium/appium/commit/501395c9489320b84ab49ff78af4270f66070d62))
|
||||
|
||||
|
||||
|
||||
## [0.4.20](https://github.com/appium/appium/compare/@appium/driver-test-support@0.4.19...@appium/driver-test-support@0.4.20) (2024-01-03)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/driver-test-support",
|
||||
"version": "0.4.20",
|
||||
"version": "0.4.22",
|
||||
"description": "Test utilities for Appium drivers",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -41,18 +41,18 @@
|
||||
},
|
||||
"types": "./build/lib/index.d.ts",
|
||||
"dependencies": {
|
||||
"@appium/types": "^0.16.0",
|
||||
"@types/lodash": "4.14.202",
|
||||
"@appium/types": "^0.16.2",
|
||||
"@types/lodash": "4.17.0",
|
||||
"@types/stoppable": "1.1.3",
|
||||
"axios": "1.6.3",
|
||||
"axios": "1.6.8",
|
||||
"bluebird": "3.7.2",
|
||||
"chai": "4.3.10",
|
||||
"chai": "4.4.1",
|
||||
"get-port": "5.1.1",
|
||||
"lodash": "4.17.21",
|
||||
"sinon": "17.0.1",
|
||||
"source-map-support": "0.5.21",
|
||||
"stoppable": "1.1.0",
|
||||
"type-fest": "4.9.0"
|
||||
"type-fest": "4.10.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"appium": "^2.0.0-beta.43",
|
||||
|
||||
@@ -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.3](https://github.com/appium/appium/compare/@appium/eslint-config-appium-ts@0.3.2...@appium/eslint-config-appium-ts@0.3.3) (2024-04-08)
|
||||
|
||||
**Note:** Version bump only for package @appium/eslint-config-appium-ts
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.3.2](https://github.com/appium/appium/compare/@appium/eslint-config-appium-ts@0.3.1...@appium/eslint-config-appium-ts@0.3.2) (2023-10-18)
|
||||
|
||||
**Note:** Version bump only for package @appium/eslint-config-appium-ts
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/eslint-config-appium-ts",
|
||||
"version": "0.3.2",
|
||||
"version": "0.3.3",
|
||||
"description": "Shared ESLint config for Appium projects (TypeScript version)",
|
||||
"keywords": [
|
||||
"eslint",
|
||||
@@ -29,10 +29,10 @@
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@appium/eslint-config-appium": "^8.0.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.5.0 || ^6.0.0",
|
||||
"@typescript-eslint/parser": "^5.5.0 || ^6.0.0",
|
||||
"eslint": "^8.21.0",
|
||||
"eslint-config-prettier": "^8.5.0 || ^9.0.0",
|
||||
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
||||
"@typescript-eslint/parser": "^7.0.0",
|
||||
"eslint": "^8.56.0",
|
||||
"eslint-config-prettier": "^9.0.0",
|
||||
"eslint-import-resolver-typescript": "^3.5.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-mocha": "^10.1.0",
|
||||
|
||||
@@ -3,6 +3,57 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [3.0.27](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@3.0.26...@appium/execute-driver-plugin@3.0.27) (2024-04-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.36.0 ([#19998](https://github.com/appium/appium/issues/19998)) ([72f3284](https://github.com/appium/appium/commit/72f32848b68e6ef8c047f700ffd0be7d68c49aba))
|
||||
|
||||
|
||||
|
||||
## [3.0.26](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@3.0.25...@appium/execute-driver-plugin@3.0.26) (2024-04-08)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.32.0 ([d25a0fc](https://github.com/appium/appium/commit/d25a0fca9b3a94880525fd956068f59427a40b26))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.32.1 ([ea8c74b](https://github.com/appium/appium/commit/ea8c74b372e73e88cf0303aa17db943014416e64))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.32.2 ([#19807](https://github.com/appium/appium/issues/19807)) ([6c034aa](https://github.com/appium/appium/commit/6c034aa84af573d36fa934c71d3d4ff328772553))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.32.3 ([f837a6a](https://github.com/appium/appium/commit/f837a6a9eaf34914ffdbfddcc3cb2f7e7427bc63))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.32.4 ([7516d41](https://github.com/appium/appium/commit/7516d4135a1eec37ba298f407254d825961795af))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.33.1 ([#19877](https://github.com/appium/appium/issues/19877)) ([0e6c3ee](https://github.com/appium/appium/commit/0e6c3eede250193fad390387ec494918367176d9))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.34.1 ([7fc7446](https://github.com/appium/appium/commit/7fc7446612f3257fa421dfec006d02730df10f59))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.35.1 ([63d7550](https://github.com/appium/appium/commit/63d7550d02f049a5c3bea5d27e7e8385d7698a4f))
|
||||
|
||||
|
||||
|
||||
## [3.0.25](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@3.0.24...@appium/execute-driver-plugin@3.0.25) (2024-02-13)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.31.1 ([db0eec0](https://github.com/appium/appium/commit/db0eec05c58fe970351a309a01507cad824bdad2))
|
||||
|
||||
|
||||
|
||||
## [3.0.24](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@3.0.23...@appium/execute-driver-plugin@3.0.24) (2024-02-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.27.2 ([35f1dba](https://github.com/appium/appium/commit/35f1dbabf6e852c4ae84ec128879bc7e61321a16))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.28.0 ([e8e0444](https://github.com/appium/appium/commit/e8e0444bd28d94963090065a813a4b10be665caa))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.28.6 ([da84efc](https://github.com/appium/appium/commit/da84efc42dd62b2be07a52dd4379791e2cef6eb2))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.28.8 ([1fdf117](https://github.com/appium/appium/commit/1fdf117c63f6e9871f4de3c0bd93ecbdb13a9235))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.29.0 ([6f0101e](https://github.com/appium/appium/commit/6f0101eb6343eb8b372e00a6b71d2b2ee909404c))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.29.1 ([fb0f8f7](https://github.com/appium/appium/commit/fb0f8f776c6a03174f4569efa60d817a930809cf))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.29.3 ([6dacb5e](https://github.com/appium/appium/commit/6dacb5e70ca3529a080f629f5245c2b676746e2c))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.29.7 ([52a6f96](https://github.com/appium/appium/commit/52a6f96e085ff13acdf8d5013673861b7e0da818))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.30.0 ([91320dd](https://github.com/appium/appium/commit/91320ddd02dca89a8cec258d0ab44a49d344d71c))
|
||||
|
||||
|
||||
|
||||
## [3.0.23](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@3.0.22...@appium/execute-driver-plugin@3.0.23) (2024-01-03)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/execute-driver-plugin",
|
||||
"version": "3.0.23",
|
||||
"version": "3.0.27",
|
||||
"description": "Plugin for batching and executing driver commands with Appiums",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -43,7 +43,7 @@
|
||||
"lodash": "4.17.21",
|
||||
"source-map-support": "0.5.21",
|
||||
"vm2": "3.9.19",
|
||||
"webdriverio": "8.27.0"
|
||||
"webdriverio": "8.36.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"appium": "^2.0.0-beta.35"
|
||||
|
||||
@@ -3,6 +3,24 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [5.5.1](https://github.com/appium/appium/compare/@appium/fake-driver@5.5.0...@appium/fake-driver@5.5.1) (2024-02-13)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **fake-driver:** fix dependencies ([#19782](https://github.com/appium/appium/issues/19782)) ([889a533](https://github.com/appium/appium/commit/889a533eef8b7a0805dd786d358f5729e03f0c40))
|
||||
|
||||
|
||||
|
||||
## [5.5.0](https://github.com/appium/appium/compare/@appium/fake-driver@5.4.0...@appium/fake-driver@5.5.0) (2024-02-06)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **appium:** Set a proper exit code if any of required doctor checks fails ([#19617](https://github.com/appium/appium/issues/19617)) ([f4011f1](https://github.com/appium/appium/commit/f4011f17d4d03bc854c43462848a4c38427acb85))
|
||||
|
||||
|
||||
|
||||
## [5.4.0](https://github.com/appium/appium/compare/@appium/fake-driver@5.3.0...@appium/fake-driver@5.4.0) (2024-01-03)
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||
const {fs, doctor} = require('@appium/support');
|
||||
const {doctor} = require('appium/support');
|
||||
|
||||
/** @satisfies {import('@appium/types').IDoctorCheck} */
|
||||
class EnvVarAndPathCheck {
|
||||
@@ -11,16 +11,7 @@ class EnvVarAndPathCheck {
|
||||
}
|
||||
|
||||
async diagnose() {
|
||||
const varValue = process.env[this.varName];
|
||||
if (typeof varValue === 'undefined') {
|
||||
return doctor.nok(`${this.varName} environment variable is NOT set!`);
|
||||
}
|
||||
|
||||
if (await fs.exists(varValue)) {
|
||||
return doctor.ok(`${this.varName} is set to: ${varValue}`);
|
||||
}
|
||||
|
||||
return doctor.nok(`${this.varName} is set to '${varValue}' but this is NOT a valid path!`);
|
||||
return doctor.ok(`${this.varName} environment variable is always set because it's fake`);
|
||||
}
|
||||
|
||||
async fix() {
|
||||
@@ -39,7 +30,3 @@ class EnvVarAndPathCheck {
|
||||
}
|
||||
|
||||
module.exports = {EnvVarAndPathCheck};
|
||||
|
||||
/**
|
||||
* @typedef {import('@appium/types').DoctorCheckResult} CheckResult
|
||||
*/
|
||||
|
||||
@@ -3,7 +3,7 @@ import {Element} from '@appium/types';
|
||||
import {errors} from 'appium/driver';
|
||||
import {FakeElement} from '../fake-element';
|
||||
import {FakeDriver} from '../driver';
|
||||
import {util} from '@appium/support';
|
||||
import {util} from 'appium/support';
|
||||
import {mixin} from './mixin';
|
||||
|
||||
const {W3C_WEB_ELEMENT_IDENTIFIER} = util;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/fake-driver",
|
||||
"version": "5.4.0",
|
||||
"version": "5.5.1",
|
||||
"description": "Mock driver used internally by Appium for testing. Ignore",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -51,7 +51,7 @@
|
||||
"xpath": "0.0.34"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"appium": "^2.0.0-beta.35"
|
||||
"appium": "^2.4.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
|
||||
@@ -3,6 +3,38 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [3.1.34](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.33...@appium/fake-plugin@3.1.34) (2024-04-16)
|
||||
|
||||
**Note:** Version bump only for package @appium/fake-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.1.33](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.32...@appium/fake-plugin@3.1.33) (2024-04-08)
|
||||
|
||||
**Note:** Version bump only for package @appium/fake-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.1.32](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.31...@appium/fake-plugin@3.1.32) (2024-02-13)
|
||||
|
||||
**Note:** Version bump only for package @appium/fake-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.1.31](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.30...@appium/fake-plugin@3.1.31) (2024-02-06)
|
||||
|
||||
**Note:** Version bump only for package @appium/fake-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.1.30](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.29...@appium/fake-plugin@3.1.30) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @appium/fake-plugin
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/fake-plugin",
|
||||
"version": "3.1.30",
|
||||
"version": "3.1.34",
|
||||
"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.2.26",
|
||||
"@appium/support": "^4.2.0",
|
||||
"@appium/base-plugin": "^2.2.30",
|
||||
"@appium/support": "^4.2.4",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
|
||||
@@ -3,6 +3,39 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [3.0.5](https://github.com/appium/appium/compare/@appium/images-plugin@3.0.4...@appium/images-plugin@3.0.5) (2024-04-16)
|
||||
|
||||
**Note:** Version bump only for package @appium/images-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.4](https://github.com/appium/appium/compare/@appium/images-plugin@3.0.3...@appium/images-plugin@3.0.4) (2024-04-08)
|
||||
|
||||
**Note:** Version bump only for package @appium/images-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.3](https://github.com/appium/appium/compare/@appium/images-plugin@3.0.2...@appium/images-plugin@3.0.3) (2024-02-13)
|
||||
|
||||
**Note:** Version bump only for package @appium/images-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.2](https://github.com/appium/appium/compare/@appium/images-plugin@3.0.1...@appium/images-plugin@3.0.2) (2024-02-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **images-plugin:** update dependency lru-cache to v10 ([#19723](https://github.com/appium/appium/issues/19723)) ([202da83](https://github.com/appium/appium/commit/202da83449073ddb3da8fb2cfbcfce482a5ecd40))
|
||||
|
||||
|
||||
|
||||
## [3.0.1](https://github.com/appium/appium/compare/@appium/images-plugin@3.0.0...@appium/images-plugin@3.0.1) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @appium/images-plugin
|
||||
|
||||
@@ -38,7 +38,7 @@ To access these settings, you should use the Appium [Settings API](https://githu
|
||||
|fixImageFindScreenshotDims|Appium knows the screen dimensions, and ultimately these are the dimensions which are relevant for deciding where to tap on the screen. If the screenshot retrieved (via Appium's native methods, or an external source) does not match the screen dimensions, this setting dictates that Appium will adjust the size of the screenshot to match, ensuring that matched elements are found at the correct coordinates. Turn this setting off if you know it's not necessary, and Appium will forego the check, potentially speeding things up a bit.|`true` or `false`|`true`|
|
||||
|fixImageTemplateSize|OpenCV will not allow the matching of a reference image / template if that image is larger than the base image to match against. It can happen that the reference image you send in has dimensions which are larger than the screenshot Appium retrieves. In this case the match will automatically fail. If you set this setting to `true`, Appium will resize the template to ensure it is at least smaller than the size of the screenshot.|`true` or `false`|`false`|
|
||||
|fixImageTemplateScale| Appium resizes a base image to fit its window size before matching them with OpenCV. If you set this setting to `true`, Appium scales a reference image you send in as the same scale Appium scales the base image to fit the window size. e.g. iOS screenshot is `750 × 1334` pixels base image. The window size is `375 x 667`. Appium rescale the base image to window size scaling it with `0.5`. A reference image is based on the screenshot size, never the image matches with the window size scale. This settings allow Appium to scale the reference image with `0.5`. [appium-base-driver#306](https://github.com/appium/appium-base-driver/pull/306)| `true` or `false` | `false` |
|
||||
|defaultImageTemplateScale| Appium does not resize template images by default (the value of 1.0). Although, storing scaled template images might help to save size of the storage. E.g. One has could represent 1080 × 126 pixels area by 270 × 32 pixels template image (the value of defaultImageTemplateScale is expected to be set to 4.0). Check [appium-base-driver#307](https://github.com/appium/appium-base-driver/pull/307) for more details. |e.g., `0.5`, `10.0`, `100`| `1.0` |
|
||||
|defaultImageTemplateScale| Appium does not resize template images by default (the value of 1.0). Although, storing scaled template images might help to save size of the storage. E.g. One could represent 1080 × 126 pixels area by 270 × 32 pixels template image (the value of defaultImageTemplateScale is expected to be set to 4.0). Check [appium-base-driver#307](https://github.com/appium/appium-base-driver/pull/307) for more details. |e.g., `0.5`, `10.0`, `100`| `1.0` |
|
||||
|checkForImageElementStaleness|It can happen that, in between the time you have matched an image element and the time you choose to tap on it, the element is no longer present. The only way for Appium to determine this is to attempt to re-match the template immediately before tapping. If that re-match fails, you will get a `StaleElementException`, as you would expect. Turn this to `false` to skip the check, potentially speeding things up, but potentially running into stale element issues without the benefit of an exception to let you know you did.|`true` or `false`|`true`|
|
||||
|autoUpdateImageElementPosition|It can happen that a matched image changes position in between the time it is found and the time you tap on it. As with the previous setting, Appium can automatically adjust its position if it determines in a re-match that the position changed.|`true` or `false`|`false`|
|
||||
|imageElementTapStrategy|In order to tap on a found image element, Appium has to use one of its touch action strategies. The available strategies are the W3C Actions API, or the older MJSONWP TouchActions API. Stick to the default unless the driver you are using does not support the W3C Actions API for some reason.|`"w3cActions"` or `"touchActions"`|`"w3cActions"`|
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/images-plugin",
|
||||
"version": "3.0.1",
|
||||
"version": "3.0.5",
|
||||
"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": "^3.0.1",
|
||||
"@appium/support": "^4.2.0",
|
||||
"@appium/opencv": "^3.0.3",
|
||||
"@appium/support": "^4.2.4",
|
||||
"lodash": "4.17.21",
|
||||
"lru-cache": "10.1.0",
|
||||
"sharp": "0.33.1",
|
||||
"lru-cache": "10.2.0",
|
||||
"sharp": "0.33.3",
|
||||
"source-map-support": "0.5.21"
|
||||
},
|
||||
"peerDependencies": {
|
||||
|
||||
@@ -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.0.3](https://github.com/appium/appium/compare/@appium/opencv@3.0.2...@appium/opencv@3.0.3) (2024-04-08)
|
||||
|
||||
**Note:** Version bump only for package @appium/opencv
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.2](https://github.com/appium/appium/compare/@appium/opencv@3.0.1...@appium/opencv@3.0.2) (2024-02-06)
|
||||
|
||||
**Note:** Version bump only for package @appium/opencv
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.1](https://github.com/appium/appium/compare/@appium/opencv@3.0.0...@appium/opencv@3.0.1) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @appium/opencv
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/opencv",
|
||||
"version": "3.0.1",
|
||||
"version": "3.0.3",
|
||||
"description": "OpenCV-related helper library",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -45,7 +45,7 @@
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
"opencv-bindings": "4.5.5",
|
||||
"sharp": "0.33.1",
|
||||
"sharp": "0.33.3",
|
||||
"source-map-support": "0.5.21"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -3,6 +3,23 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [0.3.29](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.28...@appium/plugin-test-support@0.3.29) (2024-04-08)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **docutils:** update dependency typescript to v5.4.2 ([#19876](https://github.com/appium/appium/issues/19876)) ([2448fa0](https://github.com/appium/appium/commit/2448fa0145620657ccc72b5637f1b7737fe52580))
|
||||
|
||||
|
||||
|
||||
## [0.3.28](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.27...@appium/plugin-test-support@0.3.28) (2024-02-06)
|
||||
|
||||
**Note:** Version bump only for package @appium/plugin-test-support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.3.27](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.26...@appium/plugin-test-support@0.3.27) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @appium/plugin-test-support
|
||||
|
||||
@@ -111,7 +111,7 @@ export function pluginE2EHarness(opts) {
|
||||
console.log(`${info} Will use port ${port} for Appium server`);
|
||||
this.port = port;
|
||||
|
||||
/** @type {import('appium').Args} */
|
||||
/** @type {import('appium/types').Args} */
|
||||
const args = {
|
||||
port,
|
||||
address: host,
|
||||
@@ -141,7 +141,7 @@ export function pluginE2EHarness(opts) {
|
||||
* @property {string} [appiumHome] - Path to Appium home directory
|
||||
* @property {Mocha.before} before - Mocha "before all" hook function
|
||||
* @property {Mocha.after} after - Mocha "after all" hook function
|
||||
* @property {Partial<import('appium').Args>} [serverArgs] - Arguments to pass to Appium server
|
||||
* @property {Partial<import('appium/types').Args>} [serverArgs] - Arguments to pass to Appium server
|
||||
* @property {import('appium/types').InstallType & string} driverSource - Source of driver to install
|
||||
* @property {string} [driverPackage] - Package name of driver to install
|
||||
* @property {string} driverName - Name of driver to install
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/plugin-test-support",
|
||||
"version": "0.3.27",
|
||||
"version": "0.3.29",
|
||||
"description": "Testing utilities for Appium plugins",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -41,7 +41,7 @@
|
||||
"test:unit": "exit 0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/types": "^0.16.0",
|
||||
"@appium/types": "^0.16.2",
|
||||
"get-port": "5.1.1",
|
||||
"log-symbols": "4.1.0",
|
||||
"source-map-support": "0.5.21",
|
||||
|
||||
@@ -3,6 +3,59 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [4.2.4](https://github.com/appium/appium/compare/@appium/support@4.2.3...@appium/support@4.2.4) (2024-04-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** Enable `shell` option on Windows ([#19996](https://github.com/appium/appium/issues/19996)) ([572037a](https://github.com/appium/appium/commit/572037a0e256ea1ac0d7b0551463b79e07f9e56f))
|
||||
|
||||
|
||||
|
||||
## [4.2.3](https://github.com/appium/appium/compare/@appium/support@4.2.2...@appium/support@4.2.3) (2024-04-08)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** make --log-filters work ([#19825](https://github.com/appium/appium/issues/19825)) ([0d5a0a5](https://github.com/appium/appium/commit/0d5a0a572787d913412bbfd70835e5ba8f94334c))
|
||||
* **support:** update dependency @types/semver to v7.5.8 ([d1705e2](https://github.com/appium/appium/commit/d1705e2818d435b4c37cb70753af1de5427378e2))
|
||||
* **support:** update dependency archiver to v6.0.2 ([e4ae277](https://github.com/appium/appium/commit/e4ae2772acf6cd1c2119dd7f8c1f7804e3a2394f))
|
||||
* **support:** update dependency archiver to v7 ([#19844](https://github.com/appium/appium/issues/19844)) ([c905be0](https://github.com/appium/appium/commit/c905be032fd97fcce726097e4f861b142a355f0d))
|
||||
* **support:** update dependency archiver to v7.0.1 ([b126df6](https://github.com/appium/appium/commit/b126df6234625a5c90a1b171e2844ed666120b8d))
|
||||
* **support:** update dependency axios to v1.6.8 ([bd6ab81](https://github.com/appium/appium/commit/bd6ab81c9408ab0f90fc25fc112f9257ec2973ad))
|
||||
* **support:** update dependency glob to v10.3.12 ([#19937](https://github.com/appium/appium/issues/19937)) ([9a0c059](https://github.com/appium/appium/commit/9a0c059c3ae3f762fa31b91eb903fd76e827f96d))
|
||||
* **support:** update dependency yauzl to v3 ([#19790](https://github.com/appium/appium/issues/19790)) ([41cb869](https://github.com/appium/appium/commit/41cb86945314869b8c5165d62b9790403fc07985))
|
||||
* **support:** update dependency yauzl to v3 ([#19809](https://github.com/appium/appium/issues/19809)) ([bd7b420](https://github.com/appium/appium/commit/bd7b42007d4b02a798344e722840975e7e975624))
|
||||
* **support:** update dependency yauzl to v3 ([#19878](https://github.com/appium/appium/issues/19878)) ([3da17b6](https://github.com/appium/appium/commit/3da17b6ecdfe9d55300b7e7b13605352a24ab347))
|
||||
* **support:** update dependency yauzl to v3.1.1 ([#19845](https://github.com/appium/appium/issues/19845)) ([e1ccdd2](https://github.com/appium/appium/commit/e1ccdd2d483e78e2e8f55508d80b712bd6a33b38))
|
||||
|
||||
|
||||
|
||||
## [4.2.2](https://github.com/appium/appium/compare/@appium/support@4.2.1...@appium/support@4.2.2) (2024-02-13)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update dependency @types/semver to v7.5.7 ([bd8a92f](https://github.com/appium/appium/commit/bd8a92f588d40c97fbe51f8bd3b7835c96e9fe8f))
|
||||
* **support:** update dependency semver to v7.6.0 ([7b40a32](https://github.com/appium/appium/commit/7b40a3225ebe0f5976a26d05db2f22ba7b13a130))
|
||||
|
||||
|
||||
|
||||
## [4.2.1](https://github.com/appium/appium/compare/@appium/support@4.2.0...@appium/support@4.2.1) (2024-02-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** Prefer semver.minVersion to semver.coerce API ([#19610](https://github.com/appium/appium/issues/19610)) ([b5460fc](https://github.com/appium/appium/commit/b5460fc131fd23e8a3feb0b15d3fe9eb8bdac5e9))
|
||||
* **support:** update dependency axios to v1.6.4 ([332cc48](https://github.com/appium/appium/commit/332cc48a09b5532a8d51f85f3a24785e2c754e00))
|
||||
* **support:** update dependency axios to v1.6.5 ([#19616](https://github.com/appium/appium/issues/19616)) ([ac73522](https://github.com/appium/appium/commit/ac73522351b31bd6c11972c61daa8b6b8d18fb91))
|
||||
* **support:** update dependency axios to v1.6.6 ([6313704](https://github.com/appium/appium/commit/6313704ee5a8ee3aee726eb512ef259b6fa1041c))
|
||||
* **support:** update dependency axios to v1.6.7 ([795092a](https://github.com/appium/appium/commit/795092a97f6d7569cccc4b5c166f52fef821514b))
|
||||
* **types:** update dependency type-fest to v4.10 ([#19694](https://github.com/appium/appium/issues/19694)) ([966d305](https://github.com/appium/appium/commit/966d305e5eade9369a3875243bcad951df88545c))
|
||||
* **types:** update dependency type-fest to v4.10.1 ([#19703](https://github.com/appium/appium/issues/19703)) ([501395c](https://github.com/appium/appium/commit/501395c9489320b84ab49ff78af4270f66070d62))
|
||||
|
||||
|
||||
|
||||
## [4.2.0](https://github.com/appium/appium/compare/@appium/support@4.1.11...@appium/support@4.2.0) (2024-01-03)
|
||||
|
||||
|
||||
|
||||
@@ -46,9 +46,15 @@ export async function hasAppiumDependency(cwd) {
|
||||
export const findAppiumDependencyPackage = _.memoize(
|
||||
/**
|
||||
* @param {string} [cwd]
|
||||
* @param {string|semver.Range} [acceptableVersionRange='>=2.0.0-beta'] The expected
|
||||
* semver-compatible range for the Appium dependency. Packages that have 'appium' dependency
|
||||
* not satisfying this range will be skipped.
|
||||
* @returns {Promise<string|undefined>}
|
||||
*/
|
||||
async (cwd = process.cwd()) => {
|
||||
async function findAppiumDependencyPackage (
|
||||
cwd = process.cwd(),
|
||||
acceptableVersionRange = '>=2.0.0-beta'
|
||||
) {
|
||||
/**
|
||||
* Tries to read `package.json` in `root` and resolves the identity if it depends on `appium`;
|
||||
* otherwise resolves `undefined`.
|
||||
@@ -58,14 +64,12 @@ export const findAppiumDependencyPackage = _.memoize(
|
||||
const readPkg = async (root) => {
|
||||
try {
|
||||
const pkg = await readPackageInDir(root);
|
||||
const version = semver.coerce(String(
|
||||
const version = semver.minVersion(String(
|
||||
pkg?.dependencies?.appium ??
|
||||
pkg?.devDependencies?.appium ??
|
||||
pkg?.peerDependencies?.appium
|
||||
));
|
||||
return version && semver.satisfies(version, '>=2.0.0-beta', {includePrerelease: true})
|
||||
? root
|
||||
: undefined;
|
||||
return version && semver.satisfies(version, acceptableVersionRange) ? root : undefined;
|
||||
} catch {}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import fs from './fs';
|
||||
import _ from 'lodash';
|
||||
|
||||
const DEFAULT_REPLACER = '**SECURE**';
|
||||
@@ -28,8 +27,8 @@ class SecureValuesPreprocessor {
|
||||
/**
|
||||
* Parses single rule from the given JSON file
|
||||
*
|
||||
* @param {string|import('@appium/types').LogFilter} rule The rule might either be represented as a single string
|
||||
* or a configuration object
|
||||
* @param {string|import('@appium/types').LogFilter} rule The rule might
|
||||
* either be represented as a single string or a configuration object
|
||||
* @throws {Error} If there was an error while parsing the rule
|
||||
* @returns {SecureValuePreprocessingRule} The parsed rule
|
||||
*/
|
||||
@@ -90,36 +89,31 @@ class SecureValuesPreprocessor {
|
||||
/**
|
||||
* Loads rules from the given JSON file
|
||||
*
|
||||
* @param {string|string[]|import('@appium/types').LogFiltersConfig} source The full path to the JSON file containing secure
|
||||
* values replacement rules or the rules themselves represented as an array
|
||||
* @param {string|string[]|import('@appium/types').LogFiltersConfig} filters
|
||||
* One or more log parsing rules
|
||||
* @throws {Error} If the format of the source file is invalid or
|
||||
* it does not exist
|
||||
* @returns {Promise<string[]>} The list of issues found while parsing each rule.
|
||||
* An empty list is returned if no rule parsing issues were found
|
||||
*/
|
||||
async loadRules(source) {
|
||||
let rules;
|
||||
if (_.isArray(source)) {
|
||||
rules = source;
|
||||
} else {
|
||||
if (!(await fs.exists(source))) {
|
||||
throw new Error(`'${source}' does not exist or is not accessible`);
|
||||
}
|
||||
try {
|
||||
rules = JSON.parse(await fs.readFile(source, 'utf8'));
|
||||
} catch (e) {
|
||||
throw new Error(`'${source}' must be a valid JSON file. Original error: ${e.message}`);
|
||||
}
|
||||
if (!_.isArray(rules)) {
|
||||
throw new Error(`'${source}' must contain a valid JSON array`);
|
||||
async loadRules(filters) {
|
||||
/** @type {string[]} */
|
||||
const issues = [];
|
||||
/** @type {(import('@appium/types').LogFilter|string)[]} */
|
||||
const rawRules = [];
|
||||
for (const source of (_.isArray(filters) ? filters : [filters])) {
|
||||
if (_.isPlainObject(source)) {
|
||||
rawRules.push(/** @type {import('@appium/types').LogFilter} */ (source));
|
||||
} else if (_.isString(source)) {
|
||||
rawRules.push(source);
|
||||
} else {
|
||||
issues.push(`'${source}' must be a valid log filtering rule`);
|
||||
}
|
||||
}
|
||||
|
||||
const issues = [];
|
||||
this._rules = [];
|
||||
for (const rule of rules) {
|
||||
for (const rawRule of rawRules) {
|
||||
try {
|
||||
this._rules.push(this.parseRule(rule));
|
||||
this._rules.push(this.parseRule(rawRule));
|
||||
} catch (e) {
|
||||
issues.push(e.message);
|
||||
}
|
||||
|
||||
@@ -272,7 +272,10 @@ export class NPM {
|
||||
async getPackageInfo(pkg, entries = []) {
|
||||
return (await this.exec('info', [pkg, ...entries], {
|
||||
cwd: process.cwd(),
|
||||
json: true
|
||||
json: true,
|
||||
}, {
|
||||
// https://discuss.appium.io/t/appium-driver-install-fails-while-checking-drivers-compatibility/42209
|
||||
shell: system.isWindows(),
|
||||
})).json;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/support",
|
||||
"version": "4.2.0",
|
||||
"version": "4.2.4",
|
||||
"description": "Support libs used across appium packages",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -41,8 +41,8 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/tsconfig": "^0.x",
|
||||
"@appium/types": "^0.16.0",
|
||||
"@appium/tsconfig": "^0.3.3",
|
||||
"@appium/types": "^0.16.2",
|
||||
"@colors/colors": "1.6.0",
|
||||
"@types/archiver": "6.0.2",
|
||||
"@types/base64-stream": "1.0.5",
|
||||
@@ -54,21 +54,21 @@
|
||||
"@types/ncp": "2.0.8",
|
||||
"@types/npmlog": "7.0.0",
|
||||
"@types/pluralize": "0.0.33",
|
||||
"@types/semver": "7.5.6",
|
||||
"@types/semver": "7.5.8",
|
||||
"@types/shell-quote": "1.7.5",
|
||||
"@types/supports-color": "8.1.3",
|
||||
"@types/teen_process": "2.0.4",
|
||||
"@types/uuid": "9.0.7",
|
||||
"@types/uuid": "9.0.8",
|
||||
"@types/which": "3.0.3",
|
||||
"archiver": "6.0.1",
|
||||
"axios": "1.6.3",
|
||||
"archiver": "7.0.1",
|
||||
"axios": "1.6.8",
|
||||
"base64-stream": "1.0.0",
|
||||
"bluebird": "3.7.2",
|
||||
"bplist-creator": "0.1.1",
|
||||
"bplist-parser": "0.3.2",
|
||||
"form-data": "4.0.0",
|
||||
"get-stream": "6.0.1",
|
||||
"glob": "10.3.10",
|
||||
"glob": "10.3.12",
|
||||
"jsftp": "2.1.3",
|
||||
"klaw": "4.1.0",
|
||||
"lockfile": "1.0.4",
|
||||
@@ -85,18 +85,18 @@
|
||||
"read-pkg": "5.2.0",
|
||||
"resolve-from": "5.0.0",
|
||||
"sanitize-filename": "1.6.3",
|
||||
"semver": "7.5.4",
|
||||
"semver": "7.6.0",
|
||||
"shell-quote": "1.8.1",
|
||||
"source-map-support": "0.5.21",
|
||||
"supports-color": "8.1.1",
|
||||
"teen_process": "2.1.1",
|
||||
"type-fest": "4.9.0",
|
||||
"type-fest": "4.10.1",
|
||||
"uuid": "9.0.1",
|
||||
"which": "4.0.0",
|
||||
"yauzl": "2.10.0"
|
||||
"yauzl": "3.1.2"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"sharp": "0.33.1"
|
||||
"sharp": "0.33.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
|
||||
@@ -1,10 +1,5 @@
|
||||
import {fs} from '../../lib/index';
|
||||
import os from 'os';
|
||||
import path from 'path';
|
||||
import {SecureValuesPreprocessor} from '../../lib/log-internal';
|
||||
|
||||
const CONFIG_PATH = path.resolve(os.tmpdir(), 'rules.json');
|
||||
|
||||
describe('Log Internals', function () {
|
||||
/** @type {import('../../lib/log-internal').SecureValuesPreprocessor} */
|
||||
let preprocessor;
|
||||
@@ -79,13 +74,4 @@ describe('Log Internals', function () {
|
||||
preprocessor.rules.length.should.eql(0);
|
||||
preprocessor.preprocess(':yolo" yo Yolo yyolo').should.eql(':yolo" yo Yolo yyolo');
|
||||
});
|
||||
|
||||
it('should fail if rules cannot be accessed', async function () {
|
||||
await preprocessor.loadRules('bla').should.eventually.be.rejected;
|
||||
});
|
||||
|
||||
it('should fail if rules JSON cannot be parsed', async function () {
|
||||
await fs.writeFile(CONFIG_PATH, 'blabla', 'utf8');
|
||||
await preprocessor.loadRules(CONFIG_PATH).should.eventually.be.rejected;
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,6 +3,38 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [3.0.34](https://github.com/appium/appium/compare/@appium/test-support@3.0.33...@appium/test-support@3.0.34) (2024-04-16)
|
||||
|
||||
**Note:** Version bump only for package @appium/test-support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.33](https://github.com/appium/appium/compare/@appium/test-support@3.0.32...@appium/test-support@3.0.33) (2024-04-08)
|
||||
|
||||
**Note:** Version bump only for package @appium/test-support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.32](https://github.com/appium/appium/compare/@appium/test-support@3.0.31...@appium/test-support@3.0.32) (2024-02-13)
|
||||
|
||||
**Note:** Version bump only for package @appium/test-support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.31](https://github.com/appium/appium/compare/@appium/test-support@3.0.30...@appium/test-support@3.0.31) (2024-02-06)
|
||||
|
||||
**Note:** Version bump only for package @appium/test-support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.30](https://github.com/appium/appium/compare/@appium/test-support@3.0.29...@appium/test-support@3.0.30) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @appium/test-support
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/test-support",
|
||||
"version": "3.0.30",
|
||||
"version": "3.0.34",
|
||||
"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": "^4.2.0",
|
||||
"@appium/support": "^4.2.4",
|
||||
"@colors/colors": "1.6.0",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
|
||||
@@ -3,6 +3,16 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [0.3.3](https://github.com/appium/appium/compare/@appium/tsconfig@0.3.2...@appium/tsconfig@0.3.3) (2024-04-08)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **tsconfig:** update dependency @tsconfig/node14 to v14.1.1 ([de057fa](https://github.com/appium/appium/commit/de057fa8b043a26f4854c930df5a560d89808ca6))
|
||||
* **tsconfig:** update dependency @tsconfig/node14 to v14.1.2 ([66626d2](https://github.com/appium/appium/commit/66626d26e52b6241b5618dc1052c86d48230d15e))
|
||||
|
||||
|
||||
|
||||
## [0.3.2](https://github.com/appium/appium/compare/@appium/tsconfig@0.3.1...@appium/tsconfig@0.3.2) (2023-10-18)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/tsconfig",
|
||||
"version": "0.3.2",
|
||||
"version": "0.3.3",
|
||||
"description": "Shared TypeScript Config for Appium",
|
||||
"main": "tsconfig.json",
|
||||
"keywords": [
|
||||
@@ -27,7 +27,7 @@
|
||||
"npm": ">=8"
|
||||
},
|
||||
"dependencies": {
|
||||
"@tsconfig/node14": "14.1.0"
|
||||
"@tsconfig/node14": "14.1.2"
|
||||
},
|
||||
"scripts": {
|
||||
"test:smoke": "node tsconfig.json && node tsconfig.plugin.json"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user