appium-novawindows2-driver 0.1.1

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 (192) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.yml +97 -0
  2. package/.github/ISSUE_TEMPLATE/feature_request.yml +33 -0
  3. package/.github/PULL_REQUEST_TEMPLATE.md +28 -0
  4. package/.github/workflows/lint-build.yml +30 -0
  5. package/.github/workflows/release.yml +39 -0
  6. package/.releaserc +41 -0
  7. package/CHANGELOG.md +33 -0
  8. package/LICENSE +202 -0
  9. package/README.md +557 -0
  10. package/build/eslint.config.d.mts +3 -0
  11. package/build/eslint.config.d.mts.map +1 -0
  12. package/build/eslint.config.mjs +6 -0
  13. package/build/eslint.config.mjs.map +1 -0
  14. package/build/lib/commands/actions.d.ts +11 -0
  15. package/build/lib/commands/actions.d.ts.map +1 -0
  16. package/build/lib/commands/actions.js +212 -0
  17. package/build/lib/commands/actions.js.map +1 -0
  18. package/build/lib/commands/app.d.ts +12 -0
  19. package/build/lib/commands/app.d.ts.map +1 -0
  20. package/build/lib/commands/app.js +195 -0
  21. package/build/lib/commands/app.js.map +1 -0
  22. package/build/lib/commands/device.d.ts +3 -0
  23. package/build/lib/commands/device.d.ts.map +1 -0
  24. package/build/lib/commands/device.js +31 -0
  25. package/build/lib/commands/device.js.map +1 -0
  26. package/build/lib/commands/element.d.ts +15 -0
  27. package/build/lib/commands/element.d.ts.map +1 -0
  28. package/build/lib/commands/element.js +213 -0
  29. package/build/lib/commands/element.js.map +1 -0
  30. package/build/lib/commands/extension.d.ts +87 -0
  31. package/build/lib/commands/extension.d.ts.map +1 -0
  32. package/build/lib/commands/extension.js +511 -0
  33. package/build/lib/commands/extension.js.map +1 -0
  34. package/build/lib/commands/functions.d.ts +3 -0
  35. package/build/lib/commands/functions.d.ts.map +1 -0
  36. package/build/lib/commands/functions.js +194 -0
  37. package/build/lib/commands/functions.js.map +1 -0
  38. package/build/lib/commands/index.d.ts +126 -0
  39. package/build/lib/commands/index.d.ts.map +1 -0
  40. package/build/lib/commands/index.js +54 -0
  41. package/build/lib/commands/index.js.map +1 -0
  42. package/build/lib/commands/powershell.d.ts +6 -0
  43. package/build/lib/commands/powershell.d.ts.map +1 -0
  44. package/build/lib/commands/powershell.js +204 -0
  45. package/build/lib/commands/powershell.js.map +1 -0
  46. package/build/lib/commands/system.d.ts +4 -0
  47. package/build/lib/commands/system.d.ts.map +1 -0
  48. package/build/lib/commands/system.js +8 -0
  49. package/build/lib/commands/system.js.map +1 -0
  50. package/build/lib/constants.d.ts +2 -0
  51. package/build/lib/constants.d.ts.map +1 -0
  52. package/build/lib/constants.js +5 -0
  53. package/build/lib/constants.js.map +1 -0
  54. package/build/lib/constraints.d.ts +40 -0
  55. package/build/lib/constraints.d.ts.map +1 -0
  56. package/build/lib/constraints.js +42 -0
  57. package/build/lib/constraints.js.map +1 -0
  58. package/build/lib/driver.d.ts +33 -0
  59. package/build/lib/driver.d.ts.map +1 -0
  60. package/build/lib/driver.js +181 -0
  61. package/build/lib/driver.js.map +1 -0
  62. package/build/lib/enums.d.ts +89 -0
  63. package/build/lib/enums.d.ts.map +1 -0
  64. package/build/lib/enums.js +83 -0
  65. package/build/lib/enums.js.map +1 -0
  66. package/build/lib/powershell/common.d.ts +39 -0
  67. package/build/lib/powershell/common.d.ts.map +1 -0
  68. package/build/lib/powershell/common.js +121 -0
  69. package/build/lib/powershell/common.js.map +1 -0
  70. package/build/lib/powershell/conditions.d.ts +24 -0
  71. package/build/lib/powershell/conditions.d.ts.map +1 -0
  72. package/build/lib/powershell/conditions.js +131 -0
  73. package/build/lib/powershell/conditions.js.map +1 -0
  74. package/build/lib/powershell/converter.d.ts +3 -0
  75. package/build/lib/powershell/converter.d.ts.map +1 -0
  76. package/build/lib/powershell/converter.js +273 -0
  77. package/build/lib/powershell/converter.js.map +1 -0
  78. package/build/lib/powershell/core.d.ts +8 -0
  79. package/build/lib/powershell/core.d.ts.map +1 -0
  80. package/build/lib/powershell/core.js +30 -0
  81. package/build/lib/powershell/core.js.map +1 -0
  82. package/build/lib/powershell/elements.d.ts +68 -0
  83. package/build/lib/powershell/elements.d.ts.map +1 -0
  84. package/build/lib/powershell/elements.js +515 -0
  85. package/build/lib/powershell/elements.js.map +1 -0
  86. package/build/lib/powershell/index.d.ts +8 -0
  87. package/build/lib/powershell/index.d.ts.map +1 -0
  88. package/build/lib/powershell/index.js +24 -0
  89. package/build/lib/powershell/index.js.map +1 -0
  90. package/build/lib/powershell/regex.d.ts +19 -0
  91. package/build/lib/powershell/regex.d.ts.map +1 -0
  92. package/build/lib/powershell/regex.js +68 -0
  93. package/build/lib/powershell/regex.js.map +1 -0
  94. package/build/lib/powershell/types.d.ts +155 -0
  95. package/build/lib/powershell/types.d.ts.map +1 -0
  96. package/build/lib/powershell/types.js +141 -0
  97. package/build/lib/powershell/types.js.map +1 -0
  98. package/build/lib/util.d.ts +10 -0
  99. package/build/lib/util.d.ts.map +1 -0
  100. package/build/lib/util.js +51 -0
  101. package/build/lib/util.js.map +1 -0
  102. package/build/lib/winapi/types/index.d.ts +8 -0
  103. package/build/lib/winapi/types/index.d.ts.map +1 -0
  104. package/build/lib/winapi/types/index.js +24 -0
  105. package/build/lib/winapi/types/index.js.map +1 -0
  106. package/build/lib/winapi/types/input.d.ts +11 -0
  107. package/build/lib/winapi/types/input.d.ts.map +1 -0
  108. package/build/lib/winapi/types/input.js +12 -0
  109. package/build/lib/winapi/types/input.js.map +1 -0
  110. package/build/lib/winapi/types/keyeventf.d.ts +13 -0
  111. package/build/lib/winapi/types/keyeventf.d.ts.map +1 -0
  112. package/build/lib/winapi/types/keyeventf.js +14 -0
  113. package/build/lib/winapi/types/keyeventf.js.map +1 -0
  114. package/build/lib/winapi/types/mouseeventf.d.ts +34 -0
  115. package/build/lib/winapi/types/mouseeventf.d.ts.map +1 -0
  116. package/build/lib/winapi/types/mouseeventf.js +37 -0
  117. package/build/lib/winapi/types/mouseeventf.js.map +1 -0
  118. package/build/lib/winapi/types/scancode.d.ts +95 -0
  119. package/build/lib/winapi/types/scancode.d.ts.map +1 -0
  120. package/build/lib/winapi/types/scancode.js +96 -0
  121. package/build/lib/winapi/types/scancode.js.map +1 -0
  122. package/build/lib/winapi/types/systemmetric.d.ts +214 -0
  123. package/build/lib/winapi/types/systemmetric.d.ts.map +1 -0
  124. package/build/lib/winapi/types/systemmetric.js +215 -0
  125. package/build/lib/winapi/types/systemmetric.js.map +1 -0
  126. package/build/lib/winapi/types/virtualkey.d.ts +353 -0
  127. package/build/lib/winapi/types/virtualkey.d.ts.map +1 -0
  128. package/build/lib/winapi/types/virtualkey.js +354 -0
  129. package/build/lib/winapi/types/virtualkey.js.map +1 -0
  130. package/build/lib/winapi/types/xmousebutton.d.ts +7 -0
  131. package/build/lib/winapi/types/xmousebutton.d.ts.map +1 -0
  132. package/build/lib/winapi/types/xmousebutton.js +8 -0
  133. package/build/lib/winapi/types/xmousebutton.js.map +1 -0
  134. package/build/lib/winapi/user32.d.ts +56 -0
  135. package/build/lib/winapi/user32.d.ts.map +1 -0
  136. package/build/lib/winapi/user32.js +591 -0
  137. package/build/lib/winapi/user32.js.map +1 -0
  138. package/build/lib/xpath/core.d.ts +8 -0
  139. package/build/lib/xpath/core.d.ts.map +1 -0
  140. package/build/lib/xpath/core.js +593 -0
  141. package/build/lib/xpath/core.js.map +1 -0
  142. package/build/lib/xpath/functions.d.ts +4 -0
  143. package/build/lib/xpath/functions.d.ts.map +1 -0
  144. package/build/lib/xpath/functions.js +271 -0
  145. package/build/lib/xpath/functions.js.map +1 -0
  146. package/build/lib/xpath/index.d.ts +3 -0
  147. package/build/lib/xpath/index.d.ts.map +1 -0
  148. package/build/lib/xpath/index.js +19 -0
  149. package/build/lib/xpath/index.js.map +1 -0
  150. package/eslint.config.mjs +11 -0
  151. package/examples/C#/CalculatorTest/CalculatorTest/CalculatorSession.cs +44 -0
  152. package/examples/C#/CalculatorTest/CalculatorTest/CalculatorTest.csproj +24 -0
  153. package/examples/C#/CalculatorTest/CalculatorTest/ScenarioStandard.cs +121 -0
  154. package/examples/C#/CalculatorTest/CalculatorTest/ScenarioStandardInvoke.cs +121 -0
  155. package/examples/C#/CalculatorTest/CalculatorTest.sln +16 -0
  156. package/lib/commands/actions.ts +229 -0
  157. package/lib/commands/app.ts +227 -0
  158. package/lib/commands/device.ts +41 -0
  159. package/lib/commands/element.ts +242 -0
  160. package/lib/commands/extension.ts +636 -0
  161. package/lib/commands/functions.ts +192 -0
  162. package/lib/commands/index.ts +28 -0
  163. package/lib/commands/powershell.ts +243 -0
  164. package/lib/commands/system.ts +7 -0
  165. package/lib/constants.ts +1 -0
  166. package/lib/constraints.ts +43 -0
  167. package/lib/driver.ts +247 -0
  168. package/lib/enums.ts +96 -0
  169. package/lib/powershell/common.ts +137 -0
  170. package/lib/powershell/conditions.ts +169 -0
  171. package/lib/powershell/converter.ts +373 -0
  172. package/lib/powershell/core.ts +29 -0
  173. package/lib/powershell/elements.ts +584 -0
  174. package/lib/powershell/index.ts +7 -0
  175. package/lib/powershell/regex.ts +77 -0
  176. package/lib/powershell/types.ts +208 -0
  177. package/lib/util.ts +52 -0
  178. package/lib/winapi/types/index.ts +7 -0
  179. package/lib/winapi/types/input.ts +12 -0
  180. package/lib/winapi/types/keyeventf.ts +14 -0
  181. package/lib/winapi/types/mouseeventf.ts +37 -0
  182. package/lib/winapi/types/scancode.ts +96 -0
  183. package/lib/winapi/types/systemmetric.ts +215 -0
  184. package/lib/winapi/types/virtualkey.ts +354 -0
  185. package/lib/winapi/types/xmousebutton.ts +8 -0
  186. package/lib/winapi/user32.ts +842 -0
  187. package/lib/xpath/core.ts +699 -0
  188. package/lib/xpath/functions.ts +366 -0
  189. package/lib/xpath/index.ts +2 -0
  190. package/package.json +61 -0
  191. package/tsconfig.json +13 -0
  192. package/verify_driver.js +96 -0
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleFunctionCall = handleFunctionCall;
4
+ const base_driver_1 = require("@appium/base-driver");
5
+ const xpath_analyzer_1 = require("xpath-analyzer");
6
+ const powershell_1 = require("../powershell");
7
+ const util_1 = require("../util");
8
+ const core_1 = require("./core");
9
+ const FUNCTION_ARGUMENT_ERROR = (0, util_1.$) `Function ${0}() requires ${1}.`;
10
+ async function handleFunctionCall(name, context, sendPowerShellCommand, ...args) {
11
+ const processArgs = async (...args) => {
12
+ const results = [];
13
+ for (const arg of args) {
14
+ results.push(await (0, core_1.processExprNode)(arg, context, sendPowerShellCommand));
15
+ }
16
+ return results;
17
+ };
18
+ switch (name) {
19
+ case xpath_analyzer_1.NOT:
20
+ case xpath_analyzer_1.BOOLEAN: {
21
+ if (args.length !== 1) {
22
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'exactly 1 argument'));
23
+ }
24
+ const [resultArray] = await processArgs(args[0]);
25
+ const result = Boolean(resultArray[0]);
26
+ return [name === xpath_analyzer_1.NOT ? !result : result];
27
+ }
28
+ case xpath_analyzer_1.CONCAT: {
29
+ if (args.length < 2) {
30
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'at least 2 arguments'));
31
+ }
32
+ const resultArrays = await processArgs(...args);
33
+ if (resultArrays.some((resultArray) => resultArray.length > 1)) {
34
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'each argument to have either one or zero elements'));
35
+ }
36
+ const stringArray = convertProcessedExprNodesToStrings(...resultArrays.map((resultArray) => resultArray[0]));
37
+ return [String.prototype.concat(...stringArray)];
38
+ }
39
+ case xpath_analyzer_1.STARTS_WITH:
40
+ case xpath_analyzer_1.CONTAINS: {
41
+ if (args.length !== 2) {
42
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'exactly 2 arguments'));
43
+ }
44
+ const [firstArgResult, secondArgResult] = await processArgs(args[0], args[1]);
45
+ if (firstArgResult.length > 1 || secondArgResult.length > 1) {
46
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'each argument to have either one or zero elements'));
47
+ }
48
+ const [lhs] = firstArgResult;
49
+ const [rhs] = secondArgResult;
50
+ if (typeof lhs === 'boolean') {
51
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'the first argument to be string, number or element'));
52
+ }
53
+ if (typeof rhs === 'boolean') {
54
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'the second argument to be string, number or element'));
55
+ }
56
+ const stringMethodMap = {
57
+ [xpath_analyzer_1.STARTS_WITH]: 'startsWith',
58
+ [xpath_analyzer_1.CONTAINS]: 'includes',
59
+ };
60
+ const [lhsString, rhsString] = convertProcessedExprNodesToStrings(firstArgResult, secondArgResult);
61
+ return [lhsString[stringMethodMap[name]](rhsString)];
62
+ }
63
+ case xpath_analyzer_1.COUNT: {
64
+ if (args.length !== 1) {
65
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'exactly 1 argument'));
66
+ }
67
+ const resultArray = await processArgs(args[0]);
68
+ return [resultArray.length];
69
+ }
70
+ case xpath_analyzer_1.TRUE:
71
+ case xpath_analyzer_1.FALSE:
72
+ if (args.length > 0) {
73
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'to have 0 arguments'));
74
+ }
75
+ return [name === xpath_analyzer_1.TRUE ? true : false];
76
+ case xpath_analyzer_1.ROUND:
77
+ case xpath_analyzer_1.CEILING:
78
+ case xpath_analyzer_1.FLOOR: {
79
+ if (args.length !== 1) {
80
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'exactly 1 argument'));
81
+ }
82
+ const resultArray = await processArgs(args[0]);
83
+ const [num] = resultArray[0];
84
+ if (typeof num !== 'number') {
85
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'the first argument to be a number'));
86
+ }
87
+ const mathMethodMap = {
88
+ [xpath_analyzer_1.ROUND]: 'round',
89
+ [xpath_analyzer_1.FLOOR]: 'floor',
90
+ [xpath_analyzer_1.CEILING]: 'ceil',
91
+ };
92
+ return [Math[mathMethodMap[name]](num)];
93
+ }
94
+ case xpath_analyzer_1.ID: {
95
+ if (args.length !== 1) {
96
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'exactly 1 argument'));
97
+ }
98
+ const resultArray = await processArgs(args[0]);
99
+ const stringArray = convertProcessedExprNodesToStrings(...resultArray);
100
+ const ids = Array.from(new Set(stringArray.flatMap((string) => string.split(/\s+/))));
101
+ const conditions = ids.map((id) => new powershell_1.PropertyCondition(powershell_1.Property.RUNTIME_ID, new powershell_1.PSInt32Array(id.split('.').map(Number))));
102
+ const results = [];
103
+ for (const condition of conditions) {
104
+ results.push(await sendPowerShellCommand(powershell_1.AutomationElement.rootElement.findFirst(powershell_1.TreeScope.SUBTREE, condition).buildCommand()));
105
+ }
106
+ return results.map((result) => new powershell_1.FoundAutomationElement(result.trim()));
107
+ }
108
+ case xpath_analyzer_1.POSITION:
109
+ case xpath_analyzer_1.LAST: {
110
+ if (args.length > 0) {
111
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'to have 0 arguments'));
112
+ }
113
+ const elIds = await sendPowerShellCommand(context.buildCommand());
114
+ const lastElementIndex = elIds.split('\n').map((id) => id.trim()).filter(Boolean).length;
115
+ return name === xpath_analyzer_1.LAST ? [lastElementIndex] : Array.from({ length: lastElementIndex }, () => 0);
116
+ }
117
+ case xpath_analyzer_1.LOCAL_NAME:
118
+ case xpath_analyzer_1.NAME: {
119
+ if (args.length > 1) {
120
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'no more than 1 argument'));
121
+ }
122
+ const [argResult] = await processArgs(args[0]);
123
+ if (argResult && argResult.length > 1) {
124
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'each argument to have either one or zero elements'));
125
+ }
126
+ const [element] = argResult ?? [context];
127
+ if (!(element instanceof powershell_1.AutomationElement)) {
128
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'the first argument to be element'));
129
+ }
130
+ const result = await sendPowerShellCommand(element.buildGetTagNameCommand());
131
+ return result.split('\n').map((x) => x.trim());
132
+ }
133
+ case xpath_analyzer_1.NORMALIZE_SPACE: {
134
+ if (args.length > 1) {
135
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'no more than 1 argument'));
136
+ }
137
+ const [argResult] = await processArgs(args[0]);
138
+ if (argResult && argResult.length > 1) {
139
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'each argument to have either one or zero elements'));
140
+ }
141
+ if (!argResult[0] || argResult[0] instanceof powershell_1.AutomationElement) {
142
+ return [''];
143
+ }
144
+ if (typeof argResult[0] === 'string') {
145
+ return [argResult[0].trim().replace(/\s+/g, ' ')];
146
+ }
147
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'the first argument to be string or element'));
148
+ }
149
+ case xpath_analyzer_1.STRING_LENGTH: {
150
+ if (args.length > 1) {
151
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'no more than 1 argument'));
152
+ }
153
+ const [argResult] = await processArgs(args[0]);
154
+ if (argResult && argResult.length > 1) {
155
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'the first argument to have either one or zero elements'));
156
+ }
157
+ if (!argResult[0] || argResult[0] instanceof powershell_1.AutomationElement) {
158
+ return [0];
159
+ }
160
+ if (typeof argResult[0] === 'string') {
161
+ return [argResult[0].length];
162
+ }
163
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'the first argument to be string or element'));
164
+ }
165
+ case xpath_analyzer_1.TRANSLATE: {
166
+ if (args.length !== 3) {
167
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'exactly 3 arguments'));
168
+ }
169
+ const [firstArgResult, secondArgResult, thirdArgResult] = await processArgs(args[0], args[1], args[2]);
170
+ if (firstArgResult.length > 1 || secondArgResult.length > 1 || thirdArgResult.length > 1) {
171
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'each argument to have either one or zero elements'));
172
+ }
173
+ const [[str], [from], [to]] = [firstArgResult, secondArgResult, thirdArgResult];
174
+ if (![str, from, to].every((x) => typeof x === 'string' || x instanceof powershell_1.AutomationElement)) {
175
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'each argument to be string or element'));
176
+ }
177
+ if (str instanceof powershell_1.AutomationElement) {
178
+ return [''];
179
+ }
180
+ if (from instanceof powershell_1.AutomationElement) {
181
+ return [str];
182
+ }
183
+ const result = str.split('').map((char) => {
184
+ const index = from.indexOf(char);
185
+ return index !== -1 ? (to instanceof powershell_1.AutomationElement ? '' : to)[index] ?? '' : char;
186
+ }).join('');
187
+ return [result];
188
+ }
189
+ case xpath_analyzer_1.NUMBER:
190
+ case xpath_analyzer_1.STRING: {
191
+ if (args.length > 1) {
192
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'no more than 1 argument'));
193
+ }
194
+ const [firstArg] = await processArgs(args[0]);
195
+ if (firstArg && firstArg.length > 1) {
196
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'the first argument to have either one or zero elements'));
197
+ }
198
+ return name === xpath_analyzer_1.STRING ? [...convertProcessedExprNodesToStrings(firstArg ?? [context])] : [...convertProcessedExprNodesToNumbers(firstArg ?? [context])];
199
+ }
200
+ case xpath_analyzer_1.SUBSTRING_AFTER:
201
+ case xpath_analyzer_1.SUBSTRING_BEFORE: {
202
+ if (args.length !== 2) {
203
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'exactly 2 arguments'));
204
+ }
205
+ const [firstArgResult, secondArgResult] = await processArgs(args[0], args[1]);
206
+ if (firstArgResult.length > 1 || secondArgResult.length > 1) {
207
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'each argument to have either one or zero elements'));
208
+ }
209
+ const [lhs] = firstArgResult;
210
+ const [rhs] = secondArgResult;
211
+ if (typeof lhs === 'boolean') {
212
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'the first argument to be string, number or element'));
213
+ }
214
+ if (typeof rhs === 'boolean') {
215
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'the second argument to be string, number or element'));
216
+ }
217
+ const [firstString] = convertProcessedExprNodesToStrings(firstArgResult);
218
+ const [secondString] = convertProcessedExprNodesToStrings(secondArgResult);
219
+ const index = firstString.indexOf(secondString);
220
+ if (index === -1) {
221
+ return [''];
222
+ }
223
+ return name === xpath_analyzer_1.SUBSTRING_BEFORE ? [firstString.slice(0, index)] : [firstString.slice(index + 1)];
224
+ }
225
+ case xpath_analyzer_1.SUBSTRING: {
226
+ if (args.length < 2) {
227
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'at least 2 arguments'));
228
+ }
229
+ if (args.length > 3) {
230
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'no more than 3 arguments'));
231
+ }
232
+ const [stringArg, fromArg, countArg] = await processArgs(...args);
233
+ if (typeof stringArg[0] === 'boolean' || typeof stringArg[0] === 'number') {
234
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'the first argument to be string or element'));
235
+ }
236
+ const [string] = convertProcessedExprNodesToStrings(stringArg);
237
+ const [index] = fromArg;
238
+ const [count] = countArg;
239
+ if (typeof index !== 'number') {
240
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'the second argument to be number'));
241
+ }
242
+ if (typeof count !== 'number' && typeof count !== 'undefined') {
243
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'the second argument to be number'));
244
+ }
245
+ if (count && count < 0) {
246
+ return [''];
247
+ }
248
+ return [string.slice(index + 1, count ? index + count : string.length)];
249
+ }
250
+ case xpath_analyzer_1.SUM: {
251
+ if (args.length !== 1) {
252
+ throw new base_driver_1.errors.InvalidArgumentError(FUNCTION_ARGUMENT_ERROR.format(name, 'exactly 1 argument'));
253
+ }
254
+ const [arg] = await processArgs(args[0]);
255
+ const argAsNumbers = convertProcessedExprNodesToNumbers(arg);
256
+ return [argAsNumbers.reduce((a, b) => a + b)];
257
+ }
258
+ default:
259
+ throw new base_driver_1.errors.InvalidSelectorError(`XPath function ${name}() not found.`);
260
+ }
261
+ }
262
+ function convertProcessedExprNodesToStrings(...arrayOfProcessedExprNodes) {
263
+ return arrayOfProcessedExprNodes
264
+ .map((item) => (item instanceof powershell_1.AutomationElement) ? '' : item) // windows element xml representaton never contains text nodes
265
+ .map((item) => item === undefined || item === null ? '' : String(item)); // convert not found elements to empty string and others to string
266
+ }
267
+ function convertProcessedExprNodesToNumbers(...arrayOfProcessedExprNodes) {
268
+ const arrayOfStrings = convertProcessedExprNodesToStrings(...arrayOfProcessedExprNodes);
269
+ return arrayOfStrings.map((str) => /^\s*(?<![\d.+-])[+-]?(?:\d*[.])?\d+(?![\d.])\s*$/.test(str) ? NaN : Number(str));
270
+ }
271
+ //# sourceMappingURL=functions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.js","sourceRoot":"","sources":["../../../lib/xpath/functions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './core';
2
+ export * from './functions';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/xpath/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./core"), exports);
18
+ __exportStar(require("./functions"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/xpath/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,8CAA4B"}
@@ -0,0 +1,11 @@
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
+ );
@@ -0,0 +1,44 @@
1
+ // Based on the original WinAppDriver Calculator test by Microsoft, licensed under the MIT License.
2
+
3
+ using OpenQA.Selenium.Appium;
4
+ using OpenQA.Selenium.Appium.Windows;
5
+
6
+ namespace CalculatorTest;
7
+
8
+ public class CalculatorSession
9
+ {
10
+ private const string AppiumServerUrl = "http://127.0.0.1:4723/";
11
+ private const string CalculatorAppId = "Microsoft.WindowsCalculator_8wekyb3d8bbwe!App";
12
+
13
+ protected static WindowsDriver Session { get; private set; }
14
+
15
+ protected static void Setup()
16
+ {
17
+ if (Session != null) return;
18
+
19
+ // Launch Calculator application if it is not yet launched
20
+ // Create a new session to bring up an instance of the Calculator application
21
+ // Note: Multiple calculator windows (instances) share the same process Id
22
+ var appiumOptions = new AppiumOptions
23
+ {
24
+ App = CalculatorAppId,
25
+ AutomationName = "NovaWindows",
26
+ PlatformName = "Windows",
27
+ };
28
+
29
+ Session = new WindowsDriver(new Uri(AppiumServerUrl), appiumOptions);
30
+ Assert.That(Session, Is.Not.Null);
31
+
32
+ // Set implicit timeout to 1.5 seconds to make element search to retry every 500 ms for at most three times
33
+ Session.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(1.5);
34
+ }
35
+
36
+ protected static void TearDown()
37
+ {
38
+ if (Session == null) return;
39
+
40
+ // Close the application and delete the session
41
+ Session.Quit();
42
+ Session = null;
43
+ }
44
+ }
@@ -0,0 +1,24 @@
1
+ <Project Sdk="Microsoft.NET.Sdk">
2
+
3
+ <PropertyGroup>
4
+ <TargetFramework>net8.0</TargetFramework>
5
+ <ImplicitUsings>enable</ImplicitUsings>
6
+ <Nullable>disable</Nullable>
7
+
8
+ <IsPackable>false</IsPackable>
9
+ <IsTestProject>true</IsTestProject>
10
+ </PropertyGroup>
11
+
12
+ <ItemGroup>
13
+ <PackageReference Include="Appium.WebDriver" Version="7.2.0" />
14
+ <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/>
15
+ <PackageReference Include="NUnit" Version="3.14.0"/>
16
+ <PackageReference Include="NUnit.Analyzers" Version="3.9.0"/>
17
+ <PackageReference Include="NUnit3TestAdapter" Version="4.5.0"/>
18
+ </ItemGroup>
19
+
20
+ <ItemGroup>
21
+ <Using Include="NUnit.Framework"/>
22
+ </ItemGroup>
23
+
24
+ </Project>
@@ -0,0 +1,121 @@
1
+ // Based on the original WinAppDriver Calculator test by Microsoft, licensed under the MIT License.
2
+
3
+ using OpenQA.Selenium;
4
+ using OpenQA.Selenium.Appium;
5
+
6
+ namespace CalculatorTest;
7
+
8
+ public class ScenarioStandard : CalculatorSession
9
+ {
10
+ private static AppiumElement _header;
11
+ private static AppiumElement _calculatorResult;
12
+
13
+ [Test]
14
+ public void Addition()
15
+ {
16
+ // Find the buttons by their names and click them in sequence to perform 1 + 7 = 8
17
+ Session.FindElement(MobileBy.Name("One")).Click();
18
+ Session.FindElement(MobileBy.Name("Plus")).Click();
19
+ Session.FindElement(MobileBy.Name("Seven")).Click();
20
+ Session.FindElement(MobileBy.Name("Equals")).Click();
21
+ Assert.That(GetCalculatorResultText(), Is.EqualTo("8"));
22
+ }
23
+
24
+ [Test]
25
+ public void Division()
26
+ {
27
+ // Find the buttons by their accessibility ids and click them in sequence to perform 88 / 11 = 8
28
+ Session.FindElement(MobileBy.AccessibilityId("num8Button")).Click();
29
+ Session.FindElement(MobileBy.AccessibilityId("num8Button")).Click();
30
+ Session.FindElement(MobileBy.AccessibilityId("divideButton")).Click();
31
+ Session.FindElement(MobileBy.AccessibilityId("num1Button")).Click();
32
+ Session.FindElement(MobileBy.AccessibilityId("num1Button")).Click();
33
+ Session.FindElement(MobileBy.AccessibilityId("equalButton")).Click();
34
+ Assert.That(GetCalculatorResultText(), Is.EqualTo("8"));
35
+ }
36
+
37
+ [Test]
38
+ public void Multiplication()
39
+ {
40
+ // Find the buttons by their names using XPath and click them in sequence to perform 9 x 9 = 81
41
+ Session.FindElement(By.XPath("//Button[@Name='Nine']")).Click();
42
+ Session.FindElement(By.XPath("//Button[@Name='Multiply by']")).Click();
43
+ Session.FindElement(By.XPath("//Button[@Name='Nine']")).Click();
44
+ Session.FindElement(By.XPath("//Button[@Name='Equals']")).Click();
45
+ Assert.That(GetCalculatorResultText(), Is.EqualTo("81"));
46
+ }
47
+
48
+ [Test]
49
+ public void Subtraction()
50
+ {
51
+ // Find the buttons by their accessibility ids using XPath and click them in sequence to perform 9 - 1 = 8
52
+ Session.FindElement(By.XPath("//Button[@AutomationId=\"num9Button\"]")).Click();
53
+ Session.FindElement(By.XPath("//Button[@AutomationId=\"minusButton\"]")).Click();
54
+ Session.FindElement(By.XPath("//Button[@AutomationId=\"num1Button\"]")).Click();
55
+ Session.FindElement(By.XPath("//Button[@AutomationId=\"equalButton\"]")).Click();
56
+ Assert.That(GetCalculatorResultText(), Is.EqualTo("8"));
57
+ }
58
+
59
+ [TestCase("One", "Plus", "Seven", "8")]
60
+ [TestCase("Nine", "Minus", "One", "8")]
61
+ [TestCase("Eight", "Divide by", "Eight", "1")]
62
+ public void Templatized(string input1, string operation, string input2, string expectedResult)
63
+ {
64
+ // Run sequence of button presses specified above and validate the results
65
+ Session.FindElement(MobileBy.Name(input1)).Click();
66
+ Session.FindElement(MobileBy.Name(operation)).Click();
67
+ Session.FindElement(MobileBy.Name(input2)).Click();
68
+ Session.FindElement(MobileBy.Name("Equals")).Click();
69
+ Assert.That(GetCalculatorResultText(), Is.EqualTo(expectedResult));
70
+ }
71
+
72
+ [OneTimeSetUp]
73
+ public static void ClassInitialize()
74
+ {
75
+ // Create session to launch a Calculator window
76
+ Setup();
77
+
78
+ // Identify calculator mode by locating the header
79
+ try
80
+ {
81
+ _header = Session.FindElement(MobileBy.AccessibilityId("Header"));
82
+ }
83
+ catch
84
+ {
85
+ _header = Session.FindElement(MobileBy.AccessibilityId("ContentPresenter"));
86
+ }
87
+
88
+ // Ensure that calculator is in standard mode
89
+ if (!_header.Text.Equals("Standard", StringComparison.OrdinalIgnoreCase))
90
+ {
91
+ Session.FindElement(MobileBy.AccessibilityId("TogglePaneButton")).Click();
92
+ Thread.Sleep(TimeSpan.FromSeconds(1));
93
+ var splitViewPane = Session.FindElement(MobileBy.ClassName("SplitViewPane"));
94
+ splitViewPane.FindElement(MobileBy.Name("Standard Calculator")).Click();
95
+ Thread.Sleep(TimeSpan.FromSeconds(1));
96
+ Assert.That(_header.Text.Equals("Standard", StringComparison.OrdinalIgnoreCase), Is.True);
97
+ }
98
+
99
+ // Locate the calculatorResult element
100
+ _calculatorResult = Session.FindElement(MobileBy.AccessibilityId("CalculatorResults"));
101
+ Assert.That(_calculatorResult, Is.Not.Null);
102
+ }
103
+
104
+ [OneTimeTearDown]
105
+ public static void ClassCleanup()
106
+ {
107
+ TearDown();
108
+ }
109
+
110
+ [SetUp]
111
+ public void Clear()
112
+ {
113
+ Session?.FindElement(MobileBy.Name("Clear")).Click();
114
+ Assert.That(GetCalculatorResultText(), Is.EqualTo("0"));
115
+ }
116
+
117
+ private static string GetCalculatorResultText()
118
+ {
119
+ return _calculatorResult.Text.Replace("Display is", string.Empty).Trim();
120
+ }
121
+ }