@pyrokine/mcp-chrome 2.3.2 → 2.4.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.
- package/README.md +40 -13
- package/README_zh.md +30 -11
- package/dist/anti-detection/behavior.d.ts.map +1 -1
- package/dist/anti-detection/behavior.js.map +1 -1
- package/dist/anti-detection/injection.js.map +1 -1
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/launcher.d.ts.map +1 -1
- package/dist/cdp/launcher.js.map +1 -1
- package/dist/core/auto-wait.d.ts.map +1 -1
- package/dist/core/auto-wait.js.map +1 -1
- package/dist/core/browser-driver.d.ts +6 -1
- package/dist/core/browser-driver.d.ts.map +1 -1
- package/dist/core/browser-driver.js.map +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/extension-errors.d.ts.map +1 -1
- package/dist/core/locator.d.ts.map +1 -1
- package/dist/core/locator.js.map +1 -1
- package/dist/core/retry.js.map +1 -1
- package/dist/core/session.d.ts +2 -2
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +1 -1
- package/dist/core/session.js.map +1 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/unified-session.d.ts +17 -2
- package/dist/core/unified-session.d.ts.map +1 -1
- package/dist/core/unified-session.js +44 -6
- package/dist/core/unified-session.js.map +1 -1
- package/dist/extension/bridge.d.ts +8 -2
- package/dist/extension/bridge.d.ts.map +1 -1
- package/dist/extension/bridge.js +5 -1
- package/dist/extension/bridge.js.map +1 -1
- package/dist/extension/http-server.d.ts +17 -0
- package/dist/extension/http-server.d.ts.map +1 -1
- package/dist/extension/http-server.js +63 -8
- package/dist/extension/http-server.js.map +1 -1
- package/dist/extension/index.d.ts +1 -0
- package/dist/extension/index.d.ts.map +1 -1
- package/dist/extension/index.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/browse.d.ts.map +1 -1
- package/dist/tools/browse.js +13 -37
- package/dist/tools/browse.js.map +1 -1
- package/dist/tools/cookies.js.map +1 -1
- package/dist/tools/diagnostics.d.ts +31 -0
- package/dist/tools/diagnostics.d.ts.map +1 -0
- package/dist/tools/diagnostics.js +93 -0
- package/dist/tools/diagnostics.js.map +1 -0
- package/dist/tools/evaluate.d.ts +15 -0
- package/dist/tools/evaluate.d.ts.map +1 -1
- package/dist/tools/evaluate.js +136 -84
- package/dist/tools/evaluate.js.map +1 -1
- package/dist/tools/extract.d.ts.map +1 -1
- package/dist/tools/extract.js +36 -17
- package/dist/tools/extract.js.map +1 -1
- package/dist/tools/input.d.ts +6 -0
- package/dist/tools/input.d.ts.map +1 -1
- package/dist/tools/input.js +394 -248
- package/dist/tools/input.js.map +1 -1
- package/dist/tools/logs.d.ts +17 -0
- package/dist/tools/logs.d.ts.map +1 -1
- package/dist/tools/logs.js +41 -10
- package/dist/tools/logs.js.map +1 -1
- package/dist/tools/network-sanitizer.d.ts +15 -0
- package/dist/tools/network-sanitizer.d.ts.map +1 -0
- package/dist/tools/network-sanitizer.js +61 -0
- package/dist/tools/network-sanitizer.js.map +1 -0
- package/dist/tools/post-condition.d.ts +18 -1
- package/dist/tools/post-condition.d.ts.map +1 -1
- package/dist/tools/post-condition.js +52 -94
- package/dist/tools/post-condition.js.map +1 -1
- package/dist/tools/target-diagnostics.d.ts +31 -0
- package/dist/tools/target-diagnostics.d.ts.map +1 -0
- package/dist/tools/target-diagnostics.js +91 -0
- package/dist/tools/target-diagnostics.js.map +1 -0
- package/dist/tools/wait.d.ts.map +1 -1
- package/dist/tools/wait.js +183 -209
- package/dist/tools/wait.js.map +1 -1
- package/extension/dist/assets/content.ts-Cj_iiU2s.js +25 -0
- package/extension/dist/assets/{index.ts-CJXGbOcp.js → index.ts-GG6dPUPX.js} +569 -347
- package/extension/dist/manifest.json +3 -3
- package/extension/dist/service-worker-loader.js +1 -1
- package/package.json +14 -10
- package/extension/dist/assets/content.ts-pEASbjEL.js +0 -6
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { sanitizeErrorMessage } from '../core/error-sanitizer.js';
|
|
2
3
|
const POST_CONDITION_DEFAULT_TIMEOUT_MS = 3000;
|
|
3
4
|
const POST_CONDITION_MAX_TIMEOUT_MS = 60_000;
|
|
4
5
|
const POST_CONDITION_DEFAULT_INTERVAL_MS = 100;
|
|
@@ -29,138 +30,95 @@ export const postConditionSchema = z
|
|
|
29
30
|
.refine((value) => value.text || value.selector || value.urlIncludes || value.script, {
|
|
30
31
|
message: 'postCondition 至少需要 text、selector、urlIncludes、script 之一',
|
|
31
32
|
});
|
|
32
|
-
class PostConditionError extends Error {
|
|
33
|
-
context;
|
|
34
|
-
code = 'POST_CONDITION_FAILED';
|
|
35
|
-
suggestion = '工具动作已执行,但 postCondition 未满足。请检查页面状态、异步业务流程或放宽 postCondition 条件';
|
|
36
|
-
constructor(context) {
|
|
37
|
-
super('postCondition 未满足,工具动作不能证明业务目标已经达成');
|
|
38
|
-
this.context = context;
|
|
39
|
-
this.name = 'PostConditionError';
|
|
40
|
-
}
|
|
41
|
-
toJSON() {
|
|
42
|
-
return {
|
|
43
|
-
error: {
|
|
44
|
-
code: this.code,
|
|
45
|
-
message: this.message,
|
|
46
|
-
suggestion: this.suggestion,
|
|
47
|
-
context: this.context,
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
33
|
function sleep(ms) {
|
|
53
34
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
54
35
|
}
|
|
55
36
|
function remainingMs(timeout, startedAt) {
|
|
56
37
|
return Math.max(0, timeout - (Date.now() - startedAt));
|
|
57
38
|
}
|
|
58
|
-
function
|
|
59
|
-
|
|
60
|
-
if (remaining <= 0) {
|
|
61
|
-
throw new Error('postCondition 检查超时');
|
|
62
|
-
}
|
|
63
|
-
return Math.max(1, remaining);
|
|
39
|
+
function isUnavailableError(message) {
|
|
40
|
+
return /frame|execution context|debugger|extension.*(?:disconnect|未连接)|not connected|cannot resolve cdp|failed to attach|restricted|cannot access/i.test(message);
|
|
64
41
|
}
|
|
65
|
-
|
|
42
|
+
function boundedError(error) {
|
|
43
|
+
return sanitizeErrorMessage(error instanceof Error ? error.message : String(error)).slice(0, 500);
|
|
44
|
+
}
|
|
45
|
+
async function checkPostCondition(unifiedSession, condition, timeout, mode) {
|
|
66
46
|
const checks = [];
|
|
67
|
-
const
|
|
47
|
+
const startedAt = Date.now();
|
|
48
|
+
const nextTimeout = () => Math.max(1, remainingMs(timeout, startedAt));
|
|
68
49
|
if (condition.text !== undefined) {
|
|
69
50
|
const result = await unifiedSession.evaluate(`(expected, exact) => {
|
|
70
51
|
const body = document.body
|
|
71
|
-
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return Array.from(element.selectedOptions)
|
|
85
|
-
.map((option) => option.value || option.textContent || '')
|
|
86
|
-
.join(' ')
|
|
87
|
-
}
|
|
88
|
-
if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
|
|
89
|
-
return element.value || ''
|
|
90
|
-
}
|
|
91
|
-
return ''
|
|
92
|
-
})
|
|
93
|
-
const bodyText = body.textContent || ''
|
|
94
|
-
if (exact) {
|
|
95
|
-
const matched = bodyText === expected || values.some((value) => value === expected)
|
|
96
|
-
return { matched, ...formatSample([bodyText, ...values].join('\\n')) }
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const walker = document.createTreeWalker(body, NodeFilter.SHOW_TEXT)
|
|
100
|
-
const segments = []
|
|
101
|
-
let node = walker.nextNode()
|
|
102
|
-
while (node) {
|
|
103
|
-
segments.push(node.nodeValue || '')
|
|
104
|
-
node = walker.nextNode()
|
|
105
|
-
}
|
|
106
|
-
segments.push(...values)
|
|
107
|
-
const text = segments.join('\\n')
|
|
108
|
-
return { matched: text.includes(expected), ...formatSample(text) }
|
|
109
|
-
}`, undefined, nextCheckTimeout(remainingTimeout, checkStartedAt), [condition.text, condition.exact === true]);
|
|
110
|
-
checks.push({
|
|
111
|
-
name: 'text',
|
|
112
|
-
matched: result.matched,
|
|
113
|
-
actual: result.actual,
|
|
114
|
-
});
|
|
52
|
+
if (!body) return { matched: false, actual: '' }
|
|
53
|
+
const values = Array.from(body.querySelectorAll('input, textarea, select')).map((element) =>
|
|
54
|
+
element instanceof HTMLSelectElement
|
|
55
|
+
? Array.from(element.selectedOptions).map((option) => option.value || option.textContent || '').join(' ')
|
|
56
|
+
: element instanceof HTMLInputElement && element.type === 'password'
|
|
57
|
+
? ''
|
|
58
|
+
: element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement
|
|
59
|
+
? element.value || ''
|
|
60
|
+
: '')
|
|
61
|
+
const text = [body.textContent || '', ...values].join('\\n')
|
|
62
|
+
return { matched: exact ? [body.textContent || '', ...values].some((value) => value === expected) : text.includes(expected), actual: text.slice(0, 500) }
|
|
63
|
+
}`, mode, nextTimeout(), [condition.text, condition.exact === true]);
|
|
64
|
+
checks.push({ name: 'text', matched: result.matched, actual: result.actual });
|
|
115
65
|
}
|
|
116
66
|
if (condition.selector !== undefined) {
|
|
117
|
-
const count = await unifiedSession.evaluate('(selector) => document.querySelectorAll(selector).length',
|
|
67
|
+
const count = await unifiedSession.evaluate('(selector) => document.querySelectorAll(selector).length', mode, nextTimeout(), [condition.selector]);
|
|
118
68
|
checks.push({ name: 'selector', matched: count > 0, actual: { count } });
|
|
119
69
|
}
|
|
120
70
|
if (condition.urlIncludes !== undefined) {
|
|
121
|
-
const url = await unifiedSession.evaluate('location.href',
|
|
122
|
-
checks.push({ name: 'urlIncludes', matched: url.includes(condition.urlIncludes), actual: url });
|
|
71
|
+
const url = await unifiedSession.evaluate('location.href', mode, nextTimeout());
|
|
72
|
+
checks.push({ name: 'urlIncludes', matched: url.includes(condition.urlIncludes), actual: url.slice(0, 500) });
|
|
123
73
|
}
|
|
124
74
|
if (condition.script !== undefined) {
|
|
125
|
-
const value = await unifiedSession.evaluate(condition.script,
|
|
75
|
+
const value = await unifiedSession.evaluate(condition.script, mode, nextTimeout());
|
|
126
76
|
checks.push({ name: 'script', matched: Boolean(value), actual: value });
|
|
127
77
|
}
|
|
128
78
|
return checks;
|
|
129
79
|
}
|
|
130
|
-
export async function waitForPostCondition(unifiedSession, condition, operation) {
|
|
80
|
+
export async function waitForPostCondition(unifiedSession, condition, operation, mode) {
|
|
131
81
|
const timeout = condition.timeout ?? POST_CONDITION_DEFAULT_TIMEOUT_MS;
|
|
132
82
|
const interval = condition.interval ?? POST_CONDITION_DEFAULT_INTERVAL_MS;
|
|
133
83
|
const startedAt = Date.now();
|
|
134
|
-
let
|
|
135
|
-
let lastError;
|
|
84
|
+
let checks = [];
|
|
136
85
|
while (remainingMs(timeout, startedAt) > 0) {
|
|
137
86
|
try {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
lastError = undefined;
|
|
141
|
-
if (lastChecks.every((check) => check.matched)) {
|
|
87
|
+
checks = await checkPostCondition(unifiedSession, condition, Math.max(1, remainingMs(timeout, startedAt)), mode);
|
|
88
|
+
if (checks.every((check) => check.matched)) {
|
|
142
89
|
return {
|
|
143
90
|
matched: true,
|
|
91
|
+
verificationStatus: 'matched',
|
|
144
92
|
operation,
|
|
145
93
|
elapsedMs: Date.now() - startedAt,
|
|
146
|
-
checks
|
|
94
|
+
checks,
|
|
95
|
+
retryable: false,
|
|
147
96
|
};
|
|
148
97
|
}
|
|
149
98
|
}
|
|
150
99
|
catch (error) {
|
|
151
|
-
|
|
100
|
+
const message = boundedError(error);
|
|
101
|
+
return {
|
|
102
|
+
matched: false,
|
|
103
|
+
verificationStatus: isUnavailableError(message) ? 'unavailable' : 'error',
|
|
104
|
+
operation,
|
|
105
|
+
elapsedMs: Date.now() - startedAt,
|
|
106
|
+
checks,
|
|
107
|
+
retryable: isUnavailableError(message),
|
|
108
|
+
error: message,
|
|
109
|
+
};
|
|
152
110
|
}
|
|
153
111
|
const waitMs = Math.min(interval, remainingMs(timeout, startedAt));
|
|
154
|
-
if (waitMs
|
|
155
|
-
|
|
156
|
-
}
|
|
157
|
-
await sleep(waitMs);
|
|
112
|
+
if (waitMs > 0)
|
|
113
|
+
await sleep(waitMs);
|
|
158
114
|
}
|
|
159
|
-
|
|
115
|
+
return {
|
|
116
|
+
matched: false,
|
|
117
|
+
verificationStatus: 'not_matched',
|
|
160
118
|
operation,
|
|
161
|
-
|
|
162
|
-
checks
|
|
163
|
-
|
|
164
|
-
}
|
|
119
|
+
elapsedMs: Date.now() - startedAt,
|
|
120
|
+
checks,
|
|
121
|
+
retryable: true,
|
|
122
|
+
};
|
|
165
123
|
}
|
|
166
124
|
//# sourceMappingURL=post-condition.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-condition.js","sourceRoot":"","sources":["../../src/tools/post-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"post-condition.js","sourceRoot":"","sources":["../../src/tools/post-condition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getUnifiedSession } from '../core/index.js';
|
|
2
|
+
import type { Target } from '../core/types.js';
|
|
3
|
+
export interface TargetCandidate {
|
|
4
|
+
tag?: string;
|
|
5
|
+
text?: string;
|
|
6
|
+
rect?: {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
};
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
export declare class TargetTimeoutError extends Error {
|
|
15
|
+
readonly context: Record<string, unknown>;
|
|
16
|
+
readonly code = "TARGET_TIMEOUT";
|
|
17
|
+
readonly suggestion = "\u8BF7\u68C0\u67E5 locator\u3001frame \u548C nth\uFF0C\u6216\u6839\u636E\u5019\u9009\u6458\u8981\u8C03\u6574\u76EE\u6807\uFF1B\u8FDE\u63A5\u4E0D\u53EF\u7528\u65F6\u5148\u6062\u590D Extension";
|
|
18
|
+
constructor(context: Record<string, unknown>);
|
|
19
|
+
toJSON(): object;
|
|
20
|
+
}
|
|
21
|
+
export declare function summarizeTargetCandidates(candidates: TargetCandidate[]): Array<Record<string, unknown>>;
|
|
22
|
+
export declare function buildTargetDiagnostics(unifiedSession: ReturnType<typeof getUnifiedSession>, target: Target, options: {
|
|
23
|
+
nth: number;
|
|
24
|
+
timeout?: number;
|
|
25
|
+
frame?: string | number;
|
|
26
|
+
matchCount: number;
|
|
27
|
+
lastState: string;
|
|
28
|
+
lastError?: unknown;
|
|
29
|
+
candidates?: TargetCandidate[];
|
|
30
|
+
}): Promise<Record<string, unknown>>;
|
|
31
|
+
//# sourceMappingURL=target-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target-diagnostics.d.ts","sourceRoot":"","sources":["../../src/tools/target-diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAO9C,MAAM,WAAW,eAAe;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9D,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACzB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAI7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAHrD,QAAQ,CAAC,IAAI,oBAAmB;IAChC,QAAQ,CAAC,UAAU,oMAA4D;IAE/E,YAAqB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAGpD;IAED,MAAM,IAAI,MAAM,CAEf;CACJ;AAeD,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMvG;AAmCD,wBAAsB,sBAAsB,CACxC,cAAc,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,EACpD,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IACL,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;CACjC,GACF,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA8BlC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { sanitizeErrorMessage } from '../core/error-sanitizer.js';
|
|
2
|
+
const MAX_CANDIDATES = 10;
|
|
3
|
+
const MAX_LOCATOR_TEXT = 500;
|
|
4
|
+
const MAX_CANDIDATE_TEXT = 160;
|
|
5
|
+
const MAX_DIAGNOSTIC_TIMEOUT_MS = 1000;
|
|
6
|
+
export class TargetTimeoutError extends Error {
|
|
7
|
+
context;
|
|
8
|
+
code = 'TARGET_TIMEOUT';
|
|
9
|
+
suggestion = '请检查 locator、frame 和 nth,或根据候选摘要调整目标;连接不可用时先恢复 Extension';
|
|
10
|
+
constructor(context) {
|
|
11
|
+
super(`等待目标元素超时 (${context.timeout}ms)`);
|
|
12
|
+
this.context = context;
|
|
13
|
+
this.name = 'TargetTimeoutError';
|
|
14
|
+
}
|
|
15
|
+
toJSON() {
|
|
16
|
+
return { error: { code: this.code, message: this.message, suggestion: this.suggestion, context: this.context } };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function targetType(target) {
|
|
20
|
+
return Object.keys(target).find((key) => key !== 'nth') ?? 'unknown';
|
|
21
|
+
}
|
|
22
|
+
function boundedTarget(target) {
|
|
23
|
+
return Object.fromEntries(Object.entries(target).map(([key, value]) => [
|
|
24
|
+
key,
|
|
25
|
+
typeof value === 'string' ? value.slice(0, MAX_LOCATOR_TEXT) : value,
|
|
26
|
+
]));
|
|
27
|
+
}
|
|
28
|
+
export function summarizeTargetCandidates(candidates) {
|
|
29
|
+
return candidates.slice(0, MAX_CANDIDATES).map((candidate) => ({
|
|
30
|
+
...(typeof candidate.tag === 'string' ? { tag: candidate.tag.slice(0, 40) } : {}),
|
|
31
|
+
...(typeof candidate.text === 'string' ? { text: candidate.text.slice(0, MAX_CANDIDATE_TEXT) } : {}),
|
|
32
|
+
...(candidate.rect ? { rect: candidate.rect } : {}),
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
async function collectPageCandidates(unifiedSession, timeout) {
|
|
36
|
+
try {
|
|
37
|
+
const candidates = await unifiedSession.evaluate(`(() => Array.from(document.querySelectorAll('input, textarea, select, button, a, [role], [contenteditable="true"]'))
|
|
38
|
+
.slice(0, ${MAX_CANDIDATES})
|
|
39
|
+
.map((el) => {
|
|
40
|
+
const rect = el.getBoundingClientRect();
|
|
41
|
+
return {
|
|
42
|
+
tag: el.tagName.toLowerCase(),
|
|
43
|
+
id: el.id || undefined,
|
|
44
|
+
role: el.getAttribute('role') || undefined,
|
|
45
|
+
label: (el.getAttribute('aria-label') || el.getAttribute('placeholder') || '').slice(0, 80),
|
|
46
|
+
text: (el.textContent || '').replace(/\\s+/g, ' ').trim().slice(0, ${MAX_CANDIDATE_TEXT}),
|
|
47
|
+
visible: rect.width > 0 && rect.height > 0,
|
|
48
|
+
disabled: Boolean(el.disabled) || el.getAttribute('aria-disabled') === 'true',
|
|
49
|
+
bounds: {x: rect.x, y: rect.y, width: rect.width, height: rect.height}
|
|
50
|
+
};
|
|
51
|
+
}))()`, undefined, Math.min(Math.max(timeout ?? MAX_DIAGNOSTIC_TIMEOUT_MS, 1), MAX_DIAGNOSTIC_TIMEOUT_MS));
|
|
52
|
+
return { candidates };
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
return {
|
|
56
|
+
candidates: [],
|
|
57
|
+
diagnosticError: sanitizeErrorMessage(error).slice(0, 500),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export async function buildTargetDiagnostics(unifiedSession, target, options) {
|
|
62
|
+
let state;
|
|
63
|
+
try {
|
|
64
|
+
state = await unifiedSession.getLiveState();
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
state = null;
|
|
68
|
+
}
|
|
69
|
+
const knownCandidates = options.candidates ? summarizeTargetCandidates(options.candidates) : [];
|
|
70
|
+
const pageCandidates = knownCandidates.length > 0
|
|
71
|
+
? { candidates: knownCandidates }
|
|
72
|
+
: await collectPageCandidates(unifiedSession, options.timeout);
|
|
73
|
+
return {
|
|
74
|
+
locator: boundedTarget(target),
|
|
75
|
+
targetType: targetType(target),
|
|
76
|
+
nth: options.nth,
|
|
77
|
+
currentUrl: state?.url?.slice(0, 500),
|
|
78
|
+
tabId: unifiedSession.getCurrentTargetId(),
|
|
79
|
+
managed: state?.managed ?? false,
|
|
80
|
+
frame: options.frame,
|
|
81
|
+
matchCount: options.matchCount,
|
|
82
|
+
candidates: pageCandidates.candidates,
|
|
83
|
+
lastLocatorState: options.lastState,
|
|
84
|
+
timeout: options.timeout,
|
|
85
|
+
mode: unifiedSession.getMode(),
|
|
86
|
+
connection: unifiedSession.isExtensionConnected() ? 'connected' : 'unavailable',
|
|
87
|
+
...(options.lastError ? { lastError: sanitizeErrorMessage(options.lastError).slice(0, 500) } : {}),
|
|
88
|
+
...(pageCandidates.diagnosticError ? { diagnosticError: pageCandidates.diagnosticError } : {}),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=target-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target-diagnostics.js","sourceRoot":"","sources":["../../src/tools/target-diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAIjE,MAAM,cAAc,GAAG,EAAE,CAAA;AACzB,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAC5B,MAAM,kBAAkB,GAAG,GAAG,CAAA;AAC9B,MAAM,yBAAyB,GAAG,IAAI,CAAA;AAStC,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAIpB,OAAO;IAHnB,IAAI,GAAG,gBAAgB,CAAA;IACvB,UAAU,GAAG,yDAAyD,CAAA;IAE/E,YAAqB,OAAgC;QACjD,KAAK,CAAC,aAAa,OAAO,CAAC,OAAO,KAAK,CAAC,CAAA;uBADvB,OAAO;QAExB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IACpC,CAAC;IAED,MAAM;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAA;IACpH,CAAC;CACJ;AAED,SAAS,UAAU,CAAC,MAAc;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC,IAAI,SAAS,CAAA;AACxE,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACjC,OAAO,MAAM,CAAC,WAAW,CACrB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QACzC,GAAG;QACH,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK;KACvE,CAAC,CACL,CAAA;AACL,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAA6B;IACnE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,OAAO,SAAS,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,GAAG,CAAC,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC,CAAC,CAAA;AACP,CAAC;AAED,KAAK,UAAU,qBAAqB,CAChC,cAAoD,EACpD,OAA2B;IAE3B,IAAI,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,QAAQ,CAC5C;4BACgB,cAAc;;;;;;;;6FAQmD,kBAAkB;;;;;sBAKzF,EACV,SAAS,EACT,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,yBAAyB,EAAE,CAAC,CAAC,EAAE,yBAAyB,CAAC,CACzF,CAAA;QACD,OAAO,EAAE,UAAU,EAAE,CAAA;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO;YACH,UAAU,EAAE,EAAE;YACd,eAAe,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SAC7D,CAAA;IACL,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CACxC,cAAoD,EACpD,MAAc,EACd,OAQC;IAED,IAAI,KAA8D,CAAA;IAClE,IAAI,CAAC;QACD,KAAK,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,CAAA;IAC/C,CAAC;IAAC,MAAM,CAAC;QACL,KAAK,GAAG,IAAI,CAAA;IAChB,CAAC;IACD,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/F,MAAM,cAAc,GAChB,eAAe,CAAC,MAAM,GAAG,CAAC;QACtB,CAAC,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE;QACjC,CAAC,CAAC,MAAM,qBAAqB,CAAC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAEtE,OAAO;QACH,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC;QAC9B,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC;QAC9B,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QACrC,KAAK,EAAE,cAAc,CAAC,kBAAkB,EAAE;QAC1C,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,UAAU,EAAE,cAAc,CAAC,UAAU;QACrC,gBAAgB,EAAE,OAAO,CAAC,SAAS;QACnC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE;QAC9B,UAAU,EAAE,cAAc,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa;QAC/E,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,oBAAoB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,GAAG,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjG,CAAA;AACL,CAAC"}
|
package/dist/tools/wait.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../src/tools/wait.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;
|
|
1
|
+
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../src/tools/wait.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AA4lBxE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CASxD"}
|