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.
Files changed (103) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +557 -557
  3. package/build/lib/commands/actions.d.ts.map +1 -1
  4. package/build/lib/commands/actions.js +3 -4
  5. package/build/lib/commands/actions.js.map +1 -1
  6. package/build/lib/commands/app.d.ts.map +1 -1
  7. package/build/lib/commands/app.js +53 -45
  8. package/build/lib/commands/app.js.map +1 -1
  9. package/build/lib/commands/device.d.ts.map +1 -1
  10. package/build/lib/commands/device.js +2 -0
  11. package/build/lib/commands/device.js.map +1 -1
  12. package/build/lib/commands/element.d.ts.map +1 -1
  13. package/build/lib/commands/element.js +42 -12
  14. package/build/lib/commands/element.js.map +1 -1
  15. package/build/lib/commands/extension.d.ts.map +1 -1
  16. package/build/lib/commands/extension.js +29 -17
  17. package/build/lib/commands/extension.js.map +1 -1
  18. package/build/lib/commands/file.d.ts +5 -0
  19. package/build/lib/commands/file.d.ts.map +1 -0
  20. package/build/lib/commands/file.js +49 -0
  21. package/build/lib/commands/file.js.map +1 -0
  22. package/build/lib/commands/functions.d.ts.map +1 -1
  23. package/build/lib/commands/functions.js +189 -187
  24. package/build/lib/commands/functions.js.map +1 -1
  25. package/build/lib/commands/index.d.ts +3 -0
  26. package/build/lib/commands/index.d.ts.map +1 -1
  27. package/build/lib/commands/index.js +2 -0
  28. package/build/lib/commands/index.js.map +1 -1
  29. package/build/lib/commands/powershell.d.ts.map +1 -1
  30. package/build/lib/commands/powershell.js +114 -68
  31. package/build/lib/commands/powershell.js.map +1 -1
  32. package/build/lib/constraints.d.ts +18 -0
  33. package/build/lib/constraints.d.ts.map +1 -1
  34. package/build/lib/constraints.js +18 -0
  35. package/build/lib/constraints.js.map +1 -1
  36. package/build/lib/driver.d.ts.map +1 -1
  37. package/build/lib/driver.js +35 -4
  38. package/build/lib/driver.js.map +1 -1
  39. package/build/lib/powershell/converter.d.ts.map +1 -1
  40. package/build/lib/powershell/converter.js +12 -0
  41. package/build/lib/powershell/converter.js.map +1 -1
  42. package/build/lib/powershell/elements.d.ts.map +1 -1
  43. package/build/lib/powershell/elements.js +270 -265
  44. package/build/lib/powershell/elements.js.map +1 -1
  45. package/build/lib/winapi/user32.js.map +1 -1
  46. package/build/lib/xpath/core.d.ts +2 -2
  47. package/build/lib/xpath/core.d.ts.map +1 -1
  48. package/build/lib/xpath/core.js +32 -26
  49. package/build/lib/xpath/core.js.map +1 -1
  50. package/build/lib/xpath/functions.d.ts +1 -1
  51. package/build/lib/xpath/functions.d.ts.map +1 -1
  52. package/build/lib/xpath/functions.js +2 -2
  53. package/build/lib/xpath/functions.js.map +1 -1
  54. package/build/tsconfig.tsbuildinfo +1 -0
  55. package/package.json +67 -62
  56. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -97
  57. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -33
  58. package/.github/PULL_REQUEST_TEMPLATE.md +0 -28
  59. package/.github/workflows/lint-build.yml +0 -30
  60. package/.github/workflows/release.yml +0 -39
  61. package/.releaserc +0 -41
  62. package/CHANGELOG.md +0 -33
  63. package/eslint.config.mjs +0 -11
  64. package/examples/api_test.js +0 -69
  65. package/examples/concurrency_test.js +0 -82
  66. package/examples/debug_test.js +0 -36
  67. package/examples/stress_test.js +0 -94
  68. package/examples/verify_driver.js +0 -142
  69. package/lib/commands/actions.ts +0 -229
  70. package/lib/commands/app.ts +0 -227
  71. package/lib/commands/device.ts +0 -41
  72. package/lib/commands/element.ts +0 -242
  73. package/lib/commands/extension.ts +0 -640
  74. package/lib/commands/functions.ts +0 -192
  75. package/lib/commands/index.ts +0 -28
  76. package/lib/commands/powershell.ts +0 -256
  77. package/lib/commands/system.ts +0 -7
  78. package/lib/constants.ts +0 -1
  79. package/lib/constraints.ts +0 -43
  80. package/lib/driver.ts +0 -266
  81. package/lib/enums.ts +0 -96
  82. package/lib/powershell/common.ts +0 -137
  83. package/lib/powershell/conditions.ts +0 -169
  84. package/lib/powershell/converter.ts +0 -373
  85. package/lib/powershell/core.ts +0 -29
  86. package/lib/powershell/elements.ts +0 -584
  87. package/lib/powershell/index.ts +0 -7
  88. package/lib/powershell/regex.ts +0 -77
  89. package/lib/powershell/types.ts +0 -208
  90. package/lib/util.ts +0 -52
  91. package/lib/winapi/types/index.ts +0 -7
  92. package/lib/winapi/types/input.ts +0 -12
  93. package/lib/winapi/types/keyeventf.ts +0 -14
  94. package/lib/winapi/types/mouseeventf.ts +0 -37
  95. package/lib/winapi/types/scancode.ts +0 -96
  96. package/lib/winapi/types/systemmetric.ts +0 -215
  97. package/lib/winapi/types/virtualkey.ts +0 -354
  98. package/lib/winapi/types/xmousebutton.ts +0 -8
  99. package/lib/winapi/user32.ts +0 -842
  100. package/lib/xpath/core.ts +0 -699
  101. package/lib/xpath/functions.ts +0 -366
  102. package/lib/xpath/index.ts +0 -2
  103. 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
@@ -1,11 +0,0 @@
1
- // @ts-check
2
-
3
- import { defineConfig } from 'eslint/config';
4
- import eslint from '@eslint/js';
5
- import appiumConfig from '@appium/eslint-config-appium-ts';
6
-
7
-
8
- export default defineConfig(
9
- eslint.configs.recommended,
10
- ...appiumConfig,
11
- );
@@ -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();
@@ -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();
@@ -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();