@midscene/web 0.30.10 → 1.0.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/dist/es/bin.mjs +0 -4
- package/dist/es/bin.mjs.map +1 -1
- package/dist/es/bridge-mode/agent-cli-side.mjs +22 -11
- package/dist/es/bridge-mode/agent-cli-side.mjs.map +1 -1
- package/dist/es/bridge-mode/common.mjs +8 -2
- package/dist/es/bridge-mode/common.mjs.map +1 -1
- package/dist/es/bridge-mode/io-client.mjs +10 -16
- package/dist/es/bridge-mode/io-client.mjs.map +1 -1
- package/dist/es/bridge-mode/io-server.mjs +21 -19
- package/dist/es/bridge-mode/io-server.mjs.map +1 -1
- package/dist/es/bridge-mode/page-browser-side.mjs +10 -11
- package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -1
- package/dist/es/chrome-extension/agent.mjs.map +1 -1
- package/dist/es/chrome-extension/cdpInput.mjs.map +1 -1
- package/dist/es/chrome-extension/dynamic-scripts.mjs.map +1 -1
- package/dist/es/chrome-extension/page.mjs +85 -89
- package/dist/es/chrome-extension/page.mjs.map +1 -1
- package/dist/es/playwright/ai-fixture.mjs +43 -14
- package/dist/es/playwright/ai-fixture.mjs.map +1 -1
- package/dist/es/playwright/index.mjs +18 -2
- package/dist/es/playwright/index.mjs.map +1 -1
- package/dist/es/playwright/page.mjs.map +1 -1
- package/dist/es/playwright/reporter/index.mjs +30 -16
- package/dist/es/playwright/reporter/index.mjs.map +1 -1
- package/dist/es/puppeteer/agent-launcher.mjs +48 -22
- package/dist/es/puppeteer/agent-launcher.mjs.map +1 -1
- package/dist/es/puppeteer/base-page.mjs +67 -26
- package/dist/es/puppeteer/base-page.mjs.map +1 -1
- package/dist/es/puppeteer/index.mjs +18 -2
- package/dist/es/puppeteer/index.mjs.map +1 -1
- package/dist/es/puppeteer/page.mjs.map +1 -1
- package/dist/es/static/static-agent.mjs.map +1 -1
- package/dist/es/static/static-page.mjs +1 -10
- package/dist/es/static/static-page.mjs.map +1 -1
- package/dist/es/utils.mjs +8 -0
- package/dist/es/utils.mjs.map +1 -0
- package/dist/es/web-element.mjs +2 -24
- package/dist/es/web-element.mjs.map +1 -1
- package/dist/es/web-page.mjs +71 -41
- package/dist/es/web-page.mjs.map +1 -1
- package/dist/lib/bin.js +1 -5
- package/dist/lib/bin.js.map +1 -1
- package/dist/lib/bridge-mode/agent-cli-side.js +23 -12
- package/dist/lib/bridge-mode/agent-cli-side.js.map +1 -1
- package/dist/lib/bridge-mode/browser.js +2 -2
- package/dist/lib/bridge-mode/browser.js.map +1 -1
- package/dist/lib/bridge-mode/common.js +17 -5
- package/dist/lib/bridge-mode/common.js.map +1 -1
- package/dist/lib/bridge-mode/index.js +3 -3
- package/dist/lib/bridge-mode/index.js.map +1 -1
- package/dist/lib/bridge-mode/io-client.js +12 -18
- package/dist/lib/bridge-mode/io-client.js.map +1 -1
- package/dist/lib/bridge-mode/io-server.js +25 -23
- package/dist/lib/bridge-mode/io-server.js.map +1 -1
- package/dist/lib/bridge-mode/page-browser-side.js +12 -13
- package/dist/lib/bridge-mode/page-browser-side.js.map +1 -1
- package/dist/lib/chrome-extension/agent.js +2 -2
- package/dist/lib/chrome-extension/agent.js.map +1 -1
- package/dist/lib/chrome-extension/cdpInput.js +2 -2
- package/dist/lib/chrome-extension/cdpInput.js.map +1 -1
- package/dist/lib/chrome-extension/dynamic-scripts.js +2 -2
- package/dist/lib/chrome-extension/dynamic-scripts.js.map +1 -1
- package/dist/lib/chrome-extension/index.js +3 -3
- package/dist/lib/chrome-extension/index.js.map +1 -1
- package/dist/lib/chrome-extension/page.js +87 -91
- package/dist/lib/chrome-extension/page.js.map +1 -1
- package/dist/lib/index.js +6 -6
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/playwright/ai-fixture.js +46 -17
- package/dist/lib/playwright/ai-fixture.js.map +1 -1
- package/dist/lib/playwright/index.js +32 -6
- package/dist/lib/playwright/index.js.map +1 -1
- package/dist/lib/playwright/page.js +2 -2
- package/dist/lib/playwright/page.js.map +1 -1
- package/dist/lib/playwright/reporter/index.js +32 -18
- package/dist/lib/playwright/reporter/index.js.map +1 -1
- package/dist/lib/puppeteer/agent-launcher.js +57 -28
- package/dist/lib/puppeteer/agent-launcher.js.map +1 -1
- package/dist/lib/puppeteer/base-page.js +73 -29
- package/dist/lib/puppeteer/base-page.js.map +1 -1
- package/dist/lib/puppeteer/index.js +31 -5
- package/dist/lib/puppeteer/index.js.map +1 -1
- package/dist/lib/puppeteer/page.js +2 -2
- package/dist/lib/puppeteer/page.js.map +1 -1
- package/dist/lib/static/index.js +4 -4
- package/dist/lib/static/index.js.map +1 -1
- package/dist/lib/static/static-agent.js +2 -2
- package/dist/lib/static/static-agent.js.map +1 -1
- package/dist/lib/static/static-page.js +3 -12
- package/dist/lib/static/static-page.js.map +1 -1
- package/dist/lib/utils.js +40 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/web-element.js +6 -28
- package/dist/lib/web-element.js.map +1 -1
- package/dist/lib/web-page.js +73 -43
- package/dist/lib/web-page.js.map +1 -1
- package/dist/types/bridge-mode/agent-cli-side.d.ts +23 -2
- package/dist/types/bridge-mode/common.d.ts +9 -0
- package/dist/types/bridge-mode/io-server.d.ts +3 -2
- package/dist/types/bridge-mode/page-browser-side.d.ts +2 -1
- package/dist/types/chrome-extension/page.d.ts +19 -6
- package/dist/types/playwright/ai-fixture.d.ts +16 -2
- package/dist/types/playwright/index.d.ts +1 -0
- package/dist/types/playwright/reporter/index.d.ts +2 -0
- package/dist/types/puppeteer/agent-launcher.d.ts +3 -4
- package/dist/types/puppeteer/base-page.d.ts +18 -5
- package/dist/types/puppeteer/index.d.ts +1 -0
- package/dist/types/static/static-page.d.ts +0 -1
- package/dist/types/utils.d.ts +6 -0
- package/dist/types/web-element.d.ts +10 -0
- package/dist/types/web-page.d.ts +4 -1
- package/package.json +13 -20
|
@@ -76,9 +76,6 @@ class StaticPage {
|
|
|
76
76
|
async getElementsNodeTree() {
|
|
77
77
|
return ThrowNotImplemented('getElementsNodeTree');
|
|
78
78
|
}
|
|
79
|
-
async getXpathsById(id) {
|
|
80
|
-
return ThrowNotImplemented('getXpathsById');
|
|
81
|
-
}
|
|
82
79
|
async getXpathsByPoint(point) {
|
|
83
80
|
return ThrowNotImplemented('getXpathsByPoint');
|
|
84
81
|
}
|
|
@@ -146,19 +143,13 @@ class StaticPage {
|
|
|
146
143
|
type: ThrowNotImplemented.bind(null, 'keyboard.type'),
|
|
147
144
|
press: ThrowNotImplemented.bind(null, 'keyboard.press')
|
|
148
145
|
});
|
|
149
|
-
|
|
150
|
-
else this.uiContext = Object.assign(uiContext, {
|
|
151
|
-
tree: {
|
|
152
|
-
node: null,
|
|
153
|
-
children: []
|
|
154
|
-
}
|
|
155
|
-
});
|
|
146
|
+
this.uiContext = uiContext;
|
|
156
147
|
}
|
|
157
148
|
}
|
|
158
149
|
exports["default"] = __webpack_exports__["default"];
|
|
159
|
-
for(var
|
|
150
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
160
151
|
"default"
|
|
161
|
-
].indexOf(
|
|
152
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
162
153
|
Object.defineProperty(exports, '__esModule', {
|
|
163
154
|
value: true
|
|
164
155
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static/static-page.js","sources":["webpack
|
|
1
|
+
{"version":3,"file":"static/static-page.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/static/static-page.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { DeviceAction, Point, UIContext } from '@midscene/core';\nimport type { AbstractInterface } from '@midscene/core/device';\nimport {\n defineActionDragAndDrop,\n defineActionHover,\n defineActionInput,\n defineActionKeyboardPress,\n defineActionRightClick,\n defineActionScroll,\n defineActionTap,\n} from '@midscene/core/device';\nimport { ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED } from '@midscene/shared/common';\n\ntype WebUIContext = UIContext & {\n screenshotBase64?: string;\n size: { width: number; height: number; dpr?: number };\n};\n\nconst ThrowNotImplemented = (methodName: string) => {\n throw new Error(\n `The method \"${methodName}\" is not implemented as designed since this is a static UI context. (${ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED})`,\n );\n};\n\nexport default class StaticPage implements AbstractInterface {\n interfaceType = 'static';\n\n private uiContext: WebUIContext;\n\n constructor(uiContext: WebUIContext) {\n this.uiContext = uiContext;\n }\n\n actionSpace(): DeviceAction[] {\n // Return available actions for static page - they will throw \"not implemented\" errors when executed\n // but need to be available for planning phase\n return [\n defineActionTap(async (param) => {\n ThrowNotImplemented('Tap');\n }),\n defineActionRightClick(async (param) => {\n ThrowNotImplemented('RightClick');\n }),\n defineActionHover(async (param) => {\n ThrowNotImplemented('Hover');\n }),\n defineActionInput(async (param) => {\n ThrowNotImplemented('Input');\n }),\n defineActionKeyboardPress(async (param) => {\n ThrowNotImplemented('KeyboardPress');\n }),\n defineActionScroll(async (param) => {\n ThrowNotImplemented('Scroll');\n }),\n defineActionDragAndDrop(async (param) => {\n ThrowNotImplemented('DragAndDrop');\n }),\n ];\n }\n\n async evaluateJavaScript<T = unknown>(script: string): Promise<T> {\n return ThrowNotImplemented('evaluateJavaScript');\n }\n\n // @deprecated\n async getElementsInfo() {\n return ThrowNotImplemented('getElementsInfo');\n }\n\n async getElementsNodeTree() {\n return ThrowNotImplemented('getElementsNodeTree');\n }\n\n async getXpathsByPoint(point: Point) {\n return ThrowNotImplemented('getXpathsByPoint');\n }\n\n async getElementInfoByXpath(xpath: string) {\n return ThrowNotImplemented('getElementInfoByXpath');\n }\n\n async size() {\n return {\n ...this.uiContext.size,\n dpr: this.uiContext.size.dpr || 1,\n };\n }\n\n async screenshotBase64() {\n const base64 = this.uiContext.screenshotBase64;\n if (!base64) {\n throw new Error('screenshot base64 is empty');\n }\n return base64;\n }\n\n async url() {\n return Promise.resolve('https://static_page_without_url');\n }\n\n async scrollUntilTop(startingPoint?: Point) {\n return ThrowNotImplemented('scrollUntilTop');\n }\n\n async scrollUntilBottom(startingPoint?: Point) {\n return ThrowNotImplemented('scrollUntilBottom');\n }\n\n async scrollUntilLeft(startingPoint?: Point) {\n return ThrowNotImplemented('scrollUntilLeft');\n }\n\n async scrollUntilRight(startingPoint?: Point) {\n return ThrowNotImplemented('scrollUntilRight');\n }\n\n async scrollUp(distance?: number, startingPoint?: Point) {\n return ThrowNotImplemented('scrollUp');\n }\n\n async scrollDown(distance?: number, startingPoint?: Point) {\n return ThrowNotImplemented('scrollDown');\n }\n\n async scrollLeft(distance?: number, startingPoint?: Point) {\n return ThrowNotImplemented('scrollLeft');\n }\n\n async scrollRight(distance?: number, startingPoint?: Point) {\n return ThrowNotImplemented('scrollRight');\n }\n\n async clearInput() {\n return ThrowNotImplemented('clearInput');\n }\n\n mouse = {\n click: ThrowNotImplemented.bind(null, 'mouse.click'),\n wheel: ThrowNotImplemented.bind(null, 'mouse.wheel'),\n move: ThrowNotImplemented.bind(null, 'mouse.move'),\n drag: ThrowNotImplemented.bind(null, 'mouse.drag'),\n };\n\n keyboard = {\n type: ThrowNotImplemented.bind(null, 'keyboard.type'),\n press: ThrowNotImplemented.bind(null, 'keyboard.press'),\n };\n\n async destroy(): Promise<void> {\n //\n }\n\n async getContext(): Promise<UIContext> {\n return this.uiContext;\n }\n\n updateContext(newContext: WebUIContext): void {\n this.uiContext = newContext;\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","ThrowNotImplemented","methodName","Error","ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED","StaticPage","defineActionTap","param","defineActionRightClick","defineActionHover","defineActionInput","defineActionKeyboardPress","defineActionScroll","defineActionDragAndDrop","script","point","xpath","base64","Promise","startingPoint","distance","newContext","uiContext"],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
getWebpackRequire: ()=>getWebpackRequire
|
|
28
|
+
});
|
|
29
|
+
function getWebpackRequire() {
|
|
30
|
+
return 'undefined' != typeof require ? require : require;
|
|
31
|
+
}
|
|
32
|
+
exports.getWebpackRequire = __webpack_exports__.getWebpackRequire;
|
|
33
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
34
|
+
"getWebpackRequire"
|
|
35
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
36
|
+
Object.defineProperty(exports, '__esModule', {
|
|
37
|
+
value: true
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/utils.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// Type declaration for webpack's __non_webpack_require__\ndeclare const __non_webpack_require__: typeof require | undefined;\n\n/**\n * Get a require function that won't be processed by webpack.\n * Returns __non_webpack_require__ if available (in webpack environment),\n * otherwise falls back to the standard require.\n */\nexport function getWebpackRequire(): typeof require {\n return typeof __non_webpack_require__ !== 'undefined'\n ? __non_webpack_require__\n : require;\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","getWebpackRequire","__non_webpack_require__","require"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;ACEO,SAASI;IACd,OAAO,AAAmC,eAAnC,OAAOC,UACVA,UACAC;AACN"}
|
package/dist/lib/web-element.js
CHANGED
|
@@ -24,11 +24,10 @@ var __webpack_require__ = {};
|
|
|
24
24
|
var __webpack_exports__ = {};
|
|
25
25
|
__webpack_require__.r(__webpack_exports__);
|
|
26
26
|
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
-
|
|
27
|
+
limitOpenNewTabScript: ()=>limitOpenNewTabScript,
|
|
28
28
|
WebPageContextParser: ()=>WebPageContextParser,
|
|
29
|
-
|
|
29
|
+
WebElementInfoImpl: ()=>WebElementInfoImpl
|
|
30
30
|
});
|
|
31
|
-
const extractor_namespaceObject = require("@midscene/shared/extractor");
|
|
32
31
|
const logger_namespaceObject = require("@midscene/shared/logger");
|
|
33
32
|
const agent_namespaceObject = require("@midscene/core/agent");
|
|
34
33
|
function _define_property(obj, key, value) {
|
|
@@ -64,33 +63,12 @@ class WebElementInfoImpl {
|
|
|
64
63
|
this.isVisible = isVisible;
|
|
65
64
|
}
|
|
66
65
|
}
|
|
67
|
-
|
|
66
|
+
(0, logger_namespaceObject.getDebug)('web:parse-context');
|
|
68
67
|
async function WebPageContextParser(page, _opt) {
|
|
69
|
-
var _page_getElementsNodeTree;
|
|
70
68
|
const basicContext = await (0, agent_namespaceObject.commonContextParser)(page, {
|
|
71
69
|
uploadServerUrl: _opt.uploadServerUrl
|
|
72
70
|
});
|
|
73
|
-
|
|
74
|
-
const tree = await (null == (_page_getElementsNodeTree = page.getElementsNodeTree) ? void 0 : _page_getElementsNodeTree.call(page)) || {
|
|
75
|
-
node: null,
|
|
76
|
-
children: []
|
|
77
|
-
};
|
|
78
|
-
const webTree = (0, extractor_namespaceObject.traverseTree)(tree, (elementInfo)=>{
|
|
79
|
-
const { rect, id, content, attributes, indexId, isVisible } = elementInfo;
|
|
80
|
-
return new WebElementInfoImpl({
|
|
81
|
-
rect,
|
|
82
|
-
id,
|
|
83
|
-
content,
|
|
84
|
-
attributes,
|
|
85
|
-
indexId,
|
|
86
|
-
isVisible
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
debug('traverse element tree end');
|
|
90
|
-
return {
|
|
91
|
-
...basicContext,
|
|
92
|
-
tree: webTree
|
|
93
|
-
};
|
|
71
|
+
return basicContext;
|
|
94
72
|
}
|
|
95
73
|
const limitOpenNewTabScript = `
|
|
96
74
|
if (!window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {
|
|
@@ -118,11 +96,11 @@ if (!window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {
|
|
|
118
96
|
exports.WebElementInfoImpl = __webpack_exports__.WebElementInfoImpl;
|
|
119
97
|
exports.WebPageContextParser = __webpack_exports__.WebPageContextParser;
|
|
120
98
|
exports.limitOpenNewTabScript = __webpack_exports__.limitOpenNewTabScript;
|
|
121
|
-
for(var
|
|
99
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
122
100
|
"WebElementInfoImpl",
|
|
123
101
|
"WebPageContextParser",
|
|
124
102
|
"limitOpenNewTabScript"
|
|
125
|
-
].indexOf(
|
|
103
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
126
104
|
Object.defineProperty(exports, '__esModule', {
|
|
127
105
|
value: true
|
|
128
106
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-element.js","sources":["webpack
|
|
1
|
+
{"version":3,"file":"web-element.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/web-element.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type {\n AgentOpt,\n DeviceAction,\n Rect,\n UIContext,\n WebElementInfo,\n} from '@midscene/core';\nimport type { AbstractInterface } from '@midscene/core/device';\nimport { getDebug } from '@midscene/shared/logger';\nimport { _keyDefinitions } from '@midscene/shared/us-keyboard-layout';\n\nimport { commonContextParser } from '@midscene/core/agent';\nimport type { NodeType } from '@midscene/shared/constants';\nimport type ChromeExtensionProxyPage from './chrome-extension/page';\nimport type { PlaywrightWebPage } from './playwright';\nimport type { PuppeteerWebPage } from './puppeteer';\nimport type { StaticPage } from './static';\nexport type { WebElementInfo };\n\nexport type WebPageAgentOpt = AgentOpt & WebPageOpt;\nexport type WebPageOpt = {\n waitForNavigationTimeout?: number;\n waitForNetworkIdleTimeout?: number;\n forceSameTabNavigation?: boolean /* if limit the new tab to the current page, default true */;\n enableTouchEventsInActionSpace?: boolean;\n /**\n * Force Chrome to render select elements using base-select appearance instead of OS-native rendering.\n * This makes select elements visible in screenshots captured by Playwright/Puppeteer.\n *\n * Reference: https://developer.chrome.com/blog/a-customizable-select\n *\n * When enabled, adds a style tag with `select { appearance: base-select !important; }` to the page.\n */\n forceChromeSelectRendering?: boolean;\n beforeInvokeAction?: () => Promise<void>;\n afterInvokeAction?: () => Promise<void>;\n customActions?: DeviceAction<any>[];\n};\n\nexport type WebPage =\n | PlaywrightWebPage\n | PuppeteerWebPage\n | StaticPage\n | ChromeExtensionProxyPage;\n\nexport class WebElementInfoImpl implements WebElementInfo {\n content: string;\n\n rect: Rect;\n\n center: [number, number];\n\n id: string;\n\n indexId: number;\n\n attributes: {\n nodeType: NodeType;\n [key: string]: string;\n };\n\n xpaths?: string[];\n\n isVisible: boolean;\n\n constructor({\n content,\n rect,\n id,\n attributes,\n indexId,\n xpaths,\n isVisible,\n }: {\n content: string;\n rect: Rect;\n id: string;\n attributes: {\n nodeType: NodeType;\n [key: string]: string;\n };\n indexId: number;\n xpaths?: string[];\n isVisible: boolean;\n }) {\n this.content = content;\n this.rect = rect;\n this.center = [\n Math.floor(rect.left + rect.width / 2),\n Math.floor(rect.top + rect.height / 2),\n ];\n this.id = id;\n this.attributes = attributes;\n this.indexId = indexId;\n this.xpaths = xpaths;\n this.isVisible = isVisible;\n }\n}\n\nconst debug = getDebug('web:parse-context');\nexport async function WebPageContextParser(\n page: AbstractInterface,\n _opt: { uploadServerUrl?: string },\n): Promise<UIContext> {\n const basicContext = await commonContextParser(page, {\n uploadServerUrl: _opt.uploadServerUrl,\n });\n\n // debug('will traverse element tree');\n // const tree = (await page.getElementsNodeTree?.()) || {\n // node: null,\n // children: [],\n // };\n // // const webTree = traverseTree(tree!, (elementInfo) => {\n // // const { rect, id, content, attributes, indexId, isVisible } = elementInfo;\n // // return new WebElementInfoImpl({\n // // rect,\n // // id,\n // // content,\n // // attributes,\n // // indexId,\n // // isVisible,\n // // });\n // // });\n // debug('traverse element tree end');\n\n return basicContext;\n}\n\nexport const limitOpenNewTabScript = `\nif (!window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {\n window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__ = true;\n\n // Intercept the window.open method (only once)\n window.open = function(url) {\n console.log('Blocked window.open:', url);\n window.location.href = url;\n return null;\n };\n\n // Block all a tag clicks with target=\"_blank\" (only once)\n document.addEventListener('click', function(e) {\n const target = e.target.closest('a');\n if (target && target.target === '_blank') {\n e.preventDefault();\n console.log('Blocked new tab:', target.href);\n window.location.href = target.href;\n target.removeAttribute('target');\n }\n }, true);\n}\n`;\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","WebElementInfoImpl","content","rect","id","attributes","indexId","xpaths","isVisible","Math","getDebug","WebPageContextParser","page","_opt","basicContext","commonContextParser","limitOpenNewTabScript"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;;;;;;;ACuCO,MAAMI;IAoBX,YAAY,EACVC,OAAO,EACPC,IAAI,EACJC,EAAE,EACFC,UAAU,EACVC,OAAO,EACPC,MAAM,EACNC,SAAS,EAYV,CAAE;QAtCH;QAEA;QAEA;QAEA;QAEA;QAEA;QAKA;QAEA;QAsBE,IAAI,CAAC,OAAO,GAAGN;QACf,IAAI,CAAC,IAAI,GAAGC;QACZ,IAAI,CAAC,MAAM,GAAG;YACZM,KAAK,KAAK,CAACN,KAAK,IAAI,GAAGA,KAAK,KAAK,GAAG;YACpCM,KAAK,KAAK,CAACN,KAAK,GAAG,GAAGA,KAAK,MAAM,GAAG;SACrC;QACD,IAAI,CAAC,EAAE,GAAGC;QACV,IAAI,CAAC,UAAU,GAAGC;QAClB,IAAI,CAAC,OAAO,GAAGC;QACf,IAAI,CAAC,MAAM,GAAGC;QACd,IAAI,CAAC,SAAS,GAAGC;IACnB;AACF;AAEcE,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS;AAChB,eAAeC,qBACpBC,IAAuB,EACvBC,IAAkC;IAElC,MAAMC,eAAe,MAAMC,AAAAA,IAAAA,sBAAAA,mBAAAA,AAAAA,EAAoBH,MAAM;QACnD,iBAAiBC,KAAK,eAAe;IACvC;IAoBA,OAAOC;AACT;AAEO,MAAME,wBAAwB,CAAC;;;;;;;;;;;;;;;;;;;;;;AAsBtC,CAAC"}
|
package/dist/lib/web-page.js
CHANGED
|
@@ -33,12 +33,13 @@ var __webpack_require__ = {};
|
|
|
33
33
|
var __webpack_exports__ = {};
|
|
34
34
|
__webpack_require__.r(__webpack_exports__);
|
|
35
35
|
__webpack_require__.d(__webpack_exports__, {
|
|
36
|
-
getKeyCommands: ()=>getKeyCommands,
|
|
37
36
|
commonWebActionsForWebPage: ()=>commonWebActionsForWebPage,
|
|
37
|
+
getKeyCommands: ()=>getKeyCommands,
|
|
38
38
|
AbstractWebPage: ()=>AbstractWebPage
|
|
39
39
|
});
|
|
40
40
|
const external_node_assert_namespaceObject = require("node:assert");
|
|
41
41
|
var external_node_assert_default = /*#__PURE__*/ __webpack_require__.n(external_node_assert_namespaceObject);
|
|
42
|
+
const core_namespaceObject = require("@midscene/core");
|
|
42
43
|
const device_namespaceObject = require("@midscene/core/device");
|
|
43
44
|
const utils_namespaceObject = require("@midscene/core/utils");
|
|
44
45
|
const logger_namespaceObject = require("@midscene/shared/logger");
|
|
@@ -121,7 +122,7 @@ class AbstractWebPage extends device_namespaceObject.AbstractInterface {
|
|
|
121
122
|
}
|
|
122
123
|
async clearInput(element) {}
|
|
123
124
|
}
|
|
124
|
-
const commonWebActionsForWebPage = (page)=>[
|
|
125
|
+
const commonWebActionsForWebPage = (page, includeTouchEvents = false)=>[
|
|
125
126
|
(0, device_namespaceObject.defineActionTap)(async (param)=>{
|
|
126
127
|
const element = param.locate;
|
|
127
128
|
external_node_assert_default()(element, 'Element not found, cannot tap');
|
|
@@ -170,18 +171,18 @@ const commonWebActionsForWebPage = (page)=>[
|
|
|
170
171
|
left: element.center[0],
|
|
171
172
|
top: element.center[1]
|
|
172
173
|
} : void 0;
|
|
173
|
-
const scrollToEventName =
|
|
174
|
-
if ('
|
|
175
|
-
else if ('
|
|
176
|
-
else if ('
|
|
177
|
-
else if ('
|
|
178
|
-
else if ('
|
|
174
|
+
const scrollToEventName = param?.scrollType;
|
|
175
|
+
if ('scrollToTop' === scrollToEventName) await page.scrollUntilTop(startingPoint);
|
|
176
|
+
else if ('scrollToBottom' === scrollToEventName) await page.scrollUntilBottom(startingPoint);
|
|
177
|
+
else if ('scrollToRight' === scrollToEventName) await page.scrollUntilRight(startingPoint);
|
|
178
|
+
else if ('scrollToLeft' === scrollToEventName) await page.scrollUntilLeft(startingPoint);
|
|
179
|
+
else if ('singleAction' !== scrollToEventName && scrollToEventName) throw new Error(`Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(param)}`);
|
|
179
180
|
else {
|
|
180
|
-
if (
|
|
181
|
+
if (param?.direction !== 'down' && param && param.direction) if ('up' === param.direction) await page.scrollUp(param.distance || void 0, startingPoint);
|
|
181
182
|
else if ('left' === param.direction) await page.scrollLeft(param.distance || void 0, startingPoint);
|
|
182
183
|
else if ('right' === param.direction) await page.scrollRight(param.distance || void 0, startingPoint);
|
|
183
184
|
else throw new Error(`Unknown scroll direction: ${param.direction}`);
|
|
184
|
-
else await page.scrollDown(
|
|
185
|
+
else await page.scrollDown(param?.distance || void 0, startingPoint);
|
|
185
186
|
await (0, utils_namespaceObject.sleep)(500);
|
|
186
187
|
}
|
|
187
188
|
}),
|
|
@@ -201,54 +202,83 @@ const commonWebActionsForWebPage = (page)=>[
|
|
|
201
202
|
(0, device_namespaceObject.defineActionLongPress)(async (param)=>{
|
|
202
203
|
const element = param.locate;
|
|
203
204
|
external_node_assert_default()(element, 'Element not found, cannot long press');
|
|
204
|
-
const duration =
|
|
205
|
+
const duration = param?.duration;
|
|
205
206
|
await page.longPress(element.center[0], element.center[1], duration);
|
|
206
207
|
}),
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
let endPoint;
|
|
218
|
-
if (end) endPoint = {
|
|
219
|
-
x: end.center[0],
|
|
220
|
-
y: end.center[1]
|
|
221
|
-
};
|
|
222
|
-
else if (param.distance) {
|
|
223
|
-
const direction = param.direction;
|
|
224
|
-
if (!direction) throw new Error('direction is required for swipe gesture');
|
|
225
|
-
endPoint = {
|
|
226
|
-
x: startPoint.x + ('right' === direction ? param.distance : 'left' === direction ? -param.distance : 0),
|
|
227
|
-
y: startPoint.y + ('down' === direction ? param.distance : 'up' === direction ? -param.distance : 0)
|
|
208
|
+
...includeTouchEvents ? [
|
|
209
|
+
(0, device_namespaceObject.defineActionSwipe)(async (param)=>{
|
|
210
|
+
const { width, height } = await page.size();
|
|
211
|
+
const { start, end } = param;
|
|
212
|
+
const startPoint = start ? {
|
|
213
|
+
x: start.center[0],
|
|
214
|
+
y: start.center[1]
|
|
215
|
+
} : {
|
|
216
|
+
x: width / 2,
|
|
217
|
+
y: height / 2
|
|
228
218
|
};
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
219
|
+
let endPoint;
|
|
220
|
+
if (end) endPoint = {
|
|
221
|
+
x: end.center[0],
|
|
222
|
+
y: end.center[1]
|
|
223
|
+
};
|
|
224
|
+
else if (param.distance) {
|
|
225
|
+
const direction = param.direction;
|
|
226
|
+
if (!direction) throw new Error('direction is required for swipe gesture');
|
|
227
|
+
endPoint = {
|
|
228
|
+
x: startPoint.x + ('right' === direction ? param.distance : 'left' === direction ? -param.distance : 0),
|
|
229
|
+
y: startPoint.y + ('down' === direction ? param.distance : 'up' === direction ? -param.distance : 0)
|
|
230
|
+
};
|
|
231
|
+
} else throw new Error('Either end or distance must be specified for swipe gesture');
|
|
232
|
+
endPoint.x = Math.max(0, Math.min(endPoint.x, width));
|
|
233
|
+
endPoint.y = Math.max(0, Math.min(endPoint.y, height));
|
|
234
|
+
const duration = param.duration;
|
|
235
|
+
debug(`swipe from ${startPoint.x}, ${startPoint.y} to ${endPoint.x}, ${endPoint.y} with duration ${duration}ms, repeat is set to ${param.repeat}`);
|
|
236
|
+
let repeat = 'number' == typeof param.repeat ? param.repeat : 1;
|
|
237
|
+
if (0 === repeat) repeat = 10;
|
|
238
|
+
for(let i = 0; i < repeat; i++)await page.swipe(startPoint, endPoint, duration);
|
|
239
|
+
})
|
|
240
|
+
] : [],
|
|
238
241
|
(0, device_namespaceObject.defineActionClearInput)(async (param)=>{
|
|
239
242
|
const element = param.locate;
|
|
240
243
|
external_node_assert_default()(element, 'Element not found, cannot clear input');
|
|
241
244
|
await page.clearInput(element);
|
|
245
|
+
}),
|
|
246
|
+
(0, device_namespaceObject.defineAction)({
|
|
247
|
+
name: 'Navigate',
|
|
248
|
+
description: 'Navigate the browser to a specified URL. Opens the URL in the current tab.',
|
|
249
|
+
paramSchema: core_namespaceObject.z.object({
|
|
250
|
+
url: core_namespaceObject.z.string().describe('The URL to navigate to')
|
|
251
|
+
}),
|
|
252
|
+
call: async (param)=>{
|
|
253
|
+
if (!page.navigate) throw new Error('Navigate operation is not supported on this page type');
|
|
254
|
+
await page.navigate(param.url);
|
|
255
|
+
}
|
|
256
|
+
}),
|
|
257
|
+
(0, device_namespaceObject.defineAction)({
|
|
258
|
+
name: 'Reload',
|
|
259
|
+
description: 'Reload the current page',
|
|
260
|
+
call: async ()=>{
|
|
261
|
+
if (!page.reload) throw new Error('Reload operation is not supported on this page type');
|
|
262
|
+
await page.reload();
|
|
263
|
+
}
|
|
264
|
+
}),
|
|
265
|
+
(0, device_namespaceObject.defineAction)({
|
|
266
|
+
name: 'GoBack',
|
|
267
|
+
description: 'Navigate back in browser history',
|
|
268
|
+
call: async ()=>{
|
|
269
|
+
if (!page.goBack) throw new Error('GoBack operation is not supported on this page type');
|
|
270
|
+
await page.goBack();
|
|
271
|
+
}
|
|
242
272
|
})
|
|
243
273
|
];
|
|
244
274
|
exports.AbstractWebPage = __webpack_exports__.AbstractWebPage;
|
|
245
275
|
exports.commonWebActionsForWebPage = __webpack_exports__.commonWebActionsForWebPage;
|
|
246
276
|
exports.getKeyCommands = __webpack_exports__.getKeyCommands;
|
|
247
|
-
for(var
|
|
277
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
248
278
|
"AbstractWebPage",
|
|
249
279
|
"commonWebActionsForWebPage",
|
|
250
280
|
"getKeyCommands"
|
|
251
|
-
].indexOf(
|
|
281
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
252
282
|
Object.defineProperty(exports, '__esModule', {
|
|
253
283
|
value: true
|
|
254
284
|
});
|
package/dist/lib/web-page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-page.js","sources":["webpack://@midscene/web/webpack/runtime/compat_get_default_export","webpack://@midscene/web/webpack/runtime/define_property_getters","webpack://@midscene/web/webpack/runtime/has_own_property","webpack://@midscene/web/webpack/runtime/make_namespace_object","webpack://@midscene/web/./src/web-page.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import assert from 'node:assert';\nimport type { Point } from '@midscene/core';\nimport {\n AbstractInterface,\n type DeviceAction,\n defineActionClearInput,\n defineActionDoubleClick,\n defineActionDragAndDrop,\n defineActionHover,\n defineActionInput,\n defineActionKeyboardPress,\n defineActionLongPress,\n defineActionRightClick,\n defineActionScroll,\n defineActionSwipe,\n defineActionTap,\n} from '@midscene/core/device';\n\nimport { sleep } from '@midscene/core/utils';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { getDebug } from '@midscene/shared/logger';\nimport { transformHotkeyInput } from '@midscene/shared/us-keyboard-layout';\n\nconst debug = getDebug('web:page');\n\nfunction normalizeKeyInputs(value: string | string[]): string[] {\n const inputs = Array.isArray(value) ? value : [value];\n const result: string[] = [];\n\n for (const input of inputs) {\n if (typeof input !== 'string') {\n result.push(input as unknown as string);\n continue;\n }\n\n const trimmed = input.trim();\n if (!trimmed) {\n result.push(input);\n continue;\n }\n\n let normalized = trimmed;\n if (normalized.length > 1 && normalized.includes('+')) {\n normalized = normalized.replace(/\\s*\\+\\s*/g, ' ');\n }\n if (/\\s/.test(normalized)) {\n normalized = normalized.replace(/\\s+/g, ' ');\n }\n\n const transformed = transformHotkeyInput(normalized);\n if (transformed.length === 1 && transformed[0] === '' && trimmed !== '') {\n result.push(input);\n continue;\n }\n if (transformed.length === 0) {\n result.push(input);\n continue;\n }\n\n result.push(...transformed);\n }\n\n return result;\n}\n\nexport function getKeyCommands(\n value: string | string[],\n): Array<{ key: string; command?: string }> {\n const keys = normalizeKeyInputs(value);\n\n return keys.reduce((acc: Array<{ key: string; command?: string }>, k) => {\n const includeMeta = keys.includes('Meta') || keys.includes('Control');\n if (includeMeta && (k === 'a' || k === 'A')) {\n return acc.concat([{ key: k, command: 'SelectAll' }]);\n }\n if (includeMeta && (k === 'c' || k === 'C')) {\n return acc.concat([{ key: k, command: 'Copy' }]);\n }\n if (includeMeta && (k === 'v' || k === 'V')) {\n return acc.concat([{ key: k, command: 'Paste' }]);\n }\n return acc.concat([{ key: k }]);\n }, []);\n}\n\n// this is copied from puppeteer, but we don't want to import puppeteer here\nexport declare type KeyInput =\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'Power'\n | 'Eject'\n | 'Abort'\n | 'Help'\n | 'Backspace'\n | 'Tab'\n | 'Numpad5'\n | 'NumpadEnter'\n | 'Enter'\n | '\\r'\n | '\\n'\n | 'ShiftLeft'\n | 'ShiftRight'\n | 'ControlLeft'\n | 'ControlRight'\n | 'AltLeft'\n | 'AltRight'\n | 'Pause'\n | 'CapsLock'\n | 'Escape'\n | 'Convert'\n | 'NonConvert'\n | 'Space'\n | 'Numpad9'\n | 'PageUp'\n | 'Numpad3'\n | 'PageDown'\n | 'End'\n | 'Numpad1'\n | 'Home'\n | 'Numpad7'\n | 'ArrowLeft'\n | 'Numpad4'\n | 'Numpad8'\n | 'ArrowUp'\n | 'ArrowRight'\n | 'Numpad6'\n | 'Numpad2'\n | 'ArrowDown'\n | 'Select'\n | 'Open'\n | 'PrintScreen'\n | 'Insert'\n | 'Numpad0'\n | 'Delete'\n | 'NumpadDecimal'\n | 'Digit0'\n | 'Digit1'\n | 'Digit2'\n | 'Digit3'\n | 'Digit4'\n | 'Digit5'\n | 'Digit6'\n | 'Digit7'\n | 'Digit8'\n | 'Digit9'\n | 'KeyA'\n | 'KeyB'\n | 'KeyC'\n | 'KeyD'\n | 'KeyE'\n | 'KeyF'\n | 'KeyG'\n | 'KeyH'\n | 'KeyI'\n | 'KeyJ'\n | 'KeyK'\n | 'KeyL'\n | 'KeyM'\n | 'KeyN'\n | 'KeyO'\n | 'KeyP'\n | 'KeyQ'\n | 'KeyR'\n | 'KeyS'\n | 'KeyT'\n | 'KeyU'\n | 'KeyV'\n | 'KeyW'\n | 'KeyX'\n | 'KeyY'\n | 'KeyZ'\n | 'MetaLeft'\n | 'MetaRight'\n | 'ContextMenu'\n | 'NumpadMultiply'\n | 'NumpadAdd'\n | 'NumpadSubtract'\n | 'NumpadDivide'\n | 'F1'\n | 'F2'\n | 'F3'\n | 'F4'\n | 'F5'\n | 'F6'\n | 'F7'\n | 'F8'\n | 'F9'\n | 'F10'\n | 'F11'\n | 'F12'\n | 'F13'\n | 'F14'\n | 'F15'\n | 'F16'\n | 'F17'\n | 'F18'\n | 'F19'\n | 'F20'\n | 'F21'\n | 'F22'\n | 'F23'\n | 'F24'\n | 'NumLock'\n | 'ScrollLock'\n | 'AudioVolumeMute'\n | 'AudioVolumeDown'\n | 'AudioVolumeUp'\n | 'MediaTrackNext'\n | 'MediaTrackPrevious'\n | 'MediaStop'\n | 'MediaPlayPause'\n | 'Semicolon'\n | 'Equal'\n | 'NumpadEqual'\n | 'Comma'\n | 'Minus'\n | 'Period'\n | 'Slash'\n | 'Backquote'\n | 'BracketLeft'\n | 'Backslash'\n | 'BracketRight'\n | 'Quote'\n | 'AltGraph'\n | 'Props'\n | 'Cancel'\n | 'Clear'\n | 'Shift'\n | 'Control'\n | 'Alt'\n | 'Accept'\n | 'ModeChange'\n | ' '\n | 'Print'\n | 'Execute'\n | '\\u0000'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'l'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n | 'Meta'\n | '*'\n | '+'\n | '-'\n | '/'\n | ';'\n | '='\n | ','\n | '.'\n | '`'\n | '['\n | '\\\\'\n | ']'\n | \"'\"\n | 'Attn'\n | 'CrSel'\n | 'ExSel'\n | 'EraseEof'\n | 'Play'\n | 'ZoomOut'\n | ')'\n | '!'\n | '@'\n | '#'\n | '$'\n | '%'\n | '^'\n | '&'\n | '('\n | 'A'\n | 'B'\n | 'C'\n | 'D'\n | 'E'\n | 'F'\n | 'G'\n | 'H'\n | 'I'\n | 'J'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'O'\n | 'P'\n | 'Q'\n | 'R'\n | 'S'\n | 'T'\n | 'U'\n | 'V'\n | 'W'\n | 'X'\n | 'Y'\n | 'Z'\n | ':'\n | '<'\n | '_'\n | '>'\n | '?'\n | '~'\n | '{'\n | '|'\n | '}'\n | '\"'\n | 'SoftLeft'\n | 'SoftRight'\n | 'Camera'\n | 'Call'\n | 'EndCall'\n | 'VolumeDown'\n | 'VolumeUp';\n\nexport type MouseButton = 'left' | 'right' | 'middle';\n\nexport interface MouseAction {\n click: (\n x: number,\n y: number,\n options: { button: MouseButton; count?: number },\n ) => Promise<void>;\n wheel: (deltaX: number, deltaY: number) => Promise<void>;\n move: (x: number, y: number) => Promise<void>;\n drag: (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => Promise<void>;\n}\n\nexport interface KeyboardAction {\n type: (text: string) => Promise<void>;\n press: (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => Promise<void>;\n}\n\nexport interface ChromePageDestroyOptions {\n closeTab?: boolean; // should close the tab when the page object is destroyed\n}\n\nexport abstract class AbstractWebPage extends AbstractInterface {\n get mouse(): MouseAction {\n return {\n click: async (\n x: number,\n y: number,\n options: { button: MouseButton },\n ) => {},\n wheel: async (deltaX: number, deltaY: number) => {},\n move: async (x: number, y: number) => {},\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {},\n };\n }\n\n get keyboard(): KeyboardAction {\n return {\n type: async (text: string) => {},\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {},\n };\n }\n\n async clearInput(element: ElementInfo): Promise<void> {}\n\n abstract scrollUntilTop(startingPoint?: Point): Promise<void>;\n abstract scrollUntilBottom(startingPoint?: Point): Promise<void>;\n abstract scrollUntilLeft(startingPoint?: Point): Promise<void>;\n abstract scrollUntilRight(startingPoint?: Point): Promise<void>;\n abstract scrollUp(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollDown(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollLeft(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollRight(distance?: number, startingPoint?: Point): Promise<void>;\n abstract longPress(x: number, y: number, duration?: number): Promise<void>;\n abstract swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ): Promise<void>;\n}\n\nexport const commonWebActionsForWebPage = <T extends AbstractWebPage>(\n page: T,\n): DeviceAction<any>[] => [\n defineActionTap(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot tap');\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }),\n defineActionRightClick(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot right click');\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'right',\n });\n }),\n defineActionDoubleClick(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot double click');\n\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n count: 2,\n });\n }),\n defineActionHover(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot hover');\n await page.mouse.move(element.center[0], element.center[1]);\n }),\n defineActionInput(async (param) => {\n const element = param.locate;\n if (element && param.mode !== 'append') {\n await page.clearInput(element as unknown as ElementInfo);\n }\n\n if (param.mode === 'clear') {\n // Clear mode removes existing text without entering new characters\n return;\n }\n\n if (!param || !param.value) {\n return;\n }\n\n // Note: there is another implementation in AndroidDevicePage, which is more complex\n await page.keyboard.type(param.value);\n }),\n defineActionKeyboardPress(async (param) => {\n const element = param.locate;\n if (element) {\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }\n\n const keys = getKeyCommands(param.keyName);\n await page.keyboard.press(keys as any); // TODO: fix this type error\n }),\n defineActionScroll(async (param) => {\n const element = param.locate;\n const startingPoint = element\n ? {\n left: element.center[0],\n top: element.center[1],\n }\n : undefined;\n const scrollToEventName = param?.scrollType;\n if (scrollToEventName === 'untilTop') {\n await page.scrollUntilTop(startingPoint);\n } else if (scrollToEventName === 'untilBottom') {\n await page.scrollUntilBottom(startingPoint);\n } else if (scrollToEventName === 'untilRight') {\n await page.scrollUntilRight(startingPoint);\n } else if (scrollToEventName === 'untilLeft') {\n await page.scrollUntilLeft(startingPoint);\n } else if (scrollToEventName === 'once' || !scrollToEventName) {\n if (param?.direction === 'down' || !param || !param.direction) {\n await page.scrollDown(param?.distance || undefined, startingPoint);\n } else if (param.direction === 'up') {\n await page.scrollUp(param.distance || undefined, startingPoint);\n } else if (param.direction === 'left') {\n await page.scrollLeft(param.distance || undefined, startingPoint);\n } else if (param.direction === 'right') {\n await page.scrollRight(param.distance || undefined, startingPoint);\n } else {\n throw new Error(`Unknown scroll direction: ${param.direction}`);\n }\n // until mouse event is done\n await sleep(500);\n } else {\n throw new Error(\n `Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(\n param,\n )}`,\n );\n }\n }),\n defineActionDragAndDrop(async (param) => {\n const from = param.from;\n const to = param.to;\n assert(from, 'missing \"from\" param for drag and drop');\n assert(to, 'missing \"to\" param for drag and drop');\n await page.mouse.drag(\n {\n x: from.center[0],\n y: from.center[1],\n },\n {\n x: to.center[0],\n y: to.center[1],\n },\n );\n }),\n\n defineActionLongPress(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot long press');\n const duration = param?.duration;\n await page.longPress(element.center[0], element.center[1], duration);\n }),\n\n defineActionSwipe(async (param) => {\n const { width, height } = await page.size();\n const { start, end } = param;\n\n const startPoint = start\n ? {\n x: start.center[0],\n y: start.center[1],\n }\n : {\n x: width / 2,\n y: height / 2,\n };\n\n let endPoint: {\n x: number;\n y: number;\n };\n\n if (end) {\n endPoint = {\n x: end.center[0],\n y: end.center[1],\n };\n } else if (param.distance) {\n const direction = param.direction;\n if (!direction) {\n throw new Error('direction is required for swipe gesture');\n }\n\n endPoint = {\n x:\n startPoint.x +\n (direction === 'right'\n ? param.distance\n : direction === 'left'\n ? -param.distance\n : 0),\n y:\n startPoint.y +\n (direction === 'down'\n ? param.distance\n : direction === 'up'\n ? -param.distance\n : 0),\n };\n } else {\n throw new Error(\n 'Either end or distance must be specified for swipe gesture',\n );\n }\n\n // Ensure end coordinates are within bounds\n endPoint.x = Math.max(0, Math.min(endPoint.x, width));\n endPoint.y = Math.max(0, Math.min(endPoint.y, height));\n\n const duration = param.duration;\n\n debug(\n `swipe from ${startPoint.x}, ${startPoint.y} to ${endPoint.x}, ${endPoint.y} with duration ${duration}ms, repeat is set to ${param.repeat}`,\n );\n let repeat = typeof param.repeat === 'number' ? param.repeat : 1;\n if (repeat === 0) {\n repeat = 10; // 10 times is enough for infinite swipe\n }\n for (let i = 0; i < repeat; i++) {\n await page.swipe(startPoint, endPoint, duration);\n }\n }),\n\n defineActionClearInput(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot clear input');\n await page.clearInput(element as unknown as ElementInfo);\n }),\n];\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debug","getDebug","normalizeKeyInputs","value","inputs","Array","result","input","trimmed","normalized","transformed","transformHotkeyInput","getKeyCommands","keys","acc","k","includeMeta","AbstractWebPage","AbstractInterface","x","y","options","deltaX","deltaY","from","to","text","action","element","commonWebActionsForWebPage","page","defineActionTap","param","assert","defineActionRightClick","defineActionDoubleClick","defineActionHover","defineActionInput","defineActionKeyboardPress","defineActionScroll","startingPoint","undefined","scrollToEventName","Error","JSON","sleep","defineActionDragAndDrop","defineActionLongPress","duration","defineActionSwipe","width","height","start","end","startPoint","endPoint","direction","Math","repeat","i","defineActionClearInput"],"mappings":";;;IACAA,oBAAoB,CAAC,GAAG,CAACC;QACxB,IAAIC,SAASD,UAAUA,OAAO,UAAU,GACvC,IAAOA,MAAM,CAAC,UAAU,GACxB,IAAOA;QACRD,oBAAoB,CAAC,CAACE,QAAQ;YAAE,GAAGA;QAAO;QAC1C,OAAOA;IACR;;;ICPAF,oBAAoB,CAAC,GAAG,CAAC,UAASG;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGH,oBAAoB,CAAC,CAACG,YAAYC,QAAQ,CAACJ,oBAAoB,CAAC,CAAC,UAASI,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAJ,oBAAoB,CAAC,GAAG,CAACM,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFP,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOQ,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;ACiBA,MAAMI,QAAQC,AAAAA,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS;AAEvB,SAASC,mBAAmBC,KAAwB;IAClD,MAAMC,SAASC,MAAM,OAAO,CAACF,SAASA,QAAQ;QAACA;KAAM;IACrD,MAAMG,SAAmB,EAAE;IAE3B,KAAK,MAAMC,SAASH,OAAQ;QAC1B,IAAI,AAAiB,YAAjB,OAAOG,OAAoB;YAC7BD,OAAO,IAAI,CAACC;YACZ;QACF;QAEA,MAAMC,UAAUD,MAAM,IAAI;QAC1B,IAAI,CAACC,SAAS;YACZF,OAAO,IAAI,CAACC;YACZ;QACF;QAEA,IAAIE,aAAaD;QACjB,IAAIC,WAAW,MAAM,GAAG,KAAKA,WAAW,QAAQ,CAAC,MAC/CA,aAAaA,WAAW,OAAO,CAAC,aAAa;QAE/C,IAAI,KAAK,IAAI,CAACA,aACZA,aAAaA,WAAW,OAAO,CAAC,QAAQ;QAG1C,MAAMC,cAAcC,AAAAA,IAAAA,mCAAAA,oBAAAA,AAAAA,EAAqBF;QACzC,IAAIC,AAAuB,MAAvBA,YAAY,MAAM,IAAUA,AAAmB,OAAnBA,WAAW,CAAC,EAAE,IAAWF,AAAY,OAAZA,SAAgB;YACvEF,OAAO,IAAI,CAACC;YACZ;QACF;QACA,IAAIG,AAAuB,MAAvBA,YAAY,MAAM,EAAQ;YAC5BJ,OAAO,IAAI,CAACC;YACZ;QACF;QAEAD,OAAO,IAAI,IAAII;IACjB;IAEA,OAAOJ;AACT;AAEO,SAASM,eACdT,KAAwB;IAExB,MAAMU,OAAOX,mBAAmBC;IAEhC,OAAOU,KAAK,MAAM,CAAC,CAACC,KAA+CC;QACjE,MAAMC,cAAcH,KAAK,QAAQ,CAAC,WAAWA,KAAK,QAAQ,CAAC;QAC3D,IAAIG,eAAgBD,CAAAA,AAAM,QAANA,KAAaA,AAAM,QAANA,CAAQ,GACvC,OAAOD,IAAI,MAAM,CAAC;YAAC;gBAAE,KAAKC;gBAAG,SAAS;YAAY;SAAE;QAEtD,IAAIC,eAAgBD,CAAAA,AAAM,QAANA,KAAaA,AAAM,QAANA,CAAQ,GACvC,OAAOD,IAAI,MAAM,CAAC;YAAC;gBAAE,KAAKC;gBAAG,SAAS;YAAO;SAAE;QAEjD,IAAIC,eAAgBD,CAAAA,AAAM,QAANA,KAAaA,AAAM,QAANA,CAAQ,GACvC,OAAOD,IAAI,MAAM,CAAC;YAAC;gBAAE,KAAKC;gBAAG,SAAS;YAAQ;SAAE;QAElD,OAAOD,IAAI,MAAM,CAAC;YAAC;gBAAE,KAAKC;YAAE;SAAE;IAChC,GAAG,EAAE;AACP;AAiSO,MAAeE,wBAAwBC,uBAAAA,iBAAiBA;IAC7D,IAAI,QAAqB;QACvB,OAAO;YACL,OAAO,OACLC,GACAC,GACAC,WACI;YACN,OAAO,OAAOC,QAAgBC,UAAoB;YAClD,MAAM,OAAOJ,GAAWC,KAAe;YACvC,MAAM,OACJI,MACAC,MACI;QACR;IACF;IAEA,IAAI,WAA2B;QAC7B,OAAO;YACL,MAAM,OAAOC,QAAkB;YAC/B,OAAO,OACLC,UAGI;QACR;IACF;IAEA,MAAM,WAAWC,OAAoB,EAAiB,CAAC;AAgBzD;AAEO,MAAMC,6BAA6B,CACxCC,OACwB;QACxBC,IAAAA,uBAAAA,eAAAA,AAAAA,EAAgB,OAAOC;YACrB,MAAMJ,UAAUI,MAAM,MAAM;YAC5BC,+BAAOL,SAAS;YAChB,MAAME,KAAK,KAAK,CAAC,KAAK,CAACF,QAAQ,MAAM,CAAC,EAAE,EAAEA,QAAQ,MAAM,CAAC,EAAE,EAAE;gBAC3D,QAAQ;YACV;QACF;QACAM,IAAAA,uBAAAA,sBAAAA,AAAAA,EAAuB,OAAOF;YAC5B,MAAMJ,UAAUI,MAAM,MAAM;YAC5BC,+BAAOL,SAAS;YAChB,MAAME,KAAK,KAAK,CAAC,KAAK,CAACF,QAAQ,MAAM,CAAC,EAAE,EAAEA,QAAQ,MAAM,CAAC,EAAE,EAAE;gBAC3D,QAAQ;YACV;QACF;QACAO,IAAAA,uBAAAA,uBAAAA,AAAAA,EAAwB,OAAOH;YAC7B,MAAMJ,UAAUI,MAAM,MAAM;YAC5BC,+BAAOL,SAAS;YAEhB,MAAME,KAAK,KAAK,CAAC,KAAK,CAACF,QAAQ,MAAM,CAAC,EAAE,EAAEA,QAAQ,MAAM,CAAC,EAAE,EAAE;gBAC3D,QAAQ;gBACR,OAAO;YACT;QACF;QACAQ,IAAAA,uBAAAA,iBAAAA,AAAAA,EAAkB,OAAOJ;YACvB,MAAMJ,UAAUI,MAAM,MAAM;YAC5BC,+BAAOL,SAAS;YAChB,MAAME,KAAK,KAAK,CAAC,IAAI,CAACF,QAAQ,MAAM,CAAC,EAAE,EAAEA,QAAQ,MAAM,CAAC,EAAE;QAC5D;QACAS,IAAAA,uBAAAA,iBAAAA,AAAAA,EAAkB,OAAOL;YACvB,MAAMJ,UAAUI,MAAM,MAAM;YAC5B,IAAIJ,WAAWI,AAAe,aAAfA,MAAM,IAAI,EACvB,MAAMF,KAAK,UAAU,CAACF;YAGxB,IAAII,AAAe,YAAfA,MAAM,IAAI,EAEZ;YAGF,IAAI,CAACA,SAAS,CAACA,MAAM,KAAK,EACxB;YAIF,MAAMF,KAAK,QAAQ,CAAC,IAAI,CAACE,MAAM,KAAK;QACtC;QACAM,IAAAA,uBAAAA,yBAAAA,AAAAA,EAA0B,OAAON;YAC/B,MAAMJ,UAAUI,MAAM,MAAM;YAC5B,IAAIJ,SACF,MAAME,KAAK,KAAK,CAAC,KAAK,CAACF,QAAQ,MAAM,CAAC,EAAE,EAAEA,QAAQ,MAAM,CAAC,EAAE,EAAE;gBAC3D,QAAQ;YACV;YAGF,MAAMf,OAAOD,eAAeoB,MAAM,OAAO;YACzC,MAAMF,KAAK,QAAQ,CAAC,KAAK,CAACjB;QAC5B;QACA0B,IAAAA,uBAAAA,kBAAAA,AAAAA,EAAmB,OAAOP;YACxB,MAAMJ,UAAUI,MAAM,MAAM;YAC5B,MAAMQ,gBAAgBZ,UAClB;gBACE,MAAMA,QAAQ,MAAM,CAAC,EAAE;gBACvB,KAAKA,QAAQ,MAAM,CAAC,EAAE;YACxB,IACAa;YACJ,MAAMC,oBAAoBV,QAAAA,QAAAA,KAAAA,IAAAA,MAAO,UAAU;YAC3C,IAAIU,AAAsB,eAAtBA,mBACF,MAAMZ,KAAK,cAAc,CAACU;iBACrB,IAAIE,AAAsB,kBAAtBA,mBACT,MAAMZ,KAAK,iBAAiB,CAACU;iBACxB,IAAIE,AAAsB,iBAAtBA,mBACT,MAAMZ,KAAK,gBAAgB,CAACU;iBACvB,IAAIE,AAAsB,gBAAtBA,mBACT,MAAMZ,KAAK,eAAe,CAACU;iBACtB,IAAIE,AAAsB,WAAtBA,qBAAiCA,mBAe1C,MAAM,IAAIC,MACR,CAAC,2BAA2B,EAAED,kBAAkB,SAAS,EAAEE,KAAK,SAAS,CACvEZ,QACC;iBAlBwD;gBAC7D,IAAIA,AAAAA,CAAAA,QAAAA,QAAAA,KAAAA,IAAAA,MAAO,SAAS,AAAD,MAAM,UAAWA,SAAUA,MAAM,SAAS,EAEtD,IAAIA,AAAoB,SAApBA,MAAM,SAAS,EACxB,MAAMF,KAAK,QAAQ,CAACE,MAAM,QAAQ,IAAIS,QAAWD;qBAC5C,IAAIR,AAAoB,WAApBA,MAAM,SAAS,EACxB,MAAMF,KAAK,UAAU,CAACE,MAAM,QAAQ,IAAIS,QAAWD;qBAC9C,IAAIR,AAAoB,YAApBA,MAAM,SAAS,EACxB,MAAMF,KAAK,WAAW,CAACE,MAAM,QAAQ,IAAIS,QAAWD;qBAEpD,MAAM,IAAIG,MAAM,CAAC,0BAA0B,EAAEX,MAAM,SAAS,EAAE;qBAR9D,MAAMF,KAAK,UAAU,CAACE,AAAAA,CAAAA,QAAAA,QAAAA,KAAAA,IAAAA,MAAO,QAAQ,AAAD,KAAKS,QAAWD;gBAWtD,MAAMK,AAAAA,IAAAA,sBAAAA,KAAAA,AAAAA,EAAM;YACd;QAOF;QACAC,IAAAA,uBAAAA,uBAAAA,AAAAA,EAAwB,OAAOd;YAC7B,MAAMR,OAAOQ,MAAM,IAAI;YACvB,MAAMP,KAAKO,MAAM,EAAE;YACnBC,+BAAOT,MAAM;YACbS,+BAAOR,IAAI;YACX,MAAMK,KAAK,KAAK,CAAC,IAAI,CACnB;gBACE,GAAGN,KAAK,MAAM,CAAC,EAAE;gBACjB,GAAGA,KAAK,MAAM,CAAC,EAAE;YACnB,GACA;gBACE,GAAGC,GAAG,MAAM,CAAC,EAAE;gBACf,GAAGA,GAAG,MAAM,CAAC,EAAE;YACjB;QAEJ;QAEAsB,IAAAA,uBAAAA,qBAAAA,AAAAA,EAAsB,OAAOf;YAC3B,MAAMJ,UAAUI,MAAM,MAAM;YAC5BC,+BAAOL,SAAS;YAChB,MAAMoB,WAAWhB,QAAAA,QAAAA,KAAAA,IAAAA,MAAO,QAAQ;YAChC,MAAMF,KAAK,SAAS,CAACF,QAAQ,MAAM,CAAC,EAAE,EAAEA,QAAQ,MAAM,CAAC,EAAE,EAAEoB;QAC7D;QAEAC,IAAAA,uBAAAA,iBAAAA,AAAAA,EAAkB,OAAOjB;YACvB,MAAM,EAAEkB,KAAK,EAAEC,MAAM,EAAE,GAAG,MAAMrB,KAAK,IAAI;YACzC,MAAM,EAAEsB,KAAK,EAAEC,GAAG,EAAE,GAAGrB;YAEvB,MAAMsB,aAAaF,QACf;gBACE,GAAGA,MAAM,MAAM,CAAC,EAAE;gBAClB,GAAGA,MAAM,MAAM,CAAC,EAAE;YACpB,IACA;gBACE,GAAGF,QAAQ;gBACX,GAAGC,SAAS;YACd;YAEJ,IAAII;YAKJ,IAAIF,KACFE,WAAW;gBACT,GAAGF,IAAI,MAAM,CAAC,EAAE;gBAChB,GAAGA,IAAI,MAAM,CAAC,EAAE;YAClB;iBACK,IAAIrB,MAAM,QAAQ,EAAE;gBACzB,MAAMwB,YAAYxB,MAAM,SAAS;gBACjC,IAAI,CAACwB,WACH,MAAM,IAAIb,MAAM;gBAGlBY,WAAW;oBACT,GACED,WAAW,CAAC,GACXE,CAAAA,AAAc,YAAdA,YACGxB,MAAM,QAAQ,GACdwB,AAAc,WAAdA,YACE,CAACxB,MAAM,QAAQ,GACf;oBACR,GACEsB,WAAW,CAAC,GACXE,CAAAA,AAAc,WAAdA,YACGxB,MAAM,QAAQ,GACdwB,AAAc,SAAdA,YACE,CAACxB,MAAM,QAAQ,GACf;gBACV;YACF,OACE,MAAM,IAAIW,MACR;YAKJY,SAAS,CAAC,GAAGE,KAAK,GAAG,CAAC,GAAGA,KAAK,GAAG,CAACF,SAAS,CAAC,EAAEL;YAC9CK,SAAS,CAAC,GAAGE,KAAK,GAAG,CAAC,GAAGA,KAAK,GAAG,CAACF,SAAS,CAAC,EAAEJ;YAE9C,MAAMH,WAAWhB,MAAM,QAAQ;YAE/BhC,MACE,CAAC,WAAW,EAAEsD,WAAW,CAAC,CAAC,EAAE,EAAEA,WAAW,CAAC,CAAC,IAAI,EAAEC,SAAS,CAAC,CAAC,EAAE,EAAEA,SAAS,CAAC,CAAC,eAAe,EAAEP,SAAS,qBAAqB,EAAEhB,MAAM,MAAM,EAAE;YAE7I,IAAI0B,SAAS,AAAwB,YAAxB,OAAO1B,MAAM,MAAM,GAAgBA,MAAM,MAAM,GAAG;YAC/D,IAAI0B,AAAW,MAAXA,QACFA,SAAS;YAEX,IAAK,IAAIC,IAAI,GAAGA,IAAID,QAAQC,IAC1B,MAAM7B,KAAK,KAAK,CAACwB,YAAYC,UAAUP;QAE3C;QAEAY,IAAAA,uBAAAA,sBAAAA,AAAAA,EAAuB,OAAO5B;YAC5B,MAAMJ,UAAUI,MAAM,MAAM;YAC5BC,+BAAOL,SAAS;YAChB,MAAME,KAAK,UAAU,CAACF;QACxB;KACD"}
|
|
1
|
+
{"version":3,"file":"web-page.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/web-page.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import assert from 'node:assert';\nimport type { Point } from '@midscene/core';\nimport { z } from '@midscene/core';\nimport {\n AbstractInterface,\n type DeviceAction,\n defineAction,\n defineActionClearInput,\n defineActionDoubleClick,\n defineActionDragAndDrop,\n defineActionHover,\n defineActionInput,\n defineActionKeyboardPress,\n defineActionLongPress,\n defineActionRightClick,\n defineActionScroll,\n defineActionSwipe,\n defineActionTap,\n} from '@midscene/core/device';\n\nimport { sleep } from '@midscene/core/utils';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { getDebug } from '@midscene/shared/logger';\nimport { transformHotkeyInput } from '@midscene/shared/us-keyboard-layout';\n\nconst debug = getDebug('web:page');\n\nfunction normalizeKeyInputs(value: string | string[]): string[] {\n const inputs = Array.isArray(value) ? value : [value];\n const result: string[] = [];\n\n for (const input of inputs) {\n if (typeof input !== 'string') {\n result.push(input as unknown as string);\n continue;\n }\n\n const trimmed = input.trim();\n if (!trimmed) {\n result.push(input);\n continue;\n }\n\n let normalized = trimmed;\n if (normalized.length > 1 && normalized.includes('+')) {\n normalized = normalized.replace(/\\s*\\+\\s*/g, ' ');\n }\n if (/\\s/.test(normalized)) {\n normalized = normalized.replace(/\\s+/g, ' ');\n }\n\n const transformed = transformHotkeyInput(normalized);\n if (transformed.length === 1 && transformed[0] === '' && trimmed !== '') {\n result.push(input);\n continue;\n }\n if (transformed.length === 0) {\n result.push(input);\n continue;\n }\n\n result.push(...transformed);\n }\n\n return result;\n}\n\nexport function getKeyCommands(\n value: string | string[],\n): Array<{ key: string; command?: string }> {\n const keys = normalizeKeyInputs(value);\n\n return keys.reduce((acc: Array<{ key: string; command?: string }>, k) => {\n const includeMeta = keys.includes('Meta') || keys.includes('Control');\n if (includeMeta && (k === 'a' || k === 'A')) {\n return acc.concat([{ key: k, command: 'SelectAll' }]);\n }\n if (includeMeta && (k === 'c' || k === 'C')) {\n return acc.concat([{ key: k, command: 'Copy' }]);\n }\n if (includeMeta && (k === 'v' || k === 'V')) {\n return acc.concat([{ key: k, command: 'Paste' }]);\n }\n return acc.concat([{ key: k }]);\n }, []);\n}\n\n// this is copied from puppeteer, but we don't want to import puppeteer here\nexport declare type KeyInput =\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'Power'\n | 'Eject'\n | 'Abort'\n | 'Help'\n | 'Backspace'\n | 'Tab'\n | 'Numpad5'\n | 'NumpadEnter'\n | 'Enter'\n | '\\r'\n | '\\n'\n | 'ShiftLeft'\n | 'ShiftRight'\n | 'ControlLeft'\n | 'ControlRight'\n | 'AltLeft'\n | 'AltRight'\n | 'Pause'\n | 'CapsLock'\n | 'Escape'\n | 'Convert'\n | 'NonConvert'\n | 'Space'\n | 'Numpad9'\n | 'PageUp'\n | 'Numpad3'\n | 'PageDown'\n | 'End'\n | 'Numpad1'\n | 'Home'\n | 'Numpad7'\n | 'ArrowLeft'\n | 'Numpad4'\n | 'Numpad8'\n | 'ArrowUp'\n | 'ArrowRight'\n | 'Numpad6'\n | 'Numpad2'\n | 'ArrowDown'\n | 'Select'\n | 'Open'\n | 'PrintScreen'\n | 'Insert'\n | 'Numpad0'\n | 'Delete'\n | 'NumpadDecimal'\n | 'Digit0'\n | 'Digit1'\n | 'Digit2'\n | 'Digit3'\n | 'Digit4'\n | 'Digit5'\n | 'Digit6'\n | 'Digit7'\n | 'Digit8'\n | 'Digit9'\n | 'KeyA'\n | 'KeyB'\n | 'KeyC'\n | 'KeyD'\n | 'KeyE'\n | 'KeyF'\n | 'KeyG'\n | 'KeyH'\n | 'KeyI'\n | 'KeyJ'\n | 'KeyK'\n | 'KeyL'\n | 'KeyM'\n | 'KeyN'\n | 'KeyO'\n | 'KeyP'\n | 'KeyQ'\n | 'KeyR'\n | 'KeyS'\n | 'KeyT'\n | 'KeyU'\n | 'KeyV'\n | 'KeyW'\n | 'KeyX'\n | 'KeyY'\n | 'KeyZ'\n | 'MetaLeft'\n | 'MetaRight'\n | 'ContextMenu'\n | 'NumpadMultiply'\n | 'NumpadAdd'\n | 'NumpadSubtract'\n | 'NumpadDivide'\n | 'F1'\n | 'F2'\n | 'F3'\n | 'F4'\n | 'F5'\n | 'F6'\n | 'F7'\n | 'F8'\n | 'F9'\n | 'F10'\n | 'F11'\n | 'F12'\n | 'F13'\n | 'F14'\n | 'F15'\n | 'F16'\n | 'F17'\n | 'F18'\n | 'F19'\n | 'F20'\n | 'F21'\n | 'F22'\n | 'F23'\n | 'F24'\n | 'NumLock'\n | 'ScrollLock'\n | 'AudioVolumeMute'\n | 'AudioVolumeDown'\n | 'AudioVolumeUp'\n | 'MediaTrackNext'\n | 'MediaTrackPrevious'\n | 'MediaStop'\n | 'MediaPlayPause'\n | 'Semicolon'\n | 'Equal'\n | 'NumpadEqual'\n | 'Comma'\n | 'Minus'\n | 'Period'\n | 'Slash'\n | 'Backquote'\n | 'BracketLeft'\n | 'Backslash'\n | 'BracketRight'\n | 'Quote'\n | 'AltGraph'\n | 'Props'\n | 'Cancel'\n | 'Clear'\n | 'Shift'\n | 'Control'\n | 'Alt'\n | 'Accept'\n | 'ModeChange'\n | ' '\n | 'Print'\n | 'Execute'\n | '\\u0000'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'l'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n | 'Meta'\n | '*'\n | '+'\n | '-'\n | '/'\n | ';'\n | '='\n | ','\n | '.'\n | '`'\n | '['\n | '\\\\'\n | ']'\n | \"'\"\n | 'Attn'\n | 'CrSel'\n | 'ExSel'\n | 'EraseEof'\n | 'Play'\n | 'ZoomOut'\n | ')'\n | '!'\n | '@'\n | '#'\n | '$'\n | '%'\n | '^'\n | '&'\n | '('\n | 'A'\n | 'B'\n | 'C'\n | 'D'\n | 'E'\n | 'F'\n | 'G'\n | 'H'\n | 'I'\n | 'J'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'O'\n | 'P'\n | 'Q'\n | 'R'\n | 'S'\n | 'T'\n | 'U'\n | 'V'\n | 'W'\n | 'X'\n | 'Y'\n | 'Z'\n | ':'\n | '<'\n | '_'\n | '>'\n | '?'\n | '~'\n | '{'\n | '|'\n | '}'\n | '\"'\n | 'SoftLeft'\n | 'SoftRight'\n | 'Camera'\n | 'Call'\n | 'EndCall'\n | 'VolumeDown'\n | 'VolumeUp';\n\nexport type MouseButton = 'left' | 'right' | 'middle';\n\nexport interface MouseAction {\n click: (\n x: number,\n y: number,\n options: { button: MouseButton; count?: number },\n ) => Promise<void>;\n wheel: (deltaX: number, deltaY: number) => Promise<void>;\n move: (x: number, y: number) => Promise<void>;\n drag: (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => Promise<void>;\n}\n\nexport interface KeyboardAction {\n type: (text: string) => Promise<void>;\n press: (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => Promise<void>;\n}\n\nexport interface ChromePageDestroyOptions {\n closeTab?: boolean; // should close the tab when the page object is destroyed\n}\n\nexport abstract class AbstractWebPage extends AbstractInterface {\n navigate?(url: string): Promise<void>;\n reload?(): Promise<void>;\n goBack?(): Promise<void>;\n\n get mouse(): MouseAction {\n return {\n click: async (\n x: number,\n y: number,\n options: { button: MouseButton },\n ) => {},\n wheel: async (deltaX: number, deltaY: number) => {},\n move: async (x: number, y: number) => {},\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {},\n };\n }\n\n get keyboard(): KeyboardAction {\n return {\n type: async (text: string) => {},\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {},\n };\n }\n\n async clearInput(element: ElementInfo): Promise<void> {}\n\n abstract scrollUntilTop(startingPoint?: Point): Promise<void>;\n abstract scrollUntilBottom(startingPoint?: Point): Promise<void>;\n abstract scrollUntilLeft(startingPoint?: Point): Promise<void>;\n abstract scrollUntilRight(startingPoint?: Point): Promise<void>;\n abstract scrollUp(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollDown(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollLeft(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollRight(distance?: number, startingPoint?: Point): Promise<void>;\n abstract longPress(x: number, y: number, duration?: number): Promise<void>;\n abstract swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ): Promise<void>;\n}\n\nexport const commonWebActionsForWebPage = <T extends AbstractWebPage>(\n page: T,\n includeTouchEvents = false,\n): DeviceAction<any>[] => [\n defineActionTap(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot tap');\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }),\n defineActionRightClick(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot right click');\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'right',\n });\n }),\n defineActionDoubleClick(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot double click');\n\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n count: 2,\n });\n }),\n defineActionHover(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot hover');\n await page.mouse.move(element.center[0], element.center[1]);\n }),\n defineActionInput(async (param) => {\n const element = param.locate;\n if (element && param.mode !== 'append') {\n await page.clearInput(element as unknown as ElementInfo);\n }\n\n if (param.mode === 'clear') {\n // Clear mode removes existing text without entering new characters\n return;\n }\n\n if (!param || !param.value) {\n return;\n }\n\n // Note: there is another implementation in AndroidDevicePage, which is more complex\n await page.keyboard.type(param.value);\n }),\n defineActionKeyboardPress(async (param) => {\n const element = param.locate;\n if (element) {\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }\n\n const keys = getKeyCommands(param.keyName);\n await page.keyboard.press(keys as any); // TODO: fix this type error\n }),\n defineActionScroll(async (param) => {\n const element = param.locate;\n const startingPoint = element\n ? {\n left: element.center[0],\n top: element.center[1],\n }\n : undefined;\n const scrollToEventName = param?.scrollType;\n if (scrollToEventName === 'scrollToTop') {\n await page.scrollUntilTop(startingPoint);\n } else if (scrollToEventName === 'scrollToBottom') {\n await page.scrollUntilBottom(startingPoint);\n } else if (scrollToEventName === 'scrollToRight') {\n await page.scrollUntilRight(startingPoint);\n } else if (scrollToEventName === 'scrollToLeft') {\n await page.scrollUntilLeft(startingPoint);\n } else if (scrollToEventName === 'singleAction' || !scrollToEventName) {\n if (param?.direction === 'down' || !param || !param.direction) {\n await page.scrollDown(param?.distance || undefined, startingPoint);\n } else if (param.direction === 'up') {\n await page.scrollUp(param.distance || undefined, startingPoint);\n } else if (param.direction === 'left') {\n await page.scrollLeft(param.distance || undefined, startingPoint);\n } else if (param.direction === 'right') {\n await page.scrollRight(param.distance || undefined, startingPoint);\n } else {\n throw new Error(`Unknown scroll direction: ${param.direction}`);\n }\n // until mouse event is done\n await sleep(500);\n } else {\n throw new Error(\n `Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(\n param,\n )}`,\n );\n }\n }),\n defineActionDragAndDrop(async (param) => {\n const from = param.from;\n const to = param.to;\n assert(from, 'missing \"from\" param for drag and drop');\n assert(to, 'missing \"to\" param for drag and drop');\n await page.mouse.drag(\n {\n x: from.center[0],\n y: from.center[1],\n },\n {\n x: to.center[0],\n y: to.center[1],\n },\n );\n }),\n\n defineActionLongPress(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot long press');\n const duration = param?.duration;\n await page.longPress(element.center[0], element.center[1], duration);\n }),\n\n ...(includeTouchEvents\n ? [\n defineActionSwipe(async (param) => {\n const { width, height } = await page.size();\n const { start, end } = param;\n\n const startPoint = start\n ? {\n x: start.center[0],\n y: start.center[1],\n }\n : {\n x: width / 2,\n y: height / 2,\n };\n\n let endPoint: {\n x: number;\n y: number;\n };\n\n if (end) {\n endPoint = {\n x: end.center[0],\n y: end.center[1],\n };\n } else if (param.distance) {\n const direction = param.direction;\n if (!direction) {\n throw new Error('direction is required for swipe gesture');\n }\n\n endPoint = {\n x:\n startPoint.x +\n (direction === 'right'\n ? param.distance\n : direction === 'left'\n ? -param.distance\n : 0),\n y:\n startPoint.y +\n (direction === 'down'\n ? param.distance\n : direction === 'up'\n ? -param.distance\n : 0),\n };\n } else {\n throw new Error(\n 'Either end or distance must be specified for swipe gesture',\n );\n }\n\n // Ensure end coordinates are within bounds\n endPoint.x = Math.max(0, Math.min(endPoint.x, width));\n endPoint.y = Math.max(0, Math.min(endPoint.y, height));\n\n const duration = param.duration;\n\n debug(\n `swipe from ${startPoint.x}, ${startPoint.y} to ${endPoint.x}, ${endPoint.y} with duration ${duration}ms, repeat is set to ${param.repeat}`,\n );\n let repeat = typeof param.repeat === 'number' ? param.repeat : 1;\n if (repeat === 0) {\n repeat = 10; // 10 times is enough for infinite swipe\n }\n for (let i = 0; i < repeat; i++) {\n await page.swipe(startPoint, endPoint, duration);\n }\n }),\n ]\n : []),\n\n defineActionClearInput(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot clear input');\n await page.clearInput(element as unknown as ElementInfo);\n }),\n\n defineAction({\n name: 'Navigate',\n description:\n 'Navigate the browser to a specified URL. Opens the URL in the current tab.',\n paramSchema: z.object({\n url: z.string().describe('The URL to navigate to'),\n }),\n call: async (param) => {\n if (!page.navigate) {\n throw new Error(\n 'Navigate operation is not supported on this page type',\n );\n }\n await page.navigate(param.url);\n },\n }),\n\n defineAction({\n name: 'Reload',\n description: 'Reload the current page',\n call: async () => {\n if (!page.reload) {\n throw new Error('Reload operation is not supported on this page type');\n }\n await page.reload();\n },\n }),\n\n defineAction({\n name: 'GoBack',\n description: 'Navigate back in browser history',\n call: async () => {\n if (!page.goBack) {\n throw new Error('GoBack operation is not supported on this page type');\n }\n await page.goBack();\n },\n }),\n];\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debug","getDebug","normalizeKeyInputs","value","inputs","Array","result","input","trimmed","normalized","transformed","transformHotkeyInput","getKeyCommands","keys","acc","k","includeMeta","AbstractWebPage","AbstractInterface","x","y","options","deltaX","deltaY","from","to","text","action","element","commonWebActionsForWebPage","page","includeTouchEvents","defineActionTap","param","assert","defineActionRightClick","defineActionDoubleClick","defineActionHover","defineActionInput","defineActionKeyboardPress","defineActionScroll","startingPoint","undefined","scrollToEventName","Error","JSON","sleep","defineActionDragAndDrop","defineActionLongPress","duration","defineActionSwipe","width","height","start","end","startPoint","endPoint","direction","Math","repeat","i","defineActionClearInput","defineAction","z"],"mappings":"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"}
|
|
@@ -4,10 +4,31 @@ import type { ExtensionBridgePageBrowserSide } from './page-browser-side';
|
|
|
4
4
|
interface ChromeExtensionPageCliSide extends ExtensionBridgePageBrowserSide {
|
|
5
5
|
showStatusMessage: (message: string) => Promise<void>;
|
|
6
6
|
}
|
|
7
|
-
export declare const getBridgePageInCliSide: (
|
|
7
|
+
export declare const getBridgePageInCliSide: (options?: {
|
|
8
|
+
host?: string;
|
|
9
|
+
port?: number;
|
|
10
|
+
timeout?: number | false;
|
|
11
|
+
closeConflictServer?: boolean;
|
|
12
|
+
}) => ChromeExtensionPageCliSide;
|
|
8
13
|
export declare class AgentOverChromeBridge extends Agent<ChromeExtensionPageCliSide> {
|
|
9
14
|
private destroyAfterDisconnectFlag?;
|
|
10
15
|
constructor(opts?: AgentOpt & {
|
|
16
|
+
/**
|
|
17
|
+
* Enable remote access to the bridge server.
|
|
18
|
+
* - false (default): Only localhost can connect (most secure)
|
|
19
|
+
* - true: Allow remote machines to connect (binds to 0.0.0.0)
|
|
20
|
+
*/
|
|
21
|
+
allowRemoteAccess?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Custom host to bind the bridge server to.
|
|
24
|
+
* Overrides allowRemoteAccess if specified.
|
|
25
|
+
*/
|
|
26
|
+
host?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Custom port for the bridge server.
|
|
29
|
+
* @default 3766
|
|
30
|
+
*/
|
|
31
|
+
port?: number;
|
|
11
32
|
closeNewTabsAfterDisconnect?: boolean;
|
|
12
33
|
serverListeningTimeout?: number | false;
|
|
13
34
|
closeConflictServer?: boolean;
|
|
@@ -22,7 +43,7 @@ export declare class AgentOverChromeBridge extends Agent<ChromeExtensionPageCliS
|
|
|
22
43
|
}[]>;
|
|
23
44
|
setActiveTabId(tabId: string): Promise<void>;
|
|
24
45
|
connectCurrentTab(options?: BridgeConnectTabOptions): Promise<void>;
|
|
25
|
-
|
|
46
|
+
aiAct(prompt: string, options?: any): Promise<{
|
|
26
47
|
result: Record<string, any>;
|
|
27
48
|
} | {
|
|
28
49
|
yamlFlow?: import("@midscene/core").MidsceneYamlFlowItem[];
|
|
@@ -1,6 +1,15 @@
|
|
|
1
|
+
export declare const DefaultBridgeServerHost = "127.0.0.1";
|
|
1
2
|
export declare const DefaultBridgeServerPort = 3766;
|
|
2
3
|
export declare const DefaultLocalEndpoint = "http://127.0.0.1:3766";
|
|
3
4
|
export declare const BridgeCallTimeout = 30000;
|
|
5
|
+
/**
|
|
6
|
+
* Get the server host based on configuration options.
|
|
7
|
+
* Priority: explicit host > allowRemoteAccess > default (127.0.0.1)
|
|
8
|
+
*/
|
|
9
|
+
export declare function getBridgeServerHost(options?: {
|
|
10
|
+
host?: string;
|
|
11
|
+
allowRemoteAccess?: boolean;
|
|
12
|
+
}): string;
|
|
4
13
|
export declare enum BridgeEvent {
|
|
5
14
|
Call = "bridge-call",
|
|
6
15
|
CallResponse = "bridge-call-response",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type BridgeCall } from './common';
|
|
2
|
-
export declare const killRunningServer: (port?: number) => Promise<void>;
|
|
2
|
+
export declare const killRunningServer: (port?: number, host?: string) => Promise<void>;
|
|
3
3
|
export declare class BridgeServer {
|
|
4
|
+
host: string;
|
|
4
5
|
port: number;
|
|
5
6
|
onConnect?: (() => void) | undefined;
|
|
6
7
|
onDisconnect?: ((reason: string) => void) | undefined;
|
|
@@ -14,7 +15,7 @@ export declare class BridgeServer {
|
|
|
14
15
|
calls: Record<string, BridgeCall>;
|
|
15
16
|
private connectionLost;
|
|
16
17
|
private connectionLostReason;
|
|
17
|
-
constructor(port: number, onConnect?: (() => void) | undefined, onDisconnect?: ((reason: string) => void) | undefined, closeConflictServer?: boolean | undefined);
|
|
18
|
+
constructor(host: string, port: number, onConnect?: (() => void) | undefined, onDisconnect?: ((reason: string) => void) | undefined, closeConflictServer?: boolean | undefined);
|
|
18
19
|
listen(opts?: {
|
|
19
20
|
timeout?: number | false;
|
|
20
21
|
}): Promise<void>;
|