craftdriver 0.0.1 → 0.1.0

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 (55) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +69 -5
  3. package/dist/index.d.ts +2 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +3 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/lib/bidi/connection.d.ts +62 -0
  8. package/dist/lib/bidi/connection.d.ts.map +1 -0
  9. package/dist/lib/bidi/connection.js +227 -0
  10. package/dist/lib/bidi/connection.js.map +1 -0
  11. package/dist/lib/bidi/index.d.ts +76 -0
  12. package/dist/lib/bidi/index.d.ts.map +1 -0
  13. package/dist/lib/bidi/index.js +114 -0
  14. package/dist/lib/bidi/index.js.map +1 -0
  15. package/dist/lib/bidi/logs.d.ts +104 -0
  16. package/dist/lib/bidi/logs.d.ts.map +1 -0
  17. package/dist/lib/bidi/logs.js +273 -0
  18. package/dist/lib/bidi/logs.js.map +1 -0
  19. package/dist/lib/bidi/network.d.ts +92 -0
  20. package/dist/lib/bidi/network.d.ts.map +1 -0
  21. package/dist/lib/bidi/network.js +259 -0
  22. package/dist/lib/bidi/network.js.map +1 -0
  23. package/dist/lib/bidi/storage.d.ts +81 -0
  24. package/dist/lib/bidi/storage.d.ts.map +1 -0
  25. package/dist/lib/bidi/storage.js +292 -0
  26. package/dist/lib/bidi/storage.js.map +1 -0
  27. package/dist/lib/bidi/types.d.ts +302 -0
  28. package/dist/lib/bidi/types.d.ts.map +1 -0
  29. package/dist/lib/bidi/types.js +6 -0
  30. package/dist/lib/bidi/types.js.map +1 -0
  31. package/dist/lib/browser.d.ts +179 -2
  32. package/dist/lib/browser.d.ts.map +1 -1
  33. package/dist/lib/browser.js +220 -11
  34. package/dist/lib/browser.js.map +1 -1
  35. package/dist/lib/driver.d.ts +2 -0
  36. package/dist/lib/driver.d.ts.map +1 -1
  37. package/dist/lib/driver.js +9 -1
  38. package/dist/lib/driver.js.map +1 -1
  39. package/dist/lib/elementHandle.d.ts +23 -7
  40. package/dist/lib/elementHandle.d.ts.map +1 -1
  41. package/dist/lib/elementHandle.js +84 -9
  42. package/dist/lib/elementHandle.js.map +1 -1
  43. package/dist/lib/expect.d.ts +45 -0
  44. package/dist/lib/expect.d.ts.map +1 -1
  45. package/dist/lib/expect.js +299 -11
  46. package/dist/lib/expect.js.map +1 -1
  47. package/dist/lib/service.d.ts +2 -1
  48. package/dist/lib/service.d.ts.map +1 -1
  49. package/dist/lib/service.js +23 -8
  50. package/dist/lib/service.js.map +1 -1
  51. package/dist/lib/webelement.d.ts +12 -0
  52. package/dist/lib/webelement.d.ts.map +1 -1
  53. package/dist/lib/webelement.js +62 -0
  54. package/dist/lib/webelement.js.map +1 -1
  55. package/package.json +7 -2
@@ -4,13 +4,58 @@ export interface ExpectApi {
4
4
  toHaveText(text: string | RegExp, opts?: {
5
5
  timeout?: number;
6
6
  }): Promise<void>;
7
+ toContainText(text: string | RegExp, opts?: {
8
+ timeout?: number;
9
+ }): Promise<void>;
10
+ toHaveValue(value: string | RegExp, opts?: {
11
+ timeout?: number;
12
+ }): Promise<void>;
13
+ toHaveAttribute(name: string, value?: string | RegExp, opts?: {
14
+ timeout?: number;
15
+ }): Promise<void>;
16
+ toHaveClass(className: string, opts?: {
17
+ timeout?: number;
18
+ }): Promise<void>;
7
19
  toBeVisible(opts?: {
8
20
  timeout?: number;
9
21
  }): Promise<void>;
22
+ toBeEnabled(opts?: {
23
+ timeout?: number;
24
+ }): Promise<void>;
25
+ toBeDisabled(opts?: {
26
+ timeout?: number;
27
+ }): Promise<void>;
28
+ toBeChecked(opts?: {
29
+ timeout?: number;
30
+ }): Promise<void>;
10
31
  not: {
11
32
  toBeVisible(opts?: {
12
33
  timeout?: number;
13
34
  }): Promise<void>;
35
+ toBeEnabled(opts?: {
36
+ timeout?: number;
37
+ }): Promise<void>;
38
+ toBeDisabled(opts?: {
39
+ timeout?: number;
40
+ }): Promise<void>;
41
+ toBeChecked(opts?: {
42
+ timeout?: number;
43
+ }): Promise<void>;
44
+ toHaveText(text: string | RegExp, opts?: {
45
+ timeout?: number;
46
+ }): Promise<void>;
47
+ toContainText(text: string | RegExp, opts?: {
48
+ timeout?: number;
49
+ }): Promise<void>;
50
+ toHaveValue(value: string | RegExp, opts?: {
51
+ timeout?: number;
52
+ }): Promise<void>;
53
+ toHaveAttribute(name: string, value?: string | RegExp, opts?: {
54
+ timeout?: number;
55
+ }): Promise<void>;
56
+ toHaveClass(className: string, opts?: {
57
+ timeout?: number;
58
+ }): Promise<void>;
14
59
  };
15
60
  }
16
61
  export declare function expectSelector(driver: Driver, by: By): ExpectApi;
@@ -1 +1 @@
1
- {"version":3,"file":"expect.d.ts","sourceRoot":"","sources":["../../src/lib/expect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,WAAW,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,GAAG,EAAE;QACH,WAAW,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACzD,CAAC;CACH;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,CAuDhE"}
1
+ {"version":3,"file":"expect.d.ts","sourceRoot":"","sources":["../../src/lib/expect.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,18 @@
1
1
  import { until } from './wait.js';
2
+ function matchValue(actual, expected) {
3
+ if (expected instanceof RegExp) {
4
+ return expected.test(actual);
5
+ }
6
+ return actual === expected;
7
+ }
2
8
  export function expectSelector(driver, by) {
3
- function fail(message) {
4
- throw new Error(message);
9
+ function fail(message, callerFn) {
10
+ const error = new Error(message);
11
+ // Remove internal expect.ts frames from stack trace so test file line shows first
12
+ if (callerFn && Error.captureStackTrace) {
13
+ Error.captureStackTrace(error, callerFn);
14
+ }
15
+ throw error;
5
16
  }
6
17
  const toHaveText = async function toHaveText(expected, opts) {
7
18
  const timeout = opts?.timeout ?? 5000;
@@ -13,12 +24,76 @@ export function expectSelector(driver, by) {
13
24
  const found = await driver.findElement(by);
14
25
  const text = (await found.getText())?.trim?.() ?? '';
15
26
  last = text;
16
- if (expected instanceof RegExp) {
17
- if (expected.test(text))
27
+ if (matchValue(text, expected))
28
+ return;
29
+ }
30
+ catch {
31
+ // retry
32
+ }
33
+ await new Promise((resolve) => setTimeout(resolve, 100));
34
+ }
35
+ const exp = expected instanceof RegExp ? `/${expected.source}/` : `"${expected}"`;
36
+ fail(`Expected element ${by.using}(${by.value}) to have text ${exp} but got "${last}"`, toHaveText);
37
+ };
38
+ const toContainText = async function toContainText(expected, opts) {
39
+ const timeout = opts?.timeout ?? 5000;
40
+ const deadline = Date.now() + timeout;
41
+ let last = '';
42
+ while (Date.now() < deadline) {
43
+ try {
44
+ await driver.wait(until.elementExists(by), { timeout: Math.min(250, timeout) });
45
+ const found = await driver.findElement(by);
46
+ const text = (await found.getText())?.trim?.() ?? '';
47
+ last = text;
48
+ if (expected instanceof RegExp ? expected.test(text) : text.includes(expected))
49
+ return;
50
+ }
51
+ catch {
52
+ // retry
53
+ }
54
+ await new Promise((resolve) => setTimeout(resolve, 100));
55
+ }
56
+ const exp = expected instanceof RegExp ? `/${expected.source}/` : `"${expected}"`;
57
+ fail(`Expected element ${by.using}(${by.value}) to contain text ${exp} but got "${last}"`, toContainText);
58
+ };
59
+ const toHaveValue = async function toHaveValue(expected, opts) {
60
+ const timeout = opts?.timeout ?? 5000;
61
+ const deadline = Date.now() + timeout;
62
+ let last = '';
63
+ while (Date.now() < deadline) {
64
+ try {
65
+ await driver.wait(until.elementExists(by), { timeout: Math.min(250, timeout) });
66
+ const found = await driver.findElement(by);
67
+ const val = await found.getProperty('value');
68
+ last = String(val ?? '');
69
+ if (matchValue(last, expected))
70
+ return;
71
+ }
72
+ catch {
73
+ // retry
74
+ }
75
+ await new Promise((resolve) => setTimeout(resolve, 100));
76
+ }
77
+ const exp = expected instanceof RegExp ? `/${expected.source}/` : `"${expected}"`;
78
+ fail(`Expected element ${by.using}(${by.value}) to have value ${exp} but got "${last}"`, toHaveValue);
79
+ };
80
+ const toHaveAttribute = async function toHaveAttribute(name, value, opts) {
81
+ const timeout = opts?.timeout ?? 5000;
82
+ const deadline = Date.now() + timeout;
83
+ let last = null;
84
+ while (Date.now() < deadline) {
85
+ try {
86
+ await driver.wait(until.elementExists(by), { timeout: Math.min(250, timeout) });
87
+ const found = await driver.findElement(by);
88
+ last = await found.getAttribute(name);
89
+ if (value === undefined) {
90
+ // Just check attribute exists
91
+ if (last !== null)
18
92
  return;
19
93
  }
20
- else if (text === expected) {
21
- return;
94
+ else {
95
+ if (last !== null && matchValue(last, value))
96
+ return;
22
97
  }
23
98
  }
24
99
  catch {
@@ -26,8 +101,32 @@ export function expectSelector(driver, by) {
26
101
  }
27
102
  await new Promise((resolve) => setTimeout(resolve, 100));
28
103
  }
29
- const exp = expected instanceof RegExp ? `/${expected.source}/` : `"${expected}"`;
30
- fail(`Expected element ${by.using}(${by.value}) to have text ${exp} but got "${last}"`);
104
+ if (value === undefined) {
105
+ fail(`Expected element ${by.using}(${by.value}) to have attribute "${name}" but it was not found`, toHaveAttribute);
106
+ }
107
+ const exp = value instanceof RegExp ? `/${value.source}/` : `"${value}"`;
108
+ fail(`Expected element ${by.using}(${by.value}) to have attribute "${name}" = ${exp} but got "${last}"`, toHaveAttribute);
109
+ };
110
+ const toHaveClass = async function toHaveClass(className, opts) {
111
+ const timeout = opts?.timeout ?? 5000;
112
+ const deadline = Date.now() + timeout;
113
+ let last = '';
114
+ while (Date.now() < deadline) {
115
+ try {
116
+ await driver.wait(until.elementExists(by), { timeout: Math.min(250, timeout) });
117
+ const found = await driver.findElement(by);
118
+ const cls = await found.getAttribute('class');
119
+ last = cls ?? '';
120
+ const classes = last.split(/\s+/);
121
+ if (classes.includes(className))
122
+ return;
123
+ }
124
+ catch {
125
+ // retry
126
+ }
127
+ await new Promise((resolve) => setTimeout(resolve, 100));
128
+ }
129
+ fail(`Expected element ${by.using}(${by.value}) to have class "${className}" but got "${last}"`, toHaveClass);
31
130
  };
32
131
  const toBeVisible = async function toBeVisible(opts) {
33
132
  const timeout = opts?.timeout ?? 5000;
@@ -35,7 +134,7 @@ export function expectSelector(driver, by) {
35
134
  await driver.wait(until.elementIsVisible(by), { timeout });
36
135
  }
37
136
  catch {
38
- fail(`Expected element ${by.using}(${by.value}) to be visible within ${timeout}ms`);
137
+ fail(`Expected element ${by.using}(${by.value}) to be visible within ${timeout}ms`, toBeVisible);
39
138
  }
40
139
  };
41
140
  const toBeNotVisible = async function toBeNotVisible(opts) {
@@ -44,13 +143,202 @@ export function expectSelector(driver, by) {
44
143
  await driver.wait(until.elementIsNotVisible(by), { timeout });
45
144
  }
46
145
  catch {
47
- fail(`Expected element ${by.using}(${by.value}) to become hidden within ${timeout}ms`);
146
+ fail(`Expected element ${by.using}(${by.value}) to become hidden within ${timeout}ms`, toBeNotVisible);
147
+ }
148
+ };
149
+ const toBeEnabled = async function toBeEnabled(opts) {
150
+ const timeout = opts?.timeout ?? 5000;
151
+ const deadline = Date.now() + timeout;
152
+ while (Date.now() < deadline) {
153
+ try {
154
+ await driver.wait(until.elementExists(by), { timeout: Math.min(250, timeout) });
155
+ const found = await driver.findElement(by);
156
+ if (await found.isEnabled())
157
+ return;
158
+ }
159
+ catch {
160
+ // retry
161
+ }
162
+ await new Promise((resolve) => setTimeout(resolve, 100));
163
+ }
164
+ fail(`Expected element ${by.using}(${by.value}) to be enabled within ${timeout}ms`, toBeEnabled);
165
+ };
166
+ const toBeDisabled = async function toBeDisabled(opts) {
167
+ const timeout = opts?.timeout ?? 5000;
168
+ const deadline = Date.now() + timeout;
169
+ while (Date.now() < deadline) {
170
+ try {
171
+ await driver.wait(until.elementExists(by), { timeout: Math.min(250, timeout) });
172
+ const found = await driver.findElement(by);
173
+ if (!(await found.isEnabled()))
174
+ return;
175
+ }
176
+ catch {
177
+ // retry
178
+ }
179
+ await new Promise((resolve) => setTimeout(resolve, 100));
180
+ }
181
+ fail(`Expected element ${by.using}(${by.value}) to be disabled within ${timeout}ms`, toBeDisabled);
182
+ };
183
+ const toBeChecked = async function toBeChecked(opts) {
184
+ const timeout = opts?.timeout ?? 5000;
185
+ const deadline = Date.now() + timeout;
186
+ while (Date.now() < deadline) {
187
+ try {
188
+ await driver.wait(until.elementExists(by), { timeout: Math.min(250, timeout) });
189
+ const found = await driver.findElement(by);
190
+ if (await found.isSelected())
191
+ return;
192
+ }
193
+ catch {
194
+ // retry
195
+ }
196
+ await new Promise((resolve) => setTimeout(resolve, 100));
197
+ }
198
+ fail(`Expected element ${by.using}(${by.value}) to be checked within ${timeout}ms`, toBeChecked);
199
+ };
200
+ const toBeNotChecked = async function toBeNotChecked(opts) {
201
+ const timeout = opts?.timeout ?? 5000;
202
+ const deadline = Date.now() + timeout;
203
+ while (Date.now() < deadline) {
204
+ try {
205
+ await driver.wait(until.elementExists(by), { timeout: Math.min(250, timeout) });
206
+ const found = await driver.findElement(by);
207
+ if (!(await found.isSelected()))
208
+ return;
209
+ }
210
+ catch {
211
+ // retry
212
+ }
213
+ await new Promise((resolve) => setTimeout(resolve, 100));
214
+ }
215
+ fail(`Expected element ${by.using}(${by.value}) to not be checked within ${timeout}ms`, toBeNotChecked);
216
+ };
217
+ const notToHaveText = async function notToHaveText(expected, opts) {
218
+ const timeout = opts?.timeout ?? 5000;
219
+ const deadline = Date.now() + timeout;
220
+ while (Date.now() < deadline) {
221
+ try {
222
+ await driver.wait(until.elementExists(by), { timeout: Math.min(250, timeout) });
223
+ const found = await driver.findElement(by);
224
+ const text = (await found.getText())?.trim?.() ?? '';
225
+ if (!matchValue(text, expected))
226
+ return;
227
+ }
228
+ catch {
229
+ return; // element not found = text doesn't match
230
+ }
231
+ await new Promise((resolve) => setTimeout(resolve, 100));
232
+ }
233
+ const exp = expected instanceof RegExp ? `/${expected.source}/` : `"${expected}"`;
234
+ fail(`Expected element ${by.using}(${by.value}) to NOT have text ${exp}`, notToHaveText);
235
+ };
236
+ const notToContainText = async function notToContainText(expected, opts) {
237
+ const timeout = opts?.timeout ?? 5000;
238
+ const deadline = Date.now() + timeout;
239
+ while (Date.now() < deadline) {
240
+ try {
241
+ await driver.wait(until.elementExists(by), { timeout: Math.min(250, timeout) });
242
+ const found = await driver.findElement(by);
243
+ const text = (await found.getText())?.trim?.() ?? '';
244
+ if (expected instanceof RegExp ? !expected.test(text) : !text.includes(expected))
245
+ return;
246
+ }
247
+ catch {
248
+ return;
249
+ }
250
+ await new Promise((resolve) => setTimeout(resolve, 100));
251
+ }
252
+ const exp = expected instanceof RegExp ? `/${expected.source}/` : `"${expected}"`;
253
+ fail(`Expected element ${by.using}(${by.value}) to NOT contain text ${exp}`, notToContainText);
254
+ };
255
+ const notToHaveValue = async function notToHaveValue(expected, opts) {
256
+ const timeout = opts?.timeout ?? 5000;
257
+ const deadline = Date.now() + timeout;
258
+ while (Date.now() < deadline) {
259
+ try {
260
+ await driver.wait(until.elementExists(by), { timeout: Math.min(250, timeout) });
261
+ const found = await driver.findElement(by);
262
+ const val = String(await found.getProperty('value') ?? '');
263
+ if (!matchValue(val, expected))
264
+ return;
265
+ }
266
+ catch {
267
+ return;
268
+ }
269
+ await new Promise((resolve) => setTimeout(resolve, 100));
270
+ }
271
+ const exp = expected instanceof RegExp ? `/${expected.source}/` : `"${expected}"`;
272
+ fail(`Expected element ${by.using}(${by.value}) to NOT have value ${exp}`, notToHaveValue);
273
+ };
274
+ const notToHaveAttribute = async function notToHaveAttribute(name, value, opts) {
275
+ const timeout = opts?.timeout ?? 5000;
276
+ const deadline = Date.now() + timeout;
277
+ while (Date.now() < deadline) {
278
+ try {
279
+ await driver.wait(until.elementExists(by), { timeout: Math.min(250, timeout) });
280
+ const found = await driver.findElement(by);
281
+ const attr = await found.getAttribute(name);
282
+ if (value === undefined) {
283
+ if (attr === null)
284
+ return;
285
+ }
286
+ else {
287
+ if (attr === null || !matchValue(attr, value))
288
+ return;
289
+ }
290
+ }
291
+ catch {
292
+ return;
293
+ }
294
+ await new Promise((resolve) => setTimeout(resolve, 100));
295
+ }
296
+ if (value === undefined) {
297
+ fail(`Expected element ${by.using}(${by.value}) to NOT have attribute "${name}"`, notToHaveAttribute);
298
+ }
299
+ const exp = value instanceof RegExp ? `/${value.source}/` : `"${value}"`;
300
+ fail(`Expected element ${by.using}(${by.value}) to NOT have attribute "${name}" = ${exp}`, notToHaveAttribute);
301
+ };
302
+ const notToHaveClass = async function notToHaveClass(className, opts) {
303
+ const timeout = opts?.timeout ?? 5000;
304
+ const deadline = Date.now() + timeout;
305
+ while (Date.now() < deadline) {
306
+ try {
307
+ await driver.wait(until.elementExists(by), { timeout: Math.min(250, timeout) });
308
+ const found = await driver.findElement(by);
309
+ const cls = await found.getAttribute('class') ?? '';
310
+ const classes = cls.split(/\s+/);
311
+ if (!classes.includes(className))
312
+ return;
313
+ }
314
+ catch {
315
+ return;
316
+ }
317
+ await new Promise((resolve) => setTimeout(resolve, 100));
48
318
  }
319
+ fail(`Expected element ${by.using}(${by.value}) to NOT have class "${className}"`, notToHaveClass);
49
320
  };
50
321
  return {
51
322
  toHaveText,
323
+ toContainText,
324
+ toHaveValue,
325
+ toHaveAttribute,
326
+ toHaveClass,
52
327
  toBeVisible,
53
- not: { toBeVisible: toBeNotVisible },
328
+ toBeEnabled,
329
+ toBeDisabled,
330
+ toBeChecked,
331
+ not: {
332
+ toBeVisible: toBeNotVisible,
333
+ toBeEnabled: toBeDisabled, // not enabled = disabled
334
+ toBeDisabled: toBeEnabled, // not disabled = enabled
335
+ toBeChecked: toBeNotChecked,
336
+ toHaveText: notToHaveText,
337
+ toContainText: notToContainText,
338
+ toHaveValue: notToHaveValue,
339
+ toHaveAttribute: notToHaveAttribute,
340
+ toHaveClass: notToHaveClass,
341
+ },
54
342
  };
55
343
  }
56
344
  //# sourceMappingURL=expect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"expect.js","sourceRoot":"","sources":["../../src/lib/expect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"expect.js","sourceRoot":"","sources":["../../src/lib/expect.ts"],"names":[],"mappings":"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"}
@@ -13,8 +13,9 @@ export interface DriverServiceOptions {
13
13
  export declare class DriverService {
14
14
  protected proc?: ChildProcess;
15
15
  protected endpoint: WebDriverEndpoint;
16
- protected readonly opts: Required<Omit<DriverServiceOptions, 'env'>> & {
16
+ protected readonly opts: Required<Omit<DriverServiceOptions, 'env' | 'port'>> & {
17
17
  env?: NodeJS.ProcessEnv;
18
+ port?: number;
18
19
  };
19
20
  constructor(options: DriverServiceOptions);
20
21
  getEndpoint(): WebDriverEndpoint;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/lib/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,YAAY,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,aAAa;IACxB,SAAS,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAC9B,SAAS,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACtC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC,GAAG;QACrE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;KACzB,CAAC;gBAEU,OAAO,EAAE,oBAAoB;IAmBzC,WAAW,IAAI,iBAAiB;IAI1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAOX,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;cAsBtC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAkBhD"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/lib/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,YAAY,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAeD,qBAAa,aAAa;IACxB,SAAS,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAC9B,SAAS,CAAC,QAAQ,EAAG,iBAAiB,CAAC;IACvC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG;QAC9E,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;QACxB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;gBAEU,OAAO,EAAE,oBAAoB;IAazC,WAAW,IAAI,iBAAiB;IAI1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAOX,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;cAsBtC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAkBhD"}
@@ -1,5 +1,18 @@
1
1
  import { spawn } from 'child_process';
2
2
  import { HttpClient } from './http.js';
3
+ import net from 'net';
4
+ async function findFreePort() {
5
+ return new Promise((resolve, reject) => {
6
+ const server = net.createServer();
7
+ server.unref();
8
+ server.on('error', reject);
9
+ server.listen(0, '127.0.0.1', () => {
10
+ const addr = server.address();
11
+ const port = typeof addr === 'object' && addr ? addr.port : 0;
12
+ server.close(() => resolve(port));
13
+ });
14
+ });
15
+ }
3
16
  export class DriverService {
4
17
  proc;
5
18
  endpoint;
@@ -9,18 +22,12 @@ export class DriverService {
9
22
  args: options.args ?? [],
10
23
  command: options.command,
11
24
  hostname: options.hostname ?? '127.0.0.1',
12
- port: options.port ?? 9515,
25
+ port: options.port, // undefined means auto-assign
13
26
  pathBase: options.pathBase ?? '',
14
27
  readinessPath: options.readinessPath ?? '/status',
15
28
  readinessTimeoutMs: options.readinessTimeoutMs ?? 5000,
16
29
  env: options.env,
17
30
  };
18
- this.endpoint = {
19
- protocol: 'http',
20
- hostname: this.opts.hostname,
21
- port: this.opts.port,
22
- path: this.opts.pathBase,
23
- };
24
31
  }
25
32
  getEndpoint() {
26
33
  return this.endpoint;
@@ -29,7 +36,15 @@ export class DriverService {
29
36
  if (this.proc)
30
37
  return; // already started
31
38
  await this.ensureBinaryAvailable();
32
- this.proc = spawn(this.opts.command, [`--port=${this.opts.port}`, ...this.opts.args], {
39
+ // Assign a free port if not specified
40
+ const port = this.opts.port ?? await findFreePort();
41
+ this.endpoint = {
42
+ protocol: 'http',
43
+ hostname: this.opts.hostname,
44
+ port,
45
+ path: this.opts.pathBase,
46
+ };
47
+ this.proc = spawn(this.opts.command, [`--port=${port}`, ...this.opts.args], {
33
48
  env: { ...process.env, ...this.opts.env },
34
49
  stdio: ['ignore', 'pipe', 'pipe'],
35
50
  });
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/lib/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/lib/service.ts"],"names":[],"mappings":"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"}
@@ -16,5 +16,17 @@ export declare class WebElement {
16
16
  };
17
17
  isDisplayed(): Promise<boolean>;
18
18
  screenshotBase64(): Promise<string>;
19
+ clear(): Promise<void>;
20
+ getAttribute(name: string): Promise<string | null>;
21
+ getProperty(name: string): Promise<unknown>;
22
+ isEnabled(): Promise<boolean>;
23
+ isSelected(): Promise<boolean>;
24
+ getTagName(): Promise<string>;
25
+ getRect(): Promise<{
26
+ x: number;
27
+ y: number;
28
+ width: number;
29
+ height: number;
30
+ }>;
19
31
  }
20
32
  //# sourceMappingURL=webelement.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"webelement.d.ts","sourceRoot":"","sources":["../../src/lib/webelement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAErE,eAAO,MAAM,eAAe,wCAAwC,CAAC;AACrE,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C,qBAAa,UAAU;IAEnB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;gBAFT,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM;IAG3B,KAAK,IAAI,MAAM;IAIT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAUhC,MAAM;;;;IAIA,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAU/B,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;CAS1C"}
1
+ {"version":3,"file":"webelement.d.ts","sourceRoot":"","sources":["../../src/lib/webelement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAErE,eAAO,MAAM,eAAe,wCAAwC,CAAC;AACrE,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C,qBAAa,UAAU;IAEnB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;gBAFT,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM;IAG3B,KAAK,IAAI,MAAM;IAIT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAUhC,MAAM;;;;IAIA,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAU/B,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAUnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUlD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU3C,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAU7B,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAU9B,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAU7B,OAAO,IAAI,OAAO,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CASlF"}
@@ -60,5 +60,67 @@ export class WebElement {
60
60
  const value = res?.value ?? res;
61
61
  return String(value ?? '');
62
62
  }
63
+ async clear() {
64
+ const client = new HttpClient(this.endpoint);
65
+ await client.send({
66
+ method: 'POST',
67
+ path: `/session/${this.sessionId}/element/${this.elementId}/clear`,
68
+ body: {},
69
+ });
70
+ }
71
+ async getAttribute(name) {
72
+ const client = new HttpClient(this.endpoint);
73
+ const res = await client.send({
74
+ method: 'GET',
75
+ path: `/session/${this.sessionId}/element/${this.elementId}/attribute/${name}`,
76
+ });
77
+ const value = res?.value ?? res;
78
+ return value;
79
+ }
80
+ async getProperty(name) {
81
+ const client = new HttpClient(this.endpoint);
82
+ const res = await client.send({
83
+ method: 'GET',
84
+ path: `/session/${this.sessionId}/element/${this.elementId}/property/${name}`,
85
+ });
86
+ const value = res?.value ?? res;
87
+ return value;
88
+ }
89
+ async isEnabled() {
90
+ const client = new HttpClient(this.endpoint);
91
+ const res = await client.send({
92
+ method: 'GET',
93
+ path: `/session/${this.sessionId}/element/${this.elementId}/enabled`,
94
+ });
95
+ const value = res?.value ?? res;
96
+ return Boolean(value);
97
+ }
98
+ async isSelected() {
99
+ const client = new HttpClient(this.endpoint);
100
+ const res = await client.send({
101
+ method: 'GET',
102
+ path: `/session/${this.sessionId}/element/${this.elementId}/selected`,
103
+ });
104
+ const value = res?.value ?? res;
105
+ return Boolean(value);
106
+ }
107
+ async getTagName() {
108
+ const client = new HttpClient(this.endpoint);
109
+ const res = await client.send({
110
+ method: 'GET',
111
+ path: `/session/${this.sessionId}/element/${this.elementId}/name`,
112
+ });
113
+ const value = res?.value ?? res;
114
+ return String(value ?? '').toLowerCase();
115
+ }
116
+ async getRect() {
117
+ const client = new HttpClient(this.endpoint);
118
+ const res = await client.send({
119
+ method: 'GET',
120
+ path: `/session/${this.sessionId}/element/${this.elementId}/rect`,
121
+ });
122
+ const value = res?.value ?? res;
123
+ return value;
124
+ }
63
125
  }
64
126
  //# sourceMappingURL=webelement.js.map