mirror of
https://github.com/appium/appium.git
synced 2026-11-06 09:36:50 +08:00
Compare commits
249
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
717ec38d8c | ||
|
|
d73cfa75d4 | ||
|
|
aa5ae9a8ca | ||
|
|
0419de743b | ||
|
|
009aa60364 | ||
|
|
b53c0b9674 | ||
|
|
84d96dbae4 | ||
|
|
261cfc8694 | ||
|
|
9b14205288 | ||
|
|
7124eb6075 | ||
|
|
5ae8df3c36 | ||
|
|
c2f543fc10 | ||
|
|
06797350a9 | ||
|
|
7e888d45aa | ||
|
|
b83bd04265 | ||
|
|
1ae85d6e14 | ||
|
|
fbb6fd9a27 | ||
|
|
ed6c7bd2c0 | ||
|
|
699c49306c | ||
|
|
d44a136e55 | ||
|
|
8e453bed3f | ||
|
|
a215a89f68 | ||
|
|
b59acac0e8 | ||
|
|
98ffc60cd1 | ||
|
|
b82f13b893 | ||
|
|
398c9779eb | ||
|
|
2b28b54ab9 | ||
|
|
67198eae83 | ||
|
|
e70dc4dfb6 | ||
|
|
98403151f8 | ||
|
|
1e99f81416 | ||
|
|
dd9348af17 | ||
|
|
196117bab6 | ||
|
|
3b5ae2ab17 | ||
|
|
1f79433059 | ||
|
|
ee1df47b17 | ||
|
|
c7c860bb07 | ||
|
|
db98024203 | ||
|
|
3205b5d06f | ||
|
|
63a0b05e1b | ||
|
|
08af8913fd | ||
|
|
332bb59ee3 | ||
|
|
fa571925b7 | ||
|
|
77307f2722 | ||
|
|
1fbd503a66 | ||
|
|
128b0ae867 | ||
|
|
3d0b97cae7 | ||
|
|
aad2957624 | ||
|
|
bd6e3ac0b0 | ||
|
|
de39013ae5 | ||
|
|
408885a5b2 | ||
|
|
aaa7668ae6 | ||
|
|
a306ce741a | ||
|
|
475198e36b | ||
|
|
821b4c4ef4 | ||
|
|
e6da6b8dbc | ||
|
|
ef3165f572 | ||
|
|
a3fbbda5fb | ||
|
|
33156712b1 | ||
|
|
0d8ea1bbbb | ||
|
|
1a12f54fd8 | ||
|
|
98f21f1ebc | ||
|
|
932da4544e | ||
|
|
caf600bffd | ||
|
|
d884f086b3 | ||
|
|
ca3e5d90e4 | ||
|
|
6afaa0f9bc | ||
|
|
6e21ea79d4 | ||
|
|
96b0a44629 | ||
|
|
eebc651f31 | ||
|
|
4a9aedd32d | ||
|
|
f52a23c686 | ||
|
|
d2a9a99418 | ||
|
|
2b59c135d7 | ||
|
|
73746879ef | ||
|
|
0220a9f8e9 | ||
|
|
f697cda9af | ||
|
|
ea731bf117 | ||
|
|
20a10b3297 | ||
|
|
8c7225d4e9 | ||
|
|
fa332502c5 | ||
|
|
126daeca4e | ||
|
|
e2a670e1c4 | ||
|
|
51c3ebeaba | ||
|
|
1a34396339 | ||
|
|
11926d4d39 | ||
|
|
2837bcdeb1 | ||
|
|
c013d78572 | ||
|
|
45a9c52ece | ||
|
|
64ff478786 | ||
|
|
a7a4a29100 | ||
|
|
5d172a58bd | ||
|
|
009bbee47a | ||
|
|
a32dc11101 | ||
|
|
f3614adbde | ||
|
|
49c2f31885 | ||
|
|
1c808e9261 | ||
|
|
6d894bef6f | ||
|
|
7a06ec5041 | ||
|
|
2d7eed7d81 | ||
|
|
5e095893ee | ||
|
|
7445db2279 | ||
|
|
c28fcefa72 | ||
|
|
d336b51578 | ||
|
|
c6af787011 | ||
|
|
3df047d128 | ||
|
|
805f69de35 | ||
|
|
c0b6a5afe3 | ||
|
|
3b44c7d8f5 | ||
|
|
2281e11028 | ||
|
|
5770cc0d3e | ||
|
|
5ad76bdb2b | ||
|
|
7cdb1429a1 | ||
|
|
15a128d4dd | ||
|
|
52fb78411b | ||
|
|
05faca8045 | ||
|
|
a662b7d90e | ||
|
|
26a6c62512 | ||
|
|
03b2aa6b6e | ||
|
|
595d460ac8 | ||
|
|
34603c8852 | ||
|
|
57daa4114a | ||
|
|
2d3c1d797d | ||
|
|
78f33aee09 | ||
|
|
34d978e850 | ||
|
|
8c9cce09c8 | ||
|
|
331171dd8c | ||
|
|
19954c4b13 | ||
|
|
bc72c6676a | ||
|
|
cef37d3ee3 | ||
|
|
d3c7bfeb3a | ||
|
|
91e34d7153 | ||
|
|
1d8d2b0e1a | ||
|
|
23cba266f2 | ||
|
|
3f807e5585 | ||
|
|
5862a73fe5 | ||
|
|
8e5704625d | ||
|
|
1b0459edd6 | ||
|
|
b6a76ce91e | ||
|
|
48be0f83b0 | ||
|
|
de02ed87fc | ||
|
|
8dcdab323a | ||
|
|
49b3434c2b | ||
|
|
2ef40febdc | ||
|
|
396f671f99 | ||
|
|
c63a37b905 | ||
|
|
3e7360021d | ||
|
|
c81e99fd80 | ||
|
|
4b09c323d9 | ||
|
|
d2f19aab93 | ||
|
|
73aa01786d | ||
|
|
809b2daea5 | ||
|
|
ff404a09b7 | ||
|
|
5b063e4488 | ||
|
|
3fc87ac669 | ||
|
|
ffeebc74b7 | ||
|
|
a0c4b84fb7 | ||
|
|
7625218c22 | ||
|
|
8de343d37d | ||
|
|
49f16a0949 | ||
|
|
31408cc70a | ||
|
|
ee4dea6928 | ||
|
|
862225c1d8 | ||
|
|
5926919177 | ||
|
|
c87596bb64 | ||
|
|
84fefd214c | ||
|
|
5ec3199259 | ||
|
|
fea8f8537d | ||
|
|
4916bde811 | ||
|
|
2714ed0b69 | ||
|
|
263bb43086 | ||
|
|
d1a4932409 | ||
|
|
2d3c5cd0b7 | ||
|
|
a303378231 | ||
|
|
8d9ab88939 | ||
|
|
207700bc82 | ||
|
|
4950772846 | ||
|
|
d311efebfb | ||
|
|
3882ca9e92 | ||
|
|
e51d260395 | ||
|
|
3ec80856e7 | ||
|
|
65b3787912 | ||
|
|
7722767d80 | ||
|
|
6f51456da9 | ||
|
|
14631177cd | ||
|
|
faca49690a | ||
|
|
81b077fdc9 | ||
|
|
5a922ea716 | ||
|
|
c5d6df7a00 | ||
|
|
545576a740 | ||
|
|
1377c0290f | ||
|
|
737e5e9c38 | ||
|
|
a0f59d0594 | ||
|
|
1a3d408e23 | ||
|
|
8819d3ef92 | ||
|
|
9f700bfdf9 | ||
|
|
bc1b56a3c1 | ||
|
|
de68a1f388 | ||
|
|
66fb651a18 | ||
|
|
08913cddde | ||
|
|
b0b68334c5 | ||
|
|
427bc8eb0c | ||
|
|
7cc0c47679 | ||
|
|
fe7ed5d91f | ||
|
|
6c7f3ef670 | ||
|
|
b510fad303 | ||
|
|
89595c3915 | ||
|
|
827ec98a8a | ||
|
|
641da6ddd5 | ||
|
|
d85b2161b5 | ||
|
|
f8039a70ca | ||
|
|
ae59d0b218 | ||
|
|
8599c2a0b3 | ||
|
|
72a806bec7 | ||
|
|
a3245dcf2b | ||
|
|
73b092ba11 | ||
|
|
f1d1b7d6a0 | ||
|
|
d21b9e6a90 | ||
|
|
0830fd8257 | ||
|
|
a01a91d737 | ||
|
|
210b468a92 | ||
|
|
315a5e6cc7 | ||
|
|
4851721295 | ||
|
|
abcf0d451f | ||
|
|
5aae2190bf | ||
|
|
eabcbfbff7 | ||
|
|
524447ee05 | ||
|
|
b2560b5c1d | ||
|
|
b608db91a8 | ||
|
|
b900c60dac | ||
|
|
7e47adf59d | ||
|
|
4e4eaad6b6 | ||
|
|
bc8cd52693 | ||
|
|
820428b769 | ||
|
|
034a51b686 | ||
|
|
f2cff24685 | ||
|
|
53bfc68eee | ||
|
|
dce45bdf83 | ||
|
|
e73e47de18 | ||
|
|
a080b72920 | ||
|
|
c8e9059711 | ||
|
|
d5f3a288c2 | ||
|
|
998e2586a7 | ||
|
|
78a22b2a1c | ||
|
|
a5876c8f26 | ||
|
|
4ef0c49b24 | ||
|
|
c18b43f2bd | ||
|
|
2f69e6db2a | ||
|
|
ed8e83c76c |
@@ -1,6 +1,8 @@
|
||||
name: Appium Build
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
# this list of paths could potentially impact the build
|
||||
paths:
|
||||
- '**/tsconfig*.json'
|
||||
@@ -20,6 +22,8 @@ on:
|
||||
- '!**/sample-code/**'
|
||||
- '!packages/*/docs/**'
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- '**/tsconfig*.json'
|
||||
- 'packages/base-driver/static/**/*'
|
||||
@@ -66,22 +70,12 @@ jobs:
|
||||
# - macos-latest
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3
|
||||
uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
- name: Install latest npm (win)
|
||||
if: ${{ matrix.os == 'windows-latest' }}
|
||||
# for some reason there's a bug in upgrading npm on win, have to install a specific version first
|
||||
# https://github.com/actions/setup-node/issues/623
|
||||
run: |
|
||||
npm install -g npm@8.3.1
|
||||
npm install -g npm@latest
|
||||
- name: Install latest npm (non-win)
|
||||
if: ${{ matrix.os != 'windows-latest' }}
|
||||
run: npm install -g npm
|
||||
- name: Install dependencies
|
||||
uses: bahmutov/npm-install@1a235c31658a322a3b024444759650ee6345c26d # tag=v1
|
||||
with:
|
||||
@@ -94,7 +88,7 @@ jobs:
|
||||
name: Lint
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
|
||||
- name: Install dependencies
|
||||
uses: bahmutov/npm-install@1a235c31658a322a3b024444759650ee6345c26d # tag=v1
|
||||
with:
|
||||
|
||||
@@ -12,7 +12,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
|
||||
|
||||
- name: Cleanup
|
||||
run: |
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||
steps:
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3
|
||||
uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Install Appium
|
||||
|
||||
@@ -2,6 +2,8 @@ name: Build Docs
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- '**/typedoc.json'
|
||||
- '**/tsconfig*.json'
|
||||
@@ -16,6 +18,8 @@ on:
|
||||
- '!**/test/**'
|
||||
- '!**/sample-code/**'
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- '**/typedoc.json'
|
||||
- '**/tsconfig*.json'
|
||||
@@ -35,7 +39,7 @@ jobs:
|
||||
name: Docs
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
|
||||
- name: Install dependencies (Node.js)
|
||||
uses: bahmutov/npm-install@1a235c31658a322a3b024444759650ee6345c26d # tag=v1
|
||||
with:
|
||||
|
||||
@@ -11,7 +11,7 @@ jobs:
|
||||
name: Run FOSSA Analysis
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
|
||||
with:
|
||||
ref: master
|
||||
- name: Install dependencies
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
|
||||
- run: |
|
||||
git config user.name github-actions
|
||||
git config user.email github-actions@github.com
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
name: Validate Renovate Configs
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- '.github/workflows/renovate.yml' # this file
|
||||
- '.renovaterc.json'
|
||||
- 'renovate/default.json'
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- '.github/workflows/renovate.yml' # this file
|
||||
- '.renovaterc.json'
|
||||
@@ -19,7 +23,7 @@ jobs:
|
||||
name: Check Renovate Configs
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
|
||||
- name: Validate Renovate Config
|
||||
uses: rinchsan/renovate-config-validator@1ea1e8514f6a33fdd71c40b0a5fa3512b9e7b936 # tag=v0
|
||||
with:
|
||||
|
||||
+1
-4
@@ -14,13 +14,10 @@
|
||||
"version": {
|
||||
"conventionalCommits": true,
|
||||
"createRelease": "github",
|
||||
"version": {
|
||||
"allowBranch": "master"
|
||||
}
|
||||
"allowBranch": "master"
|
||||
}
|
||||
},
|
||||
"ignoreChanges": ["**/test/**", "**/*.md"],
|
||||
"useNx": false,
|
||||
"useWorkspaces": true,
|
||||
"version": "independent"
|
||||
}
|
||||
|
||||
Generated
+10307
-8840
File diff suppressed because it is too large
Load Diff
+36
-36
@@ -85,68 +85,68 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@colors/colors": "1.6.0",
|
||||
"@commitlint/cli": "17.6.7",
|
||||
"@commitlint/config-conventional": "17.6.7",
|
||||
"@tsconfig/node14": "1.0.3",
|
||||
"@types/chai": "4.3.5",
|
||||
"@types/chai-as-promised": "7.1.5",
|
||||
"@types/diff": "5.0.3",
|
||||
"@types/mocha": "10.0.1",
|
||||
"@types/node": "18.16.20",
|
||||
"@types/semver": "7.5.0",
|
||||
"@types/sinon": "10.0.16",
|
||||
"@types/sinon-chai": "3.2.9",
|
||||
"@types/source-map-support": "0.5.6",
|
||||
"@types/teen_process": "2.0.0",
|
||||
"@types/ws": "8.5.5",
|
||||
"@types/yargs": "17.0.24",
|
||||
"@typescript-eslint/eslint-plugin": "5.62.0",
|
||||
"@typescript-eslint/parser": "5.62.0",
|
||||
"asyncbox": "2.9.4",
|
||||
"chai": "4.3.7",
|
||||
"@commitlint/cli": "18.4.0",
|
||||
"@commitlint/config-conventional": "18.4.0",
|
||||
"@tsconfig/node14": "14.1.0",
|
||||
"@types/chai": "4.3.10",
|
||||
"@types/chai-as-promised": "7.1.8",
|
||||
"@types/diff": "5.0.8",
|
||||
"@types/mocha": "10.0.4",
|
||||
"@types/node": "20.9.0",
|
||||
"@types/semver": "7.5.5",
|
||||
"@types/sinon": "10.0.20",
|
||||
"@types/sinon-chai": "3.2.12",
|
||||
"@types/source-map-support": "0.5.10",
|
||||
"@types/teen_process": "2.0.3",
|
||||
"@types/ws": "8.5.9",
|
||||
"@types/yargs": "17.0.31",
|
||||
"@typescript-eslint/eslint-plugin": "6.9.1",
|
||||
"@typescript-eslint/parser": "6.9.1",
|
||||
"asyncbox": "3.0.0",
|
||||
"chai": "4.3.10",
|
||||
"chai-as-promised": "7.1.1",
|
||||
"chai-webdriverio-async": "2.7.0",
|
||||
"conventional-changelog-conventionalcommits": "5.0.0",
|
||||
"cpy-cli": "4.2.0",
|
||||
"eslint": "8.46.0",
|
||||
"eslint-config-prettier": "8.10.0",
|
||||
"conventional-changelog-conventionalcommits": "7.0.2",
|
||||
"cpy-cli": "5.0.0",
|
||||
"eslint": "8.53.0",
|
||||
"eslint-config-prettier": "9.0.0",
|
||||
"eslint-find-rules": "4.1.0",
|
||||
"eslint-import-resolver-typescript": "3.5.5",
|
||||
"eslint-plugin-import": "2.28.0",
|
||||
"eslint-plugin-mocha": "10.1.0",
|
||||
"eslint-import-resolver-typescript": "3.6.1",
|
||||
"eslint-plugin-import": "2.29.0",
|
||||
"eslint-plugin-mocha": "10.2.0",
|
||||
"eslint-plugin-promise": "6.1.1",
|
||||
"fancy-log": "2.0.0",
|
||||
"finalhandler": "1.2.0",
|
||||
"get-port": "5.1.1",
|
||||
"handlebars": "4.7.8",
|
||||
"husky": "8.0.3",
|
||||
"json-schema-to-typescript": "13.0.2",
|
||||
"lerna": "6.6.2",
|
||||
"lint-staged": "13.2.3",
|
||||
"json-schema-to-typescript": "13.1.1",
|
||||
"lerna": "7.4.2",
|
||||
"lint-staged": "15.0.2",
|
||||
"log-symbols": "4.1.0",
|
||||
"midnight-smoker": "2.0.4",
|
||||
"midnight-smoker": "7.0.4",
|
||||
"mjpeg-consumer": "2.0.0",
|
||||
"mjpeg-server": "0.3.1",
|
||||
"mocha": "10.2.0",
|
||||
"mocha-chai-jest-snapshot": "1.1.4",
|
||||
"npm-run-all": "4.1.5",
|
||||
"prettier": "2.8.8",
|
||||
"prettier": "3.0.3",
|
||||
"rewiremock": "3.14.5",
|
||||
"rimraf": "5.0.1",
|
||||
"rimraf": "5.0.5",
|
||||
"serve-static": "1.15.0",
|
||||
"sinon": "15.2.0",
|
||||
"sinon": "16.1.3",
|
||||
"sinon-chai": "3.7.0",
|
||||
"sync-monorepo-packages": "1.0.2",
|
||||
"through2": "4.0.2",
|
||||
"ts-node": "10.9.1",
|
||||
"tsd": "0.28.1",
|
||||
"tsd": "0.29.0",
|
||||
"typedoc": "0.23.28",
|
||||
"typedoc-plugin-markdown": "3.14.0",
|
||||
"typedoc-plugin-resolve-crossmodule-references": "0.3.3",
|
||||
"typescript": "5.0.4",
|
||||
"validate.js": "0.13.1",
|
||||
"webdriverio": "7.32.3",
|
||||
"ws": "8.13.0",
|
||||
"webdriverio": "8.21.0",
|
||||
"ws": "8.14.2",
|
||||
"yaml-js": "0.3.1"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -3,6 +3,108 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [2.2.2](https://github.com/appium/appium/compare/appium@2.2.1...appium@2.2.2) (2023-11-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Load plugins in the same order that was used for the CLI command ([#19388](https://github.com/appium/appium/issues/19388)) ([7124eb6](https://github.com/appium/appium/commit/7124eb6075be0fabd83e9023a47b5a8f4c181a52))
|
||||
* **docutils:** update dependency yaml to v2.3.4 ([a215a89](https://github.com/appium/appium/commit/a215a89f684c50da24d669d60a73fb6268b05c7f))
|
||||
* **support:** update definitelytyped ([5ae8df3](https://github.com/appium/appium/commit/5ae8df3c36c7f03fbf3420087b532086f6742348))
|
||||
* **support:** update dependency axios to v1.6.0 ([699c493](https://github.com/appium/appium/commit/699c49306c38e222d618a9611482b06a3e6806aa))
|
||||
* **support:** update dependency axios to v1.6.1 ([9b14205](https://github.com/appium/appium/commit/9b14205288ef09fd4a1144fc93c82b2bb2ed2ec0))
|
||||
* **support:** update dependency teen_process to v2.0.57 ([1fbd503](https://github.com/appium/appium/commit/1fbd503a66b965a9b32bbb6702062861a8480333))
|
||||
* **support:** update dependency teen_process to v2.0.63 ([fa57192](https://github.com/appium/appium/commit/fa571925b7ac980cc99c8d23f659420eacd8546c))
|
||||
* **support:** update dependency teen_process to v2.0.64 ([332bb59](https://github.com/appium/appium/commit/332bb59ee3fdd14c03f6b3c4fd6587a30319d568))
|
||||
* **support:** update dependency teen_process to v2.0.66 ([3205b5d](https://github.com/appium/appium/commit/3205b5d06f073f1e5c7735c6e36ad08fdf091182))
|
||||
* **support:** update dependency teen_process to v2.0.67 ([3b5ae2a](https://github.com/appium/appium/commit/3b5ae2ab17c74c9890b53c081aec146152f11c7a))
|
||||
* **support:** update dependency teen_process to v2.0.73 ([8e453be](https://github.com/appium/appium/commit/8e453bed3f440c1dcf82f016f7d4431365b9cdff))
|
||||
* **support:** update dependency teen_process to v2.0.75 ([fbb6fd9](https://github.com/appium/appium/commit/fbb6fd9a2780eb00c15584abeaf644a1fcdecb4d))
|
||||
* **support:** update teen_process-related packages ([84d96db](https://github.com/appium/appium/commit/84d96dbae45dfe56218d32330f8ff2d26b750fb7))
|
||||
* **support:** update teen_process-related packages ([3d0b97c](https://github.com/appium/appium/commit/3d0b97cae76c616da0aea5b92cebcd38d59263b7))
|
||||
|
||||
|
||||
|
||||
## [2.2.1](https://github.com/appium/appium/compare/appium@2.2.0...appium@2.2.1) (2023-10-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Make sure type definitions are always in sync across modules ([#19323](https://github.com/appium/appium/issues/19323)) ([de39013](https://github.com/appium/appium/commit/de39013ae501d4fc11988435737efb862cc1d820))
|
||||
* **support:** update definitelytyped ([a306ce7](https://github.com/appium/appium/commit/a306ce741a806d21bc44f3b979803b8af5da99aa))
|
||||
|
||||
|
||||
|
||||
## [2.2.0](https://github.com/appium/appium/compare/appium@2.1.3...appium@2.2.0) (2023-10-18)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **base-driver:** Add server support of TLS and SPDY protocols ([#19105](https://github.com/appium/appium/issues/19105)) ([5926919](https://github.com/appium/appium/commit/5926919177e3df675723c80d800f933fdbda5824))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Fix creation of logging prefixes ([#19212](https://github.com/appium/appium/issues/19212)) ([805f69d](https://github.com/appium/appium/commit/805f69de354ebf0b1e8ffeb64c85833b5d533b4c))
|
||||
* **appium:** update dependency winston to v3.11.0 ([f697cda](https://github.com/appium/appium/commit/f697cda9af2b61344b55b5af0f2bfc1fd034334b))
|
||||
* **docutils:** update dependency yaml to v2.3.2 ([1a3d408](https://github.com/appium/appium/commit/1a3d408e239e4a9a7070923a90aca70df1dda908))
|
||||
* **docutils:** update dependency yaml to v2.3.3 ([caf600b](https://github.com/appium/appium/commit/caf600bffd5f25971d0270e9990b2640a671e366))
|
||||
* **images-plugin:** update dependency lru-cache to v10 ([#19050](https://github.com/appium/appium/issues/19050)) ([72a806b](https://github.com/appium/appium/commit/72a806bec7c3a80747192d24dfd9d8286a751810))
|
||||
* **opencv:** update definitelytyped ([d2a9a99](https://github.com/appium/appium/commit/d2a9a99418af9ce9b569bb9b98ee396faab932bb))
|
||||
* **support:** update definitelytyped ([3b44c7d](https://github.com/appium/appium/commit/3b44c7d8f5b89f9357dfe6bb56b54799bbe0a921))
|
||||
* **support:** update definitelytyped ([595d460](https://github.com/appium/appium/commit/595d460ac8dc41d310f9e4f653acbad3c7fd50b9))
|
||||
* **support:** update definitelytyped ([b6a76ce](https://github.com/appium/appium/commit/b6a76ce91e2765c22f84e389b93f780e0b4490c0))
|
||||
* **support:** update definitelytyped ([3e73600](https://github.com/appium/appium/commit/3e7360021dba0f8e8967094476fe92646ba5e35b))
|
||||
* **support:** update dependency @types/semver to v7.5.1 ([a0f59d0](https://github.com/appium/appium/commit/a0f59d05945e627602407d1d42e7a3a58861b11f))
|
||||
* **support:** update dependency @types/teen_process to v2.0.1 ([d2f19aa](https://github.com/appium/appium/commit/d2f19aab935cc6ec00a51f042b5f02674a772198))
|
||||
* **support:** update dependency axios to v1.5.0 ([08913cd](https://github.com/appium/appium/commit/08913cddde295f616f0fb376cc2cb71a9409a253))
|
||||
* **support:** update dependency axios to v1.5.1 ([#19217](https://github.com/appium/appium/issues/19217)) ([3df047d](https://github.com/appium/appium/commit/3df047d128d5d032826c8f5fb605b019078b717d))
|
||||
* **support:** update dependency teen_process to v2.0.10 ([bc1b56a](https://github.com/appium/appium/commit/bc1b56a3c162ed8686d3d7956c30eb1f7682b1a7))
|
||||
* **support:** update dependency teen_process to v2.0.12 ([c5d6df7](https://github.com/appium/appium/commit/c5d6df7a000d64e8591a56ce5ef65baa2071a36b))
|
||||
* **support:** update dependency teen_process to v2.0.13 ([a0c4b84](https://github.com/appium/appium/commit/a0c4b84fb7d3977b7a4ca0a07fadd49ee355791a))
|
||||
* **support:** update dependency teen_process to v2.0.18 ([ffeebc7](https://github.com/appium/appium/commit/ffeebc74b72e5eadf658325e67708ae6ed5b8346))
|
||||
* **support:** update dependency teen_process to v2.0.19 ([2ef40fe](https://github.com/appium/appium/commit/2ef40febdc717f54ea618ecfe1058b858fe2daf9))
|
||||
* **support:** update dependency teen_process to v2.0.23 ([1b0459e](https://github.com/appium/appium/commit/1b0459edd656514d8706aab8e21cd4d40de2ec5d))
|
||||
* **support:** update dependency teen_process to v2.0.24 ([bc72c66](https://github.com/appium/appium/commit/bc72c6676a5412b60e74bb143a223738ce059977))
|
||||
* **support:** update dependency teen_process to v2.0.27 ([03b2aa6](https://github.com/appium/appium/commit/03b2aa6b6e45fa0ea24c4691b039255bc4399733))
|
||||
* **support:** update dependency teen_process to v2.0.30 ([7cdb142](https://github.com/appium/appium/commit/7cdb1429a1104ad3699547f2a2dd9b237135891a))
|
||||
* **support:** update dependency teen_process to v2.0.34 ([#19218](https://github.com/appium/appium/issues/19218)) ([c28fcef](https://github.com/appium/appium/commit/c28fcefa725fbce5a0464e57946051e3cb023d85))
|
||||
* **support:** update dependency teen_process to v2.0.37 ([6d894be](https://github.com/appium/appium/commit/6d894bef6f377ebfdffdeb1adde7a72624844414))
|
||||
* **support:** update dependency teen_process to v2.0.38 ([a32dc11](https://github.com/appium/appium/commit/a32dc1110125d0f1fac9c66c17f1309145a634c7))
|
||||
* **support:** update dependency teen_process to v2.0.40 ([2837bcd](https://github.com/appium/appium/commit/2837bcdeb19532fe973a2902db5c8d730252d962))
|
||||
* **support:** update dependency teen_process to v2.0.41 ([1a34396](https://github.com/appium/appium/commit/1a34396339f71d40353d323feaf78afcf2269fc9))
|
||||
* **support:** update dependency teen_process to v2.0.42 ([e2a670e](https://github.com/appium/appium/commit/e2a670e1c4a0f061b0bfb08a6b534d9deb7bdd9c))
|
||||
* **support:** update dependency teen_process to v2.0.45 ([ea731bf](https://github.com/appium/appium/commit/ea731bf117d680496fce453ac42cfee7f05ada60))
|
||||
* **support:** update dependency teen_process to v2.0.48 ([eebc651](https://github.com/appium/appium/commit/eebc651f31c282baa7e77a6384d3ee8efc0072d6))
|
||||
* **support:** update dependency teen_process to v2.0.50 ([ca3e5d9](https://github.com/appium/appium/commit/ca3e5d90e4c51fc1dda32154e1d77e65cb44fb54))
|
||||
* **support:** update dependency teen_process to v2.0.9 ([6c7f3ef](https://github.com/appium/appium/commit/6c7f3ef670d441bdc4b693948a19dcbdc54e4764))
|
||||
|
||||
|
||||
|
||||
## [2.1.3](https://github.com/appium/appium/compare/appium@2.1.2...appium@2.1.3) (2023-08-23)
|
||||
|
||||
**Note:** Version bump only for package appium
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.1.2](https://github.com/appium/appium/compare/appium@2.1.1...appium@2.1.2) (2023-08-22)
|
||||
|
||||
**Note:** Version bump only for package appium
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.1.1](https://github.com/appium/appium/compare/appium@2.1.0...appium@2.1.1) (2023-08-21)
|
||||
|
||||
**Note:** Version bump only for package appium
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.1.0](https://github.com/appium/appium/compare/appium@2.0.1...appium@2.1.0) (2023-08-17)
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
---
|
||||
title: Starting the Server with SSL/TLS/SPDY support
|
||||
---
|
||||
|
||||
## Command Line Arguments
|
||||
|
||||
Since version 2.2 of the server there is a possibility to start it with SSL/TLS support. In order to enable secure connections to the server you need to provide the following command line arguments:
|
||||
|
||||
```bashs
|
||||
appium server --ssl-cert-path=/path/to/cert.pem --ssl-key-path=/path/to/key.pem
|
||||
```
|
||||
|
||||
Both arguments must be provided and should contain paths to a valid [X509 PEM](https://www.ssl.com/guide/pem-der-crt-and-cer-x-509-encodings-and-conversions/) certificate and its corresponding private key.
|
||||
|
||||
After the server is started use the `https` protocol and a client supporting SSL/TLS or [SPDY](https://en.wikipedia.org/wiki/SPDY) to communicate to it.
|
||||
|
||||
### Supported Features
|
||||
|
||||
Once a secure server socket is established it supports the following protocols: `['h2', 'spdy/3.1', 'spdy/3', 'spdy/2', 'http/1.1', 'http/1.0']`. See [the SPDY node module documentation](https://www.npmjs.com/package/spdy) to get more details about its features. All insecure client connections will be rejected by the server.
|
||||
|
||||
### Self-Signed Certificates
|
||||
|
||||
Use the following command in order to generate a self-signed certificate/key pair:
|
||||
|
||||
```bash
|
||||
openssl req -nodes -new -x509 -keyout key.pem -out cert.pem -subj "/C=US/ST=State/L=City/O=company/OU=Com/CN=www.testserver.local"
|
||||
```
|
||||
|
||||
Feel free to change the value of `-subj` in the command above with your matching details. The server should work just fine with a self-signed certificate, although you need to take care about a proper client setup, e.g. make sure it does not reject unauthorized certificates.
|
||||
@@ -0,0 +1,102 @@
|
||||
---
|
||||
title: Write a Test (dotnet)
|
||||
---
|
||||
|
||||
The [Appium dotnet Client](https://github.com/appium/dotnet-client/) is
|
||||
an official Appium client in C#. This driver is an extension of the Selenium C# client. It has all the functionalities of the regular driver, but add Appium-specific methods on top of this. The driver is available on the public NuGet Gallery as [Appium.WebDriver](https://www.nuget.org/packages/Appium.WebDriver/).
|
||||
|
||||
Now, we get inside the directory and create a new [NUnit](https://nunit.org/) project. We will also add the references to the Appium.Net driver, and other dependencies.
|
||||
|
||||
```bash
|
||||
cd dotnet-client
|
||||
dotnet new nunit --name appiumtest
|
||||
|
||||
cd appiumtest
|
||||
|
||||
# This will install the latest 5.x version
|
||||
dotnet add package Appium.WebDriver --prerelease
|
||||
dotnet add package Newtonsoft.Json --version 13.0.3
|
||||
```
|
||||
|
||||
Once this is done, your project should have a placeholder file `UnitTest1.cs`. We will replace the code to include the OpenQA namespaces, an initialization of the driver, and the actual test.
|
||||
|
||||
```C# title="UnitTest1.cs"
|
||||
using OpenQA.Selenium;
|
||||
using OpenQA.Selenium.Appium;
|
||||
using OpenQA.Selenium.Appium.Android;
|
||||
using OpenQA.Selenium.Appium.Enums;
|
||||
|
||||
namespace appiumtest;
|
||||
|
||||
public class Tests
|
||||
{
|
||||
private AndroidDriver _driver;
|
||||
|
||||
[OneTimeSetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
var serverUri = new Uri(Environment.GetEnvironmentVariable("APPIUM_HOST") ?? "http://127.0.0.1:4723/");
|
||||
var driverOptions = new AppiumOptions() {
|
||||
AutomationName = AutomationName.AndroidUIAutomator2,
|
||||
PlatformName = "Android",
|
||||
DeviceName = "Android Emulator",
|
||||
};
|
||||
|
||||
driverOptions.AddAdditionalAppiumOption("appPackage", "com.android.settings");
|
||||
driverOptions.AddAdditionalAppiumOption("appActivity", ".Settings");
|
||||
// NoReset assumes the app com.google.android is preinstalled on the emulator
|
||||
driverOptions.AddAdditionalAppiumOption("noReset", true);
|
||||
|
||||
_driver = new AndroidDriver(serverUri, driverOptions, TimeSpan.FromSeconds(180));
|
||||
_driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
|
||||
}
|
||||
|
||||
[OneTimeTearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
_driver.Dispose();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestBattery()
|
||||
{
|
||||
_driver.StartActivity("com.android.settings", ".Settings");
|
||||
_driver.FindElement(By.XPath("//*[@text='Battery']")).Click();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
!!! note
|
||||
|
||||
It's not within the scope of this guide to give a complete run-down on the dotnet client
|
||||
library or everything that's happening here, so we'll leave the code itself unexplained in
|
||||
detail for now. You may want to read up particularly on Appium
|
||||
[Capabilities](../guides/caps.md) in addition to familiarizing yourself with the
|
||||
[dotnet client driver documentation](https://github.com/appium/dotnet-client/) for a fuller explanation
|
||||
of the various API commands you see and what their purpose is.
|
||||
|
||||
Basically, this code is doing the following:
|
||||
|
||||
1. Defining a set of "Capabilities" (parameters) to send to the Appium server so Appium knows what
|
||||
kind of thing you want to automate. Some of these parameters can be overriden using environment variables.
|
||||
1. Starting an Appium session on the built-in Android settings app.
|
||||
1. Finding the "Battery" list item and clicking it.
|
||||
1. Ending the Appium session.
|
||||
|
||||
That's it! Let's give it a try. Before you run the test, make sure that you have an Appium server
|
||||
running in another terminal session, otherwise you'll get an error about not being able to connect
|
||||
to one. Then, you can execute the script:
|
||||
|
||||
```bash
|
||||
dotnet test
|
||||
|
||||
# Example output:
|
||||
# Starting test execution, please wait...
|
||||
# A total of 1 test files matched the specified pattern.
|
||||
|
||||
# Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: 323 ms - appiumtest.dll (net7.0)
|
||||
```
|
||||
|
||||
If all goes well, you'll see the Settings app open up and navigate to the "Battery" view in the emulator before the app closes again.
|
||||
|
||||
Congratulations, you've started your Appium journey! Read on for some next steps to explore.
|
||||
@@ -23,7 +23,7 @@ According to the driver, in addition to a working Appium server, we also need to
|
||||
- Set an environment variable pointing to the directory on disk where the Android tools are
|
||||
installed. You can usually find the path to this directory in the Android Studio SDK manager. It
|
||||
will contain the `platform-tools` and other directories. We need to define and persist the
|
||||
environment variable as `ANDROID_HOME` (or alternatively `ANDROID_SDK_ROOT`).
|
||||
environment variable as `ANDROID_HOME`.
|
||||
- Use the Android SDK manager to download whichever Android platform we want to automate (for
|
||||
example, API level 30)
|
||||
- Install the Java JDK (for the most recent Android API levels, JDK 9 is required, otherwise JDK
|
||||
|
||||
@@ -24,6 +24,7 @@ nav:
|
||||
- quickstart/test-py.md
|
||||
- quickstart/test-java.md
|
||||
- quickstart/test-rb.md
|
||||
- quickstart/test-dotnet.md
|
||||
- quickstart/next-steps.md
|
||||
- CLI Reference:
|
||||
- cli/index.md
|
||||
|
||||
@@ -159,12 +159,13 @@ class AppiumDriver extends DriverCore {
|
||||
// https://www.w3.org/TR/webdriver/#dfn-status
|
||||
const statusObj = this._isShuttingDown
|
||||
? {
|
||||
ready: false,
|
||||
message: 'The server is shutting down',
|
||||
} : {
|
||||
ready: true,
|
||||
message: 'The server is ready to accept new connections',
|
||||
};
|
||||
ready: false,
|
||||
message: 'The server is shutting down',
|
||||
}
|
||||
: {
|
||||
ready: true,
|
||||
message: 'The server is ready to accept new connections',
|
||||
};
|
||||
return {
|
||||
...statusObj,
|
||||
build: _.clone(getBuildInfo()),
|
||||
@@ -193,18 +194,18 @@ class AppiumDriver extends DriverCore {
|
||||
this.log.info(
|
||||
driverVersion
|
||||
? `Appium v${APPIUM_VER} creating new ${driverName} (v${driverVersion}) session`
|
||||
: `Appium v${APPIUM_VER} creating new ${driverName} session`
|
||||
: `Appium v${APPIUM_VER} creating new ${driverName} session`,
|
||||
);
|
||||
this.log.info(`Checking BaseDriver versions for Appium and ${driverName}`);
|
||||
this.log.info(
|
||||
AppiumDriver.baseVersion
|
||||
? `Appium's BaseDriver version is ${AppiumDriver.baseVersion}`
|
||||
: `Could not determine Appium's BaseDriver version`
|
||||
: `Could not determine Appium's BaseDriver version`,
|
||||
);
|
||||
this.log.info(
|
||||
driverBaseVersion
|
||||
? `${driverName}'s BaseDriver version is ${driverBaseVersion}`
|
||||
: `Could not determine ${driverName}'s BaseDriver version`
|
||||
: `Could not determine ${driverName}'s BaseDriver version`,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -280,7 +281,7 @@ class AppiumDriver extends DriverCore {
|
||||
jsonwpCaps,
|
||||
promoteAppiumOptions(/** @type {W3CAppiumDriverCaps} */ (w3cCapabilities)),
|
||||
this.desiredCapConstraints,
|
||||
defaultCapabilities ? promoteAppiumOptionsForObject(defaultCapabilities) : undefined
|
||||
defaultCapabilities ? promoteAppiumOptionsForObject(defaultCapabilities) : undefined,
|
||||
);
|
||||
|
||||
const {desiredCaps, processedJsonwpCapabilities, processedW3CCapabilities} =
|
||||
@@ -324,7 +325,7 @@ class AppiumDriver extends DriverCore {
|
||||
this.log.info(
|
||||
`Applying relaxed security to '${InnerDriver.name}' as per ` +
|
||||
`server command line argument. All insecure features will be ` +
|
||||
`enabled unless explicitly disabled by --deny-insecure`
|
||||
`enabled unless explicitly disabled by --deny-insecure`,
|
||||
);
|
||||
driverInstance.relaxedSecurityEnabled = true;
|
||||
}
|
||||
@@ -365,7 +366,7 @@ class AppiumDriver extends DriverCore {
|
||||
await pendingDriversGuard.acquire(AppiumDriver.name, () => {
|
||||
this.pendingDrivers[InnerDriver.name] = this.pendingDrivers[InnerDriver.name] || [];
|
||||
otherPendingDriversData = _.compact(
|
||||
this.pendingDrivers[InnerDriver.name].map((drv) => drv.driverData)
|
||||
this.pendingDrivers[InnerDriver.name].map((drv) => drv.driverData),
|
||||
);
|
||||
this.pendingDrivers[InnerDriver.name].push(driverInstance);
|
||||
});
|
||||
@@ -375,7 +376,7 @@ class AppiumDriver extends DriverCore {
|
||||
processedJsonwpCapabilities,
|
||||
reqCaps,
|
||||
processedW3CCapabilities,
|
||||
[...runningDriversData, ...otherPendingDriversData]
|
||||
[...runningDriversData, ...otherPendingDriversData],
|
||||
);
|
||||
protocol = driverInstance.protocol;
|
||||
this.sessions[innerSessionId] = driverInstance;
|
||||
@@ -389,7 +390,7 @@ class AppiumDriver extends DriverCore {
|
||||
|
||||
this.log.info(
|
||||
`New ${InnerDriver.name} session created successfully, session ` +
|
||||
`${innerSessionId} added to master session list`
|
||||
`${innerSessionId} added to master session list`,
|
||||
);
|
||||
|
||||
// set the New Command Timeout for the inner driver
|
||||
@@ -399,13 +400,13 @@ class AppiumDriver extends DriverCore {
|
||||
if (driverInstance.isW3CProtocol() && !_.isEmpty(w3cSettings)) {
|
||||
this.log.info(
|
||||
`Applying the initial values to Appium settings parsed from W3C caps: ` +
|
||||
JSON.stringify(w3cSettings)
|
||||
JSON.stringify(w3cSettings),
|
||||
);
|
||||
await driverInstance.updateSettings(w3cSettings);
|
||||
} else if (driverInstance.isMjsonwpProtocol() && !_.isEmpty(jwpSettings)) {
|
||||
this.log.info(
|
||||
`Applying the initial values to Appium settings parsed from MJSONWP caps: ` +
|
||||
JSON.stringify(jwpSettings)
|
||||
JSON.stringify(jwpSettings),
|
||||
);
|
||||
await driverInstance.updateSettings(jwpSettings);
|
||||
}
|
||||
@@ -435,13 +436,13 @@ class AppiumDriver extends DriverCore {
|
||||
for (const plugin of this.sessionPlugins[innerSessionId]) {
|
||||
if (_.isFunction(plugin.onUnexpectedShutdown)) {
|
||||
this.log.debug(
|
||||
`Plugin ${plugin.name} defines an unexpected shutdown handler; calling it now`
|
||||
`Plugin ${plugin.name} defines an unexpected shutdown handler; calling it now`,
|
||||
);
|
||||
try {
|
||||
plugin.onUnexpectedShutdown(driver, cause);
|
||||
} catch (e) {
|
||||
this.log.warn(
|
||||
`Got an error when running plugin ${plugin.name} shutdown handler: ${e}`
|
||||
`Got an error when running plugin ${plugin.name} shutdown handler: ${e}`,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
@@ -460,7 +461,7 @@ class AppiumDriver extends DriverCore {
|
||||
} else {
|
||||
this.log.warn(
|
||||
`Failed to attach the unexpected shutdown listener. ` +
|
||||
`Is 'onUnexpectedShutdown' method available for '${driver.constructor.name}'?`
|
||||
`Is 'onUnexpectedShutdown' method available for '${driver.constructor.name}'?`,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -476,13 +477,13 @@ class AppiumDriver extends DriverCore {
|
||||
const data = _.compact(
|
||||
_.values(this.sessions)
|
||||
.filter((s) => s.constructor.name === InnerDriver.name)
|
||||
.map((s) => s.driverData)
|
||||
.map((s) => s.driverData),
|
||||
);
|
||||
for (const datum of data) {
|
||||
if (!datum) {
|
||||
throw new Error(
|
||||
`Problem getting session data for driver type ` +
|
||||
`${InnerDriver.name}; does it implement 'get driverData'?`
|
||||
`${InnerDriver.name}; does it implement 'get driverData'?`,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -503,7 +504,7 @@ class AppiumDriver extends DriverCore {
|
||||
const curConstructorName = this.sessions[sessionId].constructor.name;
|
||||
otherSessionsData = _.toPairs(this.sessions)
|
||||
.filter(
|
||||
([key, value]) => value.constructor.name === curConstructorName && key !== sessionId
|
||||
([key, value]) => value.constructor.name === curConstructorName && key !== sessionId,
|
||||
)
|
||||
.map(([, value]) => value.driverData);
|
||||
const dstSession = this.sessions[sessionId];
|
||||
@@ -545,7 +546,7 @@ class AppiumDriver extends DriverCore {
|
||||
this.log.debug(`Cleaning up ${util.pluralize('active session', sessionsCount, true)}`);
|
||||
const cleanupPromises = force
|
||||
? _.values(this.sessions).map((drv) =>
|
||||
drv.startUnexpectedShutdown(reason && new Error(reason))
|
||||
drv.startUnexpectedShutdown(reason && new Error(reason)),
|
||||
)
|
||||
: _.keys(this.sessions).map((id) => this.deleteSession(id));
|
||||
for (const cleanupPromise of cleanupPromises) {
|
||||
@@ -591,7 +592,7 @@ class AppiumDriver extends DriverCore {
|
||||
// to handle a given command, a plugin should either implement that command as a plugin
|
||||
// instance method or it should implement a generic 'handle' method
|
||||
return this.pluginsForSession(sessionId).filter(
|
||||
(p) => _.isFunction(p[cmd]) || _.isFunction(p.handle)
|
||||
(p) => _.isFunction(p[cmd]) || _.isFunction(p.handle),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -667,7 +668,7 @@ class AppiumDriver extends DriverCore {
|
||||
// newCommandTimeout will be cleared. So we do it here as well.
|
||||
if (plugins.length && dstSession) {
|
||||
this.log.debug(
|
||||
'Clearing new command timeout pre-emptively since plugin(s) will handle this command'
|
||||
'Clearing new command timeout pre-emptively since plugin(s) will handle this command',
|
||||
);
|
||||
await dstSession.clearNewCommandTimeout();
|
||||
}
|
||||
@@ -704,7 +705,7 @@ class AppiumDriver extends DriverCore {
|
||||
return await dstSession.proxyCommand(
|
||||
reqForProxy.originalUrl,
|
||||
reqForProxy.method,
|
||||
reqForProxy.body
|
||||
reqForProxy.body,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -748,7 +749,7 @@ class AppiumDriver extends DriverCore {
|
||||
) {
|
||||
this.log.debug(
|
||||
'Restarting new command timeout via umbrella driver since plugin did not ' +
|
||||
'allow default handler to execute'
|
||||
'allow default handler to execute',
|
||||
);
|
||||
await dstSession.startNewCommandTimeout();
|
||||
}
|
||||
@@ -760,7 +761,7 @@ class AppiumDriver extends DriverCore {
|
||||
const sessionId = _.first(res.value);
|
||||
this.log.info(
|
||||
`Promoting ${this.sessionlessPlugins.length} sessionless plugins to be attached ` +
|
||||
`to session ID ${sessionId}`
|
||||
`to session ID ${sessionId}`,
|
||||
);
|
||||
this.sessionPlugins[sessionId] = this.sessionlessPlugins;
|
||||
this.sessionlessPlugins = [];
|
||||
@@ -812,7 +813,7 @@ class AppiumDriver extends DriverCore {
|
||||
this.log.info(
|
||||
`Command '${cmd}' was *not* handled by the following behaviours or plugins, even ` +
|
||||
`though they were registered to handle it: ${JSON.stringify(didntHandle)}. The ` +
|
||||
`command *was* handled by these: ${JSON.stringify(didHandle)}.`
|
||||
`command *was* handled by these: ${JSON.stringify(didHandle)}.`,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -885,7 +886,7 @@ export class NoDriverProxyCommandError extends Error {
|
||||
`The default behavior for this command was to proxy, but the driver ` +
|
||||
`did not have the 'proxyCommand' method defined. To fully support ` +
|
||||
`plugins, drivers should have 'proxyCommand' set to a jwpProxy object's ` +
|
||||
`'command()' method, in addition to the normal 'proxyReqRes'`
|
||||
`'command()' method, in addition to the normal 'proxyReqRes'`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ export const KNOWN_PLUGINS = Object.freeze(
|
||||
'execute-driver': '@appium/execute-driver-plugin',
|
||||
'relaxed-caps': '@appium/relaxed-caps-plugin',
|
||||
'universal-xml': '@appium/universal-xml-plugin',
|
||||
})
|
||||
}),
|
||||
);
|
||||
|
||||
// This is a map of driver names to npm packages representing those drivers.
|
||||
@@ -46,7 +46,7 @@ export const KNOWN_DRIVERS = Object.freeze(
|
||||
safari: 'appium-safari-driver',
|
||||
gecko: 'appium-geckodriver',
|
||||
chromium: 'appium-chromium-driver',
|
||||
})
|
||||
}),
|
||||
);
|
||||
|
||||
/**
|
||||
|
||||
@@ -38,14 +38,30 @@ export async function loadExtensions(appiumHome) {
|
||||
* @returns {PluginNameMap} Mapping of PluginClass to name
|
||||
*/
|
||||
export function getActivePlugins(pluginConfig, usePlugins = []) {
|
||||
/** @type {string[]} */
|
||||
let filteredPluginNames = [];
|
||||
if (usePlugins.length === 1 && usePlugins[0] === USE_ALL_PLUGINS) {
|
||||
filteredPluginNames = _.keys(pluginConfig.installedExtensions);
|
||||
} else {
|
||||
// It is important to load plugins in the same order that was used while enumerating them
|
||||
for (const pluginName of usePlugins) {
|
||||
if (pluginName in pluginConfig.installedExtensions) {
|
||||
filteredPluginNames.push(pluginName);
|
||||
} else if (pluginName === USE_ALL_PLUGINS) {
|
||||
throw new Error(
|
||||
`The reserved plugin name '${pluginName}' cannot be combined with other names.`
|
||||
);
|
||||
} else {
|
||||
throw new Error(
|
||||
`Could not load the plugin '${pluginName}' because it is not installed. ` +
|
||||
`Only the following plugins are available: ${_.keys(pluginConfig.installedExtensions)}`
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
return new Map(
|
||||
_.compact(
|
||||
Object.keys(pluginConfig.installedExtensions)
|
||||
.filter(
|
||||
(pluginName) =>
|
||||
_.includes(usePlugins, pluginName) ||
|
||||
(usePlugins.length === 1 && usePlugins[0] === USE_ALL_PLUGINS)
|
||||
)
|
||||
filteredPluginNames
|
||||
.map((pluginName) => {
|
||||
try {
|
||||
log.info(`Attempting to load plugin ${pluginName}...`);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import {logger} from '@appium/support';
|
||||
|
||||
let log = logger.getLogger('Appium');
|
||||
export const APPIUM_LOGGER_NAME = 'Appium';
|
||||
let log = logger.getLogger(APPIUM_LOGGER_NAME);
|
||||
|
||||
export default log;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import npmlog from 'npmlog';
|
||||
import {createLogger, format, transports} from 'winston';
|
||||
import {fs, logger} from '@appium/support';
|
||||
import { APPIUM_LOGGER_NAME } from './logger';
|
||||
import _ from 'lodash';
|
||||
|
||||
// set up distributed logging before everything else
|
||||
@@ -64,8 +65,7 @@ const stripColorFormat = format(function stripColor(info) {
|
||||
|
||||
function createConsoleTransport(args, logLvl) {
|
||||
return new transports.Console({
|
||||
// `name` is unsupported per winston's type declarations
|
||||
// @ts-expect-error
|
||||
// @ts-expect-error The 'name' property should exist
|
||||
name: 'console',
|
||||
handleExceptions: true,
|
||||
exitOnError: false,
|
||||
@@ -73,14 +73,6 @@ function createConsoleTransport(args, logLvl) {
|
||||
level: logLvl,
|
||||
stderrLevels: ['error'],
|
||||
format: format.combine(
|
||||
format(function adjustDebug(info) {
|
||||
// prepend debug marker, and shift to `info` log level
|
||||
if (info.level === 'debug') {
|
||||
info.level = 'info';
|
||||
info.message = `[debug] ${info.message}`;
|
||||
}
|
||||
return info;
|
||||
})(),
|
||||
timestampFormat,
|
||||
args.logNoColors ? stripColorFormat : colorizeFormat,
|
||||
format.printf(function printInfo(info) {
|
||||
@@ -92,7 +84,7 @@ function createConsoleTransport(args, logLvl) {
|
||||
|
||||
function createFileTransport(args, logLvl) {
|
||||
return new transports.File({
|
||||
// @ts-expect-error
|
||||
// @ts-expect-error The 'name' property should exist
|
||||
name: 'file',
|
||||
filename: args.logFile,
|
||||
maxFiles: 1,
|
||||
@@ -121,7 +113,7 @@ function createHttpTransport(args, logLvl) {
|
||||
}
|
||||
|
||||
return new transports.Http({
|
||||
// @ts-expect-error
|
||||
// @ts-expect-error The 'name' property should exist
|
||||
name: 'http',
|
||||
host,
|
||||
port,
|
||||
@@ -215,22 +207,19 @@ async function init(args) {
|
||||
});
|
||||
|
||||
// Capture logs emitted via npmlog and pass them through winston
|
||||
npmlog.on('log', (logObj) => {
|
||||
const winstonLevel = npmToWinstonLevels[logObj.level] || 'info';
|
||||
let msg = logObj.message;
|
||||
if (logObj.prefix) {
|
||||
const prefix = `[${logObj.prefix}]`;
|
||||
if (args.logNoColors) {
|
||||
msg = `${prefix} ${msg}`;
|
||||
} if (prefix === '[Appium]') {
|
||||
msg = `${prefix.magenta} ${msg}`;
|
||||
} else {
|
||||
msg = `${getColorizedPrefix(prefix)} ${msg}`;
|
||||
}
|
||||
log[winstonLevel](msg);
|
||||
if (args.logHandler && _.isFunction(args.logHandler)) {
|
||||
args.logHandler(logObj.level, msg);
|
||||
}
|
||||
npmlog.on('log', ({level, message, prefix}) => {
|
||||
const winstonLevel = npmToWinstonLevels[level] || 'info';
|
||||
let msg = message;
|
||||
if (prefix) {
|
||||
const decoratedPrefix = `[${prefix}]`;
|
||||
const toColorizedDecoratedPrefix = () => prefix === APPIUM_LOGGER_NAME
|
||||
? decoratedPrefix.magenta
|
||||
: getColorizedPrefix(decoratedPrefix);
|
||||
msg = `${args.logNoColors ? decoratedPrefix : toColorizedDecoratedPrefix()} ${msg}`;
|
||||
}
|
||||
log[winstonLevel](msg);
|
||||
if (args.logHandler && _.isFunction(args.logHandler)) {
|
||||
args.logHandler(level, msg);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
+21
-20
@@ -92,7 +92,7 @@ function logNonDefaultArgsWarning(args) {
|
||||
function logDefaultCapabilitiesWarning(caps) {
|
||||
logger.info(
|
||||
'Default capabilities, which will be added to each request ' +
|
||||
'unless overridden by desired capabilities:'
|
||||
'unless overridden by desired capabilities:',
|
||||
);
|
||||
inspect(caps);
|
||||
}
|
||||
@@ -144,7 +144,7 @@ function getExtraMethodMap(driverClasses, pluginClasses) {
|
||||
...map,
|
||||
...(klass.newMethodMap ?? {}),
|
||||
}),
|
||||
{}
|
||||
{},
|
||||
);
|
||||
}
|
||||
|
||||
@@ -173,12 +173,12 @@ async function prepareAppiumHome(name, appiumHome) {
|
||||
throw new Error(
|
||||
`The path '${appiumHome}' provided in the ${name} must point ` +
|
||||
`to a valid folder writeable for the current user account '${os.userInfo().username}'. ` +
|
||||
`Original error: ${err.message}`
|
||||
`Original error: ${err.message}`,
|
||||
);
|
||||
}
|
||||
if (!stat.isDirectory()) {
|
||||
throw new Error(
|
||||
`The path '${appiumHome}' provided in the ${name} must point to a valid folder`
|
||||
`The path '${appiumHome}' provided in the ${name} must point to a valid folder`,
|
||||
);
|
||||
}
|
||||
try {
|
||||
@@ -187,7 +187,7 @@ async function prepareAppiumHome(name, appiumHome) {
|
||||
throw new Error(
|
||||
`The folder path '${appiumHome}' provided in the ${name} must be ` +
|
||||
`writeable for the current user account '${os.userInfo().username}. ` +
|
||||
`Original error: ${e.message}`
|
||||
`Original error: ${e.message}`,
|
||||
);
|
||||
}
|
||||
return appiumHome;
|
||||
@@ -250,7 +250,7 @@ async function init(args) {
|
||||
throw new Error(
|
||||
`Errors in config file ${configResult.filepath}:\n ${
|
||||
configResult.reason ?? configResult.errors
|
||||
}`
|
||||
}`,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -274,23 +274,23 @@ async function init(args) {
|
||||
|
||||
if (serverArgs.logFilters) {
|
||||
const {issues, rules} = await logFactory.loadSecureValuesPreprocessingRules(
|
||||
serverArgs.logFilters
|
||||
serverArgs.logFilters,
|
||||
);
|
||||
if (!_.isEmpty(issues)) {
|
||||
throw new Error(
|
||||
`The log filtering rules config '${serverArgs.logFilters}' has issues: ` +
|
||||
JSON.stringify(issues, null, 2)
|
||||
JSON.stringify(issues, null, 2),
|
||||
);
|
||||
}
|
||||
if (_.isEmpty(rules)) {
|
||||
logger.warn(
|
||||
`Found no log filtering rules in '${serverArgs.logFilters}'. Is that expected?`
|
||||
`Found no log filtering rules in '${serverArgs.logFilters}'. Is that expected?`,
|
||||
);
|
||||
} else {
|
||||
logger.info(
|
||||
`Loaded ${util.pluralize('filtering rule', rules.length, true)} from '${
|
||||
serverArgs.logFilters
|
||||
}'`
|
||||
}'`,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -298,7 +298,7 @@ async function init(args) {
|
||||
const appiumDriver = new AppiumDriver(
|
||||
/** @type {import('@appium/types').DriverOpts<import('./appium').AppiumDriverConstraints>} */ (
|
||||
serverArgs
|
||||
)
|
||||
),
|
||||
);
|
||||
// set the config on the umbrella driver so it can match drivers to caps
|
||||
appiumDriver.driverConfig = driverConfig;
|
||||
@@ -342,14 +342,12 @@ function logServerAddress(url) {
|
||||
const interfaces = fetchInterfaces(urlObj.hostname === V4_BROADCAST_IP ? 4 : 6);
|
||||
const toLabel = (/** @type {os.NetworkInterfaceInfo} */ iface) => {
|
||||
const href = urlObj.href.replace(urlObj.hostname, iface.address);
|
||||
return iface.internal
|
||||
? `${href} (only accessible from the same host)`
|
||||
: href;
|
||||
return iface.internal ? `${href} (only accessible from the same host)` : href;
|
||||
};
|
||||
logger.info(
|
||||
`You can provide the following ${interfaces.length === 1 ? 'URL' : 'URLs'} ` +
|
||||
`in your client code to connect to this server:\n` +
|
||||
interfaces.map((iface) => `\t${toLabel(iface)}`).join('\n')
|
||||
`in your client code to connect to this server:\n` +
|
||||
interfaces.map((iface) => `\t${toLabel(iface)}`).join('\n'),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -406,7 +404,7 @@ async function main(args) {
|
||||
} catch (err) {
|
||||
logger.error(
|
||||
`Could not configure Appium server. It's possible that a driver or plugin tried ` +
|
||||
`to update the server and failed. Original error: ${err.message}`
|
||||
`to update the server and failed. Original error: ${err.message}`,
|
||||
);
|
||||
logger.debug(err.stack);
|
||||
return process.exit(1);
|
||||
@@ -416,7 +414,7 @@ async function main(args) {
|
||||
logger.warn(
|
||||
'You have enabled CORS requests from any host. Be careful not ' +
|
||||
'to visit sites which could maliciously try to start Appium ' +
|
||||
'sessions on your machine'
|
||||
'sessions on your machine',
|
||||
);
|
||||
}
|
||||
appiumDriver.server = server;
|
||||
@@ -428,7 +426,7 @@ async function main(args) {
|
||||
parsedArgs.nodeconfig,
|
||||
parsedArgs.address,
|
||||
parsedArgs.port,
|
||||
parsedArgs.basePath
|
||||
parsedArgs.basePath,
|
||||
);
|
||||
}
|
||||
} catch (err) {
|
||||
@@ -450,8 +448,11 @@ async function main(args) {
|
||||
});
|
||||
}
|
||||
|
||||
const protocol = 'secure' in server && server.secure ? 'https' : 'http';
|
||||
const address = net.isIPv6(parsedArgs.address) ? `[${parsedArgs.address}]` : parsedArgs.address;
|
||||
logServerAddress(`http://${address}:${parsedArgs.port}${normalizeBasePath(parsedArgs.basePath)}`);
|
||||
logServerAddress(
|
||||
`${protocol}://${address}:${parsedArgs.port}${normalizeBasePath(parsedArgs.basePath)}`,
|
||||
);
|
||||
|
||||
driverConfig.print();
|
||||
pluginConfig.print([...pluginClasses.values()]);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "appium",
|
||||
"version": "2.1.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Automation for Apps.",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -60,25 +60,25 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/base-driver": "^9.3.17",
|
||||
"@appium/base-plugin": "^2.2.17",
|
||||
"@appium/docutils": "^0.4.6",
|
||||
"@appium/schema": "^0.3.1",
|
||||
"@appium/support": "^4.1.4",
|
||||
"@appium/types": "^0.13.3",
|
||||
"@appium/base-driver": "^9.4.2",
|
||||
"@appium/base-plugin": "^2.2.23",
|
||||
"@appium/docutils": "^0.4.12",
|
||||
"@appium/schema": "^0.4.2",
|
||||
"@appium/support": "^4.1.9",
|
||||
"@appium/types": "^0.14.2",
|
||||
"@sidvind/better-ajv-errors": "2.1.0",
|
||||
"@types/argparse": "2.0.10",
|
||||
"@types/bluebird": "3.5.38",
|
||||
"@types/fancy-log": "2.0.0",
|
||||
"@types/semver": "7.5.0",
|
||||
"@types/teen_process": "2.0.0",
|
||||
"@types/argparse": "2.0.13",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"@types/fancy-log": "2.0.2",
|
||||
"@types/semver": "7.5.5",
|
||||
"@types/teen_process": "2.0.3",
|
||||
"@types/wrap-ansi": "3.0.0",
|
||||
"ajv": "8.12.0",
|
||||
"ajv-formats": "2.1.1",
|
||||
"argparse": "2.0.1",
|
||||
"async-lock": "1.4.0",
|
||||
"asyncbox": "2.9.4",
|
||||
"axios": "1.4.0",
|
||||
"asyncbox": "3.0.0",
|
||||
"axios": "1.6.1",
|
||||
"bluebird": "3.7.2",
|
||||
"cross-env": "7.0.3",
|
||||
"find-up": "5.0.0",
|
||||
@@ -90,11 +90,11 @@
|
||||
"resolve-from": "5.0.0",
|
||||
"semver": "7.5.4",
|
||||
"source-map-support": "0.5.21",
|
||||
"teen_process": "2.0.4",
|
||||
"teen_process": "2.0.84",
|
||||
"type-fest": "3.13.1",
|
||||
"winston": "3.10.0",
|
||||
"winston": "3.11.0",
|
||||
"wrap-ansi": "7.0.0",
|
||||
"yaml": "2.3.1"
|
||||
"yaml": "2.3.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import unittest
|
||||
from appium import webdriver
|
||||
from appium.options.android import UiAutomator2Options
|
||||
from appium.webdriver.common.appiumby import AppiumBy
|
||||
|
||||
capabilities = dict(
|
||||
@@ -16,7 +17,7 @@ appium_server_url = 'http://localhost:4723'
|
||||
|
||||
class TestAppium(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.driver = webdriver.Remote(appium_server_url, capabilities)
|
||||
self.driver = webdriver.Remote(appium_server_url, options=UiAutomator2Options().load_capabilities(capabilities))
|
||||
|
||||
def tearDown(self) -> None:
|
||||
if self.driver:
|
||||
|
||||
@@ -73,7 +73,7 @@ describe('FakeDriver via HTTP', function () {
|
||||
suppressOutput: true,
|
||||
showInstalled: true,
|
||||
},
|
||||
driverConfig
|
||||
driverConfig,
|
||||
);
|
||||
if (!_.has(driverList, 'fake')) {
|
||||
await runExtensionCommand(
|
||||
@@ -83,7 +83,7 @@ describe('FakeDriver via HTTP', function () {
|
||||
installType: INSTALL_TYPE_LOCAL,
|
||||
subcommand: DRIVER_TYPE,
|
||||
},
|
||||
driverConfig
|
||||
driverConfig,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ describe('FakeDriver via HTTP', function () {
|
||||
// arg got through.
|
||||
(await axios.post(`http://${TEST_HOST}:${port}/fakedriverCliArgs`)).data.should.have.property(
|
||||
'appiumHome',
|
||||
appiumHome
|
||||
appiumHome,
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -233,7 +233,7 @@ describe('FakeDriver via HTTP', function () {
|
||||
{
|
||||
'appium:newCommandTimeout': 0.25,
|
||||
},
|
||||
caps
|
||||
caps,
|
||||
);
|
||||
let driver = await wdio({...wdOpts, capabilities: localCaps});
|
||||
should.exist(driver.sessionId);
|
||||
@@ -249,7 +249,7 @@ describe('FakeDriver via HTTP', function () {
|
||||
{
|
||||
'appium:newCommandTimeout': 0.25,
|
||||
},
|
||||
caps
|
||||
caps,
|
||||
);
|
||||
let driver = await wdio({...wdOpts, capabilities: localCaps});
|
||||
should.exist(driver.sessionId);
|
||||
@@ -496,7 +496,7 @@ describe('FakeDriver via HTTP', function () {
|
||||
}
|
||||
});
|
||||
|
||||
it('should log a single deprecation warning if a deprecated method is used and not overridden by a newMethodMap', async function () {
|
||||
it.skip('should log a single deprecation warning if a deprecated method is used and not overridden by a newMethodMap', async function () {
|
||||
let driver = await wdio({...wdOpts, capabilities: caps});
|
||||
try {
|
||||
driver.addCommand(
|
||||
@@ -506,7 +506,7 @@ describe('FakeDriver via HTTP', function () {
|
||||
description: 'Call a deprecated command',
|
||||
parameters: [],
|
||||
ref: '',
|
||||
})
|
||||
}),
|
||||
);
|
||||
driver.addCommand(
|
||||
'doubleClick',
|
||||
@@ -515,7 +515,7 @@ describe('FakeDriver via HTTP', function () {
|
||||
description: 'Global double click',
|
||||
parameters: [],
|
||||
ref: '',
|
||||
})
|
||||
}),
|
||||
);
|
||||
await driver
|
||||
.executeScript('fake: getDeprecatedCommandsCalled', [])
|
||||
|
||||
@@ -107,55 +107,23 @@ describe('FakePlugin w/ FakeDriver via HTTP', function () {
|
||||
});
|
||||
|
||||
describe('without plugin registered', function () {
|
||||
/** @type {AppiumServer} */
|
||||
let server;
|
||||
|
||||
before(async function () {
|
||||
it('should reject server creation if plugin is not activated', async function () {
|
||||
const args = {
|
||||
appiumHome,
|
||||
port,
|
||||
address: TEST_HOST,
|
||||
usePlugins: ['other1', 'other2'],
|
||||
};
|
||||
server = /** @type {AppiumServer} */ (await appiumServer(args));
|
||||
await appiumServer(args).should.eventually.be.rejected;
|
||||
});
|
||||
|
||||
after(async function () {
|
||||
if (server) {
|
||||
await server.close();
|
||||
}
|
||||
});
|
||||
|
||||
it('should not update the server if plugin is not activated', async function () {
|
||||
await axios.post(`http://${TEST_HOST}:${port}/fake`).should.eventually.be.rejectedWith(/404/);
|
||||
});
|
||||
it('should not update method map if plugin is not activated', async function () {
|
||||
const driver = await wdio(wdOpts);
|
||||
const {sessionId} = driver;
|
||||
try {
|
||||
await axios
|
||||
.post(`${testServerBaseSessionUrl}/${sessionId}/fake_data`, {
|
||||
data: {fake: 'data'},
|
||||
})
|
||||
.should.eventually.be.rejectedWith(/404/);
|
||||
} finally {
|
||||
await driver.deleteSession();
|
||||
}
|
||||
});
|
||||
it('should not handle commands if plugin is not activated', async function () {
|
||||
const driver = await wdio(wdOpts);
|
||||
const {sessionId} = driver;
|
||||
try {
|
||||
const el = (
|
||||
await axios.post(`${testServerBaseSessionUrl}/${sessionId}/element`, {
|
||||
using: 'xpath',
|
||||
value: '//MockWebView',
|
||||
})
|
||||
).data.value;
|
||||
el.should.not.have.property('fake');
|
||||
} finally {
|
||||
await driver.deleteSession();
|
||||
}
|
||||
it('should reject server creation if reserved plugin name is provided with other names', async function () {
|
||||
const args = {
|
||||
appiumHome,
|
||||
port,
|
||||
address: TEST_HOST,
|
||||
usePlugins: ['fake', 'all'],
|
||||
};
|
||||
await appiumServer(args).should.eventually.be.rejected;
|
||||
});
|
||||
});
|
||||
|
||||
@@ -167,7 +135,7 @@ describe('FakePlugin w/ FakeDriver via HTTP', function () {
|
||||
let usePlugins;
|
||||
before(async function () {
|
||||
// then start server if we need to
|
||||
usePlugins = registrationType === 'explicit' ? ['fake', 'p2', 'p3'] : ['all'];
|
||||
usePlugins = registrationType === 'explicit' ? ['fake'] : ['all'];
|
||||
const args = {
|
||||
appiumHome,
|
||||
port,
|
||||
@@ -358,7 +326,7 @@ describe('FakePlugin w/ FakeDriver via HTTP', function () {
|
||||
/** @type {AppiumServer} */
|
||||
let server;
|
||||
|
||||
/** @type {import('webdriverio').Browser<'async'>} */
|
||||
/** @type {import('webdriverio').Browser} */
|
||||
let driver;
|
||||
|
||||
before(async function () {
|
||||
|
||||
@@ -303,7 +303,7 @@ describe('schema', function () {
|
||||
});
|
||||
|
||||
it('should flatten a schema', function () {
|
||||
expect(flattenSchema()).to.eql(flattenedSchemaFixture);
|
||||
expect(flattenSchema().length).to.be.greaterThanOrEqual(flattenedSchemaFixture.length);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -362,7 +362,7 @@ describe('schema', function () {
|
||||
});
|
||||
|
||||
it('should flatten a schema', function () {
|
||||
expect(flattenSchema()).to.eql(expected);
|
||||
expect(flattenSchema().length).to.be.greaterThanOrEqual(expected.length);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,6 +3,81 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [9.4.2](https://github.com/appium/appium/compare/@appium/base-driver@9.4.1...@appium/base-driver@9.4.2) (2023-11-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update definitelytyped ([5ae8df3](https://github.com/appium/appium/commit/5ae8df3c36c7f03fbf3420087b532086f6742348))
|
||||
* **support:** update dependency axios to v1.6.0 ([699c493](https://github.com/appium/appium/commit/699c49306c38e222d618a9611482b06a3e6806aa))
|
||||
* **support:** update dependency axios to v1.6.1 ([9b14205](https://github.com/appium/appium/commit/9b14205288ef09fd4a1144fc93c82b2bb2ed2ec0))
|
||||
|
||||
|
||||
|
||||
## [9.4.1](https://github.com/appium/appium/compare/@appium/base-driver@9.4.0...@appium/base-driver@9.4.1) (2023-10-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Make sure type definitions are always in sync across modules ([#19323](https://github.com/appium/appium/issues/19323)) ([de39013](https://github.com/appium/appium/commit/de39013ae501d4fc11988435737efb862cc1d820))
|
||||
* **support:** update definitelytyped ([a306ce7](https://github.com/appium/appium/commit/a306ce741a806d21bc44f3b979803b8af5da99aa))
|
||||
|
||||
|
||||
|
||||
## [9.4.0](https://github.com/appium/appium/compare/@appium/base-driver@9.3.20...@appium/base-driver@9.4.0) (2023-10-18)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **base-driver:** Add server support of TLS and SPDY protocols ([#19105](https://github.com/appium/appium/issues/19105)) ([5926919](https://github.com/appium/appium/commit/5926919177e3df675723c80d800f933fdbda5824))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **base-driver:** update definitelytyped ([5e09589](https://github.com/appium/appium/commit/5e095893ee8f65cb8744d2cd6c6abd70f402fa55))
|
||||
* **base-driver:** update dependency http-status-codes to v2.3.0 ([331171d](https://github.com/appium/appium/commit/331171dd8c511aba15e1b5b24329b30224e3e6ac))
|
||||
* **driver-test-support:** update dependency @types/lodash to v4.14.198 ([84fefd2](https://github.com/appium/appium/commit/84fefd214c40408cbbcd145723b5d8dbeec665af))
|
||||
* **images-plugin:** update dependency lru-cache to v10 ([#19050](https://github.com/appium/appium/issues/19050)) ([72a806b](https://github.com/appium/appium/commit/72a806bec7c3a80747192d24dfd9d8286a751810))
|
||||
* **opencv:** update definitelytyped ([d2a9a99](https://github.com/appium/appium/commit/d2a9a99418af9ce9b569bb9b98ee396faab932bb))
|
||||
* **support:** update definitelytyped ([3b44c7d](https://github.com/appium/appium/commit/3b44c7d8f5b89f9357dfe6bb56b54799bbe0a921))
|
||||
* **support:** update definitelytyped ([595d460](https://github.com/appium/appium/commit/595d460ac8dc41d310f9e4f653acbad3c7fd50b9))
|
||||
* **support:** update definitelytyped ([b6a76ce](https://github.com/appium/appium/commit/b6a76ce91e2765c22f84e389b93f780e0b4490c0))
|
||||
* **support:** update dependency axios to v1.5.0 ([08913cd](https://github.com/appium/appium/commit/08913cddde295f616f0fb376cc2cb71a9409a253))
|
||||
* **support:** update dependency axios to v1.5.1 ([#19217](https://github.com/appium/appium/issues/19217)) ([3df047d](https://github.com/appium/appium/commit/3df047d128d5d032826c8f5fb605b019078b717d))
|
||||
* **types:** update definitelytyped ([96b0a44](https://github.com/appium/appium/commit/96b0a44629c451102c44541a8d5b9e7be972f1ea))
|
||||
* Use pathToRegexp to match websocket endpoints ([#19162](https://github.com/appium/appium/issues/19162)) ([de02ed8](https://github.com/appium/appium/commit/de02ed87fc665ec9c6e563a634634307c3f21e44))
|
||||
|
||||
|
||||
|
||||
## [9.3.20](https://github.com/appium/appium/compare/@appium/base-driver@9.3.19...@appium/base-driver@9.3.20) (2023-08-23)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **base-driver:** Avoid RangeError while caching the response data ([#19043](https://github.com/appium/appium/issues/19043)) ([315a5e6](https://github.com/appium/appium/commit/315a5e6cc75d53d5fbbdae598dc4523ab85b7cb1))
|
||||
* **base-driver:** fix the LRUCache.dispose callback param order ([#19037](https://github.com/appium/appium/issues/19037)) ([abcf0d4](https://github.com/appium/appium/commit/abcf0d451f47f5c7c285f0988693c4bef9c29024))
|
||||
|
||||
|
||||
|
||||
## [9.3.19](https://github.com/appium/appium/compare/@appium/base-driver@9.3.18...@appium/base-driver@9.3.19) (2023-08-22)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-driver
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [9.3.18](https://github.com/appium/appium/compare/@appium/base-driver@9.3.17...@appium/base-driver@9.3.18) (2023-08-21)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **base-driver:** Fix possible NPE while cleaning up the state listener ([#19020](https://github.com/appium/appium/issues/19020)) ([53bfc68](https://github.com/appium/appium/commit/53bfc68eee5766ca8c6851c424c89d6b123d602e))
|
||||
* **base-driver:** Respect basic auth credentials if provided ([#19000](https://github.com/appium/appium/issues/19000)) ([ed8e83c](https://github.com/appium/appium/commit/ed8e83c76c5b660e619833515c2ea2ec29082e18))
|
||||
* **driver-test-support:** update dependency @types/lodash to v4.14.197 ([a080b72](https://github.com/appium/appium/commit/a080b729208b4e3c352456f0f230b63b0b7ee9ee))
|
||||
|
||||
|
||||
|
||||
## [9.3.17](https://github.com/appium/appium/compare/@appium/base-driver@9.3.16...@appium/base-driver@9.3.17) (2023-08-17)
|
||||
|
||||
|
||||
|
||||
@@ -116,7 +116,6 @@ POST | `session/{sessionId}/appium/getPerformanceData` | returns the
|
||||
POST | `session/{sessionId}/appium/device/press_keycode` | Press a particular key code on the device.
|
||||
POST | `session/{sessionId}/appium/device/long_press_keycode` | Press and hold a particular key code on the device.
|
||||
POST | `session/{sessionId}/appium/device/keyevent` | Send a key code to the device.
|
||||
POST | `session/{sessionId}/appium/device/rotate` | Rotate the device in three dimensions.
|
||||
GET | `session/{sessionId}/appium/device/current_activity` | Retrieve the current activity running on the device.
|
||||
GET | `session/{sessionId}/appium/device/current_package` | Retrieve the current package running on the device.
|
||||
POST | `session/{sessionId}/appium/device/install_app` | Install the given app onto the device.
|
||||
|
||||
@@ -355,7 +355,7 @@ export class BaseDriver<
|
||||
const extraCaps = _.difference(_.keys(caps), _.keys(this._desiredCapConstraints));
|
||||
if (extraCaps.length) {
|
||||
this.log.warn(
|
||||
`The following capabilities were provided, but are not ` + `recognized by Appium:`
|
||||
`The following provided capabilities were not recognized by this driver:`
|
||||
);
|
||||
for (const cap of extraCaps) {
|
||||
this.log.warn(` ${cap}`);
|
||||
|
||||
@@ -3,7 +3,7 @@ import path from 'path';
|
||||
import url from 'url';
|
||||
import logger from './logger';
|
||||
import {tempDir, fs, util, zip, timing, node} from '@appium/support';
|
||||
import LRU from 'lru-cache';
|
||||
import { LRUCache } from 'lru-cache';
|
||||
import AsyncLock from 'async-lock';
|
||||
import axios from 'axios';
|
||||
import B from 'bluebird';
|
||||
@@ -20,11 +20,12 @@ const DEFAULT_REQ_HEADERS = Object.freeze({
|
||||
'user-agent': `Appium (BaseDriver v${BASEDRIVER_VER})`,
|
||||
});
|
||||
const AVG_DOWNLOAD_SPEED_MEASUREMENT_THRESHOLD_SEC = 2;
|
||||
const APPLICATIONS_CACHE = new LRU({
|
||||
const APPLICATIONS_CACHE = new LRUCache({
|
||||
max: MAX_CACHED_APPS,
|
||||
ttl: CACHED_APPS_MAX_AGE, // expire after 24 hours
|
||||
updateAgeOnGet: true,
|
||||
dispose: (app, {fullPath}) => {
|
||||
// @ts-ignore The fullPath property exists
|
||||
dispose: ({fullPath}, app) => {
|
||||
logger.info(
|
||||
`The application '${app}' cached at '${fullPath}' has ` +
|
||||
`expired after ${CACHED_APPS_MAX_AGE}ms`
|
||||
@@ -45,7 +46,9 @@ process.on('exit', () => {
|
||||
return;
|
||||
}
|
||||
|
||||
const appPaths = [...APPLICATIONS_CACHE.values()].map(({fullPath}) => fullPath);
|
||||
const appPaths = [...APPLICATIONS_CACHE.values()]
|
||||
// @ts-ignore The fullPath property exists
|
||||
.map(({fullPath}) => fullPath);
|
||||
logger.debug(
|
||||
`Performing cleanup of ${appPaths.length} cached ` +
|
||||
util.pluralize('application', appPaths.length)
|
||||
@@ -140,6 +143,8 @@ async function configureApp(
|
||||
const {protocol, pathname} = url.parse(newApp);
|
||||
const isUrl = protocol === null ? false : ['http:', 'https:'].includes(protocol);
|
||||
|
||||
/** @type {import('@appium/types').CachedAppInfo|undefined} */
|
||||
// @ts-ignore We know the returned type
|
||||
const cachedAppInfo = APPLICATIONS_CACHE.get(app);
|
||||
if (cachedAppInfo) {
|
||||
logger.debug(`Cached app data: ${JSON.stringify(cachedAppInfo, null, 2)}`);
|
||||
@@ -279,7 +284,7 @@ async function configureApp(
|
||||
if (isPackageAFile && shouldUnzipApp && !_.isFunction(onPostProcess)) {
|
||||
const archivePath = newApp;
|
||||
if (packageHash === cachedAppInfo?.packageHash) {
|
||||
const {fullPath} = cachedAppInfo;
|
||||
const fullPath = cachedAppInfo?.fullPath;
|
||||
if (await isAppIntegrityOk(fullPath, cachedAppInfo?.integrity)) {
|
||||
if (archivePath !== app) {
|
||||
await fs.rimraf(archivePath);
|
||||
@@ -362,12 +367,19 @@ async function configureApp(
|
||||
* @returns {Promise<RemoteAppData>}
|
||||
*/
|
||||
async function queryAppLink(appLink, reqHeaders) {
|
||||
const {href} = url.parse(appLink);
|
||||
const {href, auth} = url.parse(appLink);
|
||||
const axiosUrl = auth ? href.replace(`${auth}@`, '') : href;
|
||||
/** @type {import('axios').AxiosBasicCredentials|undefined} */
|
||||
const axiosAuth = auth ? {
|
||||
username: auth.substring(0, auth.indexOf(':')),
|
||||
password: auth.substring(auth.indexOf(':') + 1),
|
||||
} : undefined;
|
||||
/**
|
||||
* @type {import('axios').RawAxiosRequestConfig}
|
||||
*/
|
||||
const requestOpts = {
|
||||
url: href,
|
||||
url: axiosUrl,
|
||||
auth: axiosAuth,
|
||||
responseType: 'stream',
|
||||
timeout: APP_DOWNLOAD_TIMEOUT_MS,
|
||||
validateStatus: (status) =>
|
||||
@@ -382,7 +394,7 @@ async function queryAppLink(appLink, reqHeaders) {
|
||||
status,
|
||||
};
|
||||
} catch (err) {
|
||||
throw new Error(`Cannot download the app from ${href}: ${err.message}`);
|
||||
throw new Error(`Cannot download the app from ${axiosUrl}: ${err.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,19 +1,29 @@
|
||||
import log from './logger';
|
||||
import LRU from 'lru-cache';
|
||||
import { LRUCache } from 'lru-cache';
|
||||
import _ from 'lodash';
|
||||
import {EventEmitter} from 'events';
|
||||
|
||||
const IDEMPOTENT_RESPONSES = new LRU({
|
||||
const IDEMPOTENT_RESPONSES = new LRUCache({
|
||||
max: 64,
|
||||
ttl: 30 * 60 * 1000,
|
||||
updateAgeOnGet: true,
|
||||
updateAgeOnHas: true,
|
||||
dispose: (key, {responseStateListener}) => {
|
||||
responseStateListener.removeAllListeners();
|
||||
// @ts-ignore The value must contain responseStateListener
|
||||
dispose: ({responseStateListener}) => {
|
||||
responseStateListener?.removeAllListeners();
|
||||
}
|
||||
});
|
||||
const MONITORED_METHODS = ['POST', 'PATCH'];
|
||||
const IDEMPOTENCY_KEY_HEADER = 'x-idempotency-key';
|
||||
const MAX_CACHED_PAYLOAD_SIZE_BYTES = 1 * 1024 * 1024; // 1 MiB
|
||||
|
||||
/**
|
||||
* @typedef {Object} CachedResponse
|
||||
* @property {string} method
|
||||
* @property {string} path
|
||||
* @property {Buffer?} response
|
||||
* @property {EventEmitter|null|undefined} responseStateListener
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -33,25 +43,34 @@ function cacheResponse(key, req, res) {
|
||||
response: null,
|
||||
responseStateListener,
|
||||
});
|
||||
const originalSocketWriter = res.socket.write.bind(res.socket);
|
||||
let response = '';
|
||||
const socket = res.socket;
|
||||
const originalSocketWriter = socket.write.bind(socket);
|
||||
const responseRef = new WeakRef(res);
|
||||
let responseChunks = [];
|
||||
let responseSize = 0;
|
||||
let errorMessage = null;
|
||||
const patchedWriter = (chunk, encoding, next) => {
|
||||
if (_.isString(chunk)) {
|
||||
response += chunk;
|
||||
} else if (_.isFunction(chunk.toString)) {
|
||||
response += chunk.toString(_.isString(encoding) ? encoding : undefined);
|
||||
if (errorMessage || !responseRef.deref()) {
|
||||
responseChunks = [];
|
||||
responseSize = 0;
|
||||
return originalSocketWriter(chunk, encoding, next);
|
||||
}
|
||||
|
||||
const buf = Buffer.from(chunk, encoding);
|
||||
responseChunks.push(buf);
|
||||
responseSize += buf.length;
|
||||
if (responseSize > MAX_CACHED_PAYLOAD_SIZE_BYTES) {
|
||||
errorMessage = `The actual response size exceeds ` +
|
||||
`the maximum allowed limit of ${MAX_CACHED_PAYLOAD_SIZE_BYTES} bytes`;
|
||||
}
|
||||
return originalSocketWriter(chunk, encoding, next);
|
||||
};
|
||||
res.socket.write = patchedWriter;
|
||||
let httpErrorMessage = null;
|
||||
let isResponseFullySent = false;
|
||||
res.once('error', (e) => { httpErrorMessage = e.message; });
|
||||
req.once('error', (e) => { httpErrorMessage = e.message; });
|
||||
res.once('finish', () => { isResponseFullySent = true; });
|
||||
res.once('close', () => {
|
||||
if (res.socket?.write === patchedWriter) {
|
||||
res.socket.write = originalSocketWriter;
|
||||
socket.write = patchedWriter;
|
||||
let didEmitReady = false;
|
||||
res.once('error', (e) => {
|
||||
errorMessage = e.message;
|
||||
if (socket.write === patchedWriter) {
|
||||
socket.write = originalSocketWriter;
|
||||
}
|
||||
|
||||
if (!IDEMPOTENT_RESPONSES.has(key)) {
|
||||
@@ -59,24 +78,57 @@ function cacheResponse(key, req, res) {
|
||||
`Could not cache the response identified by '${key}'. ` +
|
||||
`Cache consistency has been damaged`
|
||||
);
|
||||
} else if (httpErrorMessage) {
|
||||
log.info(`Could not cache the response identified by '${key}': ${httpErrorMessage}`);
|
||||
IDEMPOTENT_RESPONSES.delete(key);
|
||||
} else if (!isResponseFullySent) {
|
||||
log.info(
|
||||
`Could not cache the response identified by '${key}', ` +
|
||||
`because it has not been completed`
|
||||
);
|
||||
log.info('Does the client terminate connections too early?');
|
||||
} else {
|
||||
log.info(`Could not cache the response identified by '${key}': ${errorMessage}`);
|
||||
IDEMPOTENT_RESPONSES.delete(key);
|
||||
}
|
||||
|
||||
responseChunks = [];
|
||||
responseSize = 0;
|
||||
if (!didEmitReady) {
|
||||
responseStateListener.emit('ready', null);
|
||||
didEmitReady = true;
|
||||
}
|
||||
});
|
||||
res.once('finish', () => {
|
||||
if (socket.write === patchedWriter) {
|
||||
socket.write = originalSocketWriter;
|
||||
}
|
||||
|
||||
if (!IDEMPOTENT_RESPONSES.has(key)) {
|
||||
log.info(
|
||||
`Could not cache the response identified by '${key}'. ` +
|
||||
`Cache consistency has been damaged`
|
||||
);
|
||||
} else if (errorMessage) {
|
||||
log.info(`Could not cache the response identified by '${key}': ${errorMessage}`);
|
||||
IDEMPOTENT_RESPONSES.delete(key);
|
||||
}
|
||||
|
||||
/** @type {CachedResponse|undefined} */
|
||||
// @ts-ignore The returned type is ok
|
||||
const value = IDEMPOTENT_RESPONSES.get(key);
|
||||
if (value) {
|
||||
value.response = Buffer.from(response, 'utf8');
|
||||
responseStateListener.emit('ready', value.response);
|
||||
} else {
|
||||
responseStateListener.emit('ready', null);
|
||||
value.response = Buffer.concat(responseChunks);
|
||||
}
|
||||
responseChunks = [];
|
||||
responseSize = 0;
|
||||
if (!didEmitReady) {
|
||||
responseStateListener.emit('ready', value?.response ?? null);
|
||||
didEmitReady = true;
|
||||
}
|
||||
});
|
||||
res.once('close', () => {
|
||||
if (socket.write === patchedWriter) {
|
||||
socket.write = originalSocketWriter;
|
||||
}
|
||||
|
||||
if (!didEmitReady) {
|
||||
/** @type {CachedResponse|undefined} */
|
||||
// @ts-ignore The returned type is ok
|
||||
const value = IDEMPOTENT_RESPONSES.get(key);
|
||||
responseStateListener.emit('ready', value?.response ?? null);
|
||||
didEmitReady = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -87,7 +139,7 @@ function cacheResponse(key, req, res) {
|
||||
*/
|
||||
async function handleIdempotency(req, res, next) {
|
||||
const keyOrArr = req.headers[IDEMPOTENCY_KEY_HEADER];
|
||||
if (!keyOrArr) {
|
||||
if (_.isEmpty(keyOrArr) || !keyOrArr) {
|
||||
return next();
|
||||
}
|
||||
|
||||
@@ -105,10 +157,8 @@ async function handleIdempotency(req, res, next) {
|
||||
}
|
||||
|
||||
const {
|
||||
method,
|
||||
path,
|
||||
response,
|
||||
responseStateListener,
|
||||
// @ts-ignore We have asserted the presence of the key above
|
||||
method, path, response, responseStateListener,
|
||||
} = IDEMPOTENT_RESPONSES.get(key);
|
||||
if (req.method !== method || req.path !== path) {
|
||||
log.warn(`Got two different requests with the same idempotency key '${key}'`);
|
||||
|
||||
@@ -27,9 +27,49 @@ import {
|
||||
import B from 'bluebird';
|
||||
import {DEFAULT_BASE_PATH} from '../constants';
|
||||
import {EventEmitter} from 'events';
|
||||
import {fs} from '@appium/support';
|
||||
|
||||
const KEEP_ALIVE_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {import('express').Express} app
|
||||
* @param {Partial<import('@appium/types').ServerArgs>} [cliArgs]
|
||||
* @returns {Promise<http.Server>}
|
||||
*/
|
||||
async function createServer (app, cliArgs) {
|
||||
const {sslCertificatePath, sslKeyPath} = cliArgs ?? {};
|
||||
if (!sslCertificatePath && !sslKeyPath) {
|
||||
return http.createServer(app);
|
||||
}
|
||||
if (!sslCertificatePath || !sslKeyPath) {
|
||||
throw new Error(`Both certificate path and key path must be provided to enable TLS`);
|
||||
}
|
||||
|
||||
const certKey = [sslCertificatePath, sslKeyPath];
|
||||
const zipped = _.zip(
|
||||
await B.all(certKey.map((p) => fs.exists(p))),
|
||||
['certificate', 'key'],
|
||||
certKey,
|
||||
);
|
||||
for (const [exists, desc, p] of zipped) {
|
||||
if (!exists) {
|
||||
throw new Error(`The provided SSL ${desc} at '${p}' does not exist or is not accessible`);
|
||||
}
|
||||
}
|
||||
const [cert, key] = await B.all(certKey.map((p) => fs.readFile(p, 'utf8')));
|
||||
log.debug('Enabling TLS/SPDY on the server using the provided certificate');
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
return require('spdy').createServer({
|
||||
cert,
|
||||
key,
|
||||
spdy: {
|
||||
plain: false,
|
||||
ssl: true,
|
||||
}
|
||||
}, app);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {ServerOpts} opts
|
||||
@@ -48,9 +88,9 @@ async function server(opts) {
|
||||
keepAliveTimeout = KEEP_ALIVE_TIMEOUT_MS,
|
||||
} = opts;
|
||||
|
||||
// create the actual http server
|
||||
const app = express();
|
||||
const httpServer = http.createServer(app);
|
||||
const httpServer = await createServer(app, cliArgs);
|
||||
|
||||
return await new B(async (resolve, reject) => {
|
||||
// we put an async function as the promise constructor because we want some things to happen in
|
||||
// serial (application of plugin updates, for example). But we still need to use a promise here
|
||||
@@ -118,7 +158,6 @@ function configureServer({
|
||||
} else {
|
||||
app.use(allowCrossDomainAsyncExecute(basePath));
|
||||
}
|
||||
// @ts-ignore
|
||||
app.use(handleIdempotency);
|
||||
app.use(fixPythonContentType(basePath));
|
||||
app.use(defaultToJSONContentType);
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
import _ from 'lodash';
|
||||
import {URL} from 'url';
|
||||
import B from 'bluebird';
|
||||
import { pathToRegexp } from 'path-to-regexp';
|
||||
|
||||
const DEFAULT_WS_PATHNAME_PREFIX = '/ws';
|
||||
|
||||
@@ -16,12 +17,12 @@ async function addWebSocketHandler(handlerPathname, handlerServer) {
|
||||
this.on('upgrade', (request, socket, head) => {
|
||||
let currentPathname;
|
||||
try {
|
||||
currentPathname = new URL(/** @type {string} */ (request.url)).pathname;
|
||||
currentPathname = new URL(request.url ?? '').pathname;
|
||||
} catch {
|
||||
currentPathname = request.url;
|
||||
currentPathname = request.url ?? '';
|
||||
}
|
||||
for (const [pathname, wsServer] of _.toPairs(this.webSocketsMapping)) {
|
||||
if (currentPathname === pathname) {
|
||||
if (pathToRegexp(pathname).test(currentPathname)) {
|
||||
wsServer.handleUpgrade(request, socket, head, (ws) => {
|
||||
wsServer.emit('connection', ws, request);
|
||||
});
|
||||
|
||||
@@ -53,7 +53,7 @@ export class NoSuchDriverError extends ProtocolError {
|
||||
message || 'A session is either terminated or not started',
|
||||
NoSuchDriverError.code(),
|
||||
NoSuchDriverError.w3cStatus(),
|
||||
NoSuchDriverError.error()
|
||||
NoSuchDriverError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -77,7 +77,7 @@ export class NoSuchElementError extends ProtocolError {
|
||||
'An element could not be located on the page using the given ' + 'search parameters.',
|
||||
NoSuchElementError.code(),
|
||||
NoSuchElementError.w3cStatus(),
|
||||
NoSuchElementError.error()
|
||||
NoSuchElementError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -103,7 +103,7 @@ export class NoSuchFrameError extends ProtocolError {
|
||||
'the frame could not be found.',
|
||||
NoSuchFrameError.code(),
|
||||
NoSuchFrameError.w3cStatus(),
|
||||
NoSuchFrameError.error()
|
||||
NoSuchFrameError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -130,7 +130,7 @@ export class UnknownCommandError extends ProtocolError {
|
||||
'resource.',
|
||||
UnknownCommandError.code(),
|
||||
UnknownCommandError.w3cStatus(),
|
||||
UnknownCommandError.error()
|
||||
UnknownCommandError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -156,7 +156,7 @@ export class StaleElementReferenceError extends ProtocolError {
|
||||
'longer attached to the DOM.',
|
||||
StaleElementReferenceError.code(),
|
||||
StaleElementReferenceError.w3cStatus(),
|
||||
StaleElementReferenceError.error()
|
||||
StaleElementReferenceError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -181,7 +181,7 @@ export class ElementNotVisibleError extends ProtocolError {
|
||||
'not visible on the page.',
|
||||
ElementNotVisibleError.code(),
|
||||
ElementNotVisibleError.w3cStatus(),
|
||||
ElementNotVisibleError.error()
|
||||
ElementNotVisibleError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -207,7 +207,7 @@ export class InvalidElementStateError extends ProtocolError {
|
||||
'in an invalid state (e.g. attempting to click a disabled element).',
|
||||
InvalidElementStateError.code(),
|
||||
InvalidElementStateError.w3cStatus(),
|
||||
InvalidElementStateError.error()
|
||||
InvalidElementStateError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -252,7 +252,7 @@ export class UnknownMethodError extends ProtocolError {
|
||||
'The requested command matched a known URL but did not match an method for that URL',
|
||||
UnknownMethodError.code(),
|
||||
UnknownMethodError.w3cStatus(),
|
||||
UnknownMethodError.error()
|
||||
UnknownMethodError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -275,7 +275,7 @@ export class UnsupportedOperationError extends ProtocolError {
|
||||
message || 'A server-side error occurred. Command cannot be supported.',
|
||||
UnsupportedOperationError.code(),
|
||||
UnsupportedOperationError.w3cStatus(),
|
||||
UnsupportedOperationError.error()
|
||||
UnsupportedOperationError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -298,7 +298,7 @@ export class ElementIsNotSelectableError extends ProtocolError {
|
||||
message || 'An attempt was made to select an element that cannot be selected.',
|
||||
ElementIsNotSelectableError.code(),
|
||||
ElementIsNotSelectableError.w3cStatus(),
|
||||
ElementIsNotSelectableError.error()
|
||||
ElementIsNotSelectableError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -323,7 +323,7 @@ export class ElementClickInterceptedError extends ProtocolError {
|
||||
'the events is obscuring the element that was requested clicked',
|
||||
ElementClickInterceptedError.code(),
|
||||
ElementClickInterceptedError.w3cStatus(),
|
||||
ElementClickInterceptedError.error()
|
||||
ElementClickInterceptedError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -347,7 +347,7 @@ export class ElementNotInteractableError extends ProtocolError {
|
||||
'A command could not be completed because the element is not pointer- or keyboard interactable',
|
||||
ElementNotInteractableError.code(),
|
||||
ElementNotInteractableError.w3cStatus(),
|
||||
ElementNotInteractableError.error()
|
||||
ElementNotInteractableError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -365,7 +365,7 @@ export class InsecureCertificateError extends ProtocolError {
|
||||
'Navigation caused the user agent to hit a certificate warning, which is usually the result of an expired or invalid TLS certificate',
|
||||
ElementIsNotSelectableError.code(),
|
||||
null,
|
||||
InsecureCertificateError.error()
|
||||
InsecureCertificateError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -388,7 +388,7 @@ export class JavaScriptError extends ProtocolError {
|
||||
message || 'An error occurred while executing user supplied JavaScript.',
|
||||
JavaScriptError.code(),
|
||||
JavaScriptError.w3cStatus(),
|
||||
JavaScriptError.error()
|
||||
JavaScriptError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -411,7 +411,7 @@ export class XPathLookupError extends ProtocolError {
|
||||
message || 'An error occurred while searching for an element by XPath.',
|
||||
XPathLookupError.code(),
|
||||
XPathLookupError.w3cStatus(),
|
||||
XPathLookupError.error()
|
||||
XPathLookupError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -434,7 +434,7 @@ export class TimeoutError extends ProtocolError {
|
||||
message || 'An operation did not complete before its timeout expired.',
|
||||
TimeoutError.code(),
|
||||
TimeoutError.w3cStatus(),
|
||||
TimeoutError.error()
|
||||
TimeoutError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -459,7 +459,7 @@ export class NoSuchWindowError extends ProtocolError {
|
||||
'because the window could not be found.',
|
||||
NoSuchWindowError.code(),
|
||||
NoSuchWindowError.w3cStatus(),
|
||||
NoSuchWindowError.error()
|
||||
NoSuchWindowError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -482,7 +482,7 @@ export class InvalidArgumentError extends ProtocolError {
|
||||
err || 'The arguments passed to the command are either invalid or malformed',
|
||||
InvalidArgumentError.code(),
|
||||
InvalidArgumentError.w3cStatus(),
|
||||
InvalidArgumentError.error()
|
||||
InvalidArgumentError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -507,7 +507,7 @@ export class InvalidCookieDomainError extends ProtocolError {
|
||||
'domain than the current page.',
|
||||
InvalidCookieDomainError.code(),
|
||||
InvalidCookieDomainError.w3cStatus(),
|
||||
InvalidCookieDomainError.error()
|
||||
InvalidCookieDomainError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -531,7 +531,7 @@ export class NoSuchCookieError extends ProtocolError {
|
||||
'No cookie matching the given path name was found amongst the associated cookies of the current browsing context’s active document',
|
||||
NoSuchCookieError.code(),
|
||||
NoSuchCookieError.w3cStatus(),
|
||||
NoSuchCookieError.error()
|
||||
NoSuchCookieError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -554,7 +554,7 @@ export class UnableToSetCookieError extends ProtocolError {
|
||||
err || "A request to set a cookie's value could not be satisfied.",
|
||||
UnableToSetCookieError.code(),
|
||||
UnableToSetCookieError.w3cStatus(),
|
||||
UnableToSetCookieError.error()
|
||||
UnableToSetCookieError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -577,7 +577,7 @@ export class UnexpectedAlertOpenError extends ProtocolError {
|
||||
message || 'A modal dialog was open, blocking this operation',
|
||||
UnexpectedAlertOpenError.code(),
|
||||
UnexpectedAlertOpenError.w3cStatus(),
|
||||
UnexpectedAlertOpenError.error()
|
||||
UnexpectedAlertOpenError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -601,7 +601,7 @@ export class NoAlertOpenError extends ProtocolError {
|
||||
message || 'An attempt was made to operate on a modal dialog when one ' + 'was not open.',
|
||||
NoAlertOpenError.code(),
|
||||
NoAlertOpenError.w3cStatus(),
|
||||
NoAlertOpenError.error()
|
||||
NoAlertOpenError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -626,7 +626,7 @@ export class ScriptTimeoutError extends ProtocolError {
|
||||
err || 'A script did not complete before its timeout expired.',
|
||||
ScriptTimeoutError.code(),
|
||||
ScriptTimeoutError.w3cStatus(),
|
||||
ScriptTimeoutError.error()
|
||||
ScriptTimeoutError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -649,7 +649,7 @@ export class InvalidElementCoordinatesError extends ProtocolError {
|
||||
err || 'The coordinates provided to an interactions operation are invalid.',
|
||||
InvalidElementCoordinatesError.code(),
|
||||
InvalidElementCoordinatesError.w3cStatus(),
|
||||
InvalidElementCoordinatesError.error()
|
||||
InvalidElementCoordinatesError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -674,7 +674,7 @@ export class IMENotAvailableError extends ProtocolError {
|
||||
message || 'IME was not available.',
|
||||
IMENotAvailableError.code(),
|
||||
IMENotAvailableError.w3cStatus(),
|
||||
IMENotAvailableError.error()
|
||||
IMENotAvailableError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -697,7 +697,7 @@ export class IMEEngineActivationFailedError extends ProtocolError {
|
||||
err || 'An IME engine could not be started.',
|
||||
IMEEngineActivationFailedError.code(),
|
||||
IMEEngineActivationFailedError.w3cStatus(),
|
||||
IMEEngineActivationFailedError.error()
|
||||
IMEEngineActivationFailedError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -720,7 +720,7 @@ export class InvalidSelectorError extends ProtocolError {
|
||||
err || 'Argument was an invalid selector (e.g. XPath/CSS).',
|
||||
InvalidSelectorError.code(),
|
||||
InvalidSelectorError.w3cStatus(),
|
||||
InvalidSelectorError.error()
|
||||
InvalidSelectorError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -745,7 +745,7 @@ export class SessionNotCreatedError extends ProtocolError {
|
||||
message,
|
||||
SessionNotCreatedError.code(),
|
||||
SessionNotCreatedError.w3cStatus(),
|
||||
SessionNotCreatedError.error()
|
||||
SessionNotCreatedError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -768,7 +768,7 @@ export class MoveTargetOutOfBoundsError extends ProtocolError {
|
||||
err || 'Target provided for a move action is out of bounds.',
|
||||
MoveTargetOutOfBoundsError.code(),
|
||||
MoveTargetOutOfBoundsError.w3cStatus(),
|
||||
MoveTargetOutOfBoundsError.error()
|
||||
MoveTargetOutOfBoundsError.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -797,7 +797,7 @@ export class InvalidContextError extends ProtocolError {
|
||||
constructor(message) {
|
||||
super(
|
||||
message || 'That command could not be executed in the current context.',
|
||||
InvalidContextError.code()
|
||||
InvalidContextError.code(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -838,29 +838,53 @@ export class UnableToCaptureScreen extends ProtocolError {
|
||||
err || 'A screen capture was made impossible',
|
||||
UnableToCaptureScreen.code(),
|
||||
UnableToCaptureScreen.w3cStatus(),
|
||||
UnableToCaptureScreen.error()
|
||||
UnableToCaptureScreen.error(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function generateBadParametersMessage(requiredParams, actualParams) {
|
||||
const toArray = (/** @type {any} */ x) => (_.isArray(x) ? x : []);
|
||||
|
||||
const requiredParamNames = toArray(requiredParams?.required);
|
||||
const actualParamNames = toArray(actualParams);
|
||||
const missingRequiredParamNames = _.difference(requiredParamNames, actualParamNames);
|
||||
/** @type {string[]} */
|
||||
const resultLines = [];
|
||||
resultLines.push(
|
||||
_.isEmpty(missingRequiredParamNames)
|
||||
? // This should not happen
|
||||
'Some of the provided parameters are not known'
|
||||
: `The following required parameter${
|
||||
missingRequiredParamNames.length === 1 ? ' is ' : 's are '
|
||||
}` + `missing: ${JSON.stringify(missingRequiredParamNames)}`,
|
||||
);
|
||||
if (!_.isEmpty(requiredParamNames)) {
|
||||
resultLines.push(`Known required parameters are: ${JSON.stringify(requiredParamNames)}`);
|
||||
}
|
||||
const optionalParamNames = _.difference(toArray(requiredParams?.optional), ['sessionId', 'id']);
|
||||
if (!_.isEmpty(optionalParamNames)) {
|
||||
resultLines.push(`Known optional parameters are: ${JSON.stringify(optionalParamNames)}`);
|
||||
}
|
||||
resultLines.push(
|
||||
`You have provided${
|
||||
_.isEmpty(actualParamNames) ? ' none' : ': ' + JSON.stringify(actualParams)
|
||||
}`,
|
||||
);
|
||||
return resultLines.join('\n');
|
||||
}
|
||||
|
||||
// Equivalent to W3C InvalidArgumentError
|
||||
export class BadParametersError extends ES6Error {
|
||||
static error() {
|
||||
return 'invalid argument';
|
||||
}
|
||||
constructor(requiredParams, actualParams, errMessage) {
|
||||
let message;
|
||||
if (!errMessage) {
|
||||
message =
|
||||
`Parameters were incorrect. We wanted ` +
|
||||
`${JSON.stringify(requiredParams)} and you ` +
|
||||
`sent ${JSON.stringify(actualParams)}`;
|
||||
} else {
|
||||
message = `Parameters were incorrect. You sent ${JSON.stringify(
|
||||
actualParams
|
||||
)}, ${errMessage}`;
|
||||
}
|
||||
super(message);
|
||||
super(
|
||||
errMessage
|
||||
? `Parameters were incorrect. You sent ${JSON.stringify(actualParams)}, ${errMessage}`
|
||||
: generateBadParametersMessage(requiredParams, actualParams),
|
||||
);
|
||||
this.w3cStatus = HTTPStatusCodes.BAD_REQUEST;
|
||||
}
|
||||
}
|
||||
@@ -909,7 +933,7 @@ export class ProxyRequestError extends ES6Error {
|
||||
return errorFromW3CJsonCode(
|
||||
this.w3c.error,
|
||||
this.w3c.message || this.message,
|
||||
this.w3c.stacktrace
|
||||
this.w3c.stacktrace,
|
||||
);
|
||||
}
|
||||
return new UnknownError(this.message);
|
||||
|
||||
@@ -19,7 +19,7 @@ const CREATE_SESSION_COMMAND = 'createSession';
|
||||
const DELETE_SESSION_COMMAND = 'deleteSession';
|
||||
const GET_STATUS_COMMAND = 'getStatus';
|
||||
|
||||
/** type {Set<string>} */
|
||||
/** @type {Set<string>} */
|
||||
const deprecatedCommandsLogged = new Set();
|
||||
|
||||
function determineProtocol(createSessionArgs) {
|
||||
|
||||
@@ -568,16 +568,6 @@ const METHOD_MAP = /** @type {const} */ ({
|
||||
deprecated: true,
|
||||
},
|
||||
},
|
||||
'/session/:sessionId/appium/device/rotate': {
|
||||
POST: {
|
||||
command: 'mobileRotation',
|
||||
payloadParams: {
|
||||
required: ['x', 'y', 'radius', 'rotation', 'touchCount', 'duration'],
|
||||
optional: ['element'],
|
||||
},
|
||||
deprecated: true,
|
||||
},
|
||||
},
|
||||
'/session/:sessionId/appium/device/current_activity': {
|
||||
GET: {command: 'getCurrentActivity', deprecated: true},
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/base-driver",
|
||||
"version": "9.3.17",
|
||||
"version": "9.4.2",
|
||||
"description": "Base driver class for Appium drivers",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -44,32 +44,36 @@
|
||||
"test:types": "tsd"
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/support": "^4.1.4",
|
||||
"@appium/types": "^0.13.3",
|
||||
"@appium/support": "^4.1.9",
|
||||
"@appium/types": "^0.14.2",
|
||||
"@colors/colors": "1.6.0",
|
||||
"@types/async-lock": "1.4.0",
|
||||
"@types/bluebird": "3.5.38",
|
||||
"@types/express": "4.17.17",
|
||||
"@types/lodash": "4.14.196",
|
||||
"@types/method-override": "0.0.32",
|
||||
"@types/serve-favicon": "2.5.4",
|
||||
"@types/async-lock": "1.4.2",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"@types/express": "4.17.21",
|
||||
"@types/lodash": "4.14.201",
|
||||
"@types/method-override": "0.0.35",
|
||||
"@types/serve-favicon": "2.5.7",
|
||||
"async-lock": "1.4.0",
|
||||
"asyncbox": "2.9.4",
|
||||
"axios": "1.4.0",
|
||||
"asyncbox": "3.0.0",
|
||||
"axios": "1.6.1",
|
||||
"bluebird": "3.7.2",
|
||||
"body-parser": "1.20.2",
|
||||
"es6-error": "4.1.1",
|
||||
"express": "4.18.2",
|
||||
"http-status-codes": "2.2.0",
|
||||
"http-status-codes": "2.3.0",
|
||||
"lodash": "4.17.21",
|
||||
"lru-cache": "7.18.3",
|
||||
"lru-cache": "10.0.1",
|
||||
"method-override": "3.0.0",
|
||||
"morgan": "1.10.0",
|
||||
"path-to-regexp": "6.2.1",
|
||||
"serve-favicon": "2.5.0",
|
||||
"source-map-support": "0.5.21",
|
||||
"type-fest": "3.13.1",
|
||||
"validate.js": "0.13.1"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"spdy": "4.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
"npm": ">=8"
|
||||
|
||||
@@ -3,8 +3,19 @@ import axios from 'axios';
|
||||
import {createSandbox} from 'sinon';
|
||||
import B from 'bluebird';
|
||||
import _ from 'lodash';
|
||||
import { exec } from 'teen_process';
|
||||
import https from 'node:https';
|
||||
import {TEST_HOST, getTestPort} from '@appium/driver-test-support';
|
||||
|
||||
async function generateCertificate (certPath, keyPath) {
|
||||
await exec('openssl', [
|
||||
'req', '-nodes', '-new', '-x509',
|
||||
'-keyout', keyPath,
|
||||
'-out', certPath,
|
||||
'-subj', '/C=US/ST=State/L=City/O=company/OU=Com/CN=www.testserver.local',
|
||||
]);
|
||||
}
|
||||
|
||||
describe('server', function () {
|
||||
let hwServer;
|
||||
let port;
|
||||
@@ -96,6 +107,61 @@ describe('server', function () {
|
||||
});
|
||||
});
|
||||
|
||||
describe('tls server', function () {
|
||||
let hwServer;
|
||||
let port;
|
||||
let certPath = 'certificate.cert';
|
||||
let keyPath = 'certificate.key';
|
||||
const looseClient = axios.create({
|
||||
httpsAgent: new https.Agent({
|
||||
rejectUnauthorized: false
|
||||
})
|
||||
});
|
||||
|
||||
before(async function () {
|
||||
try {
|
||||
await generateCertificate(certPath, keyPath);
|
||||
} catch (e) {
|
||||
if (process.env.CI) {
|
||||
throw e;
|
||||
}
|
||||
return this.skip();
|
||||
}
|
||||
|
||||
port = await getTestPort(true);
|
||||
|
||||
function configureRoutes(app) {
|
||||
app.get('/', (req, res) => {
|
||||
res.header['content-type'] = 'text/html';
|
||||
res.status(200).send('Hello World!');
|
||||
});
|
||||
}
|
||||
|
||||
hwServer = await server({
|
||||
routeConfiguringFunction: configureRoutes,
|
||||
cliArgs: {
|
||||
sslCertificatePath: certPath,
|
||||
sslKeyPath: keyPath,
|
||||
},
|
||||
port,
|
||||
});
|
||||
});
|
||||
after(async function () {
|
||||
await hwServer.close();
|
||||
});
|
||||
|
||||
it('should start up with our middleware', async function () {
|
||||
const {data} = await looseClient.get(`https://${TEST_HOST}:${port}/`);
|
||||
data.should.eql('Hello World!');
|
||||
});
|
||||
it('should throw if untrusted', async function () {
|
||||
await axios.get(`https://${TEST_HOST}:${port}/`).should.eventually.be.rejected;
|
||||
});
|
||||
it('should throw if not secure', async function () {
|
||||
await axios.get(`http://${TEST_HOST}:${port}/`).should.eventually.be.rejected;
|
||||
});
|
||||
});
|
||||
|
||||
describe('server plugins', function () {
|
||||
let hwServer;
|
||||
let port;
|
||||
|
||||
@@ -428,7 +428,7 @@ describe('Protocol', function () {
|
||||
status.should.equal(400);
|
||||
|
||||
const {error: w3cError, message, stacktrace} = data.value;
|
||||
message.should.match(/Parameters were incorrect/);
|
||||
message.should.match(/following required parameter/);
|
||||
stacktrace.should.match(/protocol.js/);
|
||||
w3cError.should.be.a.string;
|
||||
w3cError.should.equal(errors.InvalidArgumentError.error());
|
||||
|
||||
@@ -35,7 +35,7 @@ describe('Protocol', function () {
|
||||
}
|
||||
let hash = shasum.digest('hex').substring(0, 8);
|
||||
// Modify the hash whenever the protocol has intentionally been modified.
|
||||
hash.should.equal('484810b0');
|
||||
hash.should.equal('6e93ad90');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -3,6 +3,54 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [2.2.23](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.22...@appium/base-plugin@2.2.23) (2023-11-14)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.2.22](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.21...@appium/base-plugin@2.2.22) (2023-10-19)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.2.21](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.20...@appium/base-plugin@2.2.21) (2023-10-18)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.2.20](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.19...@appium/base-plugin@2.2.20) (2023-08-23)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.2.19](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.18...@appium/base-plugin@2.2.19) (2023-08-22)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.2.18](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.17...@appium/base-plugin@2.2.18) (2023-08-21)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.2.17](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.16...@appium/base-plugin@2.2.17) (2023-08-17)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/base-plugin",
|
||||
"version": "2.2.17",
|
||||
"version": "2.2.23",
|
||||
"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.3.17",
|
||||
"@appium/support": "^4.1.4"
|
||||
"@appium/base-driver": "^9.4.2",
|
||||
"@appium/support": "^4.1.9"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
|
||||
@@ -3,6 +3,91 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [2.0.28](https://github.com/appium/appium/compare/@appium/doctor@2.0.27...@appium/doctor@2.0.28) (2023-11-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **doctor:** update dependency appium-adb to v11.0.3 ([ee1df47](https://github.com/appium/appium/commit/ee1df47b172009717b81cce7b3465219791b1f97))
|
||||
* **doctor:** update dependency appium-adb to v11.0.5 ([#19362](https://github.com/appium/appium/issues/19362)) ([b82f13b](https://github.com/appium/appium/commit/b82f13b893c44bcaf9908a9ebe96d3bb51c1f6b3))
|
||||
* **doctor:** update dependency appium-adb to v11.0.6 ([c2f543f](https://github.com/appium/appium/commit/c2f543fc1009067141bc6cf50a2d0e47f1a455b2))
|
||||
* **doctor:** update dependency appium-adb to v11.0.7 ([261cfc8](https://github.com/appium/appium/commit/261cfc8694f9eeab774712e67bbf46e72615efa7))
|
||||
* **support:** update definitelytyped ([5ae8df3](https://github.com/appium/appium/commit/5ae8df3c36c7f03fbf3420087b532086f6742348))
|
||||
* **support:** update dependency teen_process to v2.0.57 ([1fbd503](https://github.com/appium/appium/commit/1fbd503a66b965a9b32bbb6702062861a8480333))
|
||||
* **support:** update dependency teen_process to v2.0.63 ([fa57192](https://github.com/appium/appium/commit/fa571925b7ac980cc99c8d23f659420eacd8546c))
|
||||
* **support:** update dependency teen_process to v2.0.64 ([332bb59](https://github.com/appium/appium/commit/332bb59ee3fdd14c03f6b3c4fd6587a30319d568))
|
||||
* **support:** update dependency teen_process to v2.0.66 ([3205b5d](https://github.com/appium/appium/commit/3205b5d06f073f1e5c7735c6e36ad08fdf091182))
|
||||
* **support:** update dependency teen_process to v2.0.67 ([3b5ae2a](https://github.com/appium/appium/commit/3b5ae2ab17c74c9890b53c081aec146152f11c7a))
|
||||
* **support:** update dependency teen_process to v2.0.73 ([8e453be](https://github.com/appium/appium/commit/8e453bed3f440c1dcf82f016f7d4431365b9cdff))
|
||||
* **support:** update dependency teen_process to v2.0.75 ([fbb6fd9](https://github.com/appium/appium/commit/fbb6fd9a2780eb00c15584abeaf644a1fcdecb4d))
|
||||
* **support:** update teen_process-related packages ([84d96db](https://github.com/appium/appium/commit/84d96dbae45dfe56218d32330f8ff2d26b750fb7))
|
||||
* **support:** update teen_process-related packages ([3d0b97c](https://github.com/appium/appium/commit/3d0b97cae76c616da0aea5b92cebcd38d59263b7))
|
||||
|
||||
|
||||
|
||||
## [2.0.27](https://github.com/appium/appium/compare/@appium/doctor@2.0.26...@appium/doctor@2.0.27) (2023-10-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **doctor:** update dependency appium-adb to v11 ([#19321](https://github.com/appium/appium/issues/19321)) ([408885a](https://github.com/appium/appium/commit/408885a5b28f8691dbbb3716f3c1a409d662275b))
|
||||
* **support:** update definitelytyped ([a306ce7](https://github.com/appium/appium/commit/a306ce741a806d21bc44f3b979803b8af5da99aa))
|
||||
|
||||
|
||||
|
||||
## [2.0.26](https://github.com/appium/appium/compare/@appium/doctor@2.0.25...@appium/doctor@2.0.26) (2023-10-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **doctor:** update dependency appium-adb to v10 ([#19308](https://github.com/appium/appium/issues/19308)) ([3315671](https://github.com/appium/appium/commit/33156712b142b1cb2ffdcf1cfdf65f5b504e7751))
|
||||
* **doctor:** update dependency appium-adb to v9.14.10 ([809b2da](https://github.com/appium/appium/commit/809b2daea5304942c849b7015f0a74447fb7b57c))
|
||||
* **doctor:** update dependency appium-adb to v9.14.11 ([c81e99f](https://github.com/appium/appium/commit/c81e99fd80739d97b3dc2099a43cc66245035bc5))
|
||||
* **doctor:** update dependency appium-adb to v9.14.12 ([0220a9f](https://github.com/appium/appium/commit/0220a9f8e9a890f84031cfeaea026fceb0a303e9))
|
||||
* **doctor:** update dependency appium-adb to v9.14.7 ([#19058](https://github.com/appium/appium/issues/19058)) ([f8039a7](https://github.com/appium/appium/commit/f8039a70ca851dcc120a2b217e14e3e3b922ba21))
|
||||
* **doctor:** update dependency appium-adb to v9.14.9 ([9f700bf](https://github.com/appium/appium/commit/9f700bfdf9e09de3cea9f81029fadef84b8e956b))
|
||||
* **opencv:** update definitelytyped ([d2a9a99](https://github.com/appium/appium/commit/d2a9a99418af9ce9b569bb9b98ee396faab932bb))
|
||||
* **support:** update definitelytyped ([b6a76ce](https://github.com/appium/appium/commit/b6a76ce91e2765c22f84e389b93f780e0b4490c0))
|
||||
* **support:** update dependency @types/teen_process to v2.0.1 ([d2f19aa](https://github.com/appium/appium/commit/d2f19aab935cc6ec00a51f042b5f02674a772198))
|
||||
* **support:** update dependency teen_process to v2.0.10 ([bc1b56a](https://github.com/appium/appium/commit/bc1b56a3c162ed8686d3d7956c30eb1f7682b1a7))
|
||||
* **support:** update dependency teen_process to v2.0.12 ([c5d6df7](https://github.com/appium/appium/commit/c5d6df7a000d64e8591a56ce5ef65baa2071a36b))
|
||||
* **support:** update dependency teen_process to v2.0.13 ([a0c4b84](https://github.com/appium/appium/commit/a0c4b84fb7d3977b7a4ca0a07fadd49ee355791a))
|
||||
* **support:** update dependency teen_process to v2.0.18 ([ffeebc7](https://github.com/appium/appium/commit/ffeebc74b72e5eadf658325e67708ae6ed5b8346))
|
||||
* **support:** update dependency teen_process to v2.0.19 ([2ef40fe](https://github.com/appium/appium/commit/2ef40febdc717f54ea618ecfe1058b858fe2daf9))
|
||||
* **support:** update dependency teen_process to v2.0.23 ([1b0459e](https://github.com/appium/appium/commit/1b0459edd656514d8706aab8e21cd4d40de2ec5d))
|
||||
* **support:** update dependency teen_process to v2.0.24 ([bc72c66](https://github.com/appium/appium/commit/bc72c6676a5412b60e74bb143a223738ce059977))
|
||||
* **support:** update dependency teen_process to v2.0.27 ([03b2aa6](https://github.com/appium/appium/commit/03b2aa6b6e45fa0ea24c4691b039255bc4399733))
|
||||
* **support:** update dependency teen_process to v2.0.30 ([7cdb142](https://github.com/appium/appium/commit/7cdb1429a1104ad3699547f2a2dd9b237135891a))
|
||||
* **support:** update dependency teen_process to v2.0.34 ([#19218](https://github.com/appium/appium/issues/19218)) ([c28fcef](https://github.com/appium/appium/commit/c28fcefa725fbce5a0464e57946051e3cb023d85))
|
||||
* **support:** update dependency teen_process to v2.0.37 ([6d894be](https://github.com/appium/appium/commit/6d894bef6f377ebfdffdeb1adde7a72624844414))
|
||||
* **support:** update dependency teen_process to v2.0.38 ([a32dc11](https://github.com/appium/appium/commit/a32dc1110125d0f1fac9c66c17f1309145a634c7))
|
||||
* **support:** update dependency teen_process to v2.0.40 ([2837bcd](https://github.com/appium/appium/commit/2837bcdeb19532fe973a2902db5c8d730252d962))
|
||||
* **support:** update dependency teen_process to v2.0.41 ([1a34396](https://github.com/appium/appium/commit/1a34396339f71d40353d323feaf78afcf2269fc9))
|
||||
* **support:** update dependency teen_process to v2.0.42 ([e2a670e](https://github.com/appium/appium/commit/e2a670e1c4a0f061b0bfb08a6b534d9deb7bdd9c))
|
||||
* **support:** update dependency teen_process to v2.0.45 ([ea731bf](https://github.com/appium/appium/commit/ea731bf117d680496fce453ac42cfee7f05ada60))
|
||||
* **support:** update dependency teen_process to v2.0.48 ([eebc651](https://github.com/appium/appium/commit/eebc651f31c282baa7e77a6384d3ee8efc0072d6))
|
||||
* **support:** update dependency teen_process to v2.0.50 ([ca3e5d9](https://github.com/appium/appium/commit/ca3e5d90e4c51fc1dda32154e1d77e65cb44fb54))
|
||||
* **support:** update dependency teen_process to v2.0.9 ([6c7f3ef](https://github.com/appium/appium/commit/6c7f3ef670d441bdc4b693948a19dcbdc54e4764))
|
||||
|
||||
|
||||
|
||||
## [2.0.25](https://github.com/appium/appium/compare/@appium/doctor@2.0.24...@appium/doctor@2.0.25) (2023-08-22)
|
||||
|
||||
**Note:** Version bump only for package @appium/doctor
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.0.24](https://github.com/appium/appium/compare/@appium/doctor@2.0.23...@appium/doctor@2.0.24) (2023-08-21)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **doctor:** update dependency appium-adb to v9.14.5 ([d5f3a28](https://github.com/appium/appium/commit/d5f3a288c2497d4020b7eabc667814744e69ac48))
|
||||
|
||||
|
||||
|
||||
## [2.0.23](https://github.com/appium/appium/compare/@appium/doctor@2.0.22...@appium/doctor@2.0.23) (2023-08-17)
|
||||
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ class AndroidToolCheck extends DoctorCheck {
|
||||
const sdkRoot = getSdkRootFromEnv();
|
||||
if (!sdkRoot) {
|
||||
return nok(
|
||||
`${listOfTools} could not be found because ANDROID_HOME or ANDROID_SDK_ROOT is NOT set!`
|
||||
`${listOfTools} could not be found because ANDROID_HOME is NOT set!`
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ import {exec} from 'teen_process';
|
||||
import {DoctorCheck} from './doctor';
|
||||
import NodeDetector from './node-detector';
|
||||
import {util, env} from '@appium/support';
|
||||
import {EOL} from 'os';
|
||||
import '@colors/colors';
|
||||
|
||||
/**
|
||||
|
||||
@@ -155,7 +155,7 @@ class OptionalApplesimutilsCommandCheck extends DoctorCheck {
|
||||
async fix() {
|
||||
return `Why ${
|
||||
'applesimutils'.bold
|
||||
} is needed and how to install it: http://appium.io/docs/en/drivers/ios-xcuitest/`;
|
||||
} is needed and how to install it: https://github.com/appium/appium-xcuitest-driver/blob/master/docs/execute-methods.md#mobile-setpermission`;
|
||||
}
|
||||
}
|
||||
checks.push(new OptionalApplesimutilsCommandCheck());
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/doctor",
|
||||
"version": "2.0.23",
|
||||
"version": "2.0.28",
|
||||
"description": "Test environment for fitness to run Appium",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -44,16 +44,16 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/support": "^4.1.4",
|
||||
"@appium/support": "^4.1.9",
|
||||
"@colors/colors": "1.6.0",
|
||||
"@types/bluebird": "3.5.38",
|
||||
"@types/teen_process": "2.0.0",
|
||||
"appium-adb": "9.14.4",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"@types/teen_process": "2.0.3",
|
||||
"appium-adb": "11.0.7",
|
||||
"bluebird": "3.7.2",
|
||||
"inquirer": "8.2.6",
|
||||
"lodash": "4.17.21",
|
||||
"source-map-support": "0.5.21",
|
||||
"teen_process": "2.0.4",
|
||||
"teen_process": "2.0.84",
|
||||
"yargs": "17.7.2"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -92,7 +92,7 @@ describe('android', function () {
|
||||
(await check.diagnose()).should.deep.equal({
|
||||
ok: false,
|
||||
optional: false,
|
||||
message: `adb, emulator, ${apkAnalyzerFilename} could not be found because ANDROID_HOME or ANDROID_SDK_ROOT is NOT set!`,
|
||||
message: `adb, emulator, ${apkAnalyzerFilename} could not be found because ANDROID_HOME is NOT set!`,
|
||||
});
|
||||
});
|
||||
it('diagnose - failure - path not valid', async function () {
|
||||
|
||||
@@ -346,7 +346,7 @@ describe('ios', function () {
|
||||
});
|
||||
it('fix', async function () {
|
||||
removeColors(await check.fix()).should.equal(
|
||||
'Why applesimutils is needed and how to install it: http://appium.io/docs/en/drivers/ios-xcuitest/'
|
||||
'Why applesimutils is needed and how to install it: https://github.com/appium/appium-xcuitest-driver/blob/master/docs/execute-methods.md#mobile-setpermission'
|
||||
);
|
||||
});
|
||||
})
|
||||
|
||||
@@ -3,6 +3,87 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [0.4.12](https://github.com/appium/appium/compare/@appium/docutils@0.4.11...@appium/docutils@0.4.12) (2023-11-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **docutils:** update dependency yaml to v2.3.4 ([a215a89](https://github.com/appium/appium/commit/a215a89f684c50da24d669d60a73fb6268b05c7f))
|
||||
* **support:** update definitelytyped ([#19326](https://github.com/appium/appium/issues/19326)) ([9840315](https://github.com/appium/appium/commit/98403151f86665d723bf887e907825bbc4cc2d3d))
|
||||
* **support:** update dependency teen_process to v2.0.57 ([1fbd503](https://github.com/appium/appium/commit/1fbd503a66b965a9b32bbb6702062861a8480333))
|
||||
* **support:** update dependency teen_process to v2.0.63 ([fa57192](https://github.com/appium/appium/commit/fa571925b7ac980cc99c8d23f659420eacd8546c))
|
||||
* **support:** update dependency teen_process to v2.0.64 ([332bb59](https://github.com/appium/appium/commit/332bb59ee3fdd14c03f6b3c4fd6587a30319d568))
|
||||
* **support:** update dependency teen_process to v2.0.66 ([3205b5d](https://github.com/appium/appium/commit/3205b5d06f073f1e5c7735c6e36ad08fdf091182))
|
||||
* **support:** update dependency teen_process to v2.0.67 ([3b5ae2a](https://github.com/appium/appium/commit/3b5ae2ab17c74c9890b53c081aec146152f11c7a))
|
||||
* **support:** update dependency teen_process to v2.0.73 ([8e453be](https://github.com/appium/appium/commit/8e453bed3f440c1dcf82f016f7d4431365b9cdff))
|
||||
* **support:** update dependency teen_process to v2.0.75 ([fbb6fd9](https://github.com/appium/appium/commit/fbb6fd9a2780eb00c15584abeaf644a1fcdecb4d))
|
||||
* **support:** update teen_process-related packages ([84d96db](https://github.com/appium/appium/commit/84d96dbae45dfe56218d32330f8ff2d26b750fb7))
|
||||
* **support:** update teen_process-related packages ([3d0b97c](https://github.com/appium/appium/commit/3d0b97cae76c616da0aea5b92cebcd38d59263b7))
|
||||
|
||||
|
||||
|
||||
## [0.4.11](https://github.com/appium/appium/compare/@appium/docutils@0.4.10...@appium/docutils@0.4.11) (2023-10-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Make sure type definitions are always in sync across modules ([#19323](https://github.com/appium/appium/issues/19323)) ([de39013](https://github.com/appium/appium/commit/de39013ae501d4fc11988435737efb862cc1d820))
|
||||
|
||||
|
||||
|
||||
## [0.4.10](https://github.com/appium/appium/compare/@appium/docutils@0.4.9...@appium/docutils@0.4.10) (2023-10-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **docutils:** update dependency yaml to v2.3.2 ([1a3d408](https://github.com/appium/appium/commit/1a3d408e239e4a9a7070923a90aca70df1dda908))
|
||||
* **docutils:** update dependency yaml to v2.3.3 ([caf600b](https://github.com/appium/appium/commit/caf600bffd5f25971d0270e9990b2640a671e366))
|
||||
* **support:** update dependency teen_process to v2.0.10 ([bc1b56a](https://github.com/appium/appium/commit/bc1b56a3c162ed8686d3d7956c30eb1f7682b1a7))
|
||||
* **support:** update dependency teen_process to v2.0.12 ([c5d6df7](https://github.com/appium/appium/commit/c5d6df7a000d64e8591a56ce5ef65baa2071a36b))
|
||||
* **support:** update dependency teen_process to v2.0.13 ([a0c4b84](https://github.com/appium/appium/commit/a0c4b84fb7d3977b7a4ca0a07fadd49ee355791a))
|
||||
* **support:** update dependency teen_process to v2.0.18 ([ffeebc7](https://github.com/appium/appium/commit/ffeebc74b72e5eadf658325e67708ae6ed5b8346))
|
||||
* **support:** update dependency teen_process to v2.0.19 ([2ef40fe](https://github.com/appium/appium/commit/2ef40febdc717f54ea618ecfe1058b858fe2daf9))
|
||||
* **support:** update dependency teen_process to v2.0.23 ([1b0459e](https://github.com/appium/appium/commit/1b0459edd656514d8706aab8e21cd4d40de2ec5d))
|
||||
* **support:** update dependency teen_process to v2.0.24 ([bc72c66](https://github.com/appium/appium/commit/bc72c6676a5412b60e74bb143a223738ce059977))
|
||||
* **support:** update dependency teen_process to v2.0.27 ([03b2aa6](https://github.com/appium/appium/commit/03b2aa6b6e45fa0ea24c4691b039255bc4399733))
|
||||
* **support:** update dependency teen_process to v2.0.30 ([7cdb142](https://github.com/appium/appium/commit/7cdb1429a1104ad3699547f2a2dd9b237135891a))
|
||||
* **support:** update dependency teen_process to v2.0.34 ([#19218](https://github.com/appium/appium/issues/19218)) ([c28fcef](https://github.com/appium/appium/commit/c28fcefa725fbce5a0464e57946051e3cb023d85))
|
||||
* **support:** update dependency teen_process to v2.0.37 ([6d894be](https://github.com/appium/appium/commit/6d894bef6f377ebfdffdeb1adde7a72624844414))
|
||||
* **support:** update dependency teen_process to v2.0.38 ([a32dc11](https://github.com/appium/appium/commit/a32dc1110125d0f1fac9c66c17f1309145a634c7))
|
||||
* **support:** update dependency teen_process to v2.0.40 ([2837bcd](https://github.com/appium/appium/commit/2837bcdeb19532fe973a2902db5c8d730252d962))
|
||||
* **support:** update dependency teen_process to v2.0.41 ([1a34396](https://github.com/appium/appium/commit/1a34396339f71d40353d323feaf78afcf2269fc9))
|
||||
* **support:** update dependency teen_process to v2.0.42 ([e2a670e](https://github.com/appium/appium/commit/e2a670e1c4a0f061b0bfb08a6b534d9deb7bdd9c))
|
||||
* **support:** update dependency teen_process to v2.0.45 ([ea731bf](https://github.com/appium/appium/commit/ea731bf117d680496fce453ac42cfee7f05ada60))
|
||||
* **support:** update dependency teen_process to v2.0.48 ([eebc651](https://github.com/appium/appium/commit/eebc651f31c282baa7e77a6384d3ee8efc0072d6))
|
||||
* **support:** update dependency teen_process to v2.0.50 ([ca3e5d9](https://github.com/appium/appium/commit/ca3e5d90e4c51fc1dda32154e1d77e65cb44fb54))
|
||||
* **support:** update dependency teen_process to v2.0.9 ([6c7f3ef](https://github.com/appium/appium/commit/6c7f3ef670d441bdc4b693948a19dcbdc54e4764))
|
||||
|
||||
|
||||
|
||||
## [0.4.9](https://github.com/appium/appium/compare/@appium/docutils@0.4.8...@appium/docutils@0.4.9) (2023-08-23)
|
||||
|
||||
**Note:** Version bump only for package @appium/docutils
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.4.8](https://github.com/appium/appium/compare/@appium/docutils@0.4.7...@appium/docutils@0.4.8) (2023-08-22)
|
||||
|
||||
**Note:** Version bump only for package @appium/docutils
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.4.7](https://github.com/appium/appium/compare/@appium/docutils@0.4.6...@appium/docutils@0.4.7) (2023-08-21)
|
||||
|
||||
**Note:** Version bump only for package @appium/docutils
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.4.6](https://github.com/appium/appium/compare/@appium/docutils@0.4.5...@appium/docutils@0.4.6) (2023-08-17)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/docutils",
|
||||
"version": "0.4.6",
|
||||
"version": "0.4.12",
|
||||
"description": "Documentation generation utilities for Appium and related projects",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -49,11 +49,11 @@
|
||||
"start": "node ./build/lib/cli/index.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/support": "^4.1.4",
|
||||
"@appium/tsconfig": "^0.3.0",
|
||||
"@appium/typedoc-plugin-appium": "^0.6.6",
|
||||
"@appium/support": "^4.1.9",
|
||||
"@appium/tsconfig": "^0.x",
|
||||
"@appium/typedoc-plugin-appium": "^0.x",
|
||||
"@sliphua/lilconfig-ts-loader": "3.2.2",
|
||||
"@types/which": "3.0.0",
|
||||
"@types/which": "3.0.1",
|
||||
"chalk": "4.1.2",
|
||||
"consola": "2.15.3",
|
||||
"diff": "5.1.0",
|
||||
@@ -67,13 +67,13 @@
|
||||
"read-pkg": "5.2.0",
|
||||
"semver": "7.5.4",
|
||||
"source-map-support": "0.5.21",
|
||||
"teen_process": "2.0.4",
|
||||
"teen_process": "2.0.84",
|
||||
"type-fest": "3.13.1",
|
||||
"typedoc": "0.23.28",
|
||||
"typedoc-plugin-markdown": "3.14.0",
|
||||
"typedoc-plugin-resolve-crossmodule-references": "0.3.3",
|
||||
"typescript": "4.9.5",
|
||||
"yaml": "2.3.1",
|
||||
"typescript": "5.0.4",
|
||||
"yaml": "2.3.4",
|
||||
"yargs": "17.7.2",
|
||||
"yargs-parser": "21.1.1"
|
||||
},
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
mkdocs==1.5.2
|
||||
mkdocs-material==9.1.21
|
||||
mkdocs-material-extensions==1.1.1
|
||||
mkdocs==1.5.3
|
||||
mkdocs-material==9.4.8
|
||||
mkdocs-material-extensions==1.3
|
||||
mike==1.1.2
|
||||
|
||||
@@ -3,6 +3,61 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [0.4.17](https://github.com/appium/appium/compare/@appium/driver-test-support@0.4.16...@appium/driver-test-support@0.4.17) (2023-11-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update definitelytyped ([5ae8df3](https://github.com/appium/appium/commit/5ae8df3c36c7f03fbf3420087b532086f6742348))
|
||||
* **support:** update dependency axios to v1.6.0 ([699c493](https://github.com/appium/appium/commit/699c49306c38e222d618a9611482b06a3e6806aa))
|
||||
* **support:** update dependency axios to v1.6.1 ([9b14205](https://github.com/appium/appium/commit/9b14205288ef09fd4a1144fc93c82b2bb2ed2ec0))
|
||||
|
||||
|
||||
|
||||
## [0.4.16](https://github.com/appium/appium/compare/@appium/driver-test-support@0.4.15...@appium/driver-test-support@0.4.16) (2023-10-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Make sure type definitions are always in sync across modules ([#19323](https://github.com/appium/appium/issues/19323)) ([de39013](https://github.com/appium/appium/commit/de39013ae501d4fc11988435737efb862cc1d820))
|
||||
* **support:** update definitelytyped ([a306ce7](https://github.com/appium/appium/commit/a306ce741a806d21bc44f3b979803b8af5da99aa))
|
||||
* **test-support:** update dependency sinon to v16.1.3 ([aaa7668](https://github.com/appium/appium/commit/aaa7668ae6d58f1ac6a5af957b9b214ee71c6a48))
|
||||
|
||||
|
||||
|
||||
## [0.4.15](https://github.com/appium/appium/compare/@appium/driver-test-support@0.4.14...@appium/driver-test-support@0.4.15) (2023-10-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **driver-test-support:** update dependency @types/lodash to v4.14.198 ([84fefd2](https://github.com/appium/appium/commit/84fefd214c40408cbbcd145723b5d8dbeec665af))
|
||||
* **driver-test-support:** update dependency chai to v4.3.10 ([7a06ec5](https://github.com/appium/appium/commit/7a06ec5041e0ca4f6bf1ed9c771cb722dd707dc4))
|
||||
* **driver-test-support:** update dependency chai to v4.3.8 ([#19059](https://github.com/appium/appium/issues/19059)) ([d85b216](https://github.com/appium/appium/commit/d85b2161b5b8ac8654e25c2f357de50a7068d8e1))
|
||||
* **support:** update definitelytyped ([595d460](https://github.com/appium/appium/commit/595d460ac8dc41d310f9e4f653acbad3c7fd50b9))
|
||||
* **support:** update dependency axios to v1.5.0 ([08913cd](https://github.com/appium/appium/commit/08913cddde295f616f0fb376cc2cb71a9409a253))
|
||||
* **support:** update dependency axios to v1.5.1 ([#19217](https://github.com/appium/appium/issues/19217)) ([3df047d](https://github.com/appium/appium/commit/3df047d128d5d032826c8f5fb605b019078b717d))
|
||||
* **test-support:** update dependency sinon to v16 ([#19161](https://github.com/appium/appium/issues/19161)) ([49b3434](https://github.com/appium/appium/commit/49b3434c2bc324b5dc9f8204242c12f04b5252af))
|
||||
* **test-support:** update dependency sinon to v16.1.0 ([126daec](https://github.com/appium/appium/commit/126daeca4e600b75cf37f9fc15a1b6e563058b3c))
|
||||
|
||||
|
||||
|
||||
## [0.4.14](https://github.com/appium/appium/compare/@appium/driver-test-support@0.4.13...@appium/driver-test-support@0.4.14) (2023-08-22)
|
||||
|
||||
**Note:** Version bump only for package @appium/driver-test-support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.4.13](https://github.com/appium/appium/compare/@appium/driver-test-support@0.4.12...@appium/driver-test-support@0.4.13) (2023-08-21)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **driver-test-support:** update dependency @types/lodash to v4.14.197 ([a080b72](https://github.com/appium/appium/commit/a080b729208b4e3c352456f0f230b63b0b7ee9ee))
|
||||
|
||||
|
||||
|
||||
## [0.4.12](https://github.com/appium/appium/compare/@appium/driver-test-support@0.4.11...@appium/driver-test-support@0.4.12) (2023-08-17)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/driver-test-support",
|
||||
"version": "0.4.12",
|
||||
"version": "0.4.17",
|
||||
"description": "Test utilities for Appium drivers",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -41,15 +41,15 @@
|
||||
},
|
||||
"types": "./build/lib/index.d.ts",
|
||||
"dependencies": {
|
||||
"@appium/types": "^0.13.3",
|
||||
"@types/lodash": "4.14.196",
|
||||
"@types/stoppable": "1.1.1",
|
||||
"axios": "1.4.0",
|
||||
"@appium/types": "^0.14.2",
|
||||
"@types/lodash": "4.14.201",
|
||||
"@types/stoppable": "1.1.3",
|
||||
"axios": "1.6.1",
|
||||
"bluebird": "3.7.2",
|
||||
"chai": "4.3.7",
|
||||
"chai": "4.3.10",
|
||||
"get-port": "5.1.1",
|
||||
"lodash": "4.17.21",
|
||||
"sinon": "15.2.0",
|
||||
"sinon": "16.1.3",
|
||||
"source-map-support": "0.5.21",
|
||||
"stoppable": "1.1.0",
|
||||
"type-fest": "3.13.1"
|
||||
|
||||
@@ -3,6 +3,14 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.3.1](https://github.com/appium/appium/compare/@appium/eslint-config-appium-ts@0.3.0...@appium/eslint-config-appium-ts@0.3.1) (2023-04-03)
|
||||
|
||||
**Note:** Version bump only for package @appium/eslint-config-appium-ts
|
||||
|
||||
@@ -58,7 +58,10 @@ module.exports = {
|
||||
* want to be replaced with `import()` (I am not sure if there's a rule about that?). **If this check fails**, disable the rule for the particular line.
|
||||
*/
|
||||
'@typescript-eslint/no-var-requires': 'error',
|
||||
// 'no-unused-vars': 'off',
|
||||
/**
|
||||
* Sometimes we want unused variables to be present in base class method declarations.
|
||||
*/
|
||||
'@typescript-eslint/no-unused-vars': 'warn',
|
||||
/**
|
||||
* Allow native `Promise`s. **This overrides `@appium/eslint-config-appium`.**
|
||||
* @remarks Originally, this was so that we could use [bluebird](https://npm.im/bluebird)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/eslint-config-appium-ts",
|
||||
"version": "0.3.1",
|
||||
"version": "0.3.2",
|
||||
"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",
|
||||
"@typescript-eslint/parser": "^5.5.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",
|
||||
"eslint-config-prettier": "^8.5.0 || ^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,14 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [8.0.5](https://github.com/appium/appium/compare/@appium/eslint-config-appium@8.0.4...@appium/eslint-config-appium@8.0.5) (2023-10-18)
|
||||
|
||||
**Note:** Version bump only for package @appium/eslint-config-appium
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [8.0.4](https://github.com/appium/appium/compare/@appium/eslint-config-appium@8.0.3...@appium/eslint-config-appium@8.0.4) (2023-07-03)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/eslint-config-appium",
|
||||
"version": "8.0.4",
|
||||
"version": "8.0.5",
|
||||
"description": "Shared ESLint config for Appium projects",
|
||||
"keywords": [
|
||||
"eslint",
|
||||
@@ -31,7 +31,7 @@
|
||||
},
|
||||
"peerDependencies": {
|
||||
"eslint": "^8.21.0",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"eslint-config-prettier": "^8.5.0 || ^9.0.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-mocha": "^10.1.0",
|
||||
"eslint-plugin-promise": "^6.0.0"
|
||||
|
||||
@@ -3,6 +3,67 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [3.0.20](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@3.0.19...@appium/execute-driver-plugin@3.0.20) (2023-11-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.20.3 ([1f79433](https://github.com/appium/appium/commit/1f79433059749f91f6e212745863e577f7456d73))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.21.0 ([d44a136](https://github.com/appium/appium/commit/d44a136e55f8f2c6070ad1f3e3e010ebd5522a84))
|
||||
* **support:** update definitelytyped ([5ae8df3](https://github.com/appium/appium/commit/5ae8df3c36c7f03fbf3420087b532086f6742348))
|
||||
|
||||
|
||||
|
||||
## [3.0.19](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@3.0.18...@appium/execute-driver-plugin@3.0.19) (2023-10-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update definitelytyped ([a306ce7](https://github.com/appium/appium/commit/a306ce741a806d21bc44f3b979803b8af5da99aa))
|
||||
|
||||
|
||||
|
||||
## [3.0.18](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@3.0.17...@appium/execute-driver-plugin@3.0.18) (2023-10-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.15.10 ([545576a](https://github.com/appium/appium/commit/545576a740265284e154a9dcc82a225d3cd3481f))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.15.6 ([0830fd8](https://github.com/appium/appium/commit/0830fd8257b0d4674ea5af45689a7a5a2610ee74))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.15.8 ([b510fad](https://github.com/appium/appium/commit/b510fad303472e6de6a656f40b7d87bd64e62685))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.15.9 ([427bc8e](https://github.com/appium/appium/commit/427bc8eb0c374ecd4d53eb4fdad4b32c2bfffd00))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.0 ([207700b](https://github.com/appium/appium/commit/207700bc829b8aa19bc46b0952e7b2f890ea8c90))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.10 ([48be0f8](https://github.com/appium/appium/commit/48be0f83b05f465f9e422496dbac7e63767fa5f5))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.11 ([cef37d3](https://github.com/appium/appium/commit/cef37d3ee3aba2d93773d159f58d895e5fd6c17e))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.12 ([34d978e](https://github.com/appium/appium/commit/34d978e8504ac5e7f3b302641272676c7e0949ef))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.15 ([2281e11](https://github.com/appium/appium/commit/2281e1102826e4c03eb98f6d8b5b0630bd7ed795))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.17 ([f3614ad](https://github.com/appium/appium/commit/f3614adbde76c4ab98fd1dbfa9207fdfe84c7377))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.18 ([5d172a5](https://github.com/appium/appium/commit/5d172a58bd40a66f605ab3eaaf55d54dd895fb22))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.2 ([2d3c5cd](https://github.com/appium/appium/commit/2d3c5cd0b721074e6f7bbadc958bb8d27e9254ac))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.20 ([11926d4](https://github.com/appium/appium/commit/11926d4d39c521b88502f3fab770d8917f3f9144))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.22 ([8c7225d](https://github.com/appium/appium/commit/8c7225d4e94a0042ebf56ca9d758205c2f1a4083))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.3 ([d1a4932](https://github.com/appium/appium/commit/d1a493240973e41645a43a44f3cebe82d514b5b2))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.4 ([fea8f85](https://github.com/appium/appium/commit/fea8f8537defd16053fba5623dace4f27a8aaa1f))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.5 ([862225c](https://github.com/appium/appium/commit/862225c1d8473e175aa793bda943056359369338))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.6 ([7625218](https://github.com/appium/appium/commit/7625218c221c45b6179fc1dcf2103045e4c22718))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.16.7 ([4b09c32](https://github.com/appium/appium/commit/4b09c323d9da65f0631d150e2a402c791ec36f3d))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.17.0 ([#19277](https://github.com/appium/appium/issues/19277)) ([f52a23c](https://github.com/appium/appium/commit/f52a23c6866b7352e1eb53ed6e737d22c81ccc34))
|
||||
* **opencv:** update definitelytyped ([d2a9a99](https://github.com/appium/appium/commit/d2a9a99418af9ce9b569bb9b98ee396faab932bb))
|
||||
* **support:** update definitelytyped ([b6a76ce](https://github.com/appium/appium/commit/b6a76ce91e2765c22f84e389b93f780e0b4490c0))
|
||||
* **tsconfig:** update dependency @tsconfig/node14 to v14 ([#19082](https://github.com/appium/appium/issues/19082)) ([65b3787](https://github.com/appium/appium/commit/65b3787912a4948fb1ed48e8095299bc9ba95844))
|
||||
|
||||
|
||||
|
||||
## [3.0.17](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@3.0.16...@appium/execute-driver-plugin@3.0.17) (2023-08-22)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v7.32.4 ([4e4eaad](https://github.com/appium/appium/commit/4e4eaad6b68386e900427aafd9afd19f43033bda))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8 ([#18095](https://github.com/appium/appium/issues/18095)) ([b608db9](https://github.com/appium/appium/commit/b608db91a8ef0e3cad43ce3e14b625bf9234d383))
|
||||
|
||||
|
||||
|
||||
## [3.0.16](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@3.0.15...@appium/execute-driver-plugin@3.0.16) (2023-08-17)
|
||||
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ function coerceScriptResult(obj) {
|
||||
} catch (e) {
|
||||
log.warn(
|
||||
'Could not convert executeDriverScript to safe response!' +
|
||||
`Result was: ${JSON.stringify(obj)}. Will make it null`
|
||||
`Result was: ${JSON.stringify(obj)}. Will make it null`,
|
||||
);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -67,12 +67,14 @@ export default class ExecuteDriverPlugin extends BasePlugin {
|
||||
|
||||
const driverOpts = {
|
||||
sessionId: driver.sessionId,
|
||||
// Appium probably won't be behind ssl locally; if it ever is, might need to update this to
|
||||
// provide a user configurable parameter
|
||||
protocol: 'http',
|
||||
hostname: driver.serverHost,
|
||||
port: driver.serverPort,
|
||||
path: driver.serverPath,
|
||||
options: {
|
||||
// Appium probably won't be behind ssl locally; if it ever is, might need to update this to
|
||||
// provide a user configurable parameter
|
||||
protocol: 'http',
|
||||
hostname: driver.serverHost,
|
||||
port: driver.serverPort,
|
||||
path: driver.serverPath,
|
||||
},
|
||||
isW3C: true,
|
||||
isMobile: true,
|
||||
capabilities: driver.caps,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/execute-driver-plugin",
|
||||
"version": "3.0.16",
|
||||
"version": "3.0.20",
|
||||
"description": "Plugin for batching and executing driver commands with Appiums",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -38,12 +38,12 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/bluebird": "3.5.38",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
"source-map-support": "0.5.21",
|
||||
"vm2": "3.9.19",
|
||||
"webdriverio": "7.32.3"
|
||||
"webdriverio": "8.21.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"appium": "^2.0.0-beta.35"
|
||||
|
||||
@@ -67,7 +67,7 @@ describe('ExecuteDriverPlugin', function () {
|
||||
it('should not work unless the allowInsecure feature flag is set', async function () {
|
||||
driver = await wdio({...WDIO_OPTS, port: this.port});
|
||||
await driver
|
||||
.driverScript(basicScript)
|
||||
.executeDriverScript(basicScript)
|
||||
.should.be.rejectedWith(/allow-insecure.+execute_driver_script/i);
|
||||
});
|
||||
});
|
||||
@@ -91,7 +91,7 @@ describe('ExecuteDriverPlugin', function () {
|
||||
return [timeouts, status];
|
||||
`;
|
||||
const expectedTimeouts = {command: 60000, implicit: 0};
|
||||
const {result, logs} = await driver.driverScript(script);
|
||||
const {result, logs} = await driver.executeDriverScript(script);
|
||||
result[0].should.eql(expectedTimeouts);
|
||||
result[1].build.should.exist;
|
||||
result[1].build.version.should.exist;
|
||||
@@ -100,14 +100,14 @@ describe('ExecuteDriverPlugin', function () {
|
||||
|
||||
it('should fail with any script type other than webdriverio currently', async function () {
|
||||
const script = `return 'foo'`;
|
||||
await driver.driverScript(script, 'wd').should.be.rejectedWith(/webdriverio/);
|
||||
await driver.executeDriverScript(script, 'wd').should.be.rejectedWith(/webdriverio/);
|
||||
});
|
||||
|
||||
it('should execute a webdriverio script that returns elements correctly', async function () {
|
||||
const script = `
|
||||
return await driver.$("#Button1");
|
||||
`;
|
||||
const {result} = await driver.driverScript(script);
|
||||
const {result} = await driver.executeDriverScript(script);
|
||||
result.should.eql({
|
||||
[W3C_ELEMENT_KEY]: '1',
|
||||
[MJSONWP_ELEMENT_KEY]: '1',
|
||||
@@ -119,7 +119,7 @@ describe('ExecuteDriverPlugin', function () {
|
||||
const el = await driver.$("#Button1");
|
||||
return {element: el, elements: [el, el]};
|
||||
`;
|
||||
const {result} = await driver.driverScript(script);
|
||||
const {result} = await driver.executeDriverScript(script);
|
||||
const elObj = {
|
||||
[W3C_ELEMENT_KEY]: '1',
|
||||
[MJSONWP_ELEMENT_KEY]: '1',
|
||||
@@ -135,7 +135,7 @@ describe('ExecuteDriverPlugin', function () {
|
||||
console.error("baz");
|
||||
return null;
|
||||
`;
|
||||
const {logs} = await driver.driverScript(script);
|
||||
const {logs} = await driver.executeDriverScript(script);
|
||||
logs.should.eql({log: ['foo', 'foo2'], warn: ['bar'], error: ['baz']});
|
||||
});
|
||||
|
||||
@@ -143,7 +143,7 @@ describe('ExecuteDriverPlugin', function () {
|
||||
const script = `
|
||||
return typeof driver.lock;
|
||||
`;
|
||||
const {result} = await driver.driverScript(script);
|
||||
const {result} = await driver.executeDriverScript(script);
|
||||
result.should.eql('function');
|
||||
});
|
||||
|
||||
@@ -151,7 +151,7 @@ describe('ExecuteDriverPlugin', function () {
|
||||
const script = `
|
||||
return await driver.$("~notfound");
|
||||
`;
|
||||
const {result} = await driver.driverScript(script);
|
||||
const {result} = await driver.executeDriverScript(script);
|
||||
result.error.error.should.equal('no such element');
|
||||
result.error.message.should.match(/element could not be located/);
|
||||
result.error.stacktrace.should.includes('NoSuchElementError:');
|
||||
@@ -164,7 +164,7 @@ describe('ExecuteDriverPlugin', function () {
|
||||
return {;
|
||||
`;
|
||||
await driver
|
||||
.driverScript(script)
|
||||
.executeDriverScript(script)
|
||||
.should.be.rejectedWith(/Could not execute driver script.+Unexpected token/);
|
||||
});
|
||||
|
||||
@@ -174,7 +174,7 @@ describe('ExecuteDriverPlugin', function () {
|
||||
return true;
|
||||
`;
|
||||
await driver
|
||||
.driverScript(script, 'webdriverio', 50)
|
||||
.executeDriverScript(script, 'webdriverio', 50)
|
||||
.should.be.rejectedWith(/.+50.+timeout.+/);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"outDir": "build",
|
||||
"checkJs": true
|
||||
"checkJs": true,
|
||||
"moduleResolution": "node10"
|
||||
},
|
||||
"extends": "@appium/tsconfig/tsconfig.plugin.json",
|
||||
"include": ["lib"]
|
||||
|
||||
@@ -3,6 +3,44 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [5.2.11](https://github.com/appium/appium/compare/@appium/fake-driver@5.2.10...@appium/fake-driver@5.2.11) (2023-11-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update definitelytyped ([5ae8df3](https://github.com/appium/appium/commit/5ae8df3c36c7f03fbf3420087b532086f6742348))
|
||||
|
||||
|
||||
|
||||
## [5.2.10](https://github.com/appium/appium/compare/@appium/fake-driver@5.2.9...@appium/fake-driver@5.2.10) (2023-10-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update definitelytyped ([a306ce7](https://github.com/appium/appium/commit/a306ce741a806d21bc44f3b979803b8af5da99aa))
|
||||
|
||||
|
||||
|
||||
## [5.2.9](https://github.com/appium/appium/compare/@appium/fake-driver@5.2.8...@appium/fake-driver@5.2.9) (2023-10-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **images-plugin:** update dependency lru-cache to v10 ([#19050](https://github.com/appium/appium/issues/19050)) ([72a806b](https://github.com/appium/appium/commit/72a806bec7c3a80747192d24dfd9d8286a751810))
|
||||
* **opencv:** update definitelytyped ([d2a9a99](https://github.com/appium/appium/commit/d2a9a99418af9ce9b569bb9b98ee396faab932bb))
|
||||
* **support:** update definitelytyped ([b6a76ce](https://github.com/appium/appium/commit/b6a76ce91e2765c22f84e389b93f780e0b4490c0))
|
||||
|
||||
|
||||
|
||||
## [5.2.8](https://github.com/appium/appium/compare/@appium/fake-driver@5.2.7...@appium/fake-driver@5.2.8) (2023-08-21)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **universal-xml-plugin:** update dependency xpath to v0.0.33 ([#18952](https://github.com/appium/appium/issues/18952)) ([f2cff24](https://github.com/appium/appium/commit/f2cff24685e96578f17549454de7b7931c13df83))
|
||||
|
||||
|
||||
|
||||
## [5.2.7](https://github.com/appium/appium/compare/@appium/fake-driver@5.2.6...@appium/fake-driver@5.2.7) (2023-08-17)
|
||||
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ const ContextsMixin: FakeDriverContextsMixin = {
|
||||
this.appModel.deactivateFrame();
|
||||
} else {
|
||||
const nodes = this.appModel.xpathQuery(`//iframe[@id="${frameId}"]`);
|
||||
if (!nodes.length) {
|
||||
if (!_.isArray(nodes) || _.isEmpty(nodes)) {
|
||||
throw new errors.NoSuchFrameError();
|
||||
}
|
||||
this.appModel.activateFrame(nodes[0]);
|
||||
|
||||
@@ -71,7 +71,6 @@ import './general';
|
||||
//rest.post('/wd/hub/session/:sessionId?/appium/device/press_keycode', controller.pressKeyCode);
|
||||
//rest.post('/wd/hub/session/:sessionId?/appium/device/long_press_keycode', controller.longPressKeyCode);
|
||||
//rest.post('/wd/hub/session/:sessionId?/appium/device/keyevent', controller.keyevent);
|
||||
//rest.post('/wd/hub/session/:sessionId?/appium/device/rotate', controller.mobileRotation);
|
||||
//rest.get('/wd/hub/session/:sessionId?/appium/device/current_activity', controller.getCurrentActivity);
|
||||
//rest.post('/wd/hub/session/:sessionId?/appium/device/install_app', controller.installApp);
|
||||
//rest.post('/wd/hub/session/:sessionId?/appium/device/remove_app', controller.removeApp);
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import B from 'bluebird';
|
||||
import {BaseDriver, errors} from 'appium/driver';
|
||||
import {deprecatedCommandsLogged} from '@appium/base-driver/build/lib/protocol/protocol';
|
||||
import {FakeApp} from './fake-app';
|
||||
|
||||
const FAKE_DRIVER_CONSTRAINTS = /** @type {const} */ ({
|
||||
@@ -56,7 +55,7 @@ export class FakeDriver extends BaseDriver {
|
||||
|
||||
constructor(
|
||||
opts = /** @type {import('@appium/types').InitialOpts} */ ({}),
|
||||
shouldValidateCaps = true
|
||||
shouldValidateCaps = true,
|
||||
) {
|
||||
super(opts, shouldValidateCaps);
|
||||
this.curContext = 'NATIVE_APP';
|
||||
@@ -114,7 +113,7 @@ export class FakeDriver extends BaseDriver {
|
||||
if (d.isUnique) {
|
||||
throw new errors.SessionNotCreatedError(
|
||||
'Cannot start session; another ' +
|
||||
'unique session is in progress that requires all resources'
|
||||
'unique session is in progress that requires all resources',
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -167,7 +166,8 @@ export class FakeDriver extends BaseDriver {
|
||||
*/
|
||||
async getDeprecatedCommandsCalled() {
|
||||
await B.delay(1);
|
||||
return Array.from(deprecatedCommandsLogged);
|
||||
// TODO: Properly get deprecatedCommandsLogged list from the base-driver
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -4,6 +4,7 @@ import path from 'path';
|
||||
import XMLDom from '@xmldom/xmldom';
|
||||
import xpath from 'xpath';
|
||||
import log from './logger';
|
||||
import _ from 'lodash';
|
||||
import {FakeElement} from './fake-element';
|
||||
|
||||
const SCREENSHOT = path.join(__dirname, 'screen.png');
|
||||
@@ -28,7 +29,7 @@ export class FakeApp {
|
||||
|
||||
get title() {
|
||||
let nodes = this.xpathQuery('//title');
|
||||
if (nodes.length < 1) {
|
||||
if (!_.isArray(nodes) || nodes.length < 1) {
|
||||
throw new Error('No title!');
|
||||
}
|
||||
const node = /** @type {Node} */ (nodes[0]);
|
||||
@@ -75,6 +76,11 @@ export class FakeApp {
|
||||
|
||||
setDims() {
|
||||
const nodes = this.xpathQuery('//app');
|
||||
if (!_.isArray(nodes)) {
|
||||
throw new Error(
|
||||
'Cannot fetch app dimensions because no corresponding node has benn found in the source'
|
||||
);
|
||||
}
|
||||
const app = new FakeElement(nodes[0], this);
|
||||
this._width = parseInt(app.nodeAttrs.width, 10);
|
||||
this._height = parseInt(app.nodeAttrs.height, 10);
|
||||
@@ -93,7 +99,8 @@ export class FakeApp {
|
||||
}
|
||||
|
||||
getWebviews() {
|
||||
return this.xpathQuery('//MockWebView/*[1]').map((n) => new FakeWebView(n));
|
||||
const nodes = this.xpathQuery('//MockWebView/*[1]');
|
||||
return _.isArray(nodes) ? nodes.map((n) => new FakeWebView(n)) : [];
|
||||
}
|
||||
|
||||
activateWebview(wv) {
|
||||
@@ -153,7 +160,7 @@ export class FakeApp {
|
||||
|
||||
showAlert(alertId) {
|
||||
let nodes = this.xpathQuery(`//alert[@id="${alertId}"]`);
|
||||
if (nodes.length < 1) {
|
||||
if (!_.isArray(nodes) || _.isEmpty(nodes)) {
|
||||
throw new Error(`Alert ${alertId} doesn't exist!`);
|
||||
}
|
||||
this.activeAlert = new FakeElement(nodes[0], this);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/fake-driver",
|
||||
"version": "5.2.7",
|
||||
"version": "5.2.11",
|
||||
"description": "Mock driver used internally by Appium for testing. Ignore",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -46,13 +46,13 @@
|
||||
"test:unit": "mocha --timeout 10s --slow 5s \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/bluebird": "3.5.38",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"@xmldom/xmldom": "0.8.10",
|
||||
"asyncbox": "2.9.4",
|
||||
"asyncbox": "3.0.0",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
"source-map-support": "0.5.21",
|
||||
"xpath": "0.0.32"
|
||||
"xpath": "0.0.33"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"appium": "^2.0.0-beta.35"
|
||||
|
||||
@@ -131,7 +131,7 @@ function generalTests() {
|
||||
it('should throw an error if a required overload param is missing', async function () {
|
||||
await driver
|
||||
.executeScript('fake: addition', [{num3: 4}])
|
||||
.should.be.rejectedWith(/Parameters were incorrect/);
|
||||
.should.be.rejectedWith(/required parameters are missing/);
|
||||
});
|
||||
|
||||
it('should throw an error if sending in wrong types of params', async function () {
|
||||
|
||||
@@ -3,6 +3,58 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [3.1.27](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.26...@appium/fake-plugin@3.1.27) (2023-11-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update definitelytyped ([5ae8df3](https://github.com/appium/appium/commit/5ae8df3c36c7f03fbf3420087b532086f6742348))
|
||||
|
||||
|
||||
|
||||
## [3.1.26](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.25...@appium/fake-plugin@3.1.26) (2023-10-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update definitelytyped ([a306ce7](https://github.com/appium/appium/commit/a306ce741a806d21bc44f3b979803b8af5da99aa))
|
||||
|
||||
|
||||
|
||||
## [3.1.25](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.24...@appium/fake-plugin@3.1.25) (2023-10-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **opencv:** update definitelytyped ([d2a9a99](https://github.com/appium/appium/commit/d2a9a99418af9ce9b569bb9b98ee396faab932bb))
|
||||
* **support:** update definitelytyped ([b6a76ce](https://github.com/appium/appium/commit/b6a76ce91e2765c22f84e389b93f780e0b4490c0))
|
||||
|
||||
|
||||
|
||||
## [3.1.24](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.23...@appium/fake-plugin@3.1.24) (2023-08-23)
|
||||
|
||||
**Note:** Version bump only for package @appium/fake-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.1.23](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.22...@appium/fake-plugin@3.1.23) (2023-08-22)
|
||||
|
||||
**Note:** Version bump only for package @appium/fake-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.1.22](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.21...@appium/fake-plugin@3.1.22) (2023-08-21)
|
||||
|
||||
**Note:** Version bump only for package @appium/fake-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.1.21](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.20...@appium/fake-plugin@3.1.21) (2023-08-17)
|
||||
|
||||
**Note:** Version bump only for package @appium/fake-plugin
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/fake-plugin",
|
||||
"version": "3.1.21",
|
||||
"version": "3.1.27",
|
||||
"description": "A fake Appium 2.0 plugin",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -39,9 +39,9 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/base-plugin": "^2.2.17",
|
||||
"@appium/support": "^4.1.4",
|
||||
"@types/bluebird": "3.5.38",
|
||||
"@appium/base-plugin": "^2.2.23",
|
||||
"@appium/support": "^4.1.9",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
"source-map-support": "0.5.21"
|
||||
|
||||
@@ -3,6 +3,40 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [2.1.7](https://github.com/appium/appium/compare/@appium/images-plugin@2.1.6...@appium/images-plugin@2.1.7) (2023-11-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **images-plugin:** Prevent repeatable template modification ([#19334](https://github.com/appium/appium/issues/19334)) ([63a0b05](https://github.com/appium/appium/commit/63a0b05e1b99d8879ac928ca91111d3c62745133))
|
||||
|
||||
|
||||
|
||||
## [2.1.6](https://github.com/appium/appium/compare/@appium/images-plugin@2.1.5...@appium/images-plugin@2.1.6) (2023-10-19)
|
||||
|
||||
**Note:** Version bump only for package @appium/images-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.1.5](https://github.com/appium/appium/compare/@appium/images-plugin@2.1.4...@appium/images-plugin@2.1.5) (2023-10-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **images-plugin:** update dependency lru-cache to v10 ([#19050](https://github.com/appium/appium/issues/19050)) ([72a806b](https://github.com/appium/appium/commit/72a806bec7c3a80747192d24dfd9d8286a751810))
|
||||
|
||||
|
||||
|
||||
## [2.1.4](https://github.com/appium/appium/compare/@appium/images-plugin@2.1.3...@appium/images-plugin@2.1.4) (2023-08-21)
|
||||
|
||||
**Note:** Version bump only for package @appium/images-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.1.3](https://github.com/appium/appium/compare/@appium/images-plugin@2.1.2...@appium/images-plugin@2.1.3) (2023-08-17)
|
||||
|
||||
**Note:** Version bump only for package @appium/images-plugin
|
||||
|
||||
@@ -3,6 +3,14 @@ import {errors} from 'appium/driver';
|
||||
import {getImagesMatches, getImagesSimilarity, getImageOccurrence} from '@appium/opencv';
|
||||
import {MATCH_FEATURES_MODE, GET_SIMILARITY_MODE, MATCH_TEMPLATE_MODE} from './constants';
|
||||
|
||||
/**
|
||||
* @typedef {{visualization: string|null|undefined}} Visualized
|
||||
* @typedef {import('@appium/opencv').MatchingResult & Visualized} MatchingResult
|
||||
* @typedef {import('@appium/opencv').OccurrenceResult & Visualized} OccurrenceResult
|
||||
* @typedef {import('@appium/opencv').SimilarityResult & Visualized} SimilarityResult
|
||||
* @typedef {MatchingResult|OccurrenceResult|SimilarityResult|SimilarityResult[]} ComparisonResult
|
||||
*/
|
||||
|
||||
/**
|
||||
* Performs images comparison using OpenCV framework features.
|
||||
* It is expected that both OpenCV framework and opencv4nodejs
|
||||
@@ -14,43 +22,48 @@ import {MATCH_FEATURES_MODE, GET_SIMILARITY_MODE, MATCH_TEMPLATE_MODE} from './c
|
||||
* All image formats, that OpenCV library itself accepts, are supported.
|
||||
* @param {string|Buffer} secondImage - Base64-encoded image file.
|
||||
* All image formats, that OpenCV library itself accepts, are supported.
|
||||
* @param {object} [options] - The content of this dictionary depends
|
||||
* @param {import('@appium/opencv').MatchingOptions
|
||||
* |import('@appium/opencv').SimilarityOptions
|
||||
* |import('@appium/opencv').OccurrenceOptions} [options={}] - The content of this dictionary depends
|
||||
* on the actual `mode` value. See the documentation on `@appium/support`
|
||||
* module for more details.
|
||||
* @returns {Promise<object|object[]>} The content of the resulting dictionary depends
|
||||
* @returns {Promise<ComparisonResult>} The content of the resulting dictionary depends
|
||||
* on the actual `mode` and `options` values. See the documentation on
|
||||
* `@appium/support` module for more details.
|
||||
* @throws {Error} If required OpenCV modules are not installed or
|
||||
* if `mode` value is incorrect or if there was an unexpected issue while
|
||||
* matching the images.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @type {import('@appium/types').PluginCommand<[string, string, string, object|undefined], Promise<OccurrenceResult>>}
|
||||
*/
|
||||
async function compareImages(mode, firstImage, secondImage, options = {}) {
|
||||
const img1 = Buffer.isBuffer(firstImage) ? firstImage : Buffer.from(firstImage, 'base64');
|
||||
const img2 = Buffer.isBuffer(secondImage) ? secondImage : Buffer.from(secondImage, 'base64');
|
||||
let result = null;
|
||||
let result;
|
||||
switch (_.toLower(mode)) {
|
||||
case MATCH_FEATURES_MODE.toLowerCase():
|
||||
try {
|
||||
result = await getImagesMatches(img1, img2, options);
|
||||
result = await getImagesMatches(
|
||||
img1, img2, /** @type {import('@appium/opencv').MatchingOptions} */(options)
|
||||
);
|
||||
} catch (err) {
|
||||
// might throw if no matches
|
||||
result = {count: 0};
|
||||
result = /** @type {import('@appium/opencv').MatchingResult} */({count: 0});
|
||||
}
|
||||
break;
|
||||
case GET_SIMILARITY_MODE.toLowerCase():
|
||||
result = await getImagesSimilarity(img1, img2, options);
|
||||
result = await getImagesSimilarity(
|
||||
img1, img2, /** @type {import('@appium/opencv').SimilarityOptions} */(options));
|
||||
break;
|
||||
case MATCH_TEMPLATE_MODE.toLowerCase():
|
||||
case MATCH_TEMPLATE_MODE.toLowerCase(): {
|
||||
const opts = /** @type {import('@appium/opencv').OccurrenceOptions} */(options);
|
||||
// firstImage/img1 is the full image and secondImage/img2 is the partial one
|
||||
result = await getImageOccurrence(img1, img2, options);
|
||||
if (options.multiple) {
|
||||
result = await getImageOccurrence(
|
||||
img1, img2, opts
|
||||
);
|
||||
if (opts.multiple) {
|
||||
return result.multiple.map(convertVisualizationToBase64);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new errors.InvalidArgumentError(
|
||||
`'${mode}' images comparison mode is unknown. ` +
|
||||
@@ -68,19 +81,16 @@ async function compareImages(mode, firstImage, secondImage, options = {}) {
|
||||
* base64 encodes the visualization part of the result
|
||||
* (if necessary)
|
||||
*
|
||||
* @param {OccurrenceResult} element - occurrence result
|
||||
*
|
||||
* @param {Partial<{visualization: Buffer|null}>} element - occurrence result
|
||||
* @returns {any} I know this looks ugly from the typing perspective
|
||||
**/
|
||||
function convertVisualizationToBase64(element) {
|
||||
if (!_.isEmpty(element.visualization)) {
|
||||
element.visualization = element.visualization.toString('base64');
|
||||
}
|
||||
|
||||
return element;
|
||||
return Buffer.isBuffer(element.visualization)
|
||||
? {
|
||||
...(element),
|
||||
visualization: element.visualization.toString('base64')
|
||||
}
|
||||
: element;
|
||||
}
|
||||
|
||||
export {compareImages};
|
||||
|
||||
/**
|
||||
* @typedef {import('@appium/opencv').OccurrenceResult} OccurrenceResult
|
||||
*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import _ from 'lodash';
|
||||
import LRU from 'lru-cache';
|
||||
import {LRUCache} from 'lru-cache';
|
||||
import {errors} from 'appium/driver';
|
||||
import {ImageElement} from './image-element';
|
||||
import {compareImages} from './compare';
|
||||
@@ -34,14 +34,14 @@ const CONDITION_UNMET_PATTERN = /Condition unmet/;
|
||||
|
||||
|
||||
export default class ImageElementFinder {
|
||||
/** @type {LRU<string,ImageElement>} */
|
||||
/** @type {LRUCache<string,ImageElement>} */
|
||||
_imgElCache;
|
||||
|
||||
/**
|
||||
* @param {number} max
|
||||
*/
|
||||
constructor(max = MAX_CACHE_ITEMS) {
|
||||
this._imgElCache = new LRU({
|
||||
this._imgElCache = new LRUCache({
|
||||
ttl: MAX_CACHE_AGE_MS,
|
||||
updateAgeOnGet: true,
|
||||
max,
|
||||
@@ -78,7 +78,7 @@ export default class ImageElementFinder {
|
||||
* @property {boolean} [ignoreDefaultImageTemplateScale=false] - Whether we
|
||||
* ignore defaultImageTemplateScale. It can be used when you would like to
|
||||
* scale template with defaultImageTemplateScale setting.
|
||||
* @property {import('@appium/types').Rect?} containerRect - The bounding
|
||||
* @property {import('@appium/types').Rect?} [containerRect=null] - The bounding
|
||||
* rectangle to limit the search in
|
||||
*/
|
||||
|
||||
@@ -109,7 +109,7 @@ export default class ImageElementFinder {
|
||||
} = settings;
|
||||
|
||||
log.info(`Finding image element with match threshold ${threshold}`);
|
||||
if (!driver.getWindowRect && !driver.getWindowSize) {
|
||||
if (!driver.getWindowRect && !_.has(driver, 'getWindowSize')) {
|
||||
throw new Error("This driver does not support the required 'getWindowRect' command");
|
||||
}
|
||||
let screenSize;
|
||||
@@ -120,7 +120,7 @@ export default class ImageElementFinder {
|
||||
height: screenRect.height,
|
||||
};
|
||||
} else {
|
||||
// TODO: Drop the deprecated endpoint
|
||||
// @ts-ignore TODO: Drop the deprecated endpoint
|
||||
screenSize = await driver.getWindowSize();
|
||||
}
|
||||
|
||||
@@ -136,16 +136,23 @@ export default class ImageElementFinder {
|
||||
}
|
||||
|
||||
const results = [];
|
||||
const condition = async () => {
|
||||
let didFixTemplateImageScale = false;
|
||||
const performLookup = async () => {
|
||||
try {
|
||||
|
||||
const {screenshot, scale} = await this.getScreenshotForImageFind(driver, screenSize);
|
||||
|
||||
template = await this.fixImageTemplateScale(template, {
|
||||
defaultImageTemplateScale,
|
||||
ignoreDefaultImageTemplateScale,
|
||||
fixImageTemplateScale,
|
||||
...scale,
|
||||
});
|
||||
if (!didFixTemplateImageScale) {
|
||||
template = await this.fixImageTemplateScale(template, {
|
||||
defaultImageTemplateScale,
|
||||
ignoreDefaultImageTemplateScale,
|
||||
fixImageTemplateScale,
|
||||
...(scale || {}),
|
||||
});
|
||||
// We do not want `template` to be mutated multiple times when the
|
||||
// wrapping lambda is retried
|
||||
didFixTemplateImageScale = true;
|
||||
}
|
||||
|
||||
const comparisonOpts = {
|
||||
threshold,
|
||||
@@ -168,7 +175,9 @@ export default class ImageElementFinder {
|
||||
return true;
|
||||
};
|
||||
|
||||
const elOrEls = await compareImages(MATCH_TEMPLATE_MODE, screenshot, template, comparisonOpts);
|
||||
const elOrEls = await compareImages(
|
||||
MATCH_TEMPLATE_MODE, screenshot, template, comparisonOpts
|
||||
);
|
||||
return _.some((_.isArray(elOrEls) ? elOrEls : [elOrEls]).map(pushIfOk));
|
||||
} catch (err) {
|
||||
// if compareImages fails, we'll get a specific error, but we should
|
||||
@@ -183,7 +192,7 @@ export default class ImageElementFinder {
|
||||
};
|
||||
|
||||
try {
|
||||
await driver.implicitWaitForCondition(condition);
|
||||
await driver.implicitWaitForCondition(performLookup);
|
||||
} catch (err) {
|
||||
// this `implicitWaitForCondition` method will throw a 'Condition unmet'
|
||||
// error if an element is not found eventually. In that case, we will
|
||||
@@ -238,6 +247,9 @@ export default class ImageElementFinder {
|
||||
async ensureTemplateSize(template, maxSize) {
|
||||
const imgObj = sharp(template);
|
||||
const {width: tplWidth, height: tplHeight} = await imgObj.metadata();
|
||||
if (_.isNil(tplWidth) || _.isNil(tplHeight)) {
|
||||
throw new Error(`Template width/height cannot be determined. Is it a valid image?`);
|
||||
}
|
||||
|
||||
log.info(
|
||||
`Template image is ${tplWidth}x${tplHeight}. Bounding rectangle size is ${maxSize.width}x${maxSize.height}`
|
||||
@@ -254,8 +266,8 @@ export default class ImageElementFinder {
|
||||
// otherwise, scale it to fit inside the bounding rectangle dimensions:
|
||||
// https://sharp.pixelplumbing.com/api-resize
|
||||
return await imgObj.resize({
|
||||
width: parseInt(maxSize.width, 10),
|
||||
height: parseInt(maxSize.height, 10),
|
||||
width: Math.trunc(maxSize.width),
|
||||
height: Math.trunc(maxSize.height),
|
||||
fit: 'inside',
|
||||
})
|
||||
.toBuffer();
|
||||
@@ -301,7 +313,7 @@ export default class ImageElementFinder {
|
||||
let imgObj = sharp(screenshot);
|
||||
let {width: shotWidth, height: shotHeight} = await imgObj.metadata();
|
||||
|
||||
if (shotWidth < 1 || shotHeight < 1) {
|
||||
if (!shotWidth || shotWidth < 1 || !shotHeight || shotHeight < 1) {
|
||||
log.warn(
|
||||
`The retrieved screenshot size ${shotWidth}x${shotHeight} does ` +
|
||||
`not seem to be valid. No changes will be applied to the screenshot`
|
||||
@@ -354,7 +366,7 @@ export default class ImageElementFinder {
|
||||
const yScale = (1.0 * shotHeight) / screenSize.height;
|
||||
const scaleFactor = Math.min(xScale, yScale);
|
||||
const [newWidth, newHeight] = [shotWidth * scaleFactor, shotHeight * scaleFactor]
|
||||
.map((x) => parseInt(x, 10));
|
||||
.map(Math.trunc);
|
||||
|
||||
log.warn(
|
||||
`Resizing screenshot to ${newWidth}x${newHeight} to match ` +
|
||||
@@ -382,8 +394,8 @@ export default class ImageElementFinder {
|
||||
`screen at ${screenSize.width}x${screenSize.height}`
|
||||
);
|
||||
imgObj = imgObj.resize({
|
||||
width: parseInt(screenSize.width, 10),
|
||||
height: parseInt(screenSize.height, 10),
|
||||
width: Math.trunc(screenSize.width),
|
||||
height: Math.trunc(screenSize.height),
|
||||
fit: 'fill',
|
||||
});
|
||||
|
||||
@@ -399,13 +411,13 @@ export default class ImageElementFinder {
|
||||
|
||||
/**
|
||||
* @typedef ImageTemplateSettings
|
||||
* @property {boolean} fixImageTemplateScale - fixImageTemplateScale in device-settings
|
||||
* @property {number} defaultImageTemplateScale - defaultImageTemplateScale in device-settings
|
||||
* @property {boolean} ignoreDefaultImageTemplateScale - Ignore defaultImageTemplateScale if it has true.
|
||||
* @property {boolean} [fixImageTemplateScale=false] - fixImageTemplateScale in device-settings
|
||||
* @property {number} [defaultImageTemplateScale=DEFAULT_TEMPLATE_IMAGE_SCALE] - defaultImageTemplateScale in device-settings
|
||||
* @property {boolean} [ignoreDefaultImageTemplateScale=false] - Ignore defaultImageTemplateScale if it has true.
|
||||
* If the template has been scaled to defaultImageTemplateScale or should ignore the scale,
|
||||
* this parameter should be true. e.g. click in image-element module
|
||||
* @property {number} xScale - Scale ratio for width
|
||||
* @property {number} yScale - Scale ratio for height
|
||||
* @property {number} [xScale=DEFAULT_FIX_IMAGE_TEMPLATE_SCALE] - Scale ratio for width
|
||||
* @property {number} [yScale=DEFAULT_FIX_IMAGE_TEMPLATE_SCALE] - Scale ratio for height
|
||||
|
||||
*/
|
||||
/**
|
||||
@@ -469,6 +481,9 @@ export default class ImageElementFinder {
|
||||
|
||||
let imgObj = sharp(template);
|
||||
const {width: baseTempWidth, height: baseTempHeigh} = await imgObj.metadata();
|
||||
if (_.isNil(baseTempWidth) || _.isNil(baseTempHeigh)) {
|
||||
throw new Error(`Template width/height cannot be determined. Is it a valid image?`);
|
||||
}
|
||||
|
||||
const scaledWidth = baseTempWidth * xScale;
|
||||
const scaledHeight = baseTempHeigh * yScale;
|
||||
@@ -477,8 +492,8 @@ export default class ImageElementFinder {
|
||||
);
|
||||
log.info(`The ratio is ${xScale} and ${yScale}`);
|
||||
imgObj = imgObj.resize({
|
||||
width: parseInt(scaledWidth, 10),
|
||||
height: parseInt(scaledHeight, 10),
|
||||
width: Math.trunc(scaledWidth),
|
||||
height: Math.trunc(scaledHeight),
|
||||
fit: 'fill',
|
||||
});
|
||||
return await imgObj.toBuffer();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import _ from 'lodash';
|
||||
import {errors} from 'appium/driver';
|
||||
import {util} from 'appium/support';
|
||||
import {util} from '@appium/support';
|
||||
import log from './logger';
|
||||
import {
|
||||
IMAGE_STRATEGY, DEFAULT_SETTINGS, IMAGE_TAP_STRATEGIES,
|
||||
@@ -39,7 +39,7 @@ const TAP_DURATION_MS = 125;
|
||||
*/
|
||||
export default class ImageElement {
|
||||
/**
|
||||
* @param {ImageElementOpts}
|
||||
* @param {ImageElementOpts} options
|
||||
*/
|
||||
constructor({
|
||||
template,
|
||||
@@ -123,12 +123,11 @@ export default class ImageElement {
|
||||
* Use a driver to tap the screen at the center of this ImageElement's
|
||||
* position
|
||||
*
|
||||
* @param {BaseDriver} driver - driver for calling actions with
|
||||
* @param {import('appium/driver').BaseDriver} driver - driver for calling actions with
|
||||
*/
|
||||
async click(driver) {
|
||||
// before we click we need to make sure the element is actually still there
|
||||
// where we expect it to be
|
||||
let newImgEl;
|
||||
const settings = Object.assign({}, DEFAULT_SETTINGS, driver.settings.getSettings());
|
||||
const {
|
||||
autoUpdateImageElementPosition: updatePos,
|
||||
@@ -145,16 +144,19 @@ export default class ImageElement {
|
||||
);
|
||||
}
|
||||
|
||||
let newImgEl;
|
||||
if (checkForImageElementStaleness || updatePos) {
|
||||
log.info('Checking image element for staleness before clicking');
|
||||
try {
|
||||
newImgEl = await this.finder.findByImage(this.template, driver, {
|
||||
shouldCheckStaleness: true,
|
||||
// Set ignoreDefaultImageTemplateScale because this.template is device screenshot based image
|
||||
// managed inside Appium after finidng image by template which managed by a user
|
||||
ignoreDefaultImageTemplateScale: true,
|
||||
containerRect: this.containerRect,
|
||||
});
|
||||
newImgEl = /** @type {ImageElement} */ (await (/** @type {import('./finder').default} */ (this.finder))
|
||||
.findByImage(
|
||||
this.template, driver, {
|
||||
shouldCheckStaleness: true,
|
||||
// Set ignoreDefaultImageTemplateScale because this.template is device screenshot based image
|
||||
// managed inside Appium after finidng image by template which managed by a user
|
||||
ignoreDefaultImageTemplateScale: true,
|
||||
containerRect: this.containerRect,
|
||||
}));
|
||||
} catch (err) {
|
||||
throw new errors.StaleElementReferenceError();
|
||||
}
|
||||
@@ -199,7 +201,7 @@ export default class ImageElement {
|
||||
};
|
||||
|
||||
// check if the driver has the appropriate performActions method
|
||||
if (driver.performActions) {
|
||||
if ('performActions' in driver && _.isFunction(driver.performActions)) {
|
||||
return await driver.performActions([action]);
|
||||
}
|
||||
|
||||
@@ -215,7 +217,7 @@ export default class ImageElement {
|
||||
options: {x, y},
|
||||
};
|
||||
|
||||
if (driver.performTouch) {
|
||||
if ('performTouch' in driver && _.isFunction(driver.performTouch)) {
|
||||
return await driver.performTouch([action]);
|
||||
}
|
||||
|
||||
@@ -239,7 +241,7 @@ export default class ImageElement {
|
||||
if (strategy !== IMAGE_STRATEGY) {
|
||||
throw new errors.InvalidSelectorError(`Lookup strategies other than '${IMAGE_STRATEGY}' are not supported`);
|
||||
}
|
||||
return await this.finder.findByImage(
|
||||
return await (/** @type {import('./finder').default} */ (this.finder)).findByImage(
|
||||
Buffer.from(selector, 'base64'),
|
||||
driver,
|
||||
{multiple, containerRect: this.rect}
|
||||
@@ -251,10 +253,10 @@ export default class ImageElement {
|
||||
*
|
||||
* @param {import('appium/driver').BaseDriver} driver - the driver to use for commands
|
||||
* @param {string} cmd - the name of the driver command
|
||||
* @param {string} imgElId - the id of the ImageElement to work with
|
||||
* @param {any} imgEl - image element object
|
||||
* @param {string[]} args - Rest of arguments for executeScripts
|
||||
*
|
||||
* @returns {object} - the result of running a command
|
||||
* @returns {Promise<any>} - the result of running a command
|
||||
*/
|
||||
static async execute(driver, imgEl, cmd, ...args) {
|
||||
switch (cmd) {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
import _ from 'lodash';
|
||||
import {errors} from 'appium/driver';
|
||||
import BasePlugin from 'appium/plugin';
|
||||
import {BasePlugin} from 'appium/plugin';
|
||||
import {compareImages} from './compare';
|
||||
import ImageElementFinder from './finder';
|
||||
import {ImageElement} from './image-element';
|
||||
@@ -33,6 +33,7 @@ export default class ImageElementPlugin extends BasePlugin {
|
||||
});
|
||||
|
||||
async compareImages(next, driver, ...args) {
|
||||
// @ts-ignore Arguments should be ok there
|
||||
return await compareImages(...args);
|
||||
}
|
||||
|
||||
@@ -44,6 +45,14 @@ export default class ImageElementPlugin extends BasePlugin {
|
||||
return await this._find(true, next, driver, ...args);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {boolean} multiple
|
||||
* @param {*} next
|
||||
* @param {*} driver
|
||||
* @param {...any} args
|
||||
* @returns {Promise<any>}
|
||||
*/
|
||||
async _find(multiple, next, driver, ...args) {
|
||||
const [strategy, selector] = args;
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/images-plugin",
|
||||
"version": "2.1.3",
|
||||
"version": "2.1.7",
|
||||
"description": "Plugin for working with images and image elements in Appium",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -39,14 +39,15 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/opencv": "^2.1.2",
|
||||
"@appium/opencv": "^2.1.6",
|
||||
"@appium/support": "^4.1.9",
|
||||
"lodash": "4.17.21",
|
||||
"lru-cache": "7.18.3",
|
||||
"sharp": "0.32.4",
|
||||
"lru-cache": "10.0.1",
|
||||
"sharp": "0.32.6",
|
||||
"source-map-support": "0.5.21"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"appium": "^2.0.0-beta.35"
|
||||
"appium": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
|
||||
@@ -73,7 +73,8 @@ describe('finding elements by image', function () {
|
||||
y: 0,
|
||||
...size,
|
||||
});
|
||||
const screenStub = sandbox.stub(finder, 'getScreenshotForImageFind').returns(screenshot);
|
||||
const screenStub = sandbox.stub(finder, 'getScreenshotForImageFind')
|
||||
.returns({screenshot});
|
||||
return {rectStub, screenStub};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"outDir": "build",
|
||||
"checkJs": true,
|
||||
"esModuleInterop": true,
|
||||
"strict": false,
|
||||
"paths": {
|
||||
"@appium/opencv": ["../opencv"]
|
||||
}
|
||||
|
||||
@@ -3,6 +3,42 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [2.1.6](https://github.com/appium/appium/compare/@appium/opencv@2.1.5...@appium/opencv@2.1.6) (2023-11-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update definitelytyped ([5ae8df3](https://github.com/appium/appium/commit/5ae8df3c36c7f03fbf3420087b532086f6742348))
|
||||
|
||||
|
||||
|
||||
## [2.1.5](https://github.com/appium/appium/compare/@appium/opencv@2.1.4...@appium/opencv@2.1.5) (2023-10-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update definitelytyped ([a306ce7](https://github.com/appium/appium/commit/a306ce741a806d21bc44f3b979803b8af5da99aa))
|
||||
|
||||
|
||||
|
||||
## [2.1.4](https://github.com/appium/appium/compare/@appium/opencv@2.1.3...@appium/opencv@2.1.4) (2023-10-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **opencv:** update definitelytyped ([d2a9a99](https://github.com/appium/appium/commit/d2a9a99418af9ce9b569bb9b98ee396faab932bb))
|
||||
* **support:** update definitelytyped ([b6a76ce](https://github.com/appium/appium/commit/b6a76ce91e2765c22f84e389b93f780e0b4490c0))
|
||||
|
||||
|
||||
|
||||
## [2.1.3](https://github.com/appium/appium/compare/@appium/opencv@2.1.2...@appium/opencv@2.1.3) (2023-08-21)
|
||||
|
||||
**Note:** Version bump only for package @appium/opencv
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.1.2](https://github.com/appium/appium/compare/@appium/opencv@2.1.1...@appium/opencv@2.1.2) (2023-08-17)
|
||||
|
||||
**Note:** Version bump only for package @appium/opencv
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/opencv",
|
||||
"version": "2.1.2",
|
||||
"version": "2.1.6",
|
||||
"description": "OpenCV-related helper library",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -41,11 +41,11 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/bluebird": "3.5.38",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
"opencv-bindings": "4.5.5",
|
||||
"sharp": "0.32.4",
|
||||
"sharp": "0.32.6",
|
||||
"source-map-support": "0.5.21"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -3,6 +3,67 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [0.3.24](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.23...@appium/plugin-test-support@0.3.24) (2023-11-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update dependency teen_process to v2.0.57 ([1fbd503](https://github.com/appium/appium/commit/1fbd503a66b965a9b32bbb6702062861a8480333))
|
||||
* **support:** update dependency teen_process to v2.0.63 ([fa57192](https://github.com/appium/appium/commit/fa571925b7ac980cc99c8d23f659420eacd8546c))
|
||||
* **support:** update dependency teen_process to v2.0.64 ([332bb59](https://github.com/appium/appium/commit/332bb59ee3fdd14c03f6b3c4fd6587a30319d568))
|
||||
* **support:** update dependency teen_process to v2.0.66 ([3205b5d](https://github.com/appium/appium/commit/3205b5d06f073f1e5c7735c6e36ad08fdf091182))
|
||||
* **support:** update dependency teen_process to v2.0.67 ([3b5ae2a](https://github.com/appium/appium/commit/3b5ae2ab17c74c9890b53c081aec146152f11c7a))
|
||||
* **support:** update dependency teen_process to v2.0.73 ([8e453be](https://github.com/appium/appium/commit/8e453bed3f440c1dcf82f016f7d4431365b9cdff))
|
||||
* **support:** update dependency teen_process to v2.0.75 ([fbb6fd9](https://github.com/appium/appium/commit/fbb6fd9a2780eb00c15584abeaf644a1fcdecb4d))
|
||||
* **support:** update teen_process-related packages ([84d96db](https://github.com/appium/appium/commit/84d96dbae45dfe56218d32330f8ff2d26b750fb7))
|
||||
* **support:** update teen_process-related packages ([3d0b97c](https://github.com/appium/appium/commit/3d0b97cae76c616da0aea5b92cebcd38d59263b7))
|
||||
|
||||
|
||||
|
||||
## [0.3.23](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.22...@appium/plugin-test-support@0.3.23) (2023-10-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Make sure type definitions are always in sync across modules ([#19323](https://github.com/appium/appium/issues/19323)) ([de39013](https://github.com/appium/appium/commit/de39013ae501d4fc11988435737efb862cc1d820))
|
||||
|
||||
|
||||
|
||||
## [0.3.22](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.21...@appium/plugin-test-support@0.3.22) (2023-10-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update dependency teen_process to v2.0.10 ([bc1b56a](https://github.com/appium/appium/commit/bc1b56a3c162ed8686d3d7956c30eb1f7682b1a7))
|
||||
* **support:** update dependency teen_process to v2.0.12 ([c5d6df7](https://github.com/appium/appium/commit/c5d6df7a000d64e8591a56ce5ef65baa2071a36b))
|
||||
* **support:** update dependency teen_process to v2.0.13 ([a0c4b84](https://github.com/appium/appium/commit/a0c4b84fb7d3977b7a4ca0a07fadd49ee355791a))
|
||||
* **support:** update dependency teen_process to v2.0.18 ([ffeebc7](https://github.com/appium/appium/commit/ffeebc74b72e5eadf658325e67708ae6ed5b8346))
|
||||
* **support:** update dependency teen_process to v2.0.19 ([2ef40fe](https://github.com/appium/appium/commit/2ef40febdc717f54ea618ecfe1058b858fe2daf9))
|
||||
* **support:** update dependency teen_process to v2.0.23 ([1b0459e](https://github.com/appium/appium/commit/1b0459edd656514d8706aab8e21cd4d40de2ec5d))
|
||||
* **support:** update dependency teen_process to v2.0.24 ([bc72c66](https://github.com/appium/appium/commit/bc72c6676a5412b60e74bb143a223738ce059977))
|
||||
* **support:** update dependency teen_process to v2.0.27 ([03b2aa6](https://github.com/appium/appium/commit/03b2aa6b6e45fa0ea24c4691b039255bc4399733))
|
||||
* **support:** update dependency teen_process to v2.0.30 ([7cdb142](https://github.com/appium/appium/commit/7cdb1429a1104ad3699547f2a2dd9b237135891a))
|
||||
* **support:** update dependency teen_process to v2.0.34 ([#19218](https://github.com/appium/appium/issues/19218)) ([c28fcef](https://github.com/appium/appium/commit/c28fcefa725fbce5a0464e57946051e3cb023d85))
|
||||
* **support:** update dependency teen_process to v2.0.37 ([6d894be](https://github.com/appium/appium/commit/6d894bef6f377ebfdffdeb1adde7a72624844414))
|
||||
* **support:** update dependency teen_process to v2.0.38 ([a32dc11](https://github.com/appium/appium/commit/a32dc1110125d0f1fac9c66c17f1309145a634c7))
|
||||
* **support:** update dependency teen_process to v2.0.40 ([2837bcd](https://github.com/appium/appium/commit/2837bcdeb19532fe973a2902db5c8d730252d962))
|
||||
* **support:** update dependency teen_process to v2.0.41 ([1a34396](https://github.com/appium/appium/commit/1a34396339f71d40353d323feaf78afcf2269fc9))
|
||||
* **support:** update dependency teen_process to v2.0.42 ([e2a670e](https://github.com/appium/appium/commit/e2a670e1c4a0f061b0bfb08a6b534d9deb7bdd9c))
|
||||
* **support:** update dependency teen_process to v2.0.45 ([ea731bf](https://github.com/appium/appium/commit/ea731bf117d680496fce453ac42cfee7f05ada60))
|
||||
* **support:** update dependency teen_process to v2.0.48 ([eebc651](https://github.com/appium/appium/commit/eebc651f31c282baa7e77a6384d3ee8efc0072d6))
|
||||
* **support:** update dependency teen_process to v2.0.50 ([ca3e5d9](https://github.com/appium/appium/commit/ca3e5d90e4c51fc1dda32154e1d77e65cb44fb54))
|
||||
* **support:** update dependency teen_process to v2.0.9 ([6c7f3ef](https://github.com/appium/appium/commit/6c7f3ef670d441bdc4b693948a19dcbdc54e4764))
|
||||
|
||||
|
||||
|
||||
## [0.3.21](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.20...@appium/plugin-test-support@0.3.21) (2023-08-22)
|
||||
|
||||
**Note:** Version bump only for package @appium/plugin-test-support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.3.20](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.19...@appium/plugin-test-support@0.3.20) (2023-08-17)
|
||||
|
||||
**Note:** Version bump only for package @appium/plugin-test-support
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/plugin-test-support",
|
||||
"version": "0.3.20",
|
||||
"version": "0.3.24",
|
||||
"description": "Testing utilities for Appium plugins",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -41,11 +41,11 @@
|
||||
"test:unit": "exit 0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/types": "^0.13.3",
|
||||
"@appium/types": "^0.14.2",
|
||||
"get-port": "5.1.1",
|
||||
"log-symbols": "4.1.0",
|
||||
"source-map-support": "0.5.21",
|
||||
"teen_process": "2.0.4"
|
||||
"teen_process": "2.0.84"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"appium": "^2.0.0-beta.43",
|
||||
|
||||
@@ -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.
|
||||
|
||||
## [0.4.2](https://github.com/appium/appium/compare/@appium/schema@0.4.1...@appium/schema@0.4.2) (2023-11-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update definitelytyped ([5ae8df3](https://github.com/appium/appium/commit/5ae8df3c36c7f03fbf3420087b532086f6742348))
|
||||
|
||||
|
||||
|
||||
## [0.4.1](https://github.com/appium/appium/compare/@appium/schema@0.4.0...@appium/schema@0.4.1) (2023-10-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update definitelytyped ([a306ce7](https://github.com/appium/appium/commit/a306ce741a806d21bc44f3b979803b8af5da99aa))
|
||||
|
||||
|
||||
|
||||
## [0.4.0](https://github.com/appium/appium/compare/@appium/schema@0.3.1...@appium/schema@0.4.0) (2023-10-18)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **base-driver:** Add server support of TLS and SPDY protocols ([#19105](https://github.com/appium/appium/issues/19105)) ([5926919](https://github.com/appium/appium/commit/5926919177e3df675723c80d800f933fdbda5824))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update definitelytyped ([b6a76ce](https://github.com/appium/appium/commit/b6a76ce91e2765c22f84e389b93f780e0b4490c0))
|
||||
|
||||
|
||||
|
||||
## [0.3.1](https://github.com/appium/appium/compare/@appium/schema@0.3.0...@appium/schema@0.3.1) (2023-07-03)
|
||||
|
||||
|
||||
|
||||
@@ -288,6 +288,18 @@ export const AppiumConfigJsonSchema = /** @type {const} */ ({
|
||||
title: 'webhook config',
|
||||
type: 'string',
|
||||
},
|
||||
'ssl-cert-path': {
|
||||
description: 'Full path to the .cert file if TLS is used. Must be provided together with "ssl-key-path"',
|
||||
title: '.cert file path',
|
||||
appiumCliDest: 'sslCertificatePath',
|
||||
type: 'string',
|
||||
},
|
||||
'ssl-key-path': {
|
||||
description: 'Full path to the .key file if TLS is used. Must be provided together with "ssl-cert-path"',
|
||||
title: '.key file path',
|
||||
appiumCliDest: 'sslKeyPath',
|
||||
type: 'string',
|
||||
},
|
||||
},
|
||||
title: 'server config',
|
||||
type: 'object',
|
||||
|
||||
@@ -281,6 +281,18 @@
|
||||
"format": "uri",
|
||||
"title": "webhook config",
|
||||
"type": "string"
|
||||
},
|
||||
"ssl-cert-path": {
|
||||
"description": "Full path to the .cert file if TLS is used. Must be provided together with \"ssl-key-path\"",
|
||||
"title": ".cert file path",
|
||||
"appiumCliDest": "sslCertificatePath",
|
||||
"type": "string"
|
||||
},
|
||||
"ssl-key-path": {
|
||||
"description": "Full path to the .key file if TLS is used. Must be provided together with \"ssl-cert-path\"",
|
||||
"title": ".key file path",
|
||||
"appiumCliDest": "sslKeyPath",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"title": "server config",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/schema",
|
||||
"version": "0.3.1",
|
||||
"version": "0.4.2",
|
||||
"description": "Appium Configuration Schema",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -38,7 +38,7 @@
|
||||
"test": "exit 0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/json-schema": "7.0.12",
|
||||
"@types/json-schema": "7.0.15",
|
||||
"json-schema": "0.4.0",
|
||||
"source-map-support": "0.5.21"
|
||||
},
|
||||
|
||||
@@ -3,6 +3,99 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [4.1.9](https://github.com/appium/appium/compare/@appium/support@4.1.8...@appium/support@4.1.9) (2023-11-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **images-plugin:** Prevent repeatable template modification ([#19334](https://github.com/appium/appium/issues/19334)) ([63a0b05](https://github.com/appium/appium/commit/63a0b05e1b99d8879ac928ca91111d3c62745133))
|
||||
* **support:** update definitelytyped ([5ae8df3](https://github.com/appium/appium/commit/5ae8df3c36c7f03fbf3420087b532086f6742348))
|
||||
* **support:** update definitelytyped ([#19326](https://github.com/appium/appium/issues/19326)) ([9840315](https://github.com/appium/appium/commit/98403151f86665d723bf887e907825bbc4cc2d3d))
|
||||
* **support:** update dependency axios to v1.6.0 ([699c493](https://github.com/appium/appium/commit/699c49306c38e222d618a9611482b06a3e6806aa))
|
||||
* **support:** update dependency axios to v1.6.1 ([9b14205](https://github.com/appium/appium/commit/9b14205288ef09fd4a1144fc93c82b2bb2ed2ec0))
|
||||
* **support:** update dependency teen_process to v2.0.57 ([1fbd503](https://github.com/appium/appium/commit/1fbd503a66b965a9b32bbb6702062861a8480333))
|
||||
* **support:** update dependency teen_process to v2.0.63 ([fa57192](https://github.com/appium/appium/commit/fa571925b7ac980cc99c8d23f659420eacd8546c))
|
||||
* **support:** update dependency teen_process to v2.0.64 ([332bb59](https://github.com/appium/appium/commit/332bb59ee3fdd14c03f6b3c4fd6587a30319d568))
|
||||
* **support:** update dependency teen_process to v2.0.66 ([3205b5d](https://github.com/appium/appium/commit/3205b5d06f073f1e5c7735c6e36ad08fdf091182))
|
||||
* **support:** update dependency teen_process to v2.0.67 ([3b5ae2a](https://github.com/appium/appium/commit/3b5ae2ab17c74c9890b53c081aec146152f11c7a))
|
||||
* **support:** update dependency teen_process to v2.0.73 ([8e453be](https://github.com/appium/appium/commit/8e453bed3f440c1dcf82f016f7d4431365b9cdff))
|
||||
* **support:** update dependency teen_process to v2.0.75 ([fbb6fd9](https://github.com/appium/appium/commit/fbb6fd9a2780eb00c15584abeaf644a1fcdecb4d))
|
||||
* **support:** update teen_process-related packages ([84d96db](https://github.com/appium/appium/commit/84d96dbae45dfe56218d32330f8ff2d26b750fb7))
|
||||
* **support:** update teen_process-related packages ([3d0b97c](https://github.com/appium/appium/commit/3d0b97cae76c616da0aea5b92cebcd38d59263b7))
|
||||
|
||||
|
||||
|
||||
## [4.1.8](https://github.com/appium/appium/compare/@appium/support@4.1.7...@appium/support@4.1.8) (2023-10-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Make sure type definitions are always in sync across modules ([#19323](https://github.com/appium/appium/issues/19323)) ([de39013](https://github.com/appium/appium/commit/de39013ae501d4fc11988435737efb862cc1d820))
|
||||
* **support:** update definitelytyped ([a306ce7](https://github.com/appium/appium/commit/a306ce741a806d21bc44f3b979803b8af5da99aa))
|
||||
|
||||
|
||||
|
||||
## [4.1.7](https://github.com/appium/appium/compare/@appium/support@4.1.6...@appium/support@4.1.7) (2023-10-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **images-plugin:** update dependency lru-cache to v10 ([#19050](https://github.com/appium/appium/issues/19050)) ([72a806b](https://github.com/appium/appium/commit/72a806bec7c3a80747192d24dfd9d8286a751810))
|
||||
* **support:** update definitelytyped ([3b44c7d](https://github.com/appium/appium/commit/3b44c7d8f5b89f9357dfe6bb56b54799bbe0a921))
|
||||
* **support:** update definitelytyped ([595d460](https://github.com/appium/appium/commit/595d460ac8dc41d310f9e4f653acbad3c7fd50b9))
|
||||
* **support:** update definitelytyped ([b6a76ce](https://github.com/appium/appium/commit/b6a76ce91e2765c22f84e389b93f780e0b4490c0))
|
||||
* **support:** update definitelytyped ([3e73600](https://github.com/appium/appium/commit/3e7360021dba0f8e8967094476fe92646ba5e35b))
|
||||
* **support:** update definitelytyped ([81b077f](https://github.com/appium/appium/commit/81b077fdc9300d2dbcd6b6a6a49dc5a84982c84c))
|
||||
* **support:** update dependency @types/pluralize to v0.0.31 ([26a6c62](https://github.com/appium/appium/commit/26a6c62512afb5c1b39854173fdc34be6d7665f1))
|
||||
* **support:** update dependency @types/semver to v7.5.1 ([a0f59d0](https://github.com/appium/appium/commit/a0f59d05945e627602407d1d42e7a3a58861b11f))
|
||||
* **support:** update dependency @types/teen_process to v2.0.1 ([d2f19aa](https://github.com/appium/appium/commit/d2f19aab935cc6ec00a51f042b5f02674a772198))
|
||||
* **support:** update dependency archiver to v6 ([#19051](https://github.com/appium/appium/issues/19051)) ([a3245dc](https://github.com/appium/appium/commit/a3245dcf2b58d9c40e72e666ccd4a095b7cc984b))
|
||||
* **support:** update dependency archiver to v6.0.1 ([#19111](https://github.com/appium/appium/issues/19111)) ([263bb43](https://github.com/appium/appium/commit/263bb43086c5e753cf4170953cb282f85d59b5a8))
|
||||
* **support:** update dependency axios to v1.5.0 ([08913cd](https://github.com/appium/appium/commit/08913cddde295f616f0fb376cc2cb71a9409a253))
|
||||
* **support:** update dependency axios to v1.5.1 ([#19217](https://github.com/appium/appium/issues/19217)) ([3df047d](https://github.com/appium/appium/commit/3df047d128d5d032826c8f5fb605b019078b717d))
|
||||
* **support:** update dependency glob to v10 ([#19094](https://github.com/appium/appium/issues/19094)) ([faca496](https://github.com/appium/appium/commit/faca49690a327095362619ba5cc04a03b3e11993))
|
||||
* **support:** update dependency glob to v10 ([#19185](https://github.com/appium/appium/issues/19185)) ([d336b51](https://github.com/appium/appium/commit/d336b51578e449a110c002f9bc216e114c2dd5e0))
|
||||
* **support:** update dependency teen_process to v2.0.10 ([bc1b56a](https://github.com/appium/appium/commit/bc1b56a3c162ed8686d3d7956c30eb1f7682b1a7))
|
||||
* **support:** update dependency teen_process to v2.0.12 ([c5d6df7](https://github.com/appium/appium/commit/c5d6df7a000d64e8591a56ce5ef65baa2071a36b))
|
||||
* **support:** update dependency teen_process to v2.0.13 ([a0c4b84](https://github.com/appium/appium/commit/a0c4b84fb7d3977b7a4ca0a07fadd49ee355791a))
|
||||
* **support:** update dependency teen_process to v2.0.18 ([ffeebc7](https://github.com/appium/appium/commit/ffeebc74b72e5eadf658325e67708ae6ed5b8346))
|
||||
* **support:** update dependency teen_process to v2.0.19 ([2ef40fe](https://github.com/appium/appium/commit/2ef40febdc717f54ea618ecfe1058b858fe2daf9))
|
||||
* **support:** update dependency teen_process to v2.0.23 ([1b0459e](https://github.com/appium/appium/commit/1b0459edd656514d8706aab8e21cd4d40de2ec5d))
|
||||
* **support:** update dependency teen_process to v2.0.24 ([bc72c66](https://github.com/appium/appium/commit/bc72c6676a5412b60e74bb143a223738ce059977))
|
||||
* **support:** update dependency teen_process to v2.0.27 ([03b2aa6](https://github.com/appium/appium/commit/03b2aa6b6e45fa0ea24c4691b039255bc4399733))
|
||||
* **support:** update dependency teen_process to v2.0.30 ([7cdb142](https://github.com/appium/appium/commit/7cdb1429a1104ad3699547f2a2dd9b237135891a))
|
||||
* **support:** update dependency teen_process to v2.0.34 ([#19218](https://github.com/appium/appium/issues/19218)) ([c28fcef](https://github.com/appium/appium/commit/c28fcefa725fbce5a0464e57946051e3cb023d85))
|
||||
* **support:** update dependency teen_process to v2.0.37 ([6d894be](https://github.com/appium/appium/commit/6d894bef6f377ebfdffdeb1adde7a72624844414))
|
||||
* **support:** update dependency teen_process to v2.0.38 ([a32dc11](https://github.com/appium/appium/commit/a32dc1110125d0f1fac9c66c17f1309145a634c7))
|
||||
* **support:** update dependency teen_process to v2.0.40 ([2837bcd](https://github.com/appium/appium/commit/2837bcdeb19532fe973a2902db5c8d730252d962))
|
||||
* **support:** update dependency teen_process to v2.0.41 ([1a34396](https://github.com/appium/appium/commit/1a34396339f71d40353d323feaf78afcf2269fc9))
|
||||
* **support:** update dependency teen_process to v2.0.42 ([e2a670e](https://github.com/appium/appium/commit/e2a670e1c4a0f061b0bfb08a6b534d9deb7bdd9c))
|
||||
* **support:** update dependency teen_process to v2.0.45 ([ea731bf](https://github.com/appium/appium/commit/ea731bf117d680496fce453ac42cfee7f05ada60))
|
||||
* **support:** update dependency teen_process to v2.0.48 ([eebc651](https://github.com/appium/appium/commit/eebc651f31c282baa7e77a6384d3ee8efc0072d6))
|
||||
* **support:** update dependency teen_process to v2.0.50 ([ca3e5d9](https://github.com/appium/appium/commit/ca3e5d90e4c51fc1dda32154e1d77e65cb44fb54))
|
||||
* **support:** update dependency teen_process to v2.0.9 ([6c7f3ef](https://github.com/appium/appium/commit/6c7f3ef670d441bdc4b693948a19dcbdc54e4764))
|
||||
* **support:** update dependency uuid to v9.0.1 ([73aa017](https://github.com/appium/appium/commit/73aa01786d113a0a3c885c40f58ef9cef3c4e52b))
|
||||
* **support:** update dependency which to v4 ([#19095](https://github.com/appium/appium/issues/19095)) ([6f51456](https://github.com/appium/appium/commit/6f51456da948685f606bed7575b5a4cf98b99c74))
|
||||
|
||||
|
||||
|
||||
## [4.1.6](https://github.com/appium/appium/compare/@appium/support@4.1.5...@appium/support@4.1.6) (2023-08-22)
|
||||
|
||||
**Note:** Version bump only for package @appium/support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [4.1.5](https://github.com/appium/appium/compare/@appium/support@4.1.4...@appium/support@4.1.5) (2023-08-21)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update dependency archiver to v5.3.2 ([e73e47d](https://github.com/appium/appium/commit/e73e47de18ff7e327a06584121e85756506ab21d))
|
||||
|
||||
|
||||
|
||||
## [4.1.4](https://github.com/appium/appium/compare/@appium/support@4.1.3...@appium/support@4.1.4) (2023-08-17)
|
||||
|
||||
|
||||
|
||||
@@ -84,10 +84,8 @@ function localIp() {
|
||||
let ip = _.chain(os.networkInterfaces())
|
||||
.values()
|
||||
.flatten()
|
||||
// @ts-ignore
|
||||
.filter(function (val) {
|
||||
return val.family === 'IPv4' && val.internal === false;
|
||||
})
|
||||
// @ts-ignore this filter works fine
|
||||
.filter(({family, internal}) => family === 'IPv4' && internal === false)
|
||||
.map('address')
|
||||
.first()
|
||||
.value();
|
||||
@@ -136,23 +134,21 @@ function safeJsonParse(obj) {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* Stringifies the object passed in, converting Buffers into Strings for better
|
||||
* display. This mimics JSON.stringify (see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)
|
||||
* except the `replacer` argument can only be a function.
|
||||
*
|
||||
* @param {object} obj - the object to be serialized
|
||||
* @param {?function} replacer - function to transform the properties added to the
|
||||
* @param {any} obj - the object to be serialized
|
||||
* @param {((key:any, value:any) => any)?} replacer - function to transform the properties added to the
|
||||
* serialized object
|
||||
* @param {?number|string} space - used to insert white space into the output JSON
|
||||
* @param {number|string|undefined} space - used to insert white space into the output JSON
|
||||
* string for readability purposes. Defaults to 2
|
||||
* returns {string} - the JSON object serialized as a string
|
||||
* @returns {string} - the JSON object serialized as a string
|
||||
*/
|
||||
function jsonStringify(obj, replacer, space = 2) {
|
||||
function jsonStringify(obj, replacer = null, space = 2) {
|
||||
// if no replacer is passed, or it is not a function, just use a pass-through
|
||||
if (!_.isFunction(replacer)) {
|
||||
replacer = (k, v) => v;
|
||||
}
|
||||
const replacerFunc = _.isFunction(replacer) ? replacer : (k, v) => v;
|
||||
|
||||
// Buffers cannot be serialized in a readable way
|
||||
const bufferToJSON = Buffer.prototype.toJSON;
|
||||
@@ -162,7 +158,7 @@ function jsonStringify(obj, replacer, space = 2) {
|
||||
obj,
|
||||
(key, value) => {
|
||||
const updatedValue = Buffer.isBuffer(value) ? value.toString('utf8') : value;
|
||||
return replacer(key, updatedValue);
|
||||
return replacerFunc(key, updatedValue);
|
||||
},
|
||||
space
|
||||
);
|
||||
|
||||
@@ -138,6 +138,7 @@ class ZipExtractor {
|
||||
const openReadStream = B.promisify(this.zipfile.openReadStream.bind(this.zipfile));
|
||||
const readStream = await openReadStream(entry);
|
||||
if (isSymlink) {
|
||||
// @ts-ignore This typecast is ok
|
||||
const link = await getStream(readStream);
|
||||
await fs.symlink(link, dest);
|
||||
} else {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/support",
|
||||
"version": "4.1.4",
|
||||
"version": "4.1.9",
|
||||
"description": "Support libs used across appium packages",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -41,34 +41,34 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/tsconfig": "^0.3.0",
|
||||
"@appium/types": "^0.13.3",
|
||||
"@appium/tsconfig": "^0.x",
|
||||
"@appium/types": "^0.14.2",
|
||||
"@colors/colors": "1.6.0",
|
||||
"@types/archiver": "5.3.2",
|
||||
"@types/base64-stream": "1.0.2",
|
||||
"@types/find-root": "1.1.2",
|
||||
"@types/jsftp": "2.1.2",
|
||||
"@types/klaw": "3.0.3",
|
||||
"@types/lockfile": "1.0.2",
|
||||
"@types/mv": "2.1.2",
|
||||
"@types/ncp": "2.0.5",
|
||||
"@types/npmlog": "4.1.4",
|
||||
"@types/pluralize": "0.0.30",
|
||||
"@types/semver": "7.5.0",
|
||||
"@types/shell-quote": "1.7.1",
|
||||
"@types/supports-color": "8.1.1",
|
||||
"@types/teen_process": "2.0.0",
|
||||
"@types/uuid": "9.0.2",
|
||||
"@types/which": "3.0.0",
|
||||
"archiver": "5.3.1",
|
||||
"axios": "1.4.0",
|
||||
"@types/archiver": "6.0.1",
|
||||
"@types/base64-stream": "1.0.5",
|
||||
"@types/find-root": "1.1.4",
|
||||
"@types/jsftp": "2.1.5",
|
||||
"@types/klaw": "3.0.6",
|
||||
"@types/lockfile": "1.0.4",
|
||||
"@types/mv": "2.1.4",
|
||||
"@types/ncp": "2.0.8",
|
||||
"@types/npmlog": "4.1.6",
|
||||
"@types/pluralize": "0.0.33",
|
||||
"@types/semver": "7.5.5",
|
||||
"@types/shell-quote": "1.7.4",
|
||||
"@types/supports-color": "8.1.3",
|
||||
"@types/teen_process": "2.0.3",
|
||||
"@types/uuid": "9.0.7",
|
||||
"@types/which": "3.0.1",
|
||||
"archiver": "6.0.1",
|
||||
"axios": "1.6.1",
|
||||
"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.3",
|
||||
"glob": "10.3.10",
|
||||
"jsftp": "2.1.3",
|
||||
"klaw": "4.1.0",
|
||||
"lockfile": "1.0.4",
|
||||
@@ -89,14 +89,14 @@
|
||||
"shell-quote": "1.8.1",
|
||||
"source-map-support": "0.5.21",
|
||||
"supports-color": "8.1.1",
|
||||
"teen_process": "2.0.4",
|
||||
"teen_process": "2.0.84",
|
||||
"type-fest": "3.13.1",
|
||||
"uuid": "9.0.0",
|
||||
"which": "3.0.1",
|
||||
"uuid": "9.0.1",
|
||||
"which": "4.0.0",
|
||||
"yauzl": "2.10.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"sharp": "0.32.4"
|
||||
"sharp": "0.32.6"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
|
||||
@@ -3,6 +3,49 @@
|
||||
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/test-support@3.0.26...@appium/test-support@3.0.27) (2023-11-14)
|
||||
|
||||
**Note:** Version bump only for package @appium/test-support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.26](https://github.com/appium/appium/compare/@appium/test-support@3.0.25...@appium/test-support@3.0.26) (2023-10-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **test-support:** update dependency sinon to v16.1.3 ([aaa7668](https://github.com/appium/appium/commit/aaa7668ae6d58f1ac6a5af957b9b214ee71c6a48))
|
||||
|
||||
|
||||
|
||||
## [3.0.25](https://github.com/appium/appium/compare/@appium/test-support@3.0.24...@appium/test-support@3.0.25) (2023-10-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **test-support:** update dependency sinon to v16 ([#19161](https://github.com/appium/appium/issues/19161)) ([49b3434](https://github.com/appium/appium/commit/49b3434c2bc324b5dc9f8204242c12f04b5252af))
|
||||
* **test-support:** update dependency sinon to v16.1.0 ([126daec](https://github.com/appium/appium/commit/126daeca4e600b75cf37f9fc15a1b6e563058b3c))
|
||||
|
||||
|
||||
|
||||
## [3.0.24](https://github.com/appium/appium/compare/@appium/test-support@3.0.23...@appium/test-support@3.0.24) (2023-08-22)
|
||||
|
||||
**Note:** Version bump only for package @appium/test-support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.23](https://github.com/appium/appium/compare/@appium/test-support@3.0.22...@appium/test-support@3.0.23) (2023-08-21)
|
||||
|
||||
**Note:** Version bump only for package @appium/test-support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.22](https://github.com/appium/appium/compare/@appium/test-support@3.0.21...@appium/test-support@3.0.22) (2023-08-17)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/test-support",
|
||||
"version": "3.0.22",
|
||||
"version": "3.0.27",
|
||||
"description": "A collection of test utilities used across Appium packages",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -45,12 +45,12 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/support": "^4.1.4",
|
||||
"@appium/support": "^4.1.9",
|
||||
"@colors/colors": "1.6.0",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
"loud-rejection": "2.2.0",
|
||||
"sinon": "15.2.0",
|
||||
"sinon": "16.1.3",
|
||||
"source-map-support": "0.5.21"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -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.
|
||||
|
||||
## [0.3.2](https://github.com/appium/appium/compare/@appium/tsconfig@0.3.1...@appium/tsconfig@0.3.2) (2023-10-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **tsconfig:** update dependency @tsconfig/node14 to v14 ([#19082](https://github.com/appium/appium/issues/19082)) ([65b3787](https://github.com/appium/appium/commit/65b3787912a4948fb1ed48e8095299bc9ba95844))
|
||||
|
||||
|
||||
|
||||
## [0.3.1](https://github.com/appium/appium/compare/@appium/tsconfig@0.3.0...@appium/tsconfig@0.3.1) (2023-08-22)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8 ([#18095](https://github.com/appium/appium/issues/18095)) ([b608db9](https://github.com/appium/appium/commit/b608db91a8ef0e3cad43ce3e14b625bf9234d383))
|
||||
|
||||
|
||||
|
||||
# [0.3.0](https://github.com/appium/appium/compare/@appium/tsconfig@0.2.4...@appium/tsconfig@0.3.0) (2023-04-10)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/tsconfig",
|
||||
"version": "0.3.0",
|
||||
"version": "0.3.2",
|
||||
"description": "Shared TypeScript Config for Appium",
|
||||
"main": "tsconfig.json",
|
||||
"keywords": [
|
||||
@@ -27,7 +27,7 @@
|
||||
"npm": ">=8"
|
||||
},
|
||||
"dependencies": {
|
||||
"@tsconfig/node14": "1.0.3"
|
||||
"@tsconfig/node14": "14.1.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test:smoke": "node tsconfig.json && node tsconfig.plugin.json"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"appium/plugin": ["../packages/appium/plugin"],
|
||||
"@appium/plugin-test-support": ["../packages/plugin-test-support"]
|
||||
},
|
||||
"types": ["webdriverio/async"]
|
||||
"types": ["webdriverio"]
|
||||
},
|
||||
"extends": "./tsconfig.json",
|
||||
"references": [
|
||||
|
||||
@@ -3,6 +3,50 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [0.14.2](https://github.com/appium/appium/compare/@appium/types@0.14.1...@appium/types@0.14.2) (2023-11-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update definitelytyped ([5ae8df3](https://github.com/appium/appium/commit/5ae8df3c36c7f03fbf3420087b532086f6742348))
|
||||
|
||||
|
||||
|
||||
## [0.14.1](https://github.com/appium/appium/compare/@appium/types@0.14.0...@appium/types@0.14.1) (2023-10-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Make sure type definitions are always in sync across modules ([#19323](https://github.com/appium/appium/issues/19323)) ([de39013](https://github.com/appium/appium/commit/de39013ae501d4fc11988435737efb862cc1d820))
|
||||
* **support:** update definitelytyped ([a306ce7](https://github.com/appium/appium/commit/a306ce741a806d21bc44f3b979803b8af5da99aa))
|
||||
|
||||
|
||||
|
||||
## [0.14.0](https://github.com/appium/appium/compare/@appium/types@0.13.4...@appium/types@0.14.0) (2023-10-18)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **base-driver:** Add server support of TLS and SPDY protocols ([#19105](https://github.com/appium/appium/issues/19105)) ([5926919](https://github.com/appium/appium/commit/5926919177e3df675723c80d800f933fdbda5824))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **images-plugin:** update dependency lru-cache to v10 ([#19050](https://github.com/appium/appium/issues/19050)) ([72a806b](https://github.com/appium/appium/commit/72a806bec7c3a80747192d24dfd9d8286a751810))
|
||||
* **support:** update definitelytyped ([3b44c7d](https://github.com/appium/appium/commit/3b44c7d8f5b89f9357dfe6bb56b54799bbe0a921))
|
||||
* **support:** update definitelytyped ([595d460](https://github.com/appium/appium/commit/595d460ac8dc41d310f9e4f653acbad3c7fd50b9))
|
||||
* **types:** update definitelytyped ([96b0a44](https://github.com/appium/appium/commit/96b0a44629c451102c44541a8d5b9e7be972f1ea))
|
||||
|
||||
|
||||
|
||||
## [0.13.4](https://github.com/appium/appium/compare/@appium/types@0.13.3...@appium/types@0.13.4) (2023-08-22)
|
||||
|
||||
**Note:** Version bump only for package @appium/types
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.13.3](https://github.com/appium/appium/compare/@appium/types@0.13.2...@appium/types@0.13.3) (2023-08-17)
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user