appium-novawindows2-driver 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -201
- package/README.md +557 -557
- package/build/lib/commands/actions.d.ts.map +1 -1
- package/build/lib/commands/actions.js +3 -4
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/app.d.ts.map +1 -1
- package/build/lib/commands/app.js +53 -45
- package/build/lib/commands/app.js.map +1 -1
- package/build/lib/commands/device.d.ts.map +1 -1
- package/build/lib/commands/device.js +2 -0
- package/build/lib/commands/device.js.map +1 -1
- package/build/lib/commands/element.d.ts.map +1 -1
- package/build/lib/commands/element.js +42 -12
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/extension.d.ts.map +1 -1
- package/build/lib/commands/extension.js +29 -17
- package/build/lib/commands/extension.js.map +1 -1
- package/build/lib/commands/file.d.ts +5 -0
- package/build/lib/commands/file.d.ts.map +1 -0
- package/build/lib/commands/file.js +49 -0
- package/build/lib/commands/file.js.map +1 -0
- package/build/lib/commands/functions.d.ts.map +1 -1
- package/build/lib/commands/functions.js +189 -187
- package/build/lib/commands/functions.js.map +1 -1
- package/build/lib/commands/index.d.ts +3 -0
- package/build/lib/commands/index.d.ts.map +1 -1
- package/build/lib/commands/index.js +2 -0
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/powershell.d.ts.map +1 -1
- package/build/lib/commands/powershell.js +114 -68
- package/build/lib/commands/powershell.js.map +1 -1
- package/build/lib/constraints.d.ts +18 -0
- package/build/lib/constraints.d.ts.map +1 -1
- package/build/lib/constraints.js +18 -0
- package/build/lib/constraints.js.map +1 -1
- package/build/lib/driver.d.ts.map +1 -1
- package/build/lib/driver.js +35 -4
- package/build/lib/driver.js.map +1 -1
- package/build/lib/powershell/converter.d.ts.map +1 -1
- package/build/lib/powershell/converter.js +12 -0
- package/build/lib/powershell/converter.js.map +1 -1
- package/build/lib/powershell/elements.d.ts.map +1 -1
- package/build/lib/powershell/elements.js +270 -265
- package/build/lib/powershell/elements.js.map +1 -1
- package/build/lib/winapi/user32.js.map +1 -1
- package/build/lib/xpath/core.d.ts +2 -2
- package/build/lib/xpath/core.d.ts.map +1 -1
- package/build/lib/xpath/core.js +32 -26
- package/build/lib/xpath/core.js.map +1 -1
- package/build/lib/xpath/functions.d.ts +1 -1
- package/build/lib/xpath/functions.d.ts.map +1 -1
- package/build/lib/xpath/functions.js +2 -2
- package/build/lib/xpath/functions.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -0
- package/package.json +67 -62
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -97
- package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -33
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -28
- package/.github/workflows/lint-build.yml +0 -30
- package/.github/workflows/release.yml +0 -39
- package/.releaserc +0 -41
- package/CHANGELOG.md +0 -33
- package/eslint.config.mjs +0 -11
- package/examples/api_test.js +0 -69
- package/examples/concurrency_test.js +0 -82
- package/examples/debug_test.js +0 -36
- package/examples/stress_test.js +0 -94
- package/examples/verify_driver.js +0 -142
- package/lib/commands/actions.ts +0 -229
- package/lib/commands/app.ts +0 -227
- package/lib/commands/device.ts +0 -41
- package/lib/commands/element.ts +0 -242
- package/lib/commands/extension.ts +0 -640
- package/lib/commands/functions.ts +0 -192
- package/lib/commands/index.ts +0 -28
- package/lib/commands/powershell.ts +0 -256
- package/lib/commands/system.ts +0 -7
- package/lib/constants.ts +0 -1
- package/lib/constraints.ts +0 -43
- package/lib/driver.ts +0 -266
- package/lib/enums.ts +0 -96
- package/lib/powershell/common.ts +0 -137
- package/lib/powershell/conditions.ts +0 -169
- package/lib/powershell/converter.ts +0 -373
- package/lib/powershell/core.ts +0 -29
- package/lib/powershell/elements.ts +0 -584
- package/lib/powershell/index.ts +0 -7
- package/lib/powershell/regex.ts +0 -77
- package/lib/powershell/types.ts +0 -208
- package/lib/util.ts +0 -52
- package/lib/winapi/types/index.ts +0 -7
- package/lib/winapi/types/input.ts +0 -12
- package/lib/winapi/types/keyeventf.ts +0 -14
- package/lib/winapi/types/mouseeventf.ts +0 -37
- package/lib/winapi/types/scancode.ts +0 -96
- package/lib/winapi/types/systemmetric.ts +0 -215
- package/lib/winapi/types/virtualkey.ts +0 -354
- package/lib/winapi/types/xmousebutton.ts +0 -8
- package/lib/winapi/user32.ts +0 -842
- package/lib/xpath/core.ts +0 -699
- package/lib/xpath/functions.ts +0 -366
- package/lib/xpath/index.ts +0 -2
- package/tsconfig.json +0 -13
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
name: Lint & Build
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
pull_request:
|
|
5
|
-
branches:
|
|
6
|
-
- main
|
|
7
|
-
- develop
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
build:
|
|
11
|
-
|
|
12
|
-
runs-on: ubuntu-latest
|
|
13
|
-
|
|
14
|
-
steps:
|
|
15
|
-
- name: Checkout repository
|
|
16
|
-
uses: actions/checkout@v5
|
|
17
|
-
|
|
18
|
-
- name: Set up Node.js
|
|
19
|
-
uses: actions/setup-node@v6
|
|
20
|
-
with:
|
|
21
|
-
node-version: 24.x
|
|
22
|
-
|
|
23
|
-
- name: Install dependencies
|
|
24
|
-
run: npm install --no-package-lock
|
|
25
|
-
|
|
26
|
-
- name: Lint
|
|
27
|
-
run: npm run lint
|
|
28
|
-
|
|
29
|
-
- name: Build
|
|
30
|
-
run: npm run build
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
name: Release
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
workflow_dispatch:
|
|
5
|
-
push:
|
|
6
|
-
branches:
|
|
7
|
-
- main
|
|
8
|
-
- develop
|
|
9
|
-
|
|
10
|
-
jobs:
|
|
11
|
-
build:
|
|
12
|
-
runs-on: ubuntu-latest
|
|
13
|
-
environment: Release
|
|
14
|
-
steps:
|
|
15
|
-
- uses: actions/checkout@v5
|
|
16
|
-
- name: Use Node.js
|
|
17
|
-
uses: actions/setup-node@v6
|
|
18
|
-
with:
|
|
19
|
-
node-version: 24.x
|
|
20
|
-
- run: npm install --no-package-lock
|
|
21
|
-
name: Install dependencies
|
|
22
|
-
- run: npm run build
|
|
23
|
-
name: Run NPM Build
|
|
24
|
-
- run: npm run lint
|
|
25
|
-
name: Run NPM Lint
|
|
26
|
-
- run: |
|
|
27
|
-
rm -rf package-lock.json node_modules
|
|
28
|
-
# Remove dev and peer dependencies from node_modules
|
|
29
|
-
npm prune --omit=dev --omit=peer --no-package-lock
|
|
30
|
-
name: Remove dev dependencies and appium peer dependencies
|
|
31
|
-
- run: npm shrinkwrap --omit=dev --omit=peer
|
|
32
|
-
name: Create shrinkwrap
|
|
33
|
-
- run: npm install --only=dev --no-package-lock
|
|
34
|
-
name: Install dev dependencies for the release
|
|
35
|
-
- run: npx semantic-release
|
|
36
|
-
env:
|
|
37
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
38
|
-
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
39
|
-
name: Release
|
package/.releaserc
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"branches": [
|
|
3
|
-
"main",
|
|
4
|
-
{ "name": "develop", "prerelease": "preview" }
|
|
5
|
-
],
|
|
6
|
-
"plugins": [
|
|
7
|
-
["@semantic-release/commit-analyzer", {
|
|
8
|
-
"preset": "angular",
|
|
9
|
-
"releaseRules": [
|
|
10
|
-
{ "type": "chore", "release": "patch" }
|
|
11
|
-
]
|
|
12
|
-
}],
|
|
13
|
-
["@semantic-release/release-notes-generator", {
|
|
14
|
-
"preset": "conventionalcommits",
|
|
15
|
-
"presetConfig": {
|
|
16
|
-
"types": [
|
|
17
|
-
{ "type": "feat", "section": "Features" },
|
|
18
|
-
{ "type": "fix", "section": "Bug Fixes" },
|
|
19
|
-
{ "type": "perf", "section": "Performance Improvements" },
|
|
20
|
-
{ "type": "revert", "section": "Reverts" },
|
|
21
|
-
{ "type": "chore", "section": "Miscellaneous Chores" },
|
|
22
|
-
{ "type": "refactor", "section": "Code Refactoring" },
|
|
23
|
-
{ "type": "docs", "section": "Documentation", "hidden": true },
|
|
24
|
-
{ "type": "style", "section": "Styles", "hidden": true },
|
|
25
|
-
{ "type": "test", "section": "Tests", "hidden": true },
|
|
26
|
-
{ "type": "build", "section": "Build System", "hidden": true },
|
|
27
|
-
{ "type": "ci", "section": "Continuous Integration", "hidden": true }
|
|
28
|
-
]
|
|
29
|
-
}
|
|
30
|
-
}],
|
|
31
|
-
["@semantic-release/changelog", {
|
|
32
|
-
"changelogFile": "CHANGELOG.md"
|
|
33
|
-
}],
|
|
34
|
-
"@semantic-release/npm",
|
|
35
|
-
["@semantic-release/git", {
|
|
36
|
-
"assets": ["docs", "package.json", "CHANGELOG.md"],
|
|
37
|
-
"message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
|
|
38
|
-
}],
|
|
39
|
-
"@semantic-release/github"
|
|
40
|
-
]
|
|
41
|
-
}
|
package/CHANGELOG.md
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
## [1.1.0](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/compare/v1.0.1...v1.1.0) (2025-08-06)
|
|
2
|
-
|
|
3
|
-
### Features
|
|
4
|
-
|
|
5
|
-
* adding appArguments option ([#26](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/issues/26)) ([ded917b](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/commit/ded917bdf2f8d224cc9cf917958177ed0e97078b))
|
|
6
|
-
|
|
7
|
-
## [1.0.1](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/compare/v1.0.0...v1.0.1) (2025-04-25)
|
|
8
|
-
|
|
9
|
-
### Bug Fixes
|
|
10
|
-
|
|
11
|
-
* fixed crash in Node 22+ by using Buffer instead of {} with EnumDisplaySettingsA ([#17](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/issues/17)) ([08e4907](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/commit/08e49070020f071f3983fcb00c30e9a3ae16b9dc))
|
|
12
|
-
* set shouldCloseApp's default value to true ([#18](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/issues/18)) ([28dc1d4](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/commit/28dc1d443d416e9a44f4ddcd2fb31828e0b92bcb))
|
|
13
|
-
|
|
14
|
-
### Code Refactoring
|
|
15
|
-
|
|
16
|
-
* remove unnecessary debug logging for name locator ([#19](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/issues/19)) ([ad50be9](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/commit/ad50be9f9b60145a2f203f294d326eb9499339fb))
|
|
17
|
-
|
|
18
|
-
## 1.0.0 (2025-04-23)
|
|
19
|
-
|
|
20
|
-
### Miscellaneous Chores
|
|
21
|
-
|
|
22
|
-
* add .gitignore ([631fa0a](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/commit/631fa0a72f5cda861215ff4d98ccc41c44d357f6))
|
|
23
|
-
* adding eslint ([c05602d](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/commit/c05602d1aaa7fa003394ec663302017a3027db82))
|
|
24
|
-
* **ci:** add semantic-release workflow ([a9c39fd](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/commit/a9c39fdab2d361678445a523a2830ea9925c4f1f))
|
|
25
|
-
* **lint:** fix linting issue ([6c2cb42](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/commit/6c2cb42388a7f51842a1a5bd11905a9fe0e86ce9))
|
|
26
|
-
* **npm:** disable package-lock generation ([5a648ac](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/commit/5a648ac7f65fcfef66afd6bf76ce2188b10d4ce9))
|
|
27
|
-
* **package:** add keywords and repository info ([fa165d0](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/commit/fa165d007f6a424c0f11340b59ac73e1185091d8))
|
|
28
|
-
* **release:** rollback version to 0.0.1 for testing ([#11](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/issues/11)) ([c4dd2c2](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/commit/c4dd2c21e3067f70a11d72206fbc7f5da79380b6))
|
|
29
|
-
* updated dependencies [skip ci] ([08528fb](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/commit/08528fb06727df50c087940fe541730a2a13483f))
|
|
30
|
-
|
|
31
|
-
### Code Refactoring
|
|
32
|
-
|
|
33
|
-
* adding enums for click and updating ([89dcebf](https://github.com/nguyenvanhuy0612/appium-novawindows-driver/commit/89dcebfd026f7a68b4052f33fa2c928ba42162bf))
|
package/eslint.config.mjs
DELETED
package/examples/api_test.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
const axios = require('axios');
|
|
2
|
-
|
|
3
|
-
// Configuration
|
|
4
|
-
// Appium 2.x defaults to no base path. If you are using Appium 1.x or have configured a base path, add it here (e.g., http://.../wd/hub)
|
|
5
|
-
const hubUrl = 'http://192.168.196.155:4723';
|
|
6
|
-
|
|
7
|
-
const capabilities = {
|
|
8
|
-
"capabilities": {
|
|
9
|
-
"alwaysMatch": {
|
|
10
|
-
"platformName": "Windows",
|
|
11
|
-
"appium:automationName": "NovaWindows2",
|
|
12
|
-
"appium:app": "Root"
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
async function runTest() {
|
|
18
|
-
let sessionId;
|
|
19
|
-
try {
|
|
20
|
-
// 1. Create Session
|
|
21
|
-
console.log(`Sending POST to ${hubUrl}/session to create session...`);
|
|
22
|
-
const sessionRes = await axios.post(`${hubUrl}/session`, capabilities);
|
|
23
|
-
|
|
24
|
-
// Appium sends sessionId in `value.sessionId` (W3C) or just `sessionId` (JSONWP)
|
|
25
|
-
if (sessionRes.data.value && sessionRes.data.value.sessionId) {
|
|
26
|
-
sessionId = sessionRes.data.value.sessionId;
|
|
27
|
-
} else if (sessionRes.data.sessionId) {
|
|
28
|
-
sessionId = sessionRes.data.sessionId;
|
|
29
|
-
} else {
|
|
30
|
-
throw new Error('Failed to parse sessionId from response: ' + JSON.stringify(sessionRes.data));
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
console.log(`Session created with ID: ${sessionId}`);
|
|
34
|
-
|
|
35
|
-
// 2. Get Page Source
|
|
36
|
-
console.log(`Sending GET to ${hubUrl}/session/${sessionId}/source to get page source...`);
|
|
37
|
-
const sourceRes = await axios.get(`${hubUrl}/session/${sessionId}/source`);
|
|
38
|
-
const source = sourceRes.data.value; // W3C standard response structure { value: ... }
|
|
39
|
-
|
|
40
|
-
console.log('--- Page Source Start ---');
|
|
41
|
-
console.log(source);
|
|
42
|
-
console.log('--- Page Source End ---');
|
|
43
|
-
|
|
44
|
-
} catch (error) {
|
|
45
|
-
console.error('Error occurred:');
|
|
46
|
-
if (error.response) {
|
|
47
|
-
console.error(`Status: ${error.response.status}`);
|
|
48
|
-
console.error('Data:', JSON.stringify(error.response.data, null, 2));
|
|
49
|
-
if (error.response.status === 404) {
|
|
50
|
-
console.error('Hint: The Appium server might be using a different base path (e.g., /wd/hub). Check your server configuration.');
|
|
51
|
-
}
|
|
52
|
-
} else {
|
|
53
|
-
console.error(error.message);
|
|
54
|
-
}
|
|
55
|
-
} finally {
|
|
56
|
-
if (sessionId) {
|
|
57
|
-
// 3. Delete Session
|
|
58
|
-
try {
|
|
59
|
-
console.log(`Deleting session ${sessionId}...`);
|
|
60
|
-
await axios.delete(`${hubUrl}/session/${sessionId}`);
|
|
61
|
-
console.log('Session deleted.');
|
|
62
|
-
} catch (delErr) {
|
|
63
|
-
console.error('Failed to delete session:', delErr.message);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
runTest();
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
const axios = require('axios');
|
|
2
|
-
|
|
3
|
-
// Configuration
|
|
4
|
-
const hubUrl = 'http://192.168.196.155:4723';
|
|
5
|
-
|
|
6
|
-
const capabilities = {
|
|
7
|
-
"capabilities": {
|
|
8
|
-
"alwaysMatch": {
|
|
9
|
-
"platformName": "Windows",
|
|
10
|
-
"appium:automationName": "NovaWindows2",
|
|
11
|
-
"appium:app": "Root"
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
async function runTest() {
|
|
17
|
-
let sessionId;
|
|
18
|
-
try {
|
|
19
|
-
console.log(`Sending POST to ${hubUrl}/session to create session...`);
|
|
20
|
-
const sessionRes = await axios.post(`${hubUrl}/session`, capabilities);
|
|
21
|
-
|
|
22
|
-
if (sessionRes.data.value && sessionRes.data.value.sessionId) {
|
|
23
|
-
sessionId = sessionRes.data.value.sessionId;
|
|
24
|
-
} else if (sessionRes.data.sessionId) {
|
|
25
|
-
sessionId = sessionRes.data.sessionId;
|
|
26
|
-
} else {
|
|
27
|
-
throw new Error('Failed to parse sessionId');
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
console.log(`Session created with ID: ${sessionId}`);
|
|
31
|
-
|
|
32
|
-
// Send 100 concurrent requests
|
|
33
|
-
const startTime = Date.now();
|
|
34
|
-
console.log('Sending 100 concurrent getPageSource requests...');
|
|
35
|
-
const promises = [];
|
|
36
|
-
for (let i = 0; i < 100; i++) {
|
|
37
|
-
const startRequestTime = Date.now();
|
|
38
|
-
promises.push(
|
|
39
|
-
axios.get(`${hubUrl}/session/${sessionId}/source`)
|
|
40
|
-
.then(() => console.log(`Request ${i + 1} completed in ${Date.now() - startRequestTime} ms`))
|
|
41
|
-
.catch((err) => console.error(`Request ${i + 1} failed: ${err.message}`))
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
await Promise.all(promises);
|
|
46
|
-
console.log('All requests finished.');
|
|
47
|
-
const endTime = Date.now();
|
|
48
|
-
console.log(`Total time taken: ${endTime - startTime} ms`);
|
|
49
|
-
|
|
50
|
-
// Send 100 sequential requests
|
|
51
|
-
const startTime2 = Date.now();
|
|
52
|
-
console.log('Sending 100 sequential getPageSource requests...');
|
|
53
|
-
for (let i = 0; i < 100; i++) {
|
|
54
|
-
const startRequestTime = Date.now();
|
|
55
|
-
await axios.get(`${hubUrl}/session/${sessionId}/source`)
|
|
56
|
-
.then(() => console.log(`Request ${i + 1} completed in ${Date.now() - startRequestTime} ms`))
|
|
57
|
-
.catch((err) => console.error(`Request ${i + 1} failed: ${err.message}`));
|
|
58
|
-
}
|
|
59
|
-
const endTime2 = Date.now();
|
|
60
|
-
console.log(`Total time taken: ${endTime2 - startTime2} ms`);
|
|
61
|
-
|
|
62
|
-
// Verify session is still alive by sending one more request
|
|
63
|
-
console.log('Sending final verification request...');
|
|
64
|
-
await axios.get(`${hubUrl}/session/${sessionId}/source`);
|
|
65
|
-
console.log('Final request succeeded.');
|
|
66
|
-
|
|
67
|
-
} catch (error) {
|
|
68
|
-
console.error('Test failed:', error.message);
|
|
69
|
-
} finally {
|
|
70
|
-
if (sessionId) {
|
|
71
|
-
try {
|
|
72
|
-
console.log(`Deleting session ${sessionId}...`);
|
|
73
|
-
await axios.delete(`${hubUrl}/session/${sessionId}`);
|
|
74
|
-
console.log('Session deleted.');
|
|
75
|
-
} catch (delErr) {
|
|
76
|
-
console.error('Failed to delete session:', delErr.message);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
runTest();
|
package/examples/debug_test.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
const { remote } = require('webdriverio');
|
|
2
|
-
|
|
3
|
-
async function main() {
|
|
4
|
-
const opts = {
|
|
5
|
-
hostname: '127.0.0.1',
|
|
6
|
-
port: 4723,
|
|
7
|
-
path: '/',
|
|
8
|
-
capabilities: {
|
|
9
|
-
"platformName": "Windows",
|
|
10
|
-
"appium:automationName": "NovaWindows2",
|
|
11
|
-
"appium:app": "Root",
|
|
12
|
-
"appium:newCommandTimeout": 60
|
|
13
|
-
},
|
|
14
|
-
logLevel: 'error'
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
let client;
|
|
18
|
-
try {
|
|
19
|
-
console.log('Connecting...');
|
|
20
|
-
client = await remote(opts);
|
|
21
|
-
console.log('Connected.');
|
|
22
|
-
console.log('Sending Get-Date...');
|
|
23
|
-
const res = await client.executeScript('powerShell', ['Get-Date']);
|
|
24
|
-
console.log('Result:', res);
|
|
25
|
-
} catch (e) {
|
|
26
|
-
console.error('Error:', e);
|
|
27
|
-
} finally {
|
|
28
|
-
if (client) {
|
|
29
|
-
console.log('Deleting session...');
|
|
30
|
-
await client.deleteSession();
|
|
31
|
-
console.log('Session deleted.');
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
main();
|
package/examples/stress_test.js
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
const { remote } = require('webdriverio');
|
|
2
|
-
const fs = require('fs');
|
|
3
|
-
const path = require('path');
|
|
4
|
-
|
|
5
|
-
async function main() {
|
|
6
|
-
const opts = {
|
|
7
|
-
hostname: '192.168.196.155',
|
|
8
|
-
// hostname: '127.0.0.1',
|
|
9
|
-
port: 4723,
|
|
10
|
-
path: '/',
|
|
11
|
-
capabilities: {
|
|
12
|
-
"appium:automationName": "NovaWindows2",
|
|
13
|
-
"platformName": "Windows",
|
|
14
|
-
"appium:app": "Root",
|
|
15
|
-
"appium:newCommandTimeout": 60
|
|
16
|
-
},
|
|
17
|
-
logLevel: 'error'
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
console.log('Initializing session...');
|
|
21
|
-
let client;
|
|
22
|
-
try {
|
|
23
|
-
client = await remote(opts);
|
|
24
|
-
console.log('Session created successfully.');
|
|
25
|
-
|
|
26
|
-
// create function for each action in loop
|
|
27
|
-
const actions = {
|
|
28
|
-
getPageSource: async () => {
|
|
29
|
-
const startTime = Date.now();
|
|
30
|
-
try {
|
|
31
|
-
const source = await client.getPageSource();
|
|
32
|
-
console.log(`Page Source retrieval successful (Length: ${source.length} chars)`);
|
|
33
|
-
} catch (e) {
|
|
34
|
-
console.log(`Expected error: ${e}`);
|
|
35
|
-
}
|
|
36
|
-
const endTime = Date.now();
|
|
37
|
-
console.log(`getPageSource - Time taken: ${endTime - startTime} ms`);
|
|
38
|
-
},
|
|
39
|
-
getButtons: async () => {
|
|
40
|
-
const startTime = Date.now();
|
|
41
|
-
try {
|
|
42
|
-
const buttons = await client.findElements('xpath', '//Button');
|
|
43
|
-
console.log(`Buttons found: ${buttons.length}`);
|
|
44
|
-
} catch (e) {
|
|
45
|
-
console.log(`Expected error: ${e}`);
|
|
46
|
-
}
|
|
47
|
-
const endTime = Date.now();
|
|
48
|
-
console.log(`getButtons - Time taken: ${endTime - startTime} ms`);
|
|
49
|
-
},
|
|
50
|
-
getProcess: async () => {
|
|
51
|
-
const startTime = Date.now();
|
|
52
|
-
try {
|
|
53
|
-
const process = await client.executeScript('powerShell', ["Get-Process; exit 1"]);
|
|
54
|
-
console.log(`Process retrieval successful (Length: ${process.length} chars)`);
|
|
55
|
-
} catch (e) {
|
|
56
|
-
console.log(`Expected error: ${e}`);
|
|
57
|
-
}
|
|
58
|
-
const endTime = Date.now();
|
|
59
|
-
console.log(`getProcess - Time taken: ${endTime - startTime} ms`);
|
|
60
|
-
},
|
|
61
|
-
getWindows: async () => {
|
|
62
|
-
const startTime = Date.now();
|
|
63
|
-
try {
|
|
64
|
-
const windows = await client.findElements('xpath', '//Window');
|
|
65
|
-
console.log(`Windows found: ${windows.length}`);
|
|
66
|
-
} catch (e) {
|
|
67
|
-
console.log(`Expected error: ${e}`);
|
|
68
|
-
}
|
|
69
|
-
const endTime = Date.now();
|
|
70
|
-
console.log(`getWindows - Time taken: ${endTime - startTime} ms`);
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
// for 100 times
|
|
75
|
-
const startTime = Date.now();
|
|
76
|
-
for (let i = 0; i < 100; i++) {
|
|
77
|
-
const startCurTime = Date.now();
|
|
78
|
-
console.log(`Start Action: ${i + 1}`);
|
|
79
|
-
for (const action in actions) {
|
|
80
|
-
await actions[action]();
|
|
81
|
-
}
|
|
82
|
-
console.log(`Total time taken for action ${i + 1}: ${Date.now() - startCurTime} ms`);
|
|
83
|
-
}
|
|
84
|
-
console.log(`Total time taken: ${Date.now() - startTime} ms`);
|
|
85
|
-
} catch (err) {
|
|
86
|
-
console.error('Failed to create session:', err);
|
|
87
|
-
} finally {
|
|
88
|
-
if (client) {
|
|
89
|
-
await client.deleteSession();
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
main();
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
const { remote } = require('webdriverio');
|
|
2
|
-
const fs = require('fs');
|
|
3
|
-
const path = require('path');
|
|
4
|
-
|
|
5
|
-
async function main() {
|
|
6
|
-
const opts = {
|
|
7
|
-
hostname: '127.0.0.1',
|
|
8
|
-
port: 4723,
|
|
9
|
-
path: '/',
|
|
10
|
-
capabilities: {
|
|
11
|
-
"appium:automationName": "NovaWindows2",
|
|
12
|
-
"platformName": "Windows",
|
|
13
|
-
"appium:app": "Root", // Using Root to attach to desktop, verify this is supported
|
|
14
|
-
"appium:newCommandTimeout": 60
|
|
15
|
-
},
|
|
16
|
-
logLevel: 'error'
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
console.log('Initializing session...');
|
|
20
|
-
let client;
|
|
21
|
-
try {
|
|
22
|
-
client = await remote(opts);
|
|
23
|
-
console.log('Session created successfully.');
|
|
24
|
-
} catch (err) {
|
|
25
|
-
console.error('Failed to create session:', err);
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
try {
|
|
30
|
-
// 1. Get Page Source
|
|
31
|
-
console.log('Test 1: Get Page Source (SKIPPED - too slow for Root)');
|
|
32
|
-
//const source = await client.getPageSource();
|
|
33
|
-
//console.log(`Page Source retrieval successful (Length: ${source.length} chars)`);
|
|
34
|
-
|
|
35
|
-
// 2. Maximize Window
|
|
36
|
-
// Note: For Root, maximize might not be applicable to the "desktop" window itself in the same way,
|
|
37
|
-
// but we can try getting window size or finding a window to maximize.
|
|
38
|
-
// For simplicity, we just log window size.
|
|
39
|
-
console.log('Test 2: Get Window Rect');
|
|
40
|
-
const rect = await client.getWindowRect();
|
|
41
|
-
console.log(`Window Rect: ${JSON.stringify(rect)}`);
|
|
42
|
-
|
|
43
|
-
// 3. Take Screenshot
|
|
44
|
-
console.log('Test 3: Take Screenshot');
|
|
45
|
-
const screenshotPath = path.resolve(__dirname, 'screenshot.png');
|
|
46
|
-
await client.saveScreenshot(screenshotPath);
|
|
47
|
-
if (fs.existsSync(screenshotPath)) {
|
|
48
|
-
console.log(`Screenshot saved to: ${screenshotPath}`);
|
|
49
|
-
} else {
|
|
50
|
-
console.error('Screenshot failed to save.');
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// 4. Find Element
|
|
54
|
-
console.log('Test 4: Find Element (XPath)');
|
|
55
|
-
// Try to find the Taskbar or Start button.
|
|
56
|
-
// Common on Windows 10/11: "Starry" or name="Start"
|
|
57
|
-
// Let's try a generic find first
|
|
58
|
-
const element = await client.$('//*');
|
|
59
|
-
if (element.error) {
|
|
60
|
-
console.error('Failed to find root element');
|
|
61
|
-
} else {
|
|
62
|
-
console.log(`Found root element with ID: ${element.elementId}`);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
// 5. Get Window Handle
|
|
68
|
-
console.log('Test 5: Get Window Handle');
|
|
69
|
-
const handle = await client.getWindowHandle();
|
|
70
|
-
console.log(`Window Handle: ${handle}`);
|
|
71
|
-
|
|
72
|
-
// 6. Execute powershell command
|
|
73
|
-
console.log('Test 6: Execute powershell command');
|
|
74
|
-
const result = await client.executeScript('powerShell', [{ 'command': 'Get-Process' }]);
|
|
75
|
-
// console.log(`Result: ${JSON.stringify(result)}`); // Output can be huge, maybe truncate
|
|
76
|
-
console.log(`Result length: ${JSON.stringify(result).length} chars`);
|
|
77
|
-
|
|
78
|
-
// 7. Execute powershell command with exit
|
|
79
|
-
console.log('Test 7: Execute powershell command with exit');
|
|
80
|
-
try {
|
|
81
|
-
const resultExit = await client.executeScript('powerShell', [{ 'command': 'Get-Process; exit 0' }]);
|
|
82
|
-
console.log(`Result exit length: ${JSON.stringify(resultExit).length}`);
|
|
83
|
-
} catch (e) {
|
|
84
|
-
console.log(`Test 7 encountered error as expected (or unexpected): ${e.message}`);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// 7.5 Recovery Check
|
|
88
|
-
console.log('Test 7.5: Recovery Check with simple command');
|
|
89
|
-
console.log('Waiting 2 seconds...');
|
|
90
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
91
|
-
try {
|
|
92
|
-
const output = await client.executeScript('powerShell', [{ command: 'Get-Process | Select-Object -First 1' }]);
|
|
93
|
-
console.log('Test 7.5 passed. Recovery seems to work for simple commands.');
|
|
94
|
-
} catch (e) {
|
|
95
|
-
console.error('Test 7.5 failed:', e.message);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// 8. Click on Start button (Safe Locator)
|
|
99
|
-
console.log('Test 8: Click on Start button (Safe Locator)');
|
|
100
|
-
console.log('Waiting 3 seconds before Test 8...');
|
|
101
|
-
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
102
|
-
|
|
103
|
-
// Use direct child path to avoid deep recursion on Root
|
|
104
|
-
let startButton;
|
|
105
|
-
try {
|
|
106
|
-
// Try to find Taskbar by class name (direct child of Root usually)
|
|
107
|
-
// Then find Start button inside it.
|
|
108
|
-
// Note: XPath `//` is recursive. We want direct child.
|
|
109
|
-
// But client.$ calls `xpathToElIdOrIds`.
|
|
110
|
-
// If we use `xpath`, we can force direct children?
|
|
111
|
-
// `/Pane[@ClassName="Shell_TrayWnd"]` is absolute path from Root?
|
|
112
|
-
// No, `xpath-analyzer` treats `/` as absolute from root.
|
|
113
|
-
// Let's try finding Taskbar first using absolute path.
|
|
114
|
-
|
|
115
|
-
// However, client.$ prefixing is tricky if we don't start with /
|
|
116
|
-
// If we start with /, it's absolute.
|
|
117
|
-
|
|
118
|
-
const taskbar = await client.$('/Pane[@ClassName="Shell_TrayWnd"]');
|
|
119
|
-
startButton = await taskbar.$('Button[@Name="Start"]');
|
|
120
|
-
} catch (e) {
|
|
121
|
-
console.log('Safe locator failed: ' + e.message);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
if (!startButton || startButton.error) {
|
|
125
|
-
console.log('Could not find Start button with safe locator. Skipping click.');
|
|
126
|
-
} else {
|
|
127
|
-
await startButton.click();
|
|
128
|
-
console.log('Clicked Start button (Test 8 passed).');
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
} catch (err) {
|
|
132
|
-
console.error('Test execution failed:', err);
|
|
133
|
-
} finally {
|
|
134
|
-
if (client) {
|
|
135
|
-
console.log('Deleting session...');
|
|
136
|
-
await client.deleteSession();
|
|
137
|
-
console.log('Session deleted.');
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
main();
|