craftdriver 1.8.0 → 1.9.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.
- package/CHANGELOG.md +6 -5
- package/README.md +3 -2
- package/dist/cli/pageSemantics.d.ts +3 -39
- package/dist/cli/pageSemantics.d.ts.map +1 -1
- package/dist/cli/pageSemantics.js +3 -191
- package/dist/cli/pageSemantics.js.map +1 -1
- package/dist/cli/selector.d.ts +3 -3
- package/dist/cli/selector.d.ts.map +1 -1
- package/dist/cli/selector.js +6 -9
- package/dist/cli/selector.js.map +1 -1
- package/dist/cli/snapshot.d.ts +5 -6
- package/dist/cli/snapshot.d.ts.map +1 -1
- package/dist/cli/snapshot.js +59 -18
- package/dist/cli/snapshot.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/a11y.d.ts +6 -2
- package/dist/lib/a11y.d.ts.map +1 -1
- package/dist/lib/a11y.js +3 -1
- package/dist/lib/a11y.js.map +1 -1
- package/dist/lib/bidi/evaluate.d.ts +11 -0
- package/dist/lib/bidi/evaluate.d.ts.map +1 -0
- package/dist/lib/bidi/evaluate.js +25 -0
- package/dist/lib/bidi/evaluate.js.map +1 -0
- package/dist/lib/bidi/types.d.ts +2 -0
- package/dist/lib/bidi/types.d.ts.map +1 -1
- package/dist/lib/browser.d.ts +1 -1
- package/dist/lib/browser.d.ts.map +1 -1
- package/dist/lib/browser.js +46 -35
- package/dist/lib/browser.js.map +1 -1
- package/dist/lib/browserContext.d.ts +4 -6
- package/dist/lib/browserContext.d.ts.map +1 -1
- package/dist/lib/browserContext.js +5 -7
- package/dist/lib/browserContext.js.map +1 -1
- package/dist/lib/by.d.ts +65 -27
- package/dist/lib/by.d.ts.map +1 -1
- package/dist/lib/by.js +47 -20
- package/dist/lib/by.js.map +1 -1
- package/dist/lib/clearFastPath.d.ts.map +1 -1
- package/dist/lib/clearFastPath.js +2 -0
- package/dist/lib/clearFastPath.js.map +1 -1
- package/dist/lib/clickFastPath.d.ts.map +1 -1
- package/dist/lib/clickFastPath.js +2 -0
- package/dist/lib/clickFastPath.js.map +1 -1
- package/dist/lib/driver.d.ts +19 -0
- package/dist/lib/driver.d.ts.map +1 -1
- package/dist/lib/driver.js +111 -4
- package/dist/lib/driver.js.map +1 -1
- package/dist/lib/elementHandle.d.ts +13 -10
- package/dist/lib/elementHandle.d.ts.map +1 -1
- package/dist/lib/elementHandle.js +119 -50
- package/dist/lib/elementHandle.js.map +1 -1
- package/dist/lib/errors.d.ts +5 -1
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +5 -1
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/expect.d.ts +10 -0
- package/dist/lib/expect.d.ts.map +1 -1
- package/dist/lib/expect.js +76 -49
- package/dist/lib/expect.js.map +1 -1
- package/dist/lib/fillFastPath.d.ts.map +1 -1
- package/dist/lib/fillFastPath.js +2 -0
- package/dist/lib/fillFastPath.js.map +1 -1
- package/dist/lib/frame.d.ts.map +1 -1
- package/dist/lib/frame.js +29 -17
- package/dist/lib/frame.js.map +1 -1
- package/dist/lib/locator.d.ts +21 -54
- package/dist/lib/locator.d.ts.map +1 -1
- package/dist/lib/locator.js +165 -208
- package/dist/lib/locator.js.map +1 -1
- package/dist/lib/page.d.ts.map +1 -1
- package/dist/lib/page.js +23 -13
- package/dist/lib/page.js.map +1 -1
- package/dist/lib/pageSemantics.d.ts +42 -0
- package/dist/lib/pageSemantics.d.ts.map +1 -0
- package/dist/lib/pageSemantics.js +216 -0
- package/dist/lib/pageSemantics.js.map +1 -0
- package/dist/lib/query.d.ts +68 -0
- package/dist/lib/query.d.ts.map +1 -0
- package/dist/lib/query.js +590 -0
- package/dist/lib/query.js.map +1 -0
- package/dist/lib/shadowRoot.d.ts +21 -0
- package/dist/lib/shadowRoot.d.ts.map +1 -0
- package/dist/lib/shadowRoot.js +29 -0
- package/dist/lib/shadowRoot.js.map +1 -0
- package/dist/lib/shadowRootLocator.d.ts +31 -0
- package/dist/lib/shadowRootLocator.d.ts.map +1 -0
- package/dist/lib/shadowRootLocator.js +55 -0
- package/dist/lib/shadowRootLocator.js.map +1 -0
- package/dist/lib/timing.d.ts +2 -2
- package/dist/lib/timing.js +2 -2
- package/docs/accessibility.md +9 -1
- package/docs/api-reference.md +4 -1
- package/docs/browser-api.md +3 -3
- package/docs/browser-context.md +3 -3
- package/docs/cli.md +10 -7
- package/docs/error-codes.md +3 -1
- package/docs/getting-started.md +1 -1
- package/docs/mcp.md +9 -5
- package/docs/public/examples/iframe-child.html +12 -1
- package/docs/public/examples/shadow-dom.html +137 -0
- package/docs/recipes/login-once-reuse-session.md +1 -1
- package/docs/selectors.md +61 -0
- package/docs/session-management.md +17 -10
- package/package.json +3 -3
- package/skills/craftdriver/patterns.md +3 -0
package/dist/lib/by.d.ts
CHANGED
|
@@ -2,10 +2,65 @@ export type Locator = {
|
|
|
2
2
|
using: string;
|
|
3
3
|
value: string;
|
|
4
4
|
};
|
|
5
|
+
export interface RoleLocatorOptions {
|
|
6
|
+
name?: string;
|
|
7
|
+
exact?: boolean;
|
|
8
|
+
includeHidden?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface TextLocatorOptions {
|
|
11
|
+
exact?: boolean;
|
|
12
|
+
caseSensitive?: boolean;
|
|
13
|
+
trim?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ExactLocatorOptions {
|
|
16
|
+
exact?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Semantic intent retained alongside the W3C wire representation.
|
|
20
|
+
*
|
|
21
|
+
* Light-DOM lookup keeps using `using`/`value` for backwards compatibility.
|
|
22
|
+
* Root-aware adapters use this descriptor when XPath is not interoperable
|
|
23
|
+
* (notably inside a ShadowRoot) instead of trying to parse generated XPath.
|
|
24
|
+
*/
|
|
25
|
+
export type QueryDescriptor = {
|
|
26
|
+
kind: 'css';
|
|
27
|
+
value: string;
|
|
28
|
+
} | {
|
|
29
|
+
kind: 'xpath';
|
|
30
|
+
value: string;
|
|
31
|
+
raw: true;
|
|
32
|
+
} | {
|
|
33
|
+
kind: 'linkText';
|
|
34
|
+
value: string;
|
|
35
|
+
partial: boolean;
|
|
36
|
+
} | {
|
|
37
|
+
kind: 'ref';
|
|
38
|
+
value: string;
|
|
39
|
+
} | {
|
|
40
|
+
kind: 'role';
|
|
41
|
+
role: string;
|
|
42
|
+
options: RoleLocatorOptions;
|
|
43
|
+
} | {
|
|
44
|
+
kind: 'text';
|
|
45
|
+
value: string;
|
|
46
|
+
options: TextLocatorOptions;
|
|
47
|
+
} | {
|
|
48
|
+
kind: 'label';
|
|
49
|
+
value: string;
|
|
50
|
+
options: ExactLocatorOptions;
|
|
51
|
+
} | {
|
|
52
|
+
kind: 'placeholder' | 'alt' | 'title';
|
|
53
|
+
value: string;
|
|
54
|
+
options: ExactLocatorOptions;
|
|
55
|
+
};
|
|
5
56
|
export declare class By {
|
|
6
57
|
using: string;
|
|
7
58
|
value: string;
|
|
8
|
-
|
|
59
|
+
/** Internal semantic metadata; public for adapter code, optional for structural compatibility. */
|
|
60
|
+
readonly descriptor?: QueryDescriptor | undefined;
|
|
61
|
+
constructor(using: string, value: string,
|
|
62
|
+
/** Internal semantic metadata; public for adapter code, optional for structural compatibility. */
|
|
63
|
+
descriptor?: QueryDescriptor | undefined);
|
|
9
64
|
static css(selector: string): By;
|
|
10
65
|
static xpath(xpath: string): By;
|
|
11
66
|
static id(id: string): By;
|
|
@@ -16,6 +71,8 @@ export declare class By {
|
|
|
16
71
|
static dataAttr(name: string, value: string): By;
|
|
17
72
|
static aria(name: string, value: string): By;
|
|
18
73
|
static testId(value: string): By;
|
|
74
|
+
/** Internal agent-snapshot identity reference. Prefer durable locators in tests. */
|
|
75
|
+
static ref(value: string): By;
|
|
19
76
|
/**
|
|
20
77
|
* Match elements by their normalized visible text.
|
|
21
78
|
*
|
|
@@ -26,20 +83,13 @@ export declare class By {
|
|
|
26
83
|
* - `caseSensitive` — defaults to `true`.
|
|
27
84
|
* - `trim` — collapse whitespace via `normalize-space()`. Defaults to `true`.
|
|
28
85
|
*/
|
|
29
|
-
static text(text: string, opts?:
|
|
30
|
-
exact?: boolean;
|
|
31
|
-
caseSensitive?: boolean;
|
|
32
|
-
trim?: boolean;
|
|
33
|
-
}): By;
|
|
86
|
+
static text(text: string, opts?: TextLocatorOptions): By;
|
|
34
87
|
/**
|
|
35
88
|
* Match elements whose normalized text contains `substring`. Prefer
|
|
36
89
|
* `By.text(s, { exact: false })` for symmetry with the other locators;
|
|
37
90
|
* this lower-level entry point is kept for explicit use.
|
|
38
91
|
*/
|
|
39
|
-
static partialText(substring: string, opts?:
|
|
40
|
-
caseSensitive?: boolean;
|
|
41
|
-
trim?: boolean;
|
|
42
|
-
}): By;
|
|
92
|
+
static partialText(substring: string, opts?: Omit<TextLocatorOptions, 'exact'>): By;
|
|
43
93
|
/**
|
|
44
94
|
* Match elements by ARIA role, resolving **implicit** roles for common native
|
|
45
95
|
* elements — so `role('button')` matches `<button>` and `<input type="submit">`,
|
|
@@ -54,23 +104,11 @@ export declare class By {
|
|
|
54
104
|
* Coverage is a documented approximation of the common roles, not the full
|
|
55
105
|
* ARIA algorithm; unmapped roles still match an explicit `role=` attribute.
|
|
56
106
|
*/
|
|
57
|
-
static role(role: string, opts?:
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
static labelText(text: string, opts?: {
|
|
63
|
-
exact?: boolean;
|
|
64
|
-
}): By;
|
|
65
|
-
static placeholder(text: string, opts?: {
|
|
66
|
-
exact?: boolean;
|
|
67
|
-
}): By;
|
|
68
|
-
static altText(text: string, opts?: {
|
|
69
|
-
exact?: boolean;
|
|
70
|
-
}): By;
|
|
71
|
-
static title(text: string, opts?: {
|
|
72
|
-
exact?: boolean;
|
|
73
|
-
}): By;
|
|
107
|
+
static role(role: string, opts?: RoleLocatorOptions): By;
|
|
108
|
+
static labelText(text: string, opts?: ExactLocatorOptions): By;
|
|
109
|
+
static placeholder(text: string, opts?: ExactLocatorOptions): By;
|
|
110
|
+
static altText(text: string, opts?: ExactLocatorOptions): By;
|
|
111
|
+
static title(text: string, opts?: ExactLocatorOptions): By;
|
|
74
112
|
/** Match an `<a>` whose (trimmed) rendered text exactly equals `text`. */
|
|
75
113
|
static linkText(text: string): By;
|
|
76
114
|
/** Match an `<a>` whose (trimmed) rendered text contains `text`. */
|
package/dist/lib/by.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"by.d.ts","sourceRoot":"","sources":["../../src/lib/by.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,qBAAa,EAAE;IAEJ,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"by.d.ts","sourceRoot":"","sources":["../../src/lib/by.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/by.js
CHANGED
|
@@ -1,41 +1,52 @@
|
|
|
1
1
|
export class By {
|
|
2
2
|
using;
|
|
3
3
|
value;
|
|
4
|
-
|
|
4
|
+
descriptor;
|
|
5
|
+
constructor(using, value,
|
|
6
|
+
/** Internal semantic metadata; public for adapter code, optional for structural compatibility. */
|
|
7
|
+
descriptor) {
|
|
5
8
|
this.using = using;
|
|
6
9
|
this.value = value;
|
|
10
|
+
this.descriptor = descriptor;
|
|
7
11
|
}
|
|
8
12
|
// Base CSS/XPath helpers
|
|
9
13
|
static css(selector) {
|
|
10
|
-
return new By('css selector', selector);
|
|
14
|
+
return new By('css selector', selector, { kind: 'css', value: selector });
|
|
11
15
|
}
|
|
12
16
|
static xpath(xpath) {
|
|
13
|
-
return new By('xpath', xpath);
|
|
17
|
+
return new By('xpath', xpath, { kind: 'xpath', value: xpath, raw: true });
|
|
14
18
|
}
|
|
15
19
|
// Simple attribute-based helpers
|
|
16
20
|
static id(id) {
|
|
17
|
-
return
|
|
21
|
+
return By.css(`#${cssEscape(id)}`);
|
|
18
22
|
}
|
|
19
23
|
static name(name) {
|
|
20
|
-
return
|
|
24
|
+
return By.css(`[name="${cssEscape(name)}"]`);
|
|
21
25
|
}
|
|
22
26
|
static className(cls) {
|
|
23
|
-
return
|
|
27
|
+
return By.css(`.${cssEscape(cls)}`);
|
|
24
28
|
}
|
|
25
29
|
static tagName(tag) {
|
|
26
|
-
return
|
|
30
|
+
return By.css(tag);
|
|
27
31
|
}
|
|
28
32
|
static attr(name, value) {
|
|
29
|
-
return
|
|
33
|
+
return By.css(`[${name}="${cssEscape(value)}"]`);
|
|
30
34
|
}
|
|
31
35
|
static dataAttr(name, value) {
|
|
32
|
-
return
|
|
36
|
+
return By.css(`[data-${name}="${cssEscape(value)}"]`);
|
|
33
37
|
}
|
|
34
38
|
static aria(name, value) {
|
|
35
|
-
return
|
|
39
|
+
return By.css(`[aria-${name}="${cssEscape(value)}"]`);
|
|
36
40
|
}
|
|
37
41
|
static testId(value) {
|
|
38
|
-
return
|
|
42
|
+
return By.css(`[data-testid="${cssEscape(value)}"]`);
|
|
43
|
+
}
|
|
44
|
+
/** Internal agent-snapshot identity reference. Prefer durable locators in tests. */
|
|
45
|
+
static ref(value) {
|
|
46
|
+
return new By('css selector', `[data-craftdriver-ref="${cssEscape(value)}"]`, {
|
|
47
|
+
kind: 'ref',
|
|
48
|
+
value,
|
|
49
|
+
});
|
|
39
50
|
}
|
|
40
51
|
// Text-based locators (XPath)
|
|
41
52
|
/**
|
|
@@ -61,7 +72,7 @@ export class By {
|
|
|
61
72
|
// Prefer the innermost element for symmetry with partialText — a wrapper
|
|
62
73
|
// whose only child carries the same normalized text would otherwise match twice.
|
|
63
74
|
const xpath = `.//*[${left} = ${right} and not(.//*[${left} = ${right}])]`;
|
|
64
|
-
return By
|
|
75
|
+
return new By('xpath', xpath, { kind: 'text', value: text, options: { ...opts, exact: true } });
|
|
65
76
|
}
|
|
66
77
|
/**
|
|
67
78
|
* Match elements whose normalized text contains `substring`. Prefer
|
|
@@ -77,7 +88,11 @@ export class By {
|
|
|
77
88
|
const right = cs ? valueExpr : toLower(valueExpr);
|
|
78
89
|
// Prefer the innermost element containing the substring to avoid matching large containers
|
|
79
90
|
const xpath = `.//*[contains(${left}, ${right}) and not(.//*[contains(${left}, ${right})])]`;
|
|
80
|
-
return By
|
|
91
|
+
return new By('xpath', xpath, {
|
|
92
|
+
kind: 'text',
|
|
93
|
+
value: substring,
|
|
94
|
+
options: { ...opts, exact: false },
|
|
95
|
+
});
|
|
81
96
|
}
|
|
82
97
|
// Accessibility-inspired helpers (approximate)
|
|
83
98
|
/**
|
|
@@ -145,7 +160,7 @@ export class By {
|
|
|
145
160
|
// WebDriver endpoint passes in, which would otherwise search the whole
|
|
146
161
|
// document instead of the parent's subtree.
|
|
147
162
|
const xpath = `.//*[( ${conditions.join(' and ')} )${visibleGuard}]`;
|
|
148
|
-
return By
|
|
163
|
+
return new By('xpath', xpath, { kind: 'role', role, options: { ...opts } });
|
|
149
164
|
}
|
|
150
165
|
static labelText(text, opts) {
|
|
151
166
|
const eq = opts?.exact !== false; // default exact
|
|
@@ -161,25 +176,37 @@ export class By {
|
|
|
161
176
|
// approximation rather than the general nested-scope bug.
|
|
162
177
|
const byFor = `.//*[@id=//label[${labelMatch}]/@for]`;
|
|
163
178
|
const wrapped = `.//label[${labelMatch}]//*[self::input or self::textarea or self::select]`;
|
|
164
|
-
return By
|
|
179
|
+
return new By('xpath', `(${byFor} | ${wrapped})`, {
|
|
180
|
+
kind: 'label',
|
|
181
|
+
value: text,
|
|
182
|
+
options: { ...opts },
|
|
183
|
+
});
|
|
165
184
|
}
|
|
166
185
|
static placeholder(text, opts) {
|
|
167
186
|
const eq = opts?.exact !== false;
|
|
168
187
|
const lit = xpStringLiteral(text);
|
|
169
188
|
const pred = eq ? `@placeholder = ${lit}` : `contains(@placeholder, ${lit})`;
|
|
170
|
-
return By
|
|
189
|
+
return new By('xpath', `.//*[(self::input or self::textarea) and ${pred}]`, {
|
|
190
|
+
kind: 'placeholder',
|
|
191
|
+
value: text,
|
|
192
|
+
options: { ...opts },
|
|
193
|
+
});
|
|
171
194
|
}
|
|
172
195
|
static altText(text, opts) {
|
|
173
196
|
const eq = opts?.exact !== false;
|
|
174
197
|
const lit = xpStringLiteral(text);
|
|
175
198
|
const pred = eq ? `@alt = ${lit}` : `contains(@alt, ${lit})`;
|
|
176
|
-
return By
|
|
199
|
+
return new By('xpath', `.//*[(self::img or self::area or (self::input and @type='image')) and ${pred}]`, { kind: 'alt', value: text, options: { ...opts } });
|
|
177
200
|
}
|
|
178
201
|
static title(text, opts) {
|
|
179
202
|
const eq = opts?.exact !== false;
|
|
180
203
|
const lit = xpStringLiteral(text);
|
|
181
204
|
const pred = eq ? `@title = ${lit}` : `contains(@title, ${lit})`;
|
|
182
|
-
return By
|
|
205
|
+
return new By('xpath', `.//*[@title and ${pred}]`, {
|
|
206
|
+
kind: 'title',
|
|
207
|
+
value: text,
|
|
208
|
+
options: { ...opts },
|
|
209
|
+
});
|
|
183
210
|
}
|
|
184
211
|
// Link-text locators — the native W3C "link text" / "partial link text"
|
|
185
212
|
// location strategies, matching Selenium's By.linkText / By.partialLinkText.
|
|
@@ -189,11 +216,11 @@ export class By {
|
|
|
189
216
|
// strategy is resolved by the driver rather than as a document-rooted XPath.
|
|
190
217
|
/** Match an `<a>` whose (trimmed) rendered text exactly equals `text`. */
|
|
191
218
|
static linkText(text) {
|
|
192
|
-
return new By('link text', text);
|
|
219
|
+
return new By('link text', text, { kind: 'linkText', value: text, partial: false });
|
|
193
220
|
}
|
|
194
221
|
/** Match an `<a>` whose (trimmed) rendered text contains `text`. */
|
|
195
222
|
static partialLinkText(text) {
|
|
196
|
-
return new By('partial link text', text);
|
|
223
|
+
return new By('partial link text', text, { kind: 'linkText', value: text, partial: true });
|
|
197
224
|
}
|
|
198
225
|
}
|
|
199
226
|
// True when the candidate has an ancestor that is sectioning content (or
|
package/dist/lib/by.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"by.js","sourceRoot":"","sources":["../../src/lib/by.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"by.js","sourceRoot":"","sources":["../../src/lib/by.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clearFastPath.d.ts","sourceRoot":"","sources":["../../src/lib/clearFastPath.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"clearFastPath.d.ts","sourceRoot":"","sources":["../../src/lib/clearFastPath.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAelD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,EAC7C,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,EACxD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAkBf"}
|
|
@@ -5,6 +5,8 @@ const RECOVERABLE_CLEAR_ERRORS = new Set([
|
|
|
5
5
|
'element not interactable',
|
|
6
6
|
]);
|
|
7
7
|
function isRecoverableClearError(err) {
|
|
8
|
+
if (CraftdriverError.is(err, ErrorCode.DETACHED_SHADOW_ROOT))
|
|
9
|
+
return true;
|
|
8
10
|
if (!CraftdriverError.is(err, ErrorCode.DRIVER_ERROR))
|
|
9
11
|
return false;
|
|
10
12
|
const code = err.detail?.webDriverError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clearFastPath.js","sourceRoot":"","sources":["../../src/lib/clearFastPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,wBAAwB,GAAwB,IAAI,GAAG,CAAC;IAC5D,iBAAiB;IACjB,yBAAyB;IACzB,0BAA0B;CAC3B,CAAC,CAAC;AAEH,SAAS,uBAAuB,CAAC,GAAY;IAC3C,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IACxC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAA6C,EAC7C,cAAwD,EACxD,OAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;QAC/B,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;QAC7C,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/D,IAAI,mBAAmB,IAAI,CAAC;YAAE,MAAM,GAAG,CAAC;IAC1C,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
|
1
|
+
{"version":3,"file":"clearFastPath.js","sourceRoot":"","sources":["../../src/lib/clearFastPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,wBAAwB,GAAwB,IAAI,GAAG,CAAC;IAC5D,iBAAiB;IACjB,yBAAyB;IACzB,0BAA0B;CAC3B,CAAC,CAAC;AAEH,SAAS,uBAAuB,CAAC,GAAY;IAC3C,IAAI,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,oBAAoB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1E,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IACxC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAA6C,EAC7C,cAAwD,EACxD,OAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;QAC/B,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;QAC7C,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/D,IAAI,mBAAmB,IAAI,CAAC;YAAE,MAAM,GAAG,CAAC;IAC1C,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickFastPath.d.ts","sourceRoot":"","sources":["../../src/lib/clickFastPath.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"clickFastPath.d.ts","sourceRoot":"","sources":["../../src/lib/clickFastPath.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAiBlD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,EAC7C,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,EACxD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAkBf"}
|
|
@@ -7,6 +7,8 @@ const RECOVERABLE_CLICK_ERRORS = new Set([
|
|
|
7
7
|
'move target out of bounds',
|
|
8
8
|
]);
|
|
9
9
|
function isRecoverableClickError(err) {
|
|
10
|
+
if (CraftdriverError.is(err, ErrorCode.DETACHED_SHADOW_ROOT))
|
|
11
|
+
return true;
|
|
10
12
|
if (!CraftdriverError.is(err, ErrorCode.DRIVER_ERROR))
|
|
11
13
|
return false;
|
|
12
14
|
const code = err.detail?.webDriverError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickFastPath.js","sourceRoot":"","sources":["../../src/lib/clickFastPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,wBAAwB,GAAwB,IAAI,GAAG,CAAC;IAC5D,iBAAiB;IACjB,yBAAyB;IACzB,0BAA0B;IAC1B,2BAA2B;IAC3B,2BAA2B;CAC5B,CAAC,CAAC;AAEH,SAAS,uBAAuB,CAAC,GAAY;IAC3C,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IACxC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAA6C,EAC7C,cAAwD,EACxD,OAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;QAC/B,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;QAC7C,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/D,IAAI,mBAAmB,IAAI,CAAC;YAAE,MAAM,GAAG,CAAC;IAC1C,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
|
1
|
+
{"version":3,"file":"clickFastPath.js","sourceRoot":"","sources":["../../src/lib/clickFastPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,wBAAwB,GAAwB,IAAI,GAAG,CAAC;IAC5D,iBAAiB;IACjB,yBAAyB;IACzB,0BAA0B;IAC1B,2BAA2B;IAC3B,2BAA2B;CAC5B,CAAC,CAAC;AAEH,SAAS,uBAAuB,CAAC,GAAY;IAC3C,IAAI,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,oBAAoB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1E,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IACxC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAA6C,EAC7C,cAAwD,EACxD,OAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;QAC/B,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;QAC7C,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/D,IAAI,mBAAmB,IAAI,CAAC;YAAE,MAAM,GAAG,CAAC;IAC1C,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
package/dist/lib/driver.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import type { Capabilities, WebDriverEndpoint, ClassicCookie, ClassicCookieInput } from './types.js';
|
|
2
2
|
import { By } from './by.js';
|
|
3
3
|
import { WebElement } from './webelement.js';
|
|
4
|
+
import { ClassicShadowRoot } from './shadowRoot.js';
|
|
4
5
|
import { type Condition, type WaitOptions } from './wait.js';
|
|
5
6
|
export declare class Driver {
|
|
6
7
|
private endpoint;
|
|
7
8
|
private sessionId;
|
|
8
9
|
/** BiDi WebSocket URL if available */
|
|
9
10
|
__wsUrl?: string;
|
|
11
|
+
private bidiShadowQueriesSupported;
|
|
10
12
|
constructor(endpoint: WebDriverEndpoint, sessionId: string);
|
|
11
13
|
/**
|
|
12
14
|
* True for sessions created against a remote WebDriver endpoint.
|
|
@@ -16,6 +18,19 @@ export declare class Driver {
|
|
|
16
18
|
* `ElementHandle`) that still need a remote/local branch.
|
|
17
19
|
*/
|
|
18
20
|
isRemote(): boolean;
|
|
21
|
+
/** Session-wide capability cache for the optional BiDi shadow adapter. */
|
|
22
|
+
canUseBiDiShadowQueries(): boolean;
|
|
23
|
+
/** Disable BiDi shadow lookup after a conclusive protocol/interoperability failure. */
|
|
24
|
+
disableBiDiShadowQueries(): boolean;
|
|
25
|
+
/** Build a Classic element wrapper from a W3C/BiDi shared node id. */
|
|
26
|
+
webElementFromId(elementId: string): WebElement;
|
|
27
|
+
/** Build an internal Classic shadow-root wrapper from its W3C id. */
|
|
28
|
+
shadowRootFromId(shadowRootId: string): ClassicShadowRoot;
|
|
29
|
+
/**
|
|
30
|
+
* Recursively deserialize W3C element and shadow-root references.
|
|
31
|
+
* Execute Script can return either reference at any depth.
|
|
32
|
+
*/
|
|
33
|
+
deserializeWireValue<T = unknown>(value: unknown): T;
|
|
19
34
|
static create(endpoint: WebDriverEndpoint, caps: Capabilities, options?: {
|
|
20
35
|
timeoutMs?: number;
|
|
21
36
|
}): Promise<Driver>;
|
|
@@ -44,6 +59,10 @@ export declare class Driver {
|
|
|
44
59
|
* for `undefined`). Resolves with the value passed to the callback.
|
|
45
60
|
*/
|
|
46
61
|
executeAsyncScript<T = unknown>(script: string, args?: unknown[]): Promise<T>;
|
|
62
|
+
/** W3C Get Element Shadow Root command. Open-only policy is enforced by the query layer. */
|
|
63
|
+
getElementShadowRoot(element: WebElement): Promise<ClassicShadowRoot>;
|
|
64
|
+
findElementFromShadowRoot(shadowRootId: string, locator: By): Promise<WebElement>;
|
|
65
|
+
findElementsFromShadowRoot(shadowRootId: string, locator: By): Promise<WebElement[]>;
|
|
47
66
|
/** Configure the script (and async-script) timeout in milliseconds. */
|
|
48
67
|
setScriptTimeout(ms: number): Promise<void>;
|
|
49
68
|
wait<T>(condition: Condition<T>, options?: WaitOptions & {
|
package/dist/lib/driver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/lib/driver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EAEZ,iBAAiB,EAEjB,aAAa,EACb,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAuC,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAiB,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAS5E,qBAAa,MAAM;
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/lib/driver.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/driver.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { HttpClient } from './http.js';
|
|
2
2
|
import { WebElement, W3C_ELEMENT_KEY, LEGACY_ELEMENT_KEY } from './webelement.js';
|
|
3
|
+
import { ClassicShadowRoot, W3C_SHADOW_ROOT_KEY } from './shadowRoot.js';
|
|
3
4
|
import { WebDriverWait } from './wait.js';
|
|
4
5
|
import { CraftdriverError, ErrorCode } from './errors.js';
|
|
5
6
|
import { SESSION_CREATE_TIMEOUT_MS } from './timing.js';
|
|
@@ -13,6 +14,7 @@ export class Driver {
|
|
|
13
14
|
sessionId;
|
|
14
15
|
/** BiDi WebSocket URL if available */
|
|
15
16
|
__wsUrl;
|
|
17
|
+
bidiShadowQueriesSupported = true;
|
|
16
18
|
constructor(endpoint, sessionId) {
|
|
17
19
|
this.endpoint = endpoint;
|
|
18
20
|
this.sessionId = sessionId;
|
|
@@ -27,6 +29,45 @@ export class Driver {
|
|
|
27
29
|
isRemote() {
|
|
28
30
|
return this.endpoint.poolKey !== undefined;
|
|
29
31
|
}
|
|
32
|
+
/** Session-wide capability cache for the optional BiDi shadow adapter. */
|
|
33
|
+
canUseBiDiShadowQueries() {
|
|
34
|
+
return this.bidiShadowQueriesSupported;
|
|
35
|
+
}
|
|
36
|
+
/** Disable BiDi shadow lookup after a conclusive protocol/interoperability failure. */
|
|
37
|
+
disableBiDiShadowQueries() {
|
|
38
|
+
if (!this.bidiShadowQueriesSupported)
|
|
39
|
+
return false;
|
|
40
|
+
this.bidiShadowQueriesSupported = false;
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
/** Build a Classic element wrapper from a W3C/BiDi shared node id. */
|
|
44
|
+
webElementFromId(elementId) {
|
|
45
|
+
return new WebElement(this.endpoint, this.sessionId, elementId);
|
|
46
|
+
}
|
|
47
|
+
/** Build an internal Classic shadow-root wrapper from its W3C id. */
|
|
48
|
+
shadowRootFromId(shadowRootId) {
|
|
49
|
+
return new ClassicShadowRoot(this, shadowRootId);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Recursively deserialize W3C element and shadow-root references.
|
|
53
|
+
* Execute Script can return either reference at any depth.
|
|
54
|
+
*/
|
|
55
|
+
deserializeWireValue(value) {
|
|
56
|
+
if (Array.isArray(value)) {
|
|
57
|
+
return value.map((item) => this.deserializeWireValue(item));
|
|
58
|
+
}
|
|
59
|
+
if (value && typeof value === 'object') {
|
|
60
|
+
const record = value;
|
|
61
|
+
const elementId = record[W3C_ELEMENT_KEY] ?? record[LEGACY_ELEMENT_KEY];
|
|
62
|
+
if (typeof elementId === 'string')
|
|
63
|
+
return this.webElementFromId(elementId);
|
|
64
|
+
const shadowRootId = record[W3C_SHADOW_ROOT_KEY];
|
|
65
|
+
if (typeof shadowRootId === 'string')
|
|
66
|
+
return this.shadowRootFromId(shadowRootId);
|
|
67
|
+
return Object.fromEntries(Object.entries(record).map(([key, item]) => [key, this.deserializeWireValue(item)]));
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
30
71
|
static async create(endpoint, caps, options) {
|
|
31
72
|
const client = new HttpClient(endpoint);
|
|
32
73
|
let res;
|
|
@@ -123,6 +164,12 @@ export class Driver {
|
|
|
123
164
|
return String(v ?? '');
|
|
124
165
|
}
|
|
125
166
|
async findElement(locator) {
|
|
167
|
+
if (locator.descriptor?.kind === 'ref') {
|
|
168
|
+
const elements = await this.findElements(locator);
|
|
169
|
+
if (elements[0])
|
|
170
|
+
return elements[0];
|
|
171
|
+
throw new CraftdriverError(ErrorCode.NO_MATCH, `Snapshot ref ${locator.descriptor.value} does not identify a live element`, { detail: { ref: locator.descriptor.value } });
|
|
172
|
+
}
|
|
126
173
|
const client = new HttpClient(this.endpoint);
|
|
127
174
|
const res = await client.send({
|
|
128
175
|
method: 'POST',
|
|
@@ -134,9 +181,17 @@ export class Driver {
|
|
|
134
181
|
const elId = value?.[W3C_ELEMENT_KEY] || value?.[LEGACY_ELEMENT_KEY];
|
|
135
182
|
if (!elId)
|
|
136
183
|
throw new Error(`findElement failed: ${JSON.stringify(res)}`);
|
|
137
|
-
return
|
|
184
|
+
return this.webElementFromId(elId);
|
|
138
185
|
}
|
|
139
186
|
async findElements(locator) {
|
|
187
|
+
if (locator.descriptor?.kind === 'ref') {
|
|
188
|
+
const element = await this.executeScript(`
|
|
189
|
+
const reg = window.__craftdriverRefs;
|
|
190
|
+
const el = reg && reg.map ? reg.map.get(arguments[0]) : null;
|
|
191
|
+
return el && el.isConnected && el.ownerDocument === document ? el : null;
|
|
192
|
+
`, [locator.descriptor.value]);
|
|
193
|
+
return element instanceof WebElement ? [element] : [];
|
|
194
|
+
}
|
|
140
195
|
const client = new HttpClient(this.endpoint);
|
|
141
196
|
const res = await client.send({
|
|
142
197
|
method: 'POST',
|
|
@@ -150,7 +205,7 @@ export class Driver {
|
|
|
150
205
|
const elId = v?.[W3C_ELEMENT_KEY] || v?.[LEGACY_ELEMENT_KEY];
|
|
151
206
|
if (!elId)
|
|
152
207
|
return undefined;
|
|
153
|
-
return
|
|
208
|
+
return this.webElementFromId(elId);
|
|
154
209
|
})
|
|
155
210
|
.filter(Boolean);
|
|
156
211
|
}
|
|
@@ -161,7 +216,14 @@ export class Driver {
|
|
|
161
216
|
path: `/session/${this.sessionId}/execute/sync`,
|
|
162
217
|
body: { script, args },
|
|
163
218
|
});
|
|
164
|
-
|
|
219
|
+
// `null` is a meaningful script result (notably for `host.shadowRoot` on
|
|
220
|
+
// missing or closed roots). Nullish coalescing would replace it with the
|
|
221
|
+
// whole `{ value: null }` response and make callers think an object was
|
|
222
|
+
// returned, so unwrap by field presence instead.
|
|
223
|
+
const value = res && typeof res === 'object' && 'value' in res
|
|
224
|
+
? res.value
|
|
225
|
+
: res;
|
|
226
|
+
return this.deserializeWireValue(value);
|
|
165
227
|
}
|
|
166
228
|
/**
|
|
167
229
|
* Execute an asynchronous script. The script receives a callback as its
|
|
@@ -175,7 +237,52 @@ export class Driver {
|
|
|
175
237
|
path: `/session/${this.sessionId}/execute/async`,
|
|
176
238
|
body: { script, args },
|
|
177
239
|
});
|
|
178
|
-
|
|
240
|
+
const value = res && typeof res === 'object' && 'value' in res
|
|
241
|
+
? res.value
|
|
242
|
+
: res;
|
|
243
|
+
return this.deserializeWireValue(value);
|
|
244
|
+
}
|
|
245
|
+
/** W3C Get Element Shadow Root command. Open-only policy is enforced by the query layer. */
|
|
246
|
+
async getElementShadowRoot(element) {
|
|
247
|
+
const client = new HttpClient(this.endpoint);
|
|
248
|
+
const res = await client.send({
|
|
249
|
+
method: 'GET',
|
|
250
|
+
path: `/session/${this.sessionId}/element/${element.getId()}/shadow`,
|
|
251
|
+
});
|
|
252
|
+
const value = res?.value ??
|
|
253
|
+
res;
|
|
254
|
+
const id = value?.[W3C_SHADOW_ROOT_KEY];
|
|
255
|
+
if (!id)
|
|
256
|
+
throw new Error(`getElementShadowRoot failed: ${JSON.stringify(res)}`);
|
|
257
|
+
return this.shadowRootFromId(id);
|
|
258
|
+
}
|
|
259
|
+
async findElementFromShadowRoot(shadowRootId, locator) {
|
|
260
|
+
const client = new HttpClient(this.endpoint);
|
|
261
|
+
const res = await client.send({
|
|
262
|
+
method: 'POST',
|
|
263
|
+
path: `/session/${this.sessionId}/shadow/${shadowRootId}/element`,
|
|
264
|
+
body: { using: locator.using, value: locator.value },
|
|
265
|
+
});
|
|
266
|
+
const value = res?.value ??
|
|
267
|
+
res;
|
|
268
|
+
const id = value?.[W3C_ELEMENT_KEY] ?? value?.[LEGACY_ELEMENT_KEY];
|
|
269
|
+
if (!id)
|
|
270
|
+
throw new Error(`findElementFromShadowRoot failed: ${JSON.stringify(res)}`);
|
|
271
|
+
return this.webElementFromId(id);
|
|
272
|
+
}
|
|
273
|
+
async findElementsFromShadowRoot(shadowRootId, locator) {
|
|
274
|
+
const client = new HttpClient(this.endpoint);
|
|
275
|
+
const res = await client.send({
|
|
276
|
+
method: 'POST',
|
|
277
|
+
path: `/session/${this.sessionId}/shadow/${shadowRootId}/elements`,
|
|
278
|
+
body: { using: locator.using, value: locator.value },
|
|
279
|
+
});
|
|
280
|
+
const value = res?.value ??
|
|
281
|
+
res;
|
|
282
|
+
return (value ?? [])
|
|
283
|
+
.map((item) => item?.[W3C_ELEMENT_KEY] ?? item?.[LEGACY_ELEMENT_KEY])
|
|
284
|
+
.filter((id) => typeof id === 'string')
|
|
285
|
+
.map((id) => this.webElementFromId(id));
|
|
179
286
|
}
|
|
180
287
|
/** Configure the script (and async-script) timeout in milliseconds. */
|
|
181
288
|
async setScriptTimeout(ms) {
|