@midscene/web 1.8.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/lib/cli.js CHANGED
@@ -42,7 +42,7 @@ Promise.resolve().then(()=>{
42
42
  return (0, cli_namespaceObject.runToolsCLI)(tools, 'midscene-web', {
43
43
  stripPrefix: 'web_',
44
44
  argv: parsedOptions.argv,
45
- version: "1.8.0",
45
+ version: "1.8.1",
46
46
  extraCommands: (0, core_namespaceObject.createReportCliCommands)()
47
47
  });
48
48
  }).catch((e)=>{
@@ -37,7 +37,7 @@ class WebMCPServer extends mcp_namespaceObject.BaseMCPServer {
37
37
  constructor(toolsManager){
38
38
  super({
39
39
  name: '@midscene/web-bridge-mcp',
40
- version: "1.8.0",
40
+ version: "1.8.1",
41
41
  description: 'Control the browser using natural language commands'
42
42
  }, toolsManager);
43
43
  }
@@ -43,32 +43,9 @@ const ThrowNotImplemented = (methodName)=>{
43
43
  };
44
44
  class StaticPage {
45
45
  actionSpace() {
46
- return [
47
- (0, device_namespaceObject.defineActionTap)(async (param)=>{
48
- ThrowNotImplemented('Tap');
49
- }),
50
- (0, device_namespaceObject.defineActionRightClick)(async (param)=>{
51
- ThrowNotImplemented('RightClick');
52
- }),
53
- (0, device_namespaceObject.defineActionHover)(async (param)=>{
54
- ThrowNotImplemented('Hover');
55
- }),
56
- (0, device_namespaceObject.defineActionInput)(async (param)=>{
57
- ThrowNotImplemented('Input');
58
- }),
59
- (0, device_namespaceObject.defineActionKeyboardPress)(async (param)=>{
60
- ThrowNotImplemented('KeyboardPress');
61
- }),
62
- (0, device_namespaceObject.defineActionScroll)(async (param)=>{
63
- ThrowNotImplemented('Scroll');
64
- }),
65
- (0, device_namespaceObject.defineActionDragAndDrop)(async (param)=>{
66
- ThrowNotImplemented('DragAndDrop');
67
- }),
68
- (0, device_namespaceObject.defineActionSwipe)(async (param)=>{
69
- ThrowNotImplemented('Swipe');
70
- })
71
- ];
46
+ return (0, device_namespaceObject.defineActionsFromInputPrimitives)(this.inputPrimitives, {
47
+ size: ()=>this.size()
48
+ });
72
49
  }
73
50
  async evaluateJavaScript(script) {
74
51
  return ThrowNotImplemented('evaluateJavaScript');
@@ -132,6 +109,25 @@ class StaticPage {
132
109
  constructor(uiContext){
133
110
  _define_property(this, "interfaceType", 'static');
134
111
  _define_property(this, "uiContext", void 0);
112
+ _define_property(this, "inputPrimitives", {
113
+ pointer: {
114
+ tap: async ()=>ThrowNotImplemented('Tap'),
115
+ rightClick: async ()=>ThrowNotImplemented('RightClick'),
116
+ hover: async ()=>ThrowNotImplemented('Hover'),
117
+ dragAndDrop: async ()=>ThrowNotImplemented('DragAndDrop')
118
+ },
119
+ keyboard: {
120
+ typeText: async ()=>ThrowNotImplemented('Input'),
121
+ keyboardPress: async ()=>ThrowNotImplemented('KeyboardPress'),
122
+ clearInput: async ()=>ThrowNotImplemented('ClearInput')
123
+ },
124
+ touch: {
125
+ swipe: async ()=>ThrowNotImplemented('Swipe')
126
+ },
127
+ scroll: {
128
+ scroll: async ()=>ThrowNotImplemented('Scroll')
129
+ }
130
+ });
135
131
  _define_property(this, "mouse", {
136
132
  click: ThrowNotImplemented.bind(null, 'mouse.click'),
137
133
  wheel: ThrowNotImplemented.bind(null, 'mouse.wheel'),
@@ -1 +1 @@
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 defineActionSwipe,\n defineActionTap,\n} from '@midscene/core/device';\nimport { ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED } from '@midscene/shared/common';\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\ntype StaticPageUIContext = Omit<UIContext, 'deprecatedDpr'>;\n\nexport default class StaticPage implements AbstractInterface {\n interfaceType = 'static';\n\n private uiContext: StaticPageUIContext;\n\n constructor(uiContext: StaticPageUIContext) {\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 defineActionSwipe(async (param) => {\n ThrowNotImplemented('Swipe');\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.shotSize\n };\n }\n\n async screenshotBase64() {\n const screenshot = this.uiContext.screenshot;\n if (typeof screenshot === 'object' && 'base64' in screenshot) {\n return (screenshot as { base64: string }).base64;\n }\n return screenshot as unknown as string;\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 updateContext(newContext: StaticPageUIContext): 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","defineActionSwipe","script","point","xpath","screenshot","Promise","startingPoint","distance","newContext","uiContext"],"mappings":"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"}
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 type InputPrimitives,\n defineActionsFromInputPrimitives,\n} from '@midscene/core/device';\nimport { ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED } from '@midscene/shared/common';\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\ntype StaticPageUIContext = Omit<UIContext, 'deprecatedDpr'>;\n\nexport default class StaticPage implements AbstractInterface {\n interfaceType = 'static';\n\n private uiContext: StaticPageUIContext;\n readonly inputPrimitives: InputPrimitives = {\n pointer: {\n tap: async () => ThrowNotImplemented('Tap'),\n rightClick: async () => ThrowNotImplemented('RightClick'),\n hover: async () => ThrowNotImplemented('Hover'),\n dragAndDrop: async () => ThrowNotImplemented('DragAndDrop'),\n },\n keyboard: {\n typeText: async () => ThrowNotImplemented('Input'),\n keyboardPress: async () => ThrowNotImplemented('KeyboardPress'),\n clearInput: async () => ThrowNotImplemented('ClearInput'),\n },\n touch: {\n swipe: async () => ThrowNotImplemented('Swipe'),\n },\n scroll: {\n scroll: async () => ThrowNotImplemented('Scroll'),\n },\n };\n\n constructor(uiContext: StaticPageUIContext) {\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 defineActionsFromInputPrimitives(this.inputPrimitives, {\n size: () => this.size(),\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.shotSize,\n };\n }\n\n async screenshotBase64() {\n const screenshot = this.uiContext.screenshot;\n if (typeof screenshot === 'object' && 'base64' in screenshot) {\n return (screenshot as { base64: string }).base64;\n }\n return screenshot as unknown as string;\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 updateContext(newContext: StaticPageUIContext): 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","defineActionsFromInputPrimitives","script","point","xpath","screenshot","Promise","startingPoint","distance","newContext","uiContext"],"mappings":"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"}
@@ -1,14 +1,5 @@
1
1
  "use strict";
2
2
  var __webpack_require__ = {};
3
- (()=>{
4
- __webpack_require__.n = (module)=>{
5
- var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
- __webpack_require__.d(getter, {
7
- a: getter
8
- });
9
- return getter;
10
- };
11
- })();
12
3
  (()=>{
13
4
  __webpack_require__.d = (exports1, definition)=>{
14
5
  for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
@@ -35,16 +26,13 @@ __webpack_require__.r(__webpack_exports__);
35
26
  __webpack_require__.d(__webpack_exports__, {
36
27
  commonWebActionsForWebPage: ()=>commonWebActionsForWebPage,
37
28
  getKeyCommands: ()=>getKeyCommands,
38
- AbstractWebPage: ()=>AbstractWebPage
29
+ AbstractWebPage: ()=>AbstractWebPage,
30
+ createWebInputPrimitives: ()=>createWebInputPrimitives
39
31
  });
40
- const external_node_assert_namespaceObject = require("node:assert");
41
- var external_node_assert_default = /*#__PURE__*/ __webpack_require__.n(external_node_assert_namespaceObject);
42
32
  const core_namespaceObject = require("@midscene/core");
43
33
  const device_namespaceObject = require("@midscene/core/device");
44
34
  const utils_namespaceObject = require("@midscene/core/utils");
45
- const logger_namespaceObject = require("@midscene/shared/logger");
46
35
  const us_keyboard_layout_namespaceObject = require("@midscene/shared/us-keyboard-layout");
47
- const debug = (0, logger_namespaceObject.getDebug)('web:page');
48
36
  const navigateParamSchema = core_namespaceObject.z.object({
49
37
  url: core_namespaceObject.z.string().describe('The URL to navigate to. Must start with https://, file://, or a similar protocol.')
50
38
  });
@@ -125,152 +113,117 @@ class AbstractWebPage extends device_namespaceObject.AbstractInterface {
125
113
  }
126
114
  async clearInput(element) {}
127
115
  }
128
- const commonWebActionsForWebPage = (page, includeTouchEvents = false)=>[
129
- (0, device_namespaceObject.defineActionTap)(async (param)=>{
130
- const element = param.locate;
131
- external_node_assert_default()(element, 'Element not found, cannot tap');
132
- await page.mouse.click(element.center[0], element.center[1], {
133
- button: 'left'
134
- });
135
- }),
136
- (0, device_namespaceObject.defineActionRightClick)(async (param)=>{
137
- const element = param.locate;
138
- external_node_assert_default()(element, 'Element not found, cannot right click');
139
- await page.mouse.click(element.center[0], element.center[1], {
140
- button: 'right'
141
- });
142
- }),
143
- (0, device_namespaceObject.defineActionDoubleClick)(async (param)=>{
144
- const element = param.locate;
145
- external_node_assert_default()(element, 'Element not found, cannot double click');
146
- await page.mouse.click(element.center[0], element.center[1], {
147
- button: 'left',
148
- count: 2
149
- });
150
- }),
151
- (0, device_namespaceObject.defineActionHover)(async (param)=>{
152
- const element = param.locate;
153
- external_node_assert_default()(element, 'Element not found, cannot hover');
154
- await page.mouse.move(element.center[0], element.center[1]);
155
- }),
156
- (0, device_namespaceObject.defineActionInput)(async (param)=>{
157
- const element = param.locate;
158
- if (element && 'typeOnly' !== param.mode) await page.clearInput(element);
159
- else if (element && 'typeOnly' === param.mode) {
160
- await page.mouse.click(element.center[0], element.center[1], {
116
+ function createWebInputPrimitives(page) {
117
+ return {
118
+ pointer: {
119
+ tap: async ({ x, y })=>{
120
+ await page.mouse.click(x, y, {
161
121
  button: 'left'
162
122
  });
163
- await page.keyboard.press([
164
- {
165
- key: 'End'
166
- }
167
- ]);
123
+ },
124
+ rightClick: async ({ x, y })=>{
125
+ await page.mouse.click(x, y, {
126
+ button: 'right'
127
+ });
128
+ },
129
+ doubleClick: async ({ x, y })=>{
130
+ await page.mouse.click(x, y, {
131
+ button: 'left',
132
+ count: 2
133
+ });
134
+ },
135
+ hover: async ({ x, y })=>{
136
+ await page.mouse.move(x, y);
137
+ },
138
+ dragAndDrop: async (from, to)=>{
139
+ await page.mouse.drag(from, to);
140
+ },
141
+ longPress: async ({ x, y }, opts)=>{
142
+ await page.longPress(x, y, opts?.duration);
168
143
  }
169
- if ('clear' === param.mode) return;
170
- if (!param || !param.value) return;
171
- await page.keyboard.type(param.value);
172
- await page.flushPendingVisualUpdate?.();
173
- }),
174
- (0, device_namespaceObject.defineActionKeyboardPress)(async (param)=>{
175
- const element = param.locate;
176
- if (element) await page.mouse.click(element.center[0], element.center[1], {
177
- button: 'left'
178
- });
179
- const keys = getKeyCommands(param.keyName);
180
- await page.keyboard.press(keys);
181
- await page.flushPendingVisualUpdate?.();
182
- }),
183
- (0, device_namespaceObject.defineActionCursorMove)(async (param)=>{
184
- const arrowKey = 'left' === param.direction ? 'ArrowLeft' : 'ArrowRight';
185
- const times = param.times ?? 1;
186
- for(let i = 0; i < times; i++){
187
- await page.keyboard.press([
188
- {
189
- key: arrowKey
190
- }
191
- ]);
192
- await (0, utils_namespaceObject.sleep)(100);
144
+ },
145
+ keyboard: {
146
+ typeText: async (value, opts)=>{
147
+ const element = opts?.target;
148
+ if (element && opts?.replace !== false) await page.clearInput(element);
149
+ else if (element) {
150
+ const target = element;
151
+ await page.mouse.click(target.center[0], target.center[1], {
152
+ button: 'left'
153
+ });
154
+ await page.keyboard.press([
155
+ {
156
+ key: 'End'
157
+ }
158
+ ]);
159
+ }
160
+ if (opts?.focusOnly) return;
161
+ await page.keyboard.type(value);
162
+ await page.flushPendingVisualUpdate?.();
163
+ },
164
+ keyboardPress: async (keyName, opts)=>{
165
+ const element = opts?.target;
166
+ if (element) await page.mouse.click(element.center[0], element.center[1], {
167
+ button: 'left'
168
+ });
169
+ const keys = getKeyCommands(keyName);
170
+ await page.keyboard.press(keys);
171
+ await page.flushPendingVisualUpdate?.();
172
+ },
173
+ cursorMove: async (direction, times = 1)=>{
174
+ const arrowKey = 'left' === direction ? 'ArrowLeft' : 'ArrowRight';
175
+ for(let i = 0; i < times; i++){
176
+ await page.keyboard.press([
177
+ {
178
+ key: arrowKey
179
+ }
180
+ ]);
181
+ await (0, utils_namespaceObject.sleep)(100);
182
+ }
183
+ },
184
+ clearInput: async (target)=>{
185
+ await page.clearInput(target);
193
186
  }
194
- }),
195
- (0, device_namespaceObject.defineActionScroll)(async (param)=>{
196
- const element = param.locate;
197
- const startingPoint = element ? {
198
- left: element.center[0],
199
- top: element.center[1]
200
- } : void 0;
201
- const scrollToEventName = param?.scrollType;
202
- if ('scrollToTop' === scrollToEventName) await page.scrollUntilTop(startingPoint);
203
- else if ('scrollToBottom' === scrollToEventName) await page.scrollUntilBottom(startingPoint);
204
- else if ('scrollToRight' === scrollToEventName) await page.scrollUntilRight(startingPoint);
205
- else if ('scrollToLeft' === scrollToEventName) await page.scrollUntilLeft(startingPoint);
206
- else if ('singleAction' !== scrollToEventName && scrollToEventName) throw new Error(`Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(param)}`);
207
- else {
208
- if (param?.direction !== 'down' && param && param.direction) if ('up' === param.direction) await page.scrollUp(param.distance || void 0, startingPoint);
209
- else if ('left' === param.direction) await page.scrollLeft(param.distance || void 0, startingPoint);
210
- else if ('right' === param.direction) await page.scrollRight(param.distance || void 0, startingPoint);
211
- else throw new Error(`Unknown scroll direction: ${param.direction}`);
212
- else await page.scrollDown(param?.distance || void 0, startingPoint);
213
- await (0, utils_namespaceObject.sleep)(500);
187
+ },
188
+ touch: {
189
+ pinch: async ({ x, y }, opts)=>{
190
+ await page.pinch(x, y, opts.startDistance, opts.endDistance, opts.duration);
191
+ },
192
+ swipe: async (from, to, opts)=>{
193
+ await page.swipe(from, to, opts?.duration);
214
194
  }
215
- }),
216
- (0, device_namespaceObject.defineActionDragAndDrop)(async (param)=>{
217
- const from = param.from;
218
- const to = param.to;
219
- external_node_assert_default()(from, 'missing "from" param for drag and drop');
220
- external_node_assert_default()(to, 'missing "to" param for drag and drop');
221
- await page.mouse.drag({
222
- x: from.center[0],
223
- y: from.center[1]
224
- }, {
225
- x: to.center[0],
226
- y: to.center[1]
227
- });
228
- }),
229
- (0, device_namespaceObject.defineActionLongPress)(async (param)=>{
230
- const element = param.locate;
231
- external_node_assert_default()(element, 'Element not found, cannot long press');
232
- const duration = param?.duration;
233
- await page.longPress(element.center[0], element.center[1], duration);
234
- }),
235
- (0, device_namespaceObject.defineActionPinch)(async (param)=>{
236
- const { centerX, centerY, startDistance, endDistance, duration } = (0, device_namespaceObject.normalizePinchParam)(param, await page.size());
237
- await page.pinch(centerX, centerY, startDistance, endDistance, duration);
238
- }),
239
- ...includeTouchEvents ? [
240
- (0, device_namespaceObject.defineActionSwipe)(async (param)=>{
241
- const { width, height } = await page.size();
242
- const { start, end } = param;
243
- const startPoint = start ? {
244
- x: start.center[0],
245
- y: start.center[1]
246
- } : {
247
- x: width / 2,
248
- y: height / 2
249
- };
250
- let endPoint;
251
- if (end) endPoint = {
252
- x: end.center[0],
253
- y: end.center[1]
254
- };
255
- else if (param.distance) {
256
- const direction = param.direction;
257
- if (!direction) throw new Error('direction is required for swipe gesture');
258
- endPoint = {
259
- x: startPoint.x + ('right' === direction ? param.distance : 'left' === direction ? -param.distance : 0),
260
- y: startPoint.y + ('down' === direction ? param.distance : 'up' === direction ? -param.distance : 0)
261
- };
262
- } else throw new Error('Either end or distance must be specified for swipe gesture');
263
- endPoint.x = Math.max(0, Math.min(endPoint.x, width));
264
- endPoint.y = Math.max(0, Math.min(endPoint.y, height));
265
- const duration = param.duration;
266
- debug(`swipe from ${startPoint.x}, ${startPoint.y} to ${endPoint.x}, ${endPoint.y} with duration ${duration}ms, repeat is set to ${param.repeat}`);
267
- let repeat = 'number' == typeof param.repeat ? param.repeat : 1;
268
- if (0 === repeat) repeat = 10;
269
- for(let i = 0; i < repeat; i++)await page.swipe(startPoint, endPoint, duration);
270
- })
271
- ] : [],
272
- (0, device_namespaceObject.defineActionClearInput)(async (param)=>{
273
- await page.clearInput(param.locate);
195
+ },
196
+ scroll: {
197
+ scroll: async (param)=>{
198
+ const element = param.locate;
199
+ const startingPoint = element ? {
200
+ left: element.center[0],
201
+ top: element.center[1]
202
+ } : void 0;
203
+ const scrollToEventName = param?.scrollType;
204
+ if ('scrollToTop' === scrollToEventName) await page.scrollUntilTop(startingPoint);
205
+ else if ('scrollToBottom' === scrollToEventName) await page.scrollUntilBottom(startingPoint);
206
+ else if ('scrollToRight' === scrollToEventName) await page.scrollUntilRight(startingPoint);
207
+ else if ('scrollToLeft' === scrollToEventName) await page.scrollUntilLeft(startingPoint);
208
+ else if ('singleAction' !== scrollToEventName && scrollToEventName) throw new Error(`Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(param)}`);
209
+ else {
210
+ if (param?.direction !== 'down' && param && param.direction) if ('up' === param.direction) await page.scrollUp(param.distance || void 0, startingPoint);
211
+ else if ('left' === param.direction) await page.scrollLeft(param.distance || void 0, startingPoint);
212
+ else if ('right' === param.direction) await page.scrollRight(param.distance || void 0, startingPoint);
213
+ else throw new Error(`Unknown scroll direction: ${param.direction}`);
214
+ else await page.scrollDown(param?.distance || void 0, startingPoint);
215
+ await (0, utils_namespaceObject.sleep)(500);
216
+ }
217
+ }
218
+ }
219
+ };
220
+ }
221
+ const commonWebActionsForWebPage = (page, includeTouchEvents = false)=>{
222
+ const input = createWebInputPrimitives(page);
223
+ return [
224
+ ...(0, device_namespaceObject.defineActionsFromInputPrimitives)(input, {
225
+ size: ()=>page.size(),
226
+ includeSwipe: includeTouchEvents
274
227
  }),
275
228
  (0, device_namespaceObject.defineAction)({
276
229
  name: 'Navigate',
@@ -309,12 +262,15 @@ const commonWebActionsForWebPage = (page, includeTouchEvents = false)=>[
309
262
  }
310
263
  })
311
264
  ];
265
+ };
312
266
  exports.AbstractWebPage = __webpack_exports__.AbstractWebPage;
313
267
  exports.commonWebActionsForWebPage = __webpack_exports__.commonWebActionsForWebPage;
268
+ exports.createWebInputPrimitives = __webpack_exports__.createWebInputPrimitives;
314
269
  exports.getKeyCommands = __webpack_exports__.getKeyCommands;
315
270
  for(var __rspack_i in __webpack_exports__)if (-1 === [
316
271
  "AbstractWebPage",
317
272
  "commonWebActionsForWebPage",
273
+ "createWebInputPrimitives",
318
274
  "getKeyCommands"
319
275
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
320
276
  Object.defineProperty(exports, '__esModule', {
@@ -1 +1 @@
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 defineActionCursorMove,\n defineActionDoubleClick,\n defineActionDragAndDrop,\n defineActionHover,\n defineActionInput,\n defineActionKeyboardPress,\n defineActionLongPress,\n defineActionPinch,\n defineActionRightClick,\n defineActionScroll,\n defineActionSwipe,\n defineActionTap,\n normalizePinchParam,\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\nconst navigateParamSchema = z.object({\n url: z\n .string()\n .describe(\n 'The URL to navigate to. Must start with https://, file://, or a similar protocol.',\n ),\n});\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 goForward?(): Promise<void>;\n stopLoading?(): Promise<void>;\n navigationState?(): Promise<{ isLoading: boolean }>;\n flushPendingVisualUpdate?(): 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 abstract pinch(\n centerX: number,\n centerY: number,\n startDistance: number,\n endDistance: 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\n // Pure tap action - file handling is done at Page layer via setFileChooserHandler\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 !== 'typeOnly') {\n await page.clearInput(element as unknown as ElementInfo);\n } else if (element && param.mode === 'typeOnly') {\n // typeOnly mode: click to focus and move cursor to end, but don't clear\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n await page.keyboard.press([{ key: 'End' }]);\n }\n\n if (param.mode === 'clear') {\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 await page.flushPendingVisualUpdate?.();\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 await page.flushPendingVisualUpdate?.();\n }),\n defineActionCursorMove(async (param) => {\n const arrowKey = param.direction === 'left' ? 'ArrowLeft' : 'ArrowRight';\n const times = param.times ?? 1;\n for (let i = 0; i < times; i++) {\n await page.keyboard.press([{ key: arrowKey as any }]);\n await sleep(100);\n }\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 defineActionPinch(async (param) => {\n const { centerX, centerY, startDistance, endDistance, duration } =\n normalizePinchParam(param, await page.size());\n\n await page.pinch(centerX, centerY, startDistance, endDistance, 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 await page.clearInput(param.locate as ElementInfo | undefined);\n }),\n\n defineAction<typeof navigateParamSchema, { url: string }>({\n name: 'Navigate',\n description:\n 'Navigate the browser to a specified URL. Opens the URL in the current tab.',\n paramSchema: navigateParamSchema,\n sample: {\n url: 'https://www.example.com',\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 defineAction({\n name: 'GoForward',\n description: 'Navigate forward in browser history',\n call: async () => {\n if (!page.goForward) {\n throw new Error(\n 'GoForward operation is not supported on this page type',\n );\n }\n await page.goForward();\n },\n }),\n];\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debug","getDebug","navigateParamSchema","z","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","defineActionCursorMove","arrowKey","times","i","sleep","defineActionScroll","startingPoint","undefined","scrollToEventName","Error","JSON","defineActionDragAndDrop","defineActionLongPress","duration","defineActionPinch","centerX","centerY","startDistance","endDistance","normalizePinchParam","defineActionSwipe","width","height","start","end","startPoint","endPoint","direction","Math","repeat","defineActionClearInput","defineAction"],"mappings":"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"}
1
+ {"version":3,"file":"web-page.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/web-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 { Point } from '@midscene/core';\nimport { z } from '@midscene/core';\nimport {\n AbstractInterface,\n type BrowserInputPrimitives,\n type DeviceAction,\n defineAction,\n defineActionsFromInputPrimitives,\n} from '@midscene/core/device';\n\nimport { sleep } from '@midscene/core/utils';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { transformHotkeyInput } from '@midscene/shared/us-keyboard-layout';\n\nconst navigateParamSchema = z.object({\n url: z\n .string()\n .describe(\n 'The URL to navigate to. Must start with https://, file://, or a similar protocol.',\n ),\n});\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 goForward?(): Promise<void>;\n stopLoading?(): Promise<void>;\n navigationState?(): Promise<{ isLoading: boolean }>;\n flushPendingVisualUpdate?(): 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 abstract pinch(\n centerX: number,\n centerY: number,\n startDistance: number,\n endDistance: number,\n duration?: number,\n ): Promise<void>;\n}\n\nexport function createWebInputPrimitives(\n page: AbstractWebPage,\n): BrowserInputPrimitives {\n return {\n pointer: {\n tap: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'left' });\n },\n rightClick: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'right' });\n },\n doubleClick: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'left', count: 2 });\n },\n hover: async ({ x, y }) => {\n await page.mouse.move(x, y);\n },\n dragAndDrop: async (from, to) => {\n await page.mouse.drag(from, to);\n },\n longPress: async ({ x, y }, opts) => {\n await page.longPress(x, y, opts?.duration);\n },\n },\n keyboard: {\n typeText: async (value, opts) => {\n const element = opts?.target;\n if (element && opts?.replace !== false) {\n await page.clearInput(element as ElementInfo);\n } else if (element) {\n const target = element as ElementInfo;\n await page.mouse.click(target.center[0], target.center[1], {\n button: 'left',\n });\n await page.keyboard.press([{ key: 'End' }]);\n }\n\n if (opts?.focusOnly) {\n return;\n }\n\n await page.keyboard.type(value);\n await page.flushPendingVisualUpdate?.();\n },\n keyboardPress: async (keyName, opts) => {\n const element = opts?.target as\n | { center: [number, number] }\n | undefined;\n if (element) {\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }\n\n const keys = getKeyCommands(keyName);\n await page.keyboard.press(keys as any);\n await page.flushPendingVisualUpdate?.();\n },\n cursorMove: async (direction, times = 1) => {\n const arrowKey = direction === 'left' ? 'ArrowLeft' : 'ArrowRight';\n for (let i = 0; i < times; i++) {\n await page.keyboard.press([{ key: arrowKey as any }]);\n await sleep(100);\n }\n },\n clearInput: async (target) => {\n await page.clearInput(target as ElementInfo | undefined);\n },\n },\n touch: {\n pinch: async ({ x, y }, opts) => {\n await page.pinch(\n x,\n y,\n opts.startDistance,\n opts.endDistance,\n opts.duration,\n );\n },\n swipe: async (from, to, opts) => {\n await page.swipe(from, to, opts?.duration);\n },\n },\n scroll: {\n scroll: 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 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 },\n };\n}\n\nexport const commonWebActionsForWebPage = <T extends AbstractWebPage>(\n page: T,\n includeTouchEvents = false,\n): DeviceAction<any>[] => {\n const input = createWebInputPrimitives(page);\n return [\n ...defineActionsFromInputPrimitives(input, {\n size: () => page.size(),\n includeSwipe: includeTouchEvents,\n }),\n\n defineAction<typeof navigateParamSchema, { url: string }>({\n name: 'Navigate',\n description:\n 'Navigate the browser to a specified URL. Opens the URL in the current tab.',\n paramSchema: navigateParamSchema,\n sample: {\n url: 'https://www.example.com',\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(\n 'Reload operation is not supported on this page type',\n );\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(\n 'GoBack operation is not supported on this page type',\n );\n }\n await page.goBack();\n },\n }),\n defineAction({\n name: 'GoForward',\n description: 'Navigate forward in browser history',\n call: async () => {\n if (!page.goForward) {\n throw new Error(\n 'GoForward operation is not supported on this page type',\n );\n }\n await page.goForward();\n },\n }),\n ];\n};\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","navigateParamSchema","z","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","createWebInputPrimitives","page","opts","target","keyName","direction","times","arrowKey","i","sleep","param","startingPoint","undefined","scrollToEventName","Error","JSON","commonWebActionsForWebPage","includeTouchEvents","defineActionsFromInputPrimitives","defineAction"],"mappings":"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"}
@@ -1,9 +1,11 @@
1
1
  import type { DeviceAction, Point, UIContext } from '@midscene/core';
2
2
  import type { AbstractInterface } from '@midscene/core/device';
3
+ import { type InputPrimitives } from '@midscene/core/device';
3
4
  type StaticPageUIContext = Omit<UIContext, 'deprecatedDpr'>;
4
5
  export default class StaticPage implements AbstractInterface {
5
6
  interfaceType: string;
6
7
  private uiContext;
8
+ readonly inputPrimitives: InputPrimitives;
7
9
  constructor(uiContext: StaticPageUIContext);
8
10
  actionSpace(): DeviceAction[];
9
11
  evaluateJavaScript<T = unknown>(script: string): Promise<T>;
@@ -1,5 +1,5 @@
1
1
  import type { Point } from '@midscene/core';
2
- import { AbstractInterface, type DeviceAction } from '@midscene/core/device';
2
+ import { AbstractInterface, type BrowserInputPrimitives, type DeviceAction } from '@midscene/core/device';
3
3
  import type { ElementInfo } from '@midscene/shared/extractor';
4
4
  export declare function getKeyCommands(value: string | string[]): Array<{
5
5
  key: string;
@@ -66,4 +66,5 @@ export declare abstract class AbstractWebPage extends AbstractInterface {
66
66
  }, duration?: number): Promise<void>;
67
67
  abstract pinch(centerX: number, centerY: number, startDistance: number, endDistance: number, duration?: number): Promise<void>;
68
68
  }
69
+ export declare function createWebInputPrimitives(page: AbstractWebPage): BrowserInputPrimitives;
69
70
  export declare const commonWebActionsForWebPage: <T extends AbstractWebPage>(page: T, includeTouchEvents?: boolean) => DeviceAction<any>[];