@donggui/web 1.5.5-donggui.3
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 +9 -0
- package/bin/midscene-playground +3 -0
- package/bin/midscene-web +2 -0
- package/dist/es/bin.mjs +23 -0
- package/dist/es/bin.mjs.map +1 -0
- package/dist/es/bridge-mode/agent-cli-side.mjs +137 -0
- package/dist/es/bridge-mode/agent-cli-side.mjs.map +1 -0
- package/dist/es/bridge-mode/browser.mjs +2 -0
- package/dist/es/bridge-mode/common.mjs +43 -0
- package/dist/es/bridge-mode/common.mjs.map +1 -0
- package/dist/es/bridge-mode/index.mjs +4 -0
- package/dist/es/bridge-mode/io-client.mjs +101 -0
- package/dist/es/bridge-mode/io-client.mjs.map +1 -0
- package/dist/es/bridge-mode/io-server.mjs +210 -0
- package/dist/es/bridge-mode/io-server.mjs.map +1 -0
- package/dist/es/bridge-mode/page-browser-side.mjs +118 -0
- package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -0
- package/dist/es/chrome-extension/agent.mjs +9 -0
- package/dist/es/chrome-extension/agent.mjs.map +1 -0
- package/dist/es/chrome-extension/cdpInput.mjs +174 -0
- package/dist/es/chrome-extension/cdpInput.mjs.LICENSE.txt +5 -0
- package/dist/es/chrome-extension/cdpInput.mjs.map +1 -0
- package/dist/es/chrome-extension/dynamic-scripts.mjs +38 -0
- package/dist/es/chrome-extension/dynamic-scripts.mjs.map +1 -0
- package/dist/es/chrome-extension/index.mjs +5 -0
- package/dist/es/chrome-extension/page.mjs +651 -0
- package/dist/es/chrome-extension/page.mjs.map +1 -0
- package/dist/es/cli.mjs +16 -0
- package/dist/es/cli.mjs.map +1 -0
- package/dist/es/common/cache-helper.mjs +28 -0
- package/dist/es/common/cache-helper.mjs.map +1 -0
- package/dist/es/index.mjs +6 -0
- package/dist/es/mcp-server.mjs +35 -0
- package/dist/es/mcp-server.mjs.map +1 -0
- package/dist/es/mcp-tools-puppeteer.mjs +215 -0
- package/dist/es/mcp-tools-puppeteer.mjs.map +1 -0
- package/dist/es/mcp-tools.mjs +78 -0
- package/dist/es/mcp-tools.mjs.map +1 -0
- package/dist/es/playwright/ai-fixture.mjs +367 -0
- package/dist/es/playwright/ai-fixture.mjs.map +1 -0
- package/dist/es/playwright/index.mjs +40 -0
- package/dist/es/playwright/index.mjs.map +1 -0
- package/dist/es/playwright/page.mjs +44 -0
- package/dist/es/playwright/page.mjs.map +1 -0
- package/dist/es/playwright/reporter/index.mjs +216 -0
- package/dist/es/playwright/reporter/index.mjs.map +1 -0
- package/dist/es/puppeteer/agent-launcher.mjs +185 -0
- package/dist/es/puppeteer/agent-launcher.mjs.map +1 -0
- package/dist/es/puppeteer/base-page.mjs +564 -0
- package/dist/es/puppeteer/base-page.mjs.map +1 -0
- package/dist/es/puppeteer/index.mjs +34 -0
- package/dist/es/puppeteer/index.mjs.map +1 -0
- package/dist/es/puppeteer/page.mjs +9 -0
- package/dist/es/puppeteer/page.mjs.map +1 -0
- package/dist/es/static/index.mjs +3 -0
- package/dist/es/static/static-agent.mjs +12 -0
- package/dist/es/static/static-agent.mjs.map +1 -0
- package/dist/es/static/static-page.mjs +122 -0
- package/dist/es/static/static-page.mjs.map +1 -0
- package/dist/es/utils.mjs +8 -0
- package/dist/es/utils.mjs.map +1 -0
- package/dist/es/web-element.mjs +59 -0
- package/dist/es/web-element.mjs.map +1 -0
- package/dist/es/web-page.mjs +260 -0
- package/dist/es/web-page.mjs.map +1 -0
- package/dist/lib/bin.js +29 -0
- package/dist/lib/bin.js.map +1 -0
- package/dist/lib/bridge-mode/agent-cli-side.js +174 -0
- package/dist/lib/bridge-mode/agent-cli-side.js.map +1 -0
- package/dist/lib/bridge-mode/browser.js +38 -0
- package/dist/lib/bridge-mode/browser.js.map +1 -0
- package/dist/lib/bridge-mode/common.js +107 -0
- package/dist/lib/bridge-mode/common.js.map +1 -0
- package/dist/lib/bridge-mode/index.js +46 -0
- package/dist/lib/bridge-mode/index.js.map +1 -0
- package/dist/lib/bridge-mode/io-client.js +135 -0
- package/dist/lib/bridge-mode/io-client.js.map +1 -0
- package/dist/lib/bridge-mode/io-server.js +247 -0
- package/dist/lib/bridge-mode/io-server.js.map +1 -0
- package/dist/lib/bridge-mode/page-browser-side.js +162 -0
- package/dist/lib/bridge-mode/page-browser-side.js.map +1 -0
- package/dist/lib/chrome-extension/agent.js +43 -0
- package/dist/lib/chrome-extension/agent.js.map +1 -0
- package/dist/lib/chrome-extension/cdpInput.js +208 -0
- package/dist/lib/chrome-extension/cdpInput.js.LICENSE.txt +5 -0
- package/dist/lib/chrome-extension/cdpInput.js.map +1 -0
- package/dist/lib/chrome-extension/dynamic-scripts.js +88 -0
- package/dist/lib/chrome-extension/dynamic-scripts.js.map +1 -0
- package/dist/lib/chrome-extension/index.js +60 -0
- package/dist/lib/chrome-extension/index.js.map +1 -0
- package/dist/lib/chrome-extension/page.js +685 -0
- package/dist/lib/chrome-extension/page.js.map +1 -0
- package/dist/lib/cli.js +22 -0
- package/dist/lib/cli.js.map +1 -0
- package/dist/lib/common/cache-helper.js +68 -0
- package/dist/lib/common/cache-helper.js.map +1 -0
- package/dist/lib/index.js +60 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/mcp-server.js +75 -0
- package/dist/lib/mcp-server.js.map +1 -0
- package/dist/lib/mcp-tools-puppeteer.js +259 -0
- package/dist/lib/mcp-tools-puppeteer.js.map +1 -0
- package/dist/lib/mcp-tools.js +112 -0
- package/dist/lib/mcp-tools.js.map +1 -0
- package/dist/lib/playwright/ai-fixture.js +404 -0
- package/dist/lib/playwright/ai-fixture.js.map +1 -0
- package/dist/lib/playwright/index.js +93 -0
- package/dist/lib/playwright/index.js.map +1 -0
- package/dist/lib/playwright/page.js +78 -0
- package/dist/lib/playwright/page.js.map +1 -0
- package/dist/lib/playwright/reporter/index.js +250 -0
- package/dist/lib/playwright/reporter/index.js.map +1 -0
- package/dist/lib/puppeteer/agent-launcher.js +253 -0
- package/dist/lib/puppeteer/agent-launcher.js.map +1 -0
- package/dist/lib/puppeteer/base-page.js +607 -0
- package/dist/lib/puppeteer/base-page.js.map +1 -0
- package/dist/lib/puppeteer/index.js +84 -0
- package/dist/lib/puppeteer/index.js.map +1 -0
- package/dist/lib/puppeteer/page.js +43 -0
- package/dist/lib/puppeteer/page.js.map +1 -0
- package/dist/lib/static/index.js +52 -0
- package/dist/lib/static/index.js.map +1 -0
- package/dist/lib/static/static-agent.js +46 -0
- package/dist/lib/static/static-agent.js.map +1 -0
- package/dist/lib/static/static-page.js +156 -0
- package/dist/lib/static/static-page.js.map +1 -0
- package/dist/lib/utils.js +40 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/web-element.js +96 -0
- package/dist/lib/web-element.js.map +1 -0
- package/dist/lib/web-page.js +310 -0
- package/dist/lib/web-page.js.map +1 -0
- package/dist/types/bin.d.ts +1 -0
- package/dist/types/bridge-mode/agent-cli-side.d.ts +49 -0
- package/dist/types/bridge-mode/browser.d.ts +2 -0
- package/dist/types/bridge-mode/common.d.ts +74 -0
- package/dist/types/bridge-mode/index.d.ts +4 -0
- package/dist/types/bridge-mode/io-client.d.ts +10 -0
- package/dist/types/bridge-mode/io-server.d.ts +27 -0
- package/dist/types/bridge-mode/page-browser-side.d.ts +21 -0
- package/dist/types/chrome-extension/agent.d.ts +5 -0
- package/dist/types/chrome-extension/cdpInput.d.ts +52 -0
- package/dist/types/chrome-extension/dynamic-scripts.d.ts +3 -0
- package/dist/types/chrome-extension/index.d.ts +5 -0
- package/dist/types/chrome-extension/page.d.ts +110 -0
- package/dist/types/cli.d.ts +1 -0
- package/dist/types/common/cache-helper.d.ts +20 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/mcp-server.d.ts +26 -0
- package/dist/types/mcp-tools-puppeteer.d.ts +13 -0
- package/dist/types/mcp-tools.d.ts +12 -0
- package/dist/types/playwright/ai-fixture.d.ts +131 -0
- package/dist/types/playwright/index.d.ts +13 -0
- package/dist/types/playwright/page.d.ts +11 -0
- package/dist/types/playwright/reporter/index.d.ts +42 -0
- package/dist/types/puppeteer/agent-launcher.d.ts +61 -0
- package/dist/types/puppeteer/base-page.d.ts +106 -0
- package/dist/types/puppeteer/index.d.ts +10 -0
- package/dist/types/puppeteer/page.d.ts +6 -0
- package/dist/types/static/index.d.ts +2 -0
- package/dist/types/static/static-agent.d.ts +5 -0
- package/dist/types/static/static-page.d.ts +42 -0
- package/dist/types/utils.d.ts +6 -0
- package/dist/types/web-element.d.ts +48 -0
- package/dist/types/web-page.d.ts +62 -0
- package/package.json +166 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type BridgeCall } from './common';
|
|
2
|
+
export declare const killRunningServer: (port?: number, host?: string) => Promise<void>;
|
|
3
|
+
export declare class BridgeServer {
|
|
4
|
+
host: string;
|
|
5
|
+
port: number;
|
|
6
|
+
onConnect?: (() => void) | undefined;
|
|
7
|
+
onDisconnect?: ((reason: string) => void) | undefined;
|
|
8
|
+
closeConflictServer?: boolean | undefined;
|
|
9
|
+
private callId;
|
|
10
|
+
private io;
|
|
11
|
+
private socket;
|
|
12
|
+
private listeningTimeoutId;
|
|
13
|
+
private listeningTimerFlag;
|
|
14
|
+
private connectionTipTimer;
|
|
15
|
+
calls: Record<string, BridgeCall>;
|
|
16
|
+
private connectionLost;
|
|
17
|
+
private connectionLostReason;
|
|
18
|
+
constructor(host: string, port: number, onConnect?: (() => void) | undefined, onDisconnect?: ((reason: string) => void) | undefined, closeConflictServer?: boolean | undefined);
|
|
19
|
+
listen(opts?: {
|
|
20
|
+
timeout?: number | false;
|
|
21
|
+
}): Promise<void>;
|
|
22
|
+
private connectionLostErrorMsg;
|
|
23
|
+
private triggerCallResponseCallback;
|
|
24
|
+
private emitCall;
|
|
25
|
+
call<T = any>(method: string, args: any[], timeout?: number): Promise<T>;
|
|
26
|
+
close(): Promise<void | undefined>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import ChromeExtensionProxyPage from '../chrome-extension/page';
|
|
2
|
+
import type { ChromePageDestroyOptions } from '../web-page';
|
|
3
|
+
import { type BridgeConnectTabOptions } from './common';
|
|
4
|
+
import { BridgeClient } from './io-client';
|
|
5
|
+
export declare class ExtensionBridgePageBrowserSide extends ChromeExtensionProxyPage {
|
|
6
|
+
serverEndpoint?: string | undefined;
|
|
7
|
+
onDisconnect: () => void;
|
|
8
|
+
onLogMessage: (message: string, type: 'log' | 'status') => void;
|
|
9
|
+
onConnectionRequest?: (() => Promise<boolean>) | undefined;
|
|
10
|
+
bridgeClient: BridgeClient | null;
|
|
11
|
+
private destroyOptions?;
|
|
12
|
+
private newlyCreatedTabIds;
|
|
13
|
+
private confirmationPromise;
|
|
14
|
+
constructor(serverEndpoint?: string | undefined, onDisconnect?: () => void, onLogMessage?: (message: string, type: 'log' | 'status') => void, forceSameTabNavigation?: boolean, onConnectionRequest?: (() => Promise<boolean>) | undefined);
|
|
15
|
+
private setupBridgeClient;
|
|
16
|
+
connect(): Promise<void>;
|
|
17
|
+
connectNewTabWithUrl(url: string, options?: BridgeConnectTabOptions): Promise<void>;
|
|
18
|
+
connectCurrentTab(options?: BridgeConnectTabOptions): Promise<void>;
|
|
19
|
+
setDestroyOptions(options: ChromePageDestroyOptions): Promise<void>;
|
|
20
|
+
destroy(): Promise<void>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2017 Google Inc.
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { type KeyInput } from '@midscene/shared/us-keyboard-layout';
|
|
7
|
+
/**
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
export interface KeyDownOptions {
|
|
11
|
+
/**
|
|
12
|
+
* @deprecated Do not use. This is automatically handled.
|
|
13
|
+
*/
|
|
14
|
+
text?: string;
|
|
15
|
+
/**
|
|
16
|
+
* @deprecated Do not use. This is automatically handled.
|
|
17
|
+
*/
|
|
18
|
+
commands?: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
23
|
+
export interface KeyboardTypeOptions {
|
|
24
|
+
/**
|
|
25
|
+
* Time to wait between key presses in milliseconds
|
|
26
|
+
* @default undefined
|
|
27
|
+
*/
|
|
28
|
+
delay?: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
export type KeyPressOptions = KeyDownOptions & KeyboardTypeOptions;
|
|
34
|
+
type InternalCDPSession = {
|
|
35
|
+
send: (command: string, params: any) => Promise<void>;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
export declare class CdpKeyboard {
|
|
41
|
+
#private;
|
|
42
|
+
_modifiers: number;
|
|
43
|
+
constructor(client: InternalCDPSession);
|
|
44
|
+
updateClient(client: InternalCDPSession): void;
|
|
45
|
+
down(key: KeyInput, options?: Readonly<KeyDownOptions>): Promise<void>;
|
|
46
|
+
up(key: KeyInput): Promise<void>;
|
|
47
|
+
sendCharacter(char: string): Promise<void>;
|
|
48
|
+
private charIsKey;
|
|
49
|
+
type(text: string, options?: Readonly<KeyboardTypeOptions>): Promise<void>;
|
|
50
|
+
press(key: KeyInput | KeyInput[], options?: Readonly<KeyPressOptions>): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED } from '@midscene/shared/common';
|
|
2
|
+
import { ChromeExtensionProxyPageAgent } from './agent';
|
|
3
|
+
import ChromeExtensionProxyPage from './page';
|
|
4
|
+
export { overrideAIConfig } from '@midscene/shared/env';
|
|
5
|
+
export { ChromeExtensionProxyPage, ChromeExtensionProxyPageAgent, ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED, };
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type { ElementCacheFeature, ElementTreeNode, Point, Rect, Size } from '@midscene/core';
|
|
2
|
+
import type { AbstractInterface, DeviceAction } from '@midscene/core/device';
|
|
3
|
+
import type { ElementInfo } from '@midscene/shared/extractor';
|
|
4
|
+
import { type CacheFeatureOptions } from '../common/cache-helper';
|
|
5
|
+
import { type KeyInput, type MouseButton } from '../web-page';
|
|
6
|
+
export default class ChromeExtensionProxyPage implements AbstractInterface {
|
|
7
|
+
interfaceType: string;
|
|
8
|
+
forceSameTabNavigation: boolean;
|
|
9
|
+
private viewportSize?;
|
|
10
|
+
private activeTabId;
|
|
11
|
+
private destroyed;
|
|
12
|
+
private isMobileEmulation;
|
|
13
|
+
_continueWhenFailedToAttachDebugger: boolean;
|
|
14
|
+
constructor(forceSameTabNavigation: boolean);
|
|
15
|
+
actionSpace(): DeviceAction[];
|
|
16
|
+
setActiveTabId(tabId: number): Promise<void>;
|
|
17
|
+
getActiveTabId(): Promise<number | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Get a list of current tabs
|
|
20
|
+
* @returns {Promise<Array<{id: number, title: string, url: string}>>}
|
|
21
|
+
*/
|
|
22
|
+
getBrowserTabList(): Promise<{
|
|
23
|
+
id: string;
|
|
24
|
+
title: string;
|
|
25
|
+
url: string;
|
|
26
|
+
currentActiveTab: boolean;
|
|
27
|
+
}[]>;
|
|
28
|
+
getTabIdOrConnectToCurrentTab(): Promise<number>;
|
|
29
|
+
/**
|
|
30
|
+
* Ensure debugger is attached to the current tab.
|
|
31
|
+
* Uses lazy attach pattern - only attaches when needed.
|
|
32
|
+
*/
|
|
33
|
+
private ensureDebuggerAttached;
|
|
34
|
+
private showMousePointer;
|
|
35
|
+
private hideMousePointer;
|
|
36
|
+
/**
|
|
37
|
+
* Public method to detach debugger without destroying the page instance.
|
|
38
|
+
* Useful for error recovery scenarios where we want to remove the debugger banner
|
|
39
|
+
* without completely destroying the page.
|
|
40
|
+
*/
|
|
41
|
+
detachDebugger(tabId?: number): Promise<void>;
|
|
42
|
+
private enableWaterFlowAnimation;
|
|
43
|
+
private disableWaterFlowAnimation;
|
|
44
|
+
/**
|
|
45
|
+
* Send a command to the debugger with automatic attach and retry on detachment.
|
|
46
|
+
* Uses lazy attach pattern - will automatically attach if not already attached.
|
|
47
|
+
*/
|
|
48
|
+
private sendCommandToDebugger;
|
|
49
|
+
private getPageContentByCDP;
|
|
50
|
+
evaluateJavaScript(script: string): Promise<any>;
|
|
51
|
+
beforeInvokeAction(): Promise<void>;
|
|
52
|
+
private waitUntilNetworkIdle;
|
|
53
|
+
getElementsInfo(): Promise<ElementInfo[]>;
|
|
54
|
+
getXpathsByPoint(point: Point, isOrderSensitive?: boolean): Promise<any>;
|
|
55
|
+
getElementInfoByXpath(xpath: string): Promise<any>;
|
|
56
|
+
cacheFeatureForPoint(center: [number, number], options?: CacheFeatureOptions): Promise<ElementCacheFeature>;
|
|
57
|
+
rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect>;
|
|
58
|
+
getElementsNodeTree(): Promise<ElementTreeNode<ElementInfo>>;
|
|
59
|
+
size(): Promise<Size>;
|
|
60
|
+
screenshotBase64(): Promise<string>;
|
|
61
|
+
url(): Promise<string>;
|
|
62
|
+
navigate(url: string): Promise<void>;
|
|
63
|
+
reload(): Promise<void>;
|
|
64
|
+
goBack(): Promise<void>;
|
|
65
|
+
scrollUntilTop(startingPoint?: Point): Promise<void>;
|
|
66
|
+
scrollUntilBottom(startingPoint?: Point): Promise<void>;
|
|
67
|
+
scrollUntilLeft(startingPoint?: Point): Promise<void>;
|
|
68
|
+
scrollUntilRight(startingPoint?: Point): Promise<void>;
|
|
69
|
+
scrollUp(distance?: number, startingPoint?: Point): Promise<void>;
|
|
70
|
+
scrollDown(distance?: number, startingPoint?: Point): Promise<void>;
|
|
71
|
+
scrollLeft(distance?: number, startingPoint?: Point): Promise<void>;
|
|
72
|
+
scrollRight(distance?: number, startingPoint?: Point): Promise<void>;
|
|
73
|
+
clearInput(element: ElementInfo): Promise<void>;
|
|
74
|
+
private latestMouseX;
|
|
75
|
+
private latestMouseY;
|
|
76
|
+
mouse: {
|
|
77
|
+
click: (x: number, y: number, options?: {
|
|
78
|
+
button?: MouseButton;
|
|
79
|
+
count?: number;
|
|
80
|
+
}) => Promise<void>;
|
|
81
|
+
wheel: (deltaX: number, deltaY: number, startX?: number, startY?: number) => Promise<void>;
|
|
82
|
+
move: (x: number, y: number) => Promise<void>;
|
|
83
|
+
drag: (from: {
|
|
84
|
+
x: number;
|
|
85
|
+
y: number;
|
|
86
|
+
}, to: {
|
|
87
|
+
x: number;
|
|
88
|
+
y: number;
|
|
89
|
+
}) => Promise<void>;
|
|
90
|
+
};
|
|
91
|
+
keyboard: {
|
|
92
|
+
type: (text: string) => Promise<void>;
|
|
93
|
+
press: (action: {
|
|
94
|
+
key: KeyInput;
|
|
95
|
+
command?: string;
|
|
96
|
+
} | {
|
|
97
|
+
key: KeyInput;
|
|
98
|
+
command?: string;
|
|
99
|
+
}[]) => Promise<void>;
|
|
100
|
+
};
|
|
101
|
+
destroy(): Promise<void>;
|
|
102
|
+
longPress(x: number, y: number, duration?: number): Promise<void>;
|
|
103
|
+
swipe(from: {
|
|
104
|
+
x: number;
|
|
105
|
+
y: number;
|
|
106
|
+
}, to: {
|
|
107
|
+
x: number;
|
|
108
|
+
y: number;
|
|
109
|
+
}, duration?: number): Promise<void>;
|
|
110
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ElementCacheFeature, Rect } from '@midscene/core';
|
|
2
|
+
import type { IModelConfig } from '@midscene/shared/env';
|
|
3
|
+
import type { DebugFunction } from '@midscene/shared/logger';
|
|
4
|
+
export type WebElementCacheFeature = ElementCacheFeature & {
|
|
5
|
+
xpaths?: string[];
|
|
6
|
+
};
|
|
7
|
+
export declare const sanitizeXpaths: (xpaths: unknown) => string[];
|
|
8
|
+
export interface CacheFeatureOptions {
|
|
9
|
+
targetDescription?: string;
|
|
10
|
+
modelConfig?: IModelConfig;
|
|
11
|
+
}
|
|
12
|
+
export declare function judgeOrderSensitive(options: CacheFeatureOptions | undefined, debug: DebugFunction): Promise<boolean>;
|
|
13
|
+
export declare function buildRectFromElementInfo(elementInfo: {
|
|
14
|
+
rect: {
|
|
15
|
+
left: number;
|
|
16
|
+
top: number;
|
|
17
|
+
width: number;
|
|
18
|
+
height: number;
|
|
19
|
+
};
|
|
20
|
+
}): Rect;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { PlaywrightAiFixture } from './playwright';
|
|
2
|
+
export type { PlayWrightAiFixtureType } from './playwright';
|
|
3
|
+
export { Agent as PageAgent, type AgentOpt } from '@midscene/core/agent';
|
|
4
|
+
export { PuppeteerAgent } from './puppeteer';
|
|
5
|
+
export { PlaywrightAgent } from './playwright';
|
|
6
|
+
export { StaticPageAgent, StaticPage } from './static';
|
|
7
|
+
export { WebMidsceneTools } from './mcp-tools';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { GenericAgent } from '@midscene/shared/mcp';
|
|
2
|
+
import { BaseMCPServer, type Tool } from '@midscene/shared/mcp';
|
|
3
|
+
import { WebMidsceneTools } from './mcp-tools';
|
|
4
|
+
/**
|
|
5
|
+
* Web MCP Server class
|
|
6
|
+
*/
|
|
7
|
+
export declare class WebMCPServer extends BaseMCPServer {
|
|
8
|
+
constructor(toolsManager?: WebMidsceneTools);
|
|
9
|
+
protected createToolsManager(): WebMidsceneTools;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Create an MCP server launcher for a specific Agent
|
|
13
|
+
*/
|
|
14
|
+
export declare function mcpServerForAgent(agent: GenericAgent): {
|
|
15
|
+
launch(options?: {
|
|
16
|
+
verbose?: boolean;
|
|
17
|
+
}): Promise<import("@midscene/shared/mcp").LaunchMCPServerResult>;
|
|
18
|
+
launchHttp(options: import("@midscene/shared/mcp").LaunchMCPServerOptions): Promise<import("@midscene/shared/mcp").LaunchMCPServerResult>;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Create MCP kit for a specific Agent
|
|
22
|
+
*/
|
|
23
|
+
export declare function mcpKitForAgent(agent: GenericAgent): Promise<{
|
|
24
|
+
description: string;
|
|
25
|
+
tools: Tool[];
|
|
26
|
+
}>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BaseMidsceneTools, type ToolDefinition } from '@midscene/shared/mcp';
|
|
2
|
+
import { PuppeteerAgent } from './puppeteer';
|
|
3
|
+
import { StaticPage } from './static';
|
|
4
|
+
/**
|
|
5
|
+
* Tools manager for Web Puppeteer-mode MCP.
|
|
6
|
+
* Uses a persistent headless Chrome browser that survives across CLI calls.
|
|
7
|
+
*/
|
|
8
|
+
export declare class WebPuppeteerMidsceneTools extends BaseMidsceneTools<PuppeteerAgent> {
|
|
9
|
+
protected createTemporaryDevice(): StaticPage;
|
|
10
|
+
protected ensureAgent(navigateToUrl?: string): Promise<PuppeteerAgent>;
|
|
11
|
+
destroy(): Promise<void>;
|
|
12
|
+
protected preparePlatformTools(): ToolDefinition[];
|
|
13
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseMidsceneTools, type ToolDefinition } from '@midscene/shared/mcp';
|
|
2
|
+
import { AgentOverChromeBridge } from './bridge-mode';
|
|
3
|
+
import { StaticPage } from './static';
|
|
4
|
+
/**
|
|
5
|
+
* Tools manager for Web bridge-mode MCP
|
|
6
|
+
*/
|
|
7
|
+
export declare class WebMidsceneTools extends BaseMidsceneTools<AgentOverChromeBridge> {
|
|
8
|
+
protected createTemporaryDevice(): StaticPage;
|
|
9
|
+
protected ensureAgent(openNewTabWithUrl?: string): Promise<AgentOverChromeBridge>;
|
|
10
|
+
private initBridgeModeAgent;
|
|
11
|
+
protected preparePlatformTools(): ToolDefinition[];
|
|
12
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { type PlaywrightWebPage } from './index';
|
|
2
|
+
import type { Agent as PageAgent } from '@midscene/core/agent';
|
|
3
|
+
import { type TestInfo, type TestType } from '@playwright/test';
|
|
4
|
+
import type { Page as OriginPlaywrightPage } from 'playwright';
|
|
5
|
+
export type APITestType = Pick<TestType<any, any>, 'step'>;
|
|
6
|
+
export declare const midsceneDumpAnnotationId = "MIDSCENE_DUMP_ANNOTATION";
|
|
7
|
+
type PlaywrightCacheConfig = {
|
|
8
|
+
strategy?: 'read-only' | 'read-write' | 'write-only';
|
|
9
|
+
id?: string;
|
|
10
|
+
};
|
|
11
|
+
type PlaywrightCache = false | true | PlaywrightCacheConfig;
|
|
12
|
+
export declare const PlaywrightAiFixture: (options?: {
|
|
13
|
+
forceSameTabNavigation?: boolean;
|
|
14
|
+
waitForNetworkIdleTimeout?: number;
|
|
15
|
+
waitForNavigationTimeout?: number;
|
|
16
|
+
cache?: PlaywrightCache;
|
|
17
|
+
}) => {
|
|
18
|
+
agentForPage: ({ page }: {
|
|
19
|
+
page: OriginPlaywrightPage;
|
|
20
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
21
|
+
ai: ({ page }: {
|
|
22
|
+
page: OriginPlaywrightPage;
|
|
23
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
24
|
+
aiAct: ({ page }: {
|
|
25
|
+
page: OriginPlaywrightPage;
|
|
26
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* @deprecated Use {@link PlaywrightAiFixture.aiAct} instead.
|
|
29
|
+
*/
|
|
30
|
+
aiAction: ({ page }: {
|
|
31
|
+
page: OriginPlaywrightPage;
|
|
32
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
33
|
+
aiTap: ({ page }: {
|
|
34
|
+
page: OriginPlaywrightPage;
|
|
35
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
36
|
+
aiRightClick: ({ page }: {
|
|
37
|
+
page: OriginPlaywrightPage;
|
|
38
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
39
|
+
aiDoubleClick: ({ page }: {
|
|
40
|
+
page: OriginPlaywrightPage;
|
|
41
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
42
|
+
aiHover: ({ page }: {
|
|
43
|
+
page: OriginPlaywrightPage;
|
|
44
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
45
|
+
aiInput: ({ page }: {
|
|
46
|
+
page: OriginPlaywrightPage;
|
|
47
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
48
|
+
aiKeyboardPress: ({ page }: {
|
|
49
|
+
page: OriginPlaywrightPage;
|
|
50
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
51
|
+
aiScroll: ({ page }: {
|
|
52
|
+
page: OriginPlaywrightPage;
|
|
53
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
54
|
+
aiQuery: ({ page }: {
|
|
55
|
+
page: OriginPlaywrightPage;
|
|
56
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
57
|
+
aiAssert: ({ page }: {
|
|
58
|
+
page: OriginPlaywrightPage;
|
|
59
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
60
|
+
aiWaitFor: ({ page }: {
|
|
61
|
+
page: OriginPlaywrightPage;
|
|
62
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
63
|
+
aiLocate: ({ page }: {
|
|
64
|
+
page: OriginPlaywrightPage;
|
|
65
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
66
|
+
aiNumber: ({ page }: {
|
|
67
|
+
page: OriginPlaywrightPage;
|
|
68
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
69
|
+
aiString: ({ page }: {
|
|
70
|
+
page: OriginPlaywrightPage;
|
|
71
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
72
|
+
aiBoolean: ({ page }: {
|
|
73
|
+
page: OriginPlaywrightPage;
|
|
74
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
75
|
+
aiAsk: ({ page }: {
|
|
76
|
+
page: OriginPlaywrightPage;
|
|
77
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
78
|
+
runYaml: ({ page }: {
|
|
79
|
+
page: OriginPlaywrightPage;
|
|
80
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
81
|
+
setAIActionContext: ({ page }: {
|
|
82
|
+
page: OriginPlaywrightPage;
|
|
83
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
84
|
+
evaluateJavaScript: ({ page }: {
|
|
85
|
+
page: OriginPlaywrightPage;
|
|
86
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
87
|
+
recordToReport: ({ page }: {
|
|
88
|
+
page: OriginPlaywrightPage;
|
|
89
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
90
|
+
logScreenshot: ({ page }: {
|
|
91
|
+
page: OriginPlaywrightPage;
|
|
92
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
93
|
+
freezePageContext: ({ page }: {
|
|
94
|
+
page: OriginPlaywrightPage;
|
|
95
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
96
|
+
unfreezePageContext: ({ page }: {
|
|
97
|
+
page: OriginPlaywrightPage;
|
|
98
|
+
}, use: any, testInfo: TestInfo) => Promise<void>;
|
|
99
|
+
};
|
|
100
|
+
export type PlayWrightAiFixtureType = {
|
|
101
|
+
agentForPage: (page?: any, opts?: any) => Promise<PageAgent<PlaywrightWebPage>>;
|
|
102
|
+
ai: <T = any>(...args: Parameters<PageAgent['ai']>) => Promise<T>;
|
|
103
|
+
aiAct: (...args: Parameters<PageAgent['aiAct']>) => ReturnType<PageAgent['aiAct']>;
|
|
104
|
+
/**
|
|
105
|
+
* @deprecated Use {@link PlayWrightAiFixtureType.aiAct} instead.
|
|
106
|
+
*/
|
|
107
|
+
aiAction: (...args: Parameters<PageAgent['aiAction']>) => ReturnType<PageAgent['aiAction']>;
|
|
108
|
+
aiTap: (...args: Parameters<PageAgent['aiTap']>) => ReturnType<PageAgent['aiTap']>;
|
|
109
|
+
aiRightClick: (...args: Parameters<PageAgent['aiRightClick']>) => ReturnType<PageAgent['aiRightClick']>;
|
|
110
|
+
aiDoubleClick: (...args: Parameters<PageAgent['aiDoubleClick']>) => ReturnType<PageAgent['aiDoubleClick']>;
|
|
111
|
+
aiHover: (...args: Parameters<PageAgent['aiHover']>) => ReturnType<PageAgent['aiHover']>;
|
|
112
|
+
aiInput: (...args: Parameters<PageAgent['aiInput']>) => ReturnType<PageAgent['aiInput']>;
|
|
113
|
+
aiKeyboardPress: (...args: Parameters<PageAgent['aiKeyboardPress']>) => ReturnType<PageAgent['aiKeyboardPress']>;
|
|
114
|
+
aiScroll: (...args: Parameters<PageAgent['aiScroll']>) => ReturnType<PageAgent['aiScroll']>;
|
|
115
|
+
aiQuery: <T = any>(...args: Parameters<PageAgent['aiQuery']>) => Promise<T>;
|
|
116
|
+
aiAssert: (...args: Parameters<PageAgent['aiAssert']>) => ReturnType<PageAgent['aiAssert']>;
|
|
117
|
+
aiWaitFor: (...args: Parameters<PageAgent['aiWaitFor']>) => Promise<void>;
|
|
118
|
+
aiLocate: (...args: Parameters<PageAgent['aiLocate']>) => ReturnType<PageAgent['aiLocate']>;
|
|
119
|
+
aiNumber: (...args: Parameters<PageAgent['aiNumber']>) => ReturnType<PageAgent['aiNumber']>;
|
|
120
|
+
aiString: (...args: Parameters<PageAgent['aiString']>) => ReturnType<PageAgent['aiString']>;
|
|
121
|
+
aiBoolean: (...args: Parameters<PageAgent['aiBoolean']>) => ReturnType<PageAgent['aiBoolean']>;
|
|
122
|
+
aiAsk: (...args: Parameters<PageAgent['aiAsk']>) => ReturnType<PageAgent['aiAsk']>;
|
|
123
|
+
runYaml: (...args: Parameters<PageAgent['runYaml']>) => ReturnType<PageAgent['runYaml']>;
|
|
124
|
+
setAIActionContext: (...args: Parameters<PageAgent['setAIActionContext']>) => ReturnType<PageAgent['setAIActionContext']>;
|
|
125
|
+
evaluateJavaScript: (...args: Parameters<PageAgent['evaluateJavaScript']>) => ReturnType<PageAgent['evaluateJavaScript']>;
|
|
126
|
+
recordToReport: (...args: Parameters<PageAgent['recordToReport']>) => ReturnType<PageAgent['recordToReport']>;
|
|
127
|
+
logScreenshot: (...args: Parameters<PageAgent['logScreenshot']>) => ReturnType<PageAgent['logScreenshot']>;
|
|
128
|
+
freezePageContext: (...args: Parameters<PageAgent['freezePageContext']>) => ReturnType<PageAgent['freezePageContext']>;
|
|
129
|
+
unfreezePageContext: (...args: Parameters<PageAgent['unfreezePageContext']>) => ReturnType<PageAgent['unfreezePageContext']>;
|
|
130
|
+
};
|
|
131
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Agent as PageAgent } from '@midscene/core/agent';
|
|
2
|
+
import type { Page as PlaywrightPage } from 'playwright';
|
|
3
|
+
import { WebPage as PlaywrightWebPage } from './page';
|
|
4
|
+
export type { PlayWrightAiFixtureType } from './ai-fixture';
|
|
5
|
+
export { PlaywrightAiFixture } from './ai-fixture';
|
|
6
|
+
export { overrideAIConfig } from '@midscene/shared/env';
|
|
7
|
+
export { WebPage as PlaywrightWebPage } from './page';
|
|
8
|
+
export type { WebPageAgentOpt } from '../web-element';
|
|
9
|
+
import type { WebPageAgentOpt } from '../web-element';
|
|
10
|
+
export declare class PlaywrightAgent extends PageAgent<PlaywrightWebPage> {
|
|
11
|
+
constructor(page: PlaywrightPage, opts?: WebPageAgentOpt);
|
|
12
|
+
waitForNetworkIdle(timeout?: number): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Page as PlaywrightPageType } from 'playwright';
|
|
2
|
+
import { Page as BasePage } from '../puppeteer/base-page';
|
|
3
|
+
import type { WebPageOpt } from '../web-element';
|
|
4
|
+
export declare class WebPage extends BasePage<'playwright', PlaywrightPageType> {
|
|
5
|
+
private playwrightFileChooserHandler?;
|
|
6
|
+
constructor(page: PlaywrightPageType, opts?: WebPageOpt);
|
|
7
|
+
registerFileChooserListener(handler: (chooser: import('@midscene/core/device').FileChooserHandler) => Promise<void>): Promise<{
|
|
8
|
+
dispose: () => void;
|
|
9
|
+
getError: () => Error | undefined;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { FullConfig, Reporter, Suite, TestCase, TestResult } from '@playwright/test/reporter';
|
|
2
|
+
interface MidsceneReporterOptions {
|
|
3
|
+
type?: 'merged' | 'separate';
|
|
4
|
+
/**
|
|
5
|
+
* Output format for the report.
|
|
6
|
+
* - 'single-html': All screenshots embedded as base64 in a single HTML file (default)
|
|
7
|
+
* - 'html-and-external-assets': Screenshots saved as separate PNG files in a screenshots/ subdirectory
|
|
8
|
+
*
|
|
9
|
+
* Note: 'html-and-external-assets' reports must be served via HTTP server due to CORS restrictions.
|
|
10
|
+
*/
|
|
11
|
+
outputFormat?: 'single-html' | 'html-and-external-assets';
|
|
12
|
+
}
|
|
13
|
+
declare class MidsceneReporter implements Reporter {
|
|
14
|
+
private mergedFilename?;
|
|
15
|
+
private testTitleToFilename;
|
|
16
|
+
mode?: 'merged' | 'separate';
|
|
17
|
+
outputFormat: 'single-html' | 'html-and-external-assets';
|
|
18
|
+
private tempFiles;
|
|
19
|
+
private pendingReports;
|
|
20
|
+
private mergedReportInitialized;
|
|
21
|
+
private writeQueue;
|
|
22
|
+
private hasMultipleProjects;
|
|
23
|
+
private writtenScreenshots;
|
|
24
|
+
constructor(options?: MidsceneReporterOptions);
|
|
25
|
+
private static getMode;
|
|
26
|
+
private getSeparatedFilename;
|
|
27
|
+
private getReportFilename;
|
|
28
|
+
/**
|
|
29
|
+
* Get the report path - for directory mode, returns a directory path with index.html
|
|
30
|
+
*/
|
|
31
|
+
private getReportPath;
|
|
32
|
+
/**
|
|
33
|
+
* Copy screenshots from temp location to report screenshots directory
|
|
34
|
+
*/
|
|
35
|
+
private copyScreenshotsToReport;
|
|
36
|
+
private updateReport;
|
|
37
|
+
onBegin(config: FullConfig, suite: Suite): Promise<void>;
|
|
38
|
+
onTestBegin(_test: TestCase, _result: TestResult): void;
|
|
39
|
+
onTestEnd(test: TestCase, result: TestResult): void;
|
|
40
|
+
onEnd(): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
export default MidsceneReporter;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { PuppeteerAgent } from './index';
|
|
2
|
+
import type { AgentOpt, MidsceneYamlScriptWebEnv } from '@midscene/core';
|
|
3
|
+
import { type Browser, type Page } from 'puppeteer';
|
|
4
|
+
export declare const defaultUA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36";
|
|
5
|
+
export declare const defaultViewportWidth = 1440;
|
|
6
|
+
export declare const defaultViewportHeight = 768;
|
|
7
|
+
export declare const defaultViewportScale = 0;
|
|
8
|
+
export declare const defaultWaitForNetworkIdleTimeout = 2000;
|
|
9
|
+
export declare function resolveAiActionContext(target: MidsceneYamlScriptWebEnv, preference?: Partial<Pick<AgentOpt, 'aiActionContext' | 'aiActContext'>>): AgentOpt['aiActionContext'] | undefined;
|
|
10
|
+
interface FreeFn {
|
|
11
|
+
name: string;
|
|
12
|
+
fn: () => void;
|
|
13
|
+
}
|
|
14
|
+
export interface BuildChromeArgsOptions {
|
|
15
|
+
userAgent?: string;
|
|
16
|
+
windowSize?: {
|
|
17
|
+
width: number;
|
|
18
|
+
height: number;
|
|
19
|
+
};
|
|
20
|
+
chromeArgs?: string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Builds Chrome launch arguments with sensible defaults.
|
|
24
|
+
*
|
|
25
|
+
* Platform-specific behavior:
|
|
26
|
+
* - On non-Windows systems, automatically adds --no-sandbox and --disable-setuid-sandbox
|
|
27
|
+
* for compatibility with containerized/CI environments
|
|
28
|
+
*
|
|
29
|
+
* @param options - Configuration options for Chrome arguments
|
|
30
|
+
* @returns Array of Chrome launch arguments
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* // Basic usage
|
|
35
|
+
* const args = buildChromeArgs();
|
|
36
|
+
*
|
|
37
|
+
* // With custom arguments
|
|
38
|
+
* const args = buildChromeArgs({
|
|
39
|
+
* chromeArgs: ['--disable-gpu', '--disable-dev-shm-usage'],
|
|
40
|
+
* userAgent: 'CustomUA/1.0',
|
|
41
|
+
* windowSize: { width: 1920, height: 1080 },
|
|
42
|
+
* });
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function buildChromeArgs(options?: BuildChromeArgsOptions): string[];
|
|
46
|
+
export declare function launchPuppeteerPage(target: MidsceneYamlScriptWebEnv, preference?: {
|
|
47
|
+
headed?: boolean;
|
|
48
|
+
keepWindow?: boolean;
|
|
49
|
+
ignoreDefaultArgs?: boolean | string[];
|
|
50
|
+
}, browser?: Browser, existingPage?: Page): Promise<{
|
|
51
|
+
page: Page;
|
|
52
|
+
freeFn: FreeFn[];
|
|
53
|
+
}>;
|
|
54
|
+
export declare function puppeteerAgentForTarget(target: MidsceneYamlScriptWebEnv, preference?: {
|
|
55
|
+
headed?: boolean;
|
|
56
|
+
keepWindow?: boolean;
|
|
57
|
+
} & Partial<Pick<AgentOpt, 'testId' | 'groupName' | 'groupDescription' | 'generateReport' | 'autoPrintReportMsg' | 'reportFileName' | 'replanningCycleLimit' | 'cache' | 'aiActionContext'>>, browser?: Browser, existingPage?: Page): Promise<{
|
|
58
|
+
agent: PuppeteerAgent;
|
|
59
|
+
freeFn: FreeFn[];
|
|
60
|
+
}>;
|
|
61
|
+
export {};
|