@midscene/web 0.12.4 → 0.12.5-beta-20250306111616.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/appium/index.js +8 -0
- package/dist/es/appium/index.js.map +1 -0
- package/dist/es/appium/page.js +341 -0
- package/dist/es/appium/page.js.map +1 -0
- package/dist/es/bridge-mode/agent-cli-side.js +153 -0
- package/dist/es/bridge-mode/agent-cli-side.js.map +1 -0
- package/dist/es/bridge-mode/browser.js +6 -0
- package/dist/es/bridge-mode/browser.js.map +1 -0
- package/dist/es/bridge-mode/common.js +43 -0
- package/dist/es/bridge-mode/common.js.map +1 -0
- package/dist/es/bridge-mode/index.js +8 -0
- package/dist/es/bridge-mode/index.js.map +1 -0
- package/dist/es/bridge-mode/io-client.js +107 -0
- package/dist/es/bridge-mode/io-client.js.map +1 -0
- package/dist/es/bridge-mode/io-server.js +212 -0
- package/dist/es/bridge-mode/io-server.js.map +1 -0
- package/dist/es/bridge-mode/page-browser-side.js +168 -0
- package/dist/es/bridge-mode/page-browser-side.js.map +1 -0
- package/dist/es/chrome-extension/agent.js +11 -0
- package/dist/es/chrome-extension/agent.js.map +1 -0
- package/dist/es/chrome-extension/cdpInput.js +214 -0
- package/dist/es/chrome-extension/cdpInput.js.map +1 -0
- package/dist/es/chrome-extension/dynamic-scripts.js +67 -0
- package/dist/es/chrome-extension/dynamic-scripts.js.map +1 -0
- package/dist/es/chrome-extension/index.js +10 -0
- package/dist/es/chrome-extension/index.js.map +1 -0
- package/dist/es/chrome-extension/page.js +489 -0
- package/dist/es/chrome-extension/page.js.map +1 -0
- package/dist/es/common/agent.js +263 -0
- package/dist/es/common/agent.js.map +1 -0
- package/dist/es/common/task-cache.js +168 -0
- package/dist/es/common/task-cache.js.map +1 -0
- package/dist/es/common/tasks.js +927 -0
- package/dist/es/common/tasks.js.map +1 -0
- package/dist/es/{ui-utils.js → common/ui-utils.js} +3 -32
- package/dist/es/common/ui-utils.js.map +1 -0
- package/dist/es/common/utils.js +156 -0
- package/dist/es/common/utils.js.map +1 -0
- package/dist/es/index.js +9 -5399
- package/dist/es/index.js.map +1 -1
- package/dist/es/page.js +51 -0
- package/dist/es/page.js.map +1 -0
- package/dist/es/playground/agent.js +12 -0
- package/dist/es/playground/agent.js.map +1 -0
- package/dist/es/playground/bin.js +9 -0
- package/dist/es/playground/bin.js.map +1 -0
- package/dist/es/playground/index.js +10 -0
- package/dist/es/playground/index.js.map +1 -0
- package/dist/es/playground/server.js +171 -0
- package/dist/es/playground/server.js.map +1 -0
- package/dist/es/playground/static-page.js +145 -0
- package/dist/es/playground/static-page.js.map +1 -0
- package/dist/es/playwright/ai-fixture.js +184 -0
- package/dist/es/playwright/ai-fixture.js.map +1 -0
- package/dist/es/playwright/index.js +54 -0
- package/dist/es/playwright/index.js.map +1 -0
- package/dist/es/playwright/page.js +11 -0
- package/dist/es/playwright/page.js.map +1 -0
- package/dist/es/playwright/reporter/index.js +74 -0
- package/dist/es/playwright/reporter/index.js.map +1 -0
- package/dist/es/playwright/reporter/select-cache-file.js +98 -0
- package/dist/es/playwright/reporter/select-cache-file.js.map +1 -0
- package/dist/es/puppeteer/agent-launcher.js +162 -0
- package/dist/es/puppeteer/agent-launcher.js.map +1 -0
- package/dist/es/puppeteer/base-page.js +267 -0
- package/dist/es/puppeteer/base-page.js.map +1 -0
- package/dist/es/puppeteer/index.js +54 -0
- package/dist/es/puppeteer/index.js.map +1 -0
- package/dist/es/puppeteer/page.js +40 -0
- package/dist/es/puppeteer/page.js.map +1 -0
- package/dist/es/web-element.js +27 -0
- package/dist/es/web-element.js.map +1 -0
- package/dist/es/yaml/builder.js +15 -0
- package/dist/es/yaml/builder.js.map +1 -0
- package/dist/es/yaml/index.js +5 -0
- package/dist/es/yaml/index.js.map +1 -0
- package/dist/es/yaml/player.js +227 -0
- package/dist/es/yaml/player.js.map +1 -0
- package/dist/es/yaml/utils.js +73 -0
- package/dist/es/yaml/utils.js.map +1 -0
- package/dist/lib/appium/index.js +8 -0
- package/dist/lib/appium/index.js.map +1 -0
- package/dist/lib/appium/page.js +341 -0
- package/dist/lib/appium/page.js.map +1 -0
- package/dist/lib/bridge-mode/agent-cli-side.js +153 -0
- package/dist/lib/bridge-mode/agent-cli-side.js.map +1 -0
- package/dist/lib/bridge-mode/browser.js +6 -0
- package/dist/lib/bridge-mode/browser.js.map +1 -0
- package/dist/lib/bridge-mode/common.js +43 -0
- package/dist/lib/bridge-mode/common.js.map +1 -0
- package/dist/lib/bridge-mode/index.js +8 -0
- package/dist/lib/bridge-mode/index.js.map +1 -0
- package/dist/lib/bridge-mode/io-client.js +107 -0
- package/dist/lib/bridge-mode/io-client.js.map +1 -0
- package/dist/lib/bridge-mode/io-server.js +212 -0
- package/dist/lib/bridge-mode/io-server.js.map +1 -0
- package/dist/lib/bridge-mode/page-browser-side.js +168 -0
- package/dist/lib/bridge-mode/page-browser-side.js.map +1 -0
- package/dist/lib/chrome-extension/agent.js +11 -0
- package/dist/lib/chrome-extension/agent.js.map +1 -0
- package/dist/lib/chrome-extension/cdpInput.js +214 -0
- package/dist/lib/chrome-extension/cdpInput.js.map +1 -0
- package/dist/lib/chrome-extension/dynamic-scripts.js +67 -0
- package/dist/lib/chrome-extension/dynamic-scripts.js.map +1 -0
- package/dist/lib/chrome-extension/index.js +10 -0
- package/dist/lib/chrome-extension/index.js.map +1 -0
- package/dist/lib/chrome-extension/page.js +489 -0
- package/dist/lib/chrome-extension/page.js.map +1 -0
- package/dist/lib/common/agent.js +263 -0
- package/dist/lib/common/agent.js.map +1 -0
- package/dist/lib/common/task-cache.js +168 -0
- package/dist/lib/common/task-cache.js.map +1 -0
- package/dist/lib/common/tasks.js +927 -0
- package/dist/lib/common/tasks.js.map +1 -0
- package/dist/lib/{ui-utils.js → common/ui-utils.js} +3 -32
- package/dist/lib/common/ui-utils.js.map +1 -0
- package/dist/lib/common/utils.js +156 -0
- package/dist/lib/common/utils.js.map +1 -0
- package/dist/lib/index.js +9 -5399
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/page.js +51 -0
- package/dist/lib/page.js.map +1 -0
- package/dist/lib/playground/agent.js +12 -0
- package/dist/lib/playground/agent.js.map +1 -0
- package/dist/lib/playground/bin.js +9 -0
- package/dist/lib/playground/bin.js.map +1 -0
- package/dist/lib/playground/index.js +10 -0
- package/dist/lib/playground/index.js.map +1 -0
- package/dist/lib/playground/server.js +171 -0
- package/dist/lib/playground/server.js.map +1 -0
- package/dist/lib/playground/static-page.js +145 -0
- package/dist/lib/playground/static-page.js.map +1 -0
- package/dist/lib/playwright/ai-fixture.js +184 -0
- package/dist/lib/playwright/ai-fixture.js.map +1 -0
- package/dist/lib/playwright/index.js +54 -0
- package/dist/lib/playwright/index.js.map +1 -0
- package/dist/lib/playwright/page.js +11 -0
- package/dist/lib/playwright/page.js.map +1 -0
- package/dist/lib/playwright/reporter/index.js +74 -0
- package/dist/lib/playwright/reporter/index.js.map +1 -0
- package/dist/lib/playwright/reporter/select-cache-file.js +98 -0
- package/dist/lib/playwright/reporter/select-cache-file.js.map +1 -0
- package/dist/lib/puppeteer/agent-launcher.js +162 -0
- package/dist/lib/puppeteer/agent-launcher.js.map +1 -0
- package/dist/lib/puppeteer/base-page.js +267 -0
- package/dist/lib/puppeteer/base-page.js.map +1 -0
- package/dist/lib/puppeteer/index.js +54 -0
- package/dist/lib/puppeteer/index.js.map +1 -0
- package/dist/lib/puppeteer/page.js +40 -0
- package/dist/lib/puppeteer/page.js.map +1 -0
- package/dist/lib/web-element.js +27 -0
- package/dist/lib/web-element.js.map +1 -0
- package/dist/lib/yaml/builder.js +15 -0
- package/dist/lib/yaml/builder.js.map +1 -0
- package/dist/lib/yaml/index.js +5 -0
- package/dist/lib/yaml/index.js.map +1 -0
- package/dist/lib/yaml/player.js +227 -0
- package/dist/lib/yaml/player.js.map +1 -0
- package/dist/lib/yaml/utils.js +73 -0
- package/dist/lib/yaml/utils.js.map +1 -0
- package/dist/types/appium/index.d.ts +2 -0
- package/dist/types/appium/page.d.ts +58 -0
- package/dist/types/bridge-mode/agent-cli-side.d.ts +17 -0
- package/dist/types/bridge-mode/browser.d.ts +2 -0
- package/dist/types/bridge-mode/common.d.ts +57 -0
- package/dist/types/bridge-mode/index.d.ts +3 -0
- package/dist/types/bridge-mode/io-client.d.ts +10 -0
- package/dist/types/bridge-mode/io-server.d.ts +21 -0
- package/dist/types/bridge-mode/page-browser-side.d.ts +18 -0
- package/dist/types/chrome-extension/agent.d.ts +5 -0
- package/dist/types/chrome-extension/cdpInput.d.ts +48 -0
- package/dist/types/chrome-extension/dynamic-scripts.d.ts +3 -0
- package/dist/types/chrome-extension/index.d.ts +4 -0
- package/dist/types/chrome-extension/page.d.ts +64 -0
- package/dist/types/common/agent.d.ts +47 -0
- package/dist/types/common/task-cache.d.ts +91 -0
- package/dist/types/common/tasks.d.ts +44 -0
- package/dist/types/common/ui-utils.d.ts +8 -0
- package/dist/types/common/utils.d.ts +16 -0
- package/dist/types/index.d.ts +9 -17
- package/dist/types/page.d.ts +57 -0
- package/dist/types/playground/agent.d.ts +5 -0
- package/dist/types/playground/bin.d.ts +1 -0
- package/dist/types/playground/index.d.ts +4 -0
- package/dist/types/playground/server.d.ts +14 -0
- package/dist/types/playground/static-page.d.ts +34 -0
- package/dist/types/playwright/ai-fixture.d.ts +35 -0
- package/dist/types/playwright/index.d.ts +9 -0
- package/dist/types/playwright/page.d.ts +5 -0
- package/dist/types/{playwright-report.d.ts → playwright/reporter/index.d.ts} +2 -4
- package/dist/types/playwright/reporter/select-cache-file.d.ts +1 -0
- package/dist/types/puppeteer/agent-launcher.d.ts +28 -0
- package/dist/types/puppeteer/base-page.d.ts +58 -0
- package/dist/types/puppeteer/index.d.ts +8 -0
- package/dist/types/puppeteer/page.d.ts +10 -0
- package/dist/types/web-element.d.ts +33 -0
- package/dist/types/yaml/builder.d.ts +2 -0
- package/dist/types/yaml/index.d.ts +3 -0
- package/dist/types/{utils-c05abdf8.d.ts → yaml/player.d.ts} +3 -9
- package/dist/types/yaml/utils.d.ts +4 -0
- package/package.json +64 -60
- package/dist/es/appium.js +0 -4909
- package/dist/es/appium.js.map +0 -1
- package/dist/es/bridge-mode-browser.js +0 -907
- package/dist/es/bridge-mode-browser.js.map +0 -1
- package/dist/es/bridge-mode.js +0 -4932
- package/dist/es/bridge-mode.js.map +0 -1
- package/dist/es/chrome-extension.js +0 -5302
- package/dist/es/chrome-extension.js.map +0 -1
- package/dist/es/midscene-playground.js +0 -5209
- package/dist/es/midscene-playground.js.map +0 -1
- package/dist/es/playground.js +0 -4735
- package/dist/es/playground.js.map +0 -1
- package/dist/es/playwright-report.js +0 -404
- package/dist/es/playwright-report.js.map +0 -1
- package/dist/es/playwright.js +0 -5036
- package/dist/es/playwright.js.map +0 -1
- package/dist/es/puppeteer.js +0 -5016
- package/dist/es/puppeteer.js.map +0 -1
- package/dist/es/ui-utils.js.map +0 -1
- package/dist/es/utils.js +0 -510
- package/dist/es/utils.js.map +0 -1
- package/dist/es/yaml.js +0 -3007
- package/dist/es/yaml.js.map +0 -1
- package/dist/lib/appium.js +0 -4909
- package/dist/lib/appium.js.map +0 -1
- package/dist/lib/bridge-mode-browser.js +0 -907
- package/dist/lib/bridge-mode-browser.js.map +0 -1
- package/dist/lib/bridge-mode.js +0 -4932
- package/dist/lib/bridge-mode.js.map +0 -1
- package/dist/lib/chrome-extension.js +0 -5302
- package/dist/lib/chrome-extension.js.map +0 -1
- package/dist/lib/midscene-playground.js +0 -5209
- package/dist/lib/midscene-playground.js.map +0 -1
- package/dist/lib/playground.js +0 -4735
- package/dist/lib/playground.js.map +0 -1
- package/dist/lib/playwright-report.js +0 -404
- package/dist/lib/playwright-report.js.map +0 -1
- package/dist/lib/playwright.js +0 -5036
- package/dist/lib/playwright.js.map +0 -1
- package/dist/lib/puppeteer.js +0 -5016
- package/dist/lib/puppeteer.js.map +0 -1
- package/dist/lib/ui-utils.js.map +0 -1
- package/dist/lib/utils.js +0 -510
- package/dist/lib/utils.js.map +0 -1
- package/dist/lib/yaml.js +0 -3007
- package/dist/lib/yaml.js.map +0 -1
- package/dist/types/agent-93ac4610.d.ts +0 -175
- package/dist/types/appium.d.ts +0 -11
- package/dist/types/bridge-mode-browser.d.ts +0 -9
- package/dist/types/bridge-mode.d.ts +0 -28
- package/dist/types/browser-3c8d24ff.d.ts +0 -37
- package/dist/types/chrome-extension.d.ts +0 -18
- package/dist/types/midscene-playground.d.ts +0 -2
- package/dist/types/page-09c548ff.d.ts +0 -321
- package/dist/types/playground.d.ts +0 -18
- package/dist/types/playwright.d.ts +0 -49
- package/dist/types/puppeteer.d.ts +0 -32
- package/dist/types/ui-utils.d.ts +0 -11
- package/dist/types/utils.d.ts +0 -8
- package/dist/types/yaml.d.ts +0 -16
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"AAAA,SAAsB,iBAAmB;AACzC,SAAiB,YAAkB","names":[],"ignoreList":[],"sources":["../../../src/appium/index.ts"],"sourcesContent":["export { PageAgent as AppiumAgent } from '../common/agent';\nexport { Page as AppiumPage } from './page';\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
var __async = (__this, __arguments, generator) => {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
var fulfilled = (value) => {
|
|
4
|
+
try {
|
|
5
|
+
step(generator.next(value));
|
|
6
|
+
} catch (e) {
|
|
7
|
+
reject(e);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var rejected = (value) => {
|
|
11
|
+
try {
|
|
12
|
+
step(generator.throw(value));
|
|
13
|
+
} catch (e) {
|
|
14
|
+
reject(e);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
18
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
import fs from "node:fs";
|
|
22
|
+
import { getTmpFile } from "@midscene/core/utils";
|
|
23
|
+
import {
|
|
24
|
+
clientExtractTextWithPosition
|
|
25
|
+
} from "@midscene/shared/extractor";
|
|
26
|
+
import { base64Encoded, resizeImg } from "@midscene/shared/img";
|
|
27
|
+
import { DOMParser } from "@xmldom/xmldom";
|
|
28
|
+
function buttonToNumber(button) {
|
|
29
|
+
return button === "left" ? 0 : button === "middle" ? 1 : 2;
|
|
30
|
+
}
|
|
31
|
+
class Page {
|
|
32
|
+
constructor(browser) {
|
|
33
|
+
this.pageType = "appium";
|
|
34
|
+
this.browser = browser;
|
|
35
|
+
}
|
|
36
|
+
getElementsInfo() {
|
|
37
|
+
return __async(this, null, function* () {
|
|
38
|
+
const pageSource = yield this.browser.getPageSource();
|
|
39
|
+
const { width, height } = yield this.browser.getWindowSize();
|
|
40
|
+
const parser = new DOMParser();
|
|
41
|
+
const doc = parser.parseFromString(pageSource, "text/xml");
|
|
42
|
+
const infos = clientExtractTextWithPosition(doc).filter(
|
|
43
|
+
(element) => element.rect.height !== height && element.rect.width !== width && element.rect.left !== 0 && element.rect.top !== 0 && element.attributes.visible === "true"
|
|
44
|
+
);
|
|
45
|
+
return infos;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
getElementsNodeTree() {
|
|
49
|
+
return __async(this, null, function* () {
|
|
50
|
+
throw new Error("Not implemented");
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
size() {
|
|
54
|
+
return __async(this, null, function* () {
|
|
55
|
+
return this.browser.getWindowSize();
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
screenshotBase64() {
|
|
59
|
+
return __async(this, null, function* () {
|
|
60
|
+
const { width, height } = yield this.size();
|
|
61
|
+
const path = getTmpFile("png");
|
|
62
|
+
const screenshotBuffer = yield this.browser.saveScreenshot(path);
|
|
63
|
+
const resizedScreenshotBuffer = yield resizeImg(screenshotBuffer, {
|
|
64
|
+
width,
|
|
65
|
+
height
|
|
66
|
+
});
|
|
67
|
+
fs.writeFileSync(path, resizedScreenshotBuffer);
|
|
68
|
+
return base64Encoded(path);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
get mouse() {
|
|
72
|
+
return {
|
|
73
|
+
click: (x, y, options) => this.mouseClick(x, y, (options == null ? void 0 : options.button) || "left"),
|
|
74
|
+
wheel: (deltaX, deltaY) => this.mouseWheel(deltaX, deltaY),
|
|
75
|
+
move: (x, y) => this.mouseMove(x, y),
|
|
76
|
+
drag: (from, to) => this.mouseDrag(from, to)
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// Object that includes keyboard and mouse operations
|
|
80
|
+
get keyboard() {
|
|
81
|
+
return {
|
|
82
|
+
type: (text) => this.keyboardType(text),
|
|
83
|
+
press: (action) => this.keyboardPressAction(action)
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
clearInput(element) {
|
|
87
|
+
return __async(this, null, function* () {
|
|
88
|
+
if (!element) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const ele = yield this.browser.$(element.locator);
|
|
92
|
+
const blank = " ";
|
|
93
|
+
yield this.keyboardType(blank);
|
|
94
|
+
yield ele.clearValue();
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
url() {
|
|
98
|
+
var _a;
|
|
99
|
+
const platformName = (_a = this.browser.capabilities.platformName) == null ? void 0 : _a.toLowerCase();
|
|
100
|
+
if (platformName === "ios") {
|
|
101
|
+
const bundleId = this.browser.capabilities.bundleId;
|
|
102
|
+
return bundleId;
|
|
103
|
+
}
|
|
104
|
+
if (platformName === "android") {
|
|
105
|
+
const appActivity = this.browser.capabilities.appActivity;
|
|
106
|
+
return appActivity;
|
|
107
|
+
}
|
|
108
|
+
return "";
|
|
109
|
+
}
|
|
110
|
+
// Scroll to top element
|
|
111
|
+
scrollUntilTop(startingPoint) {
|
|
112
|
+
return __async(this, null, function* () {
|
|
113
|
+
if (startingPoint) {
|
|
114
|
+
yield this.mouse.move(startingPoint.left, startingPoint.top);
|
|
115
|
+
}
|
|
116
|
+
yield this.mouseWheel(0, -9999999, 100);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// Scroll to bottom element
|
|
120
|
+
scrollUntilBottom(startingPoint) {
|
|
121
|
+
return __async(this, null, function* () {
|
|
122
|
+
if (startingPoint) {
|
|
123
|
+
yield this.mouse.move(startingPoint.left, startingPoint.top);
|
|
124
|
+
}
|
|
125
|
+
yield this.mouseWheel(0, 9999999, 100);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
scrollUntilLeft(startingPoint) {
|
|
129
|
+
return __async(this, null, function* () {
|
|
130
|
+
if (startingPoint) {
|
|
131
|
+
yield this.mouse.move(startingPoint.left, startingPoint.top);
|
|
132
|
+
}
|
|
133
|
+
yield this.mouseWheel(-9999999, 0, 100);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
scrollUntilRight(startingPoint) {
|
|
137
|
+
return __async(this, null, function* () {
|
|
138
|
+
if (startingPoint) {
|
|
139
|
+
yield this.mouse.move(startingPoint.left, startingPoint.top);
|
|
140
|
+
}
|
|
141
|
+
yield this.mouseWheel(9999999, 0, 100);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// Scroll up one screen
|
|
145
|
+
scrollUp(distance, startingPoint) {
|
|
146
|
+
return __async(this, null, function* () {
|
|
147
|
+
const { height } = yield this.browser.getWindowSize();
|
|
148
|
+
const scrollDistance = distance || height * 0.7;
|
|
149
|
+
if (startingPoint) {
|
|
150
|
+
yield this.mouse.move(startingPoint.left, startingPoint.top);
|
|
151
|
+
}
|
|
152
|
+
yield this.mouseWheel(0, -scrollDistance, 1e3);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
// Scroll down one screen
|
|
156
|
+
scrollDown(distance, startingPoint) {
|
|
157
|
+
return __async(this, null, function* () {
|
|
158
|
+
const { height } = yield this.browser.getWindowSize();
|
|
159
|
+
const scrollDistance = distance || height * 0.7;
|
|
160
|
+
if (startingPoint) {
|
|
161
|
+
yield this.mouse.move(startingPoint.left, startingPoint.top);
|
|
162
|
+
}
|
|
163
|
+
yield this.mouseWheel(0, scrollDistance, 1e3);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
scrollLeft(distance, startingPoint) {
|
|
167
|
+
return __async(this, null, function* () {
|
|
168
|
+
const { width } = yield this.browser.getWindowSize();
|
|
169
|
+
const scrollDistance = distance || width * 0.7;
|
|
170
|
+
if (startingPoint) {
|
|
171
|
+
yield this.mouse.move(startingPoint.left, startingPoint.top);
|
|
172
|
+
}
|
|
173
|
+
yield this.mouseWheel(-scrollDistance, 0, 1e3);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
scrollRight(distance, startingPoint) {
|
|
177
|
+
return __async(this, null, function* () {
|
|
178
|
+
const { width } = yield this.browser.getWindowSize();
|
|
179
|
+
const scrollDistance = distance || width * 0.7;
|
|
180
|
+
if (startingPoint) {
|
|
181
|
+
yield this.mouse.move(startingPoint.left, startingPoint.top);
|
|
182
|
+
}
|
|
183
|
+
yield this.mouseWheel(scrollDistance, 0, 1e3);
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
keyboardType(text) {
|
|
187
|
+
return __async(this, null, function* () {
|
|
188
|
+
const actions = [];
|
|
189
|
+
for (const char of text) {
|
|
190
|
+
actions.push({ type: "keyDown", value: char });
|
|
191
|
+
actions.push({ type: "keyUp", value: char });
|
|
192
|
+
}
|
|
193
|
+
if (!actions.length) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
yield this.browser.performActions([
|
|
197
|
+
{
|
|
198
|
+
type: "key",
|
|
199
|
+
id: "keyboard",
|
|
200
|
+
actions
|
|
201
|
+
}
|
|
202
|
+
]);
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
keyboardPress(key) {
|
|
206
|
+
return __async(this, null, function* () {
|
|
207
|
+
yield this.browser.performActions([
|
|
208
|
+
{
|
|
209
|
+
type: "key",
|
|
210
|
+
id: "keyboard",
|
|
211
|
+
actions: [
|
|
212
|
+
{ type: "keyDown", value: key },
|
|
213
|
+
{ type: "keyUp", value: key }
|
|
214
|
+
]
|
|
215
|
+
}
|
|
216
|
+
]);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
keyboardPressAction(action) {
|
|
220
|
+
return __async(this, null, function* () {
|
|
221
|
+
if (Array.isArray(action)) {
|
|
222
|
+
for (const act of action) {
|
|
223
|
+
yield this.browser.performActions([
|
|
224
|
+
{
|
|
225
|
+
type: "key",
|
|
226
|
+
id: "keyboard",
|
|
227
|
+
actions: [
|
|
228
|
+
{ type: "keyDown", value: act.key },
|
|
229
|
+
{ type: "keyUp", value: act.key }
|
|
230
|
+
]
|
|
231
|
+
}
|
|
232
|
+
]);
|
|
233
|
+
}
|
|
234
|
+
} else {
|
|
235
|
+
yield this.browser.performActions([
|
|
236
|
+
{
|
|
237
|
+
type: "key",
|
|
238
|
+
id: "keyboard",
|
|
239
|
+
actions: [
|
|
240
|
+
{ type: "keyDown", value: action.key },
|
|
241
|
+
{ type: "keyUp", value: action.key }
|
|
242
|
+
]
|
|
243
|
+
}
|
|
244
|
+
]);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
mouseClick(x, y, button = "left") {
|
|
249
|
+
return __async(this, null, function* () {
|
|
250
|
+
yield this.mouseMove(x, y);
|
|
251
|
+
yield this.browser.performActions([
|
|
252
|
+
{
|
|
253
|
+
type: "pointer",
|
|
254
|
+
id: "mouse",
|
|
255
|
+
parameters: { pointerType: "mouse" },
|
|
256
|
+
actions: [
|
|
257
|
+
{ type: "pointerMove", duration: 0, x, y },
|
|
258
|
+
{ type: "pointerDown", button: buttonToNumber(button) },
|
|
259
|
+
{ type: "pause", duration: 100 },
|
|
260
|
+
{ type: "pointerUp", button: buttonToNumber(button) }
|
|
261
|
+
]
|
|
262
|
+
}
|
|
263
|
+
]);
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
mouseMove(x, y) {
|
|
267
|
+
return __async(this, null, function* () {
|
|
268
|
+
yield this.browser.performActions([
|
|
269
|
+
{
|
|
270
|
+
type: "pointer",
|
|
271
|
+
id: "mouse",
|
|
272
|
+
parameters: { pointerType: "mouse" },
|
|
273
|
+
actions: [{ type: "pointerMove", duration: 0, x, y }]
|
|
274
|
+
}
|
|
275
|
+
]);
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
mouseDrag(from, to) {
|
|
279
|
+
return __async(this, null, function* () {
|
|
280
|
+
yield this.browser.performActions([
|
|
281
|
+
{
|
|
282
|
+
type: "pointer",
|
|
283
|
+
id: "mouse",
|
|
284
|
+
parameters: { pointerType: "mouse" },
|
|
285
|
+
actions: [
|
|
286
|
+
{ type: "pointerMove", duration: 0, x: from.x, y: from.y },
|
|
287
|
+
{ type: "pointerDown", button: 0 },
|
|
288
|
+
{ type: "pointerMove", duration: 500, x: to.x, y: to.y },
|
|
289
|
+
{ type: "pointerUp", button: 0 }
|
|
290
|
+
]
|
|
291
|
+
}
|
|
292
|
+
]);
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
mouseWheel(deltaX, deltaY, duration = 1e3) {
|
|
296
|
+
return __async(this, null, function* () {
|
|
297
|
+
const n = 4;
|
|
298
|
+
const windowSize = yield this.browser.getWindowSize();
|
|
299
|
+
const startX = deltaX < 0 ? (n - 1) * (windowSize.width / n) : windowSize.width / n;
|
|
300
|
+
const startY = deltaY < 0 ? (n - 1) * (windowSize.height / n) : windowSize.height / n;
|
|
301
|
+
const maxNegativeDeltaX = startX;
|
|
302
|
+
const maxPositiveDeltaX = (n - 1) * (windowSize.width / n);
|
|
303
|
+
const maxNegativeDeltaY = startY;
|
|
304
|
+
const maxPositiveDeltaY = (n - 1) * (windowSize.height / n);
|
|
305
|
+
deltaX = Math.max(-maxNegativeDeltaX, Math.min(deltaX, maxPositiveDeltaX));
|
|
306
|
+
deltaY = Math.max(-maxNegativeDeltaY, Math.min(deltaY, maxPositiveDeltaY));
|
|
307
|
+
yield this.browser.performActions([
|
|
308
|
+
{
|
|
309
|
+
type: "pointer",
|
|
310
|
+
id: "finger1",
|
|
311
|
+
parameters: { pointerType: "touch" },
|
|
312
|
+
actions: [
|
|
313
|
+
{ type: "pointerMove", duration: 0, x: startX, y: startY },
|
|
314
|
+
{ type: "pointerDown", button: 0 },
|
|
315
|
+
{ type: "pause", duration },
|
|
316
|
+
{
|
|
317
|
+
type: "pointerMove",
|
|
318
|
+
duration,
|
|
319
|
+
origin: "pointer",
|
|
320
|
+
// Use 'pointer' as the starting point
|
|
321
|
+
x: deltaX,
|
|
322
|
+
// X offset relative to the starting point
|
|
323
|
+
y: deltaY
|
|
324
|
+
// Y offset relative to the starting point
|
|
325
|
+
},
|
|
326
|
+
{ type: "pointerUp", button: 0 }
|
|
327
|
+
]
|
|
328
|
+
}
|
|
329
|
+
]);
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
destroy() {
|
|
333
|
+
return __async(this, null, function* () {
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
export {
|
|
338
|
+
Page
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../src/appium/page.ts"],"sourcesContent":["import fs from 'node:fs';\nimport type { Point, Size } from '@midscene/core';\nimport { getTmpFile } from '@midscene/core/utils';\nimport {\n type ElementInfo,\n clientExtractTextWithPosition,\n} from '@midscene/shared/extractor';\nimport { base64Encoded, resizeImg } from '@midscene/shared/img';\nimport { DOMParser } from '@xmldom/xmldom';\nimport type { KeyInput as PuppeteerKeyInput } from 'puppeteer';\nimport type { Browser } from 'webdriverio';\nimport type { AbstractPage, MouseButton } from '../page';\n\ntype WebKeyInput = PuppeteerKeyInput;\n\nfunction buttonToNumber(button: MouseButton): number {\n return button === 'left' ? 0 : button === 'middle' ? 1 : 2;\n}\n\nexport class Page implements AbstractPage {\n private browser: Browser;\n pageType = 'appium';\n\n constructor(browser: Browser) {\n this.browser = browser;\n }\n\n async getElementsInfo() {\n const pageSource = await this.browser.getPageSource();\n const { width, height } = await this.browser.getWindowSize();\n const parser = new DOMParser();\n const doc = parser.parseFromString(pageSource, 'text/xml');\n const infos = clientExtractTextWithPosition(doc).filter(\n (element) =>\n element.rect.height !== height &&\n element.rect.width !== width &&\n element.rect.left !== 0 &&\n element.rect.top !== 0 &&\n element.attributes.visible === 'true',\n );\n\n return infos;\n }\n\n async getElementsNodeTree(): Promise<any> {\n throw new Error('Not implemented');\n }\n\n async size(): Promise<Size> {\n return this.browser.getWindowSize();\n }\n\n async screenshotBase64(): Promise<string> {\n const { width, height } = await this.size();\n const path = getTmpFile('png')!;\n const screenshotBuffer = await this.browser.saveScreenshot(path);\n const resizedScreenshotBuffer = await resizeImg(screenshotBuffer, {\n width,\n height,\n });\n fs.writeFileSync(path, resizedScreenshotBuffer);\n\n return base64Encoded(path);\n }\n\n get mouse() {\n return {\n click: (x: number, y: number, options?: { button: MouseButton }) =>\n this.mouseClick(x, y, options?.button || 'left'),\n wheel: (deltaX: number, deltaY: number) =>\n this.mouseWheel(deltaX, deltaY),\n move: (x: number, y: number) => this.mouseMove(x, y),\n drag: (from: { x: number; y: number }, to: { x: number; y: number }) =>\n this.mouseDrag(from, to),\n };\n }\n\n // Object that includes keyboard and mouse operations\n get keyboard() {\n return {\n type: (text: string) => this.keyboardType(text),\n press: (\n action:\n | { key: WebKeyInput; command?: string }\n | { key: WebKeyInput; command?: string }[],\n ) => this.keyboardPressAction(action),\n };\n }\n\n async clearInput(element: ElementInfo): Promise<void> {\n if (!element) {\n return;\n }\n\n const ele = await this.browser.$(element.locator);\n const blank = ' ';\n await this.keyboardType(blank);\n await ele.clearValue();\n }\n\n url(): string {\n const platformName = this.browser.capabilities.platformName?.toLowerCase();\n\n if (platformName === 'ios') {\n const bundleId = (this.browser.capabilities as { bundleId: string })\n .bundleId;\n return bundleId;\n }\n\n if (platformName === 'android') {\n const appActivity = (this.browser.capabilities as { appActivity: string })\n .appActivity;\n return appActivity;\n }\n\n return '';\n }\n\n // Scroll to top element\n async scrollUntilTop(startingPoint?: Point): Promise<void> {\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n\n await this.mouseWheel(0, -9999999, 100);\n }\n\n // Scroll to bottom element\n async scrollUntilBottom(startingPoint?: Point): Promise<void> {\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n\n await this.mouseWheel(0, 9999999, 100);\n }\n\n async scrollUntilLeft(startingPoint?: Point): Promise<void> {\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n\n await this.mouseWheel(-9999999, 0, 100);\n }\n\n async scrollUntilRight(startingPoint?: Point): Promise<void> {\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n\n await this.mouseWheel(9999999, 0, 100);\n }\n\n // Scroll up one screen\n async scrollUp(distance?: number, startingPoint?: Point): Promise<void> {\n const { height } = await this.browser.getWindowSize();\n const scrollDistance = distance || height * 0.7;\n\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n\n await this.mouseWheel(0, -scrollDistance, 1000);\n }\n\n // Scroll down one screen\n async scrollDown(distance?: number, startingPoint?: Point): Promise<void> {\n const { height } = await this.browser.getWindowSize();\n const scrollDistance = distance || height * 0.7;\n\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n\n await this.mouseWheel(0, scrollDistance, 1000);\n }\n\n async scrollLeft(distance?: number, startingPoint?: Point): Promise<void> {\n const { width } = await this.browser.getWindowSize();\n const scrollDistance = distance || width * 0.7;\n\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n\n await this.mouseWheel(-scrollDistance, 0, 1000);\n }\n\n async scrollRight(distance?: number, startingPoint?: Point): Promise<void> {\n const { width } = await this.browser.getWindowSize();\n const scrollDistance = distance || width * 0.7;\n\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n\n await this.mouseWheel(scrollDistance, 0, 1000);\n }\n\n private async keyboardType(text: string): Promise<void> {\n const actions = [];\n\n for (const char of text) {\n actions.push({ type: 'keyDown', value: char });\n actions.push({ type: 'keyUp', value: char });\n }\n\n if (!actions.length) {\n return;\n }\n\n await this.browser.performActions([\n {\n type: 'key',\n id: 'keyboard',\n actions: actions,\n },\n ]);\n }\n\n private async keyboardPress(key: WebKeyInput): Promise<void> {\n await this.browser.performActions([\n {\n type: 'key',\n id: 'keyboard',\n actions: [\n { type: 'keyDown', value: key },\n { type: 'keyUp', value: key },\n ],\n },\n ]);\n }\n\n private async keyboardPressAction(\n action:\n | { key: WebKeyInput; command?: string }\n | { key: WebKeyInput; command?: string }[],\n ): Promise<void> {\n if (Array.isArray(action)) {\n for (const act of action) {\n await this.browser.performActions([\n {\n type: 'key',\n id: 'keyboard',\n actions: [\n { type: 'keyDown', value: act.key },\n { type: 'keyUp', value: act.key },\n ],\n },\n ]);\n }\n } else {\n await this.browser.performActions([\n {\n type: 'key',\n id: 'keyboard',\n actions: [\n { type: 'keyDown', value: action.key },\n { type: 'keyUp', value: action.key },\n ],\n },\n ]);\n }\n }\n\n private async mouseClick(\n x: number,\n y: number,\n button: MouseButton = 'left',\n ): Promise<void> {\n await this.mouseMove(x, y);\n await this.browser.performActions([\n {\n type: 'pointer',\n id: 'mouse',\n parameters: { pointerType: 'mouse' },\n actions: [\n { type: 'pointerMove', duration: 0, x, y },\n { type: 'pointerDown', button: buttonToNumber(button) },\n { type: 'pause', duration: 100 },\n { type: 'pointerUp', button: buttonToNumber(button) },\n ],\n },\n ]);\n }\n\n private async mouseMove(x: number, y: number): Promise<void> {\n await this.browser.performActions([\n {\n type: 'pointer',\n id: 'mouse',\n parameters: { pointerType: 'mouse' },\n actions: [{ type: 'pointerMove', duration: 0, x, y }],\n },\n ]);\n }\n\n private async mouseDrag(\n from: { x: number; y: number },\n to: { x: number; y: number },\n ): Promise<void> {\n await this.browser.performActions([\n {\n type: 'pointer',\n id: 'mouse',\n parameters: { pointerType: 'mouse' },\n actions: [\n { type: 'pointerMove', duration: 0, x: from.x, y: from.y },\n { type: 'pointerDown', button: 0 },\n { type: 'pointerMove', duration: 500, x: to.x, y: to.y },\n { type: 'pointerUp', button: 0 },\n ],\n },\n ]);\n }\n\n private async mouseWheel(\n deltaX: number,\n deltaY: number,\n duration = 1000,\n ): Promise<void> {\n const n = 4;\n // Get the size of the window\n const windowSize = await this.browser.getWindowSize();\n\n // Set the starting point based on the sign of deltaX and deltaY\n const startX =\n deltaX < 0 ? (n - 1) * (windowSize.width / n) : windowSize.width / n;\n const startY =\n deltaY < 0 ? (n - 1) * (windowSize.height / n) : windowSize.height / n;\n\n // Calculate the maximum allowable offset for non-symmetry\n const maxNegativeDeltaX = startX; // Maximum offset on the left\n const maxPositiveDeltaX = (n - 1) * (windowSize.width / n); // Maximum offset on the right\n\n const maxNegativeDeltaY = startY; // Maximum offset on the top\n const maxPositiveDeltaY = (n - 1) * (windowSize.height / n); // Maximum offset on the bottom\n\n // Limit the absolute value of deltaX and deltaY within the maximum offset\n deltaX = Math.max(-maxNegativeDeltaX, Math.min(deltaX, maxPositiveDeltaX));\n deltaY = Math.max(-maxNegativeDeltaY, Math.min(deltaY, maxPositiveDeltaY));\n\n await this.browser.performActions([\n {\n type: 'pointer',\n id: 'finger1',\n parameters: { pointerType: 'touch' },\n actions: [\n { type: 'pointerMove', duration: 0, x: startX, y: startY },\n { type: 'pointerDown', button: 0 },\n { type: 'pause', duration },\n {\n type: 'pointerMove',\n duration,\n origin: 'pointer', // Use 'pointer' as the starting point\n x: deltaX, // X offset relative to the starting point\n y: deltaY, // Y offset relative to the starting point\n },\n { type: 'pointerUp', button: 0 },\n ],\n },\n ]);\n }\n\n async destroy(): Promise<void> {\n //\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
2
|
+
var __reflectGet = Reflect.get;
|
|
3
|
+
var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
|
|
4
|
+
var __async = (__this, __arguments, generator) => {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
var fulfilled = (value) => {
|
|
7
|
+
try {
|
|
8
|
+
step(generator.next(value));
|
|
9
|
+
} catch (e) {
|
|
10
|
+
reject(e);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
var rejected = (value) => {
|
|
14
|
+
try {
|
|
15
|
+
step(generator.throw(value));
|
|
16
|
+
} catch (e) {
|
|
17
|
+
reject(e);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
21
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
import { PageAgent } from "../common/agent";
|
|
25
|
+
import { assert } from "@midscene/shared/utils";
|
|
26
|
+
import {
|
|
27
|
+
BridgeEvent,
|
|
28
|
+
BridgePageType,
|
|
29
|
+
DefaultBridgeServerPort,
|
|
30
|
+
KeyboardEvent,
|
|
31
|
+
MouseEvent
|
|
32
|
+
} from "./common";
|
|
33
|
+
import { BridgeServer } from "./io-server";
|
|
34
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
35
|
+
const getBridgePageInCliSide = () => {
|
|
36
|
+
const server = new BridgeServer(DefaultBridgeServerPort);
|
|
37
|
+
server.listen();
|
|
38
|
+
const bridgeCaller = (method) => {
|
|
39
|
+
return (...args) => __async(void 0, null, function* () {
|
|
40
|
+
const response = yield server.call(method, args);
|
|
41
|
+
return response;
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
const page = {
|
|
45
|
+
showStatusMessage: (message) => __async(void 0, null, function* () {
|
|
46
|
+
yield server.call(BridgeEvent.UpdateAgentStatus, [message]);
|
|
47
|
+
})
|
|
48
|
+
};
|
|
49
|
+
return new Proxy(page, {
|
|
50
|
+
get(target, prop, receiver) {
|
|
51
|
+
assert(typeof prop === "string", "prop must be a string");
|
|
52
|
+
if (prop === "toJSON") {
|
|
53
|
+
return () => {
|
|
54
|
+
return {
|
|
55
|
+
pageType: BridgePageType
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (prop === "pageType") {
|
|
60
|
+
return BridgePageType;
|
|
61
|
+
}
|
|
62
|
+
if (prop === "_forceUsePageContext") {
|
|
63
|
+
return void 0;
|
|
64
|
+
}
|
|
65
|
+
if (Object.keys(page).includes(prop)) {
|
|
66
|
+
return page[prop];
|
|
67
|
+
}
|
|
68
|
+
if (prop === "mouse") {
|
|
69
|
+
const mouse = {
|
|
70
|
+
click: bridgeCaller(MouseEvent.Click),
|
|
71
|
+
wheel: bridgeCaller(MouseEvent.Wheel),
|
|
72
|
+
move: bridgeCaller(MouseEvent.Move),
|
|
73
|
+
drag: bridgeCaller(MouseEvent.Drag)
|
|
74
|
+
};
|
|
75
|
+
return mouse;
|
|
76
|
+
}
|
|
77
|
+
if (prop === "keyboard") {
|
|
78
|
+
const keyboard = {
|
|
79
|
+
type: bridgeCaller(KeyboardEvent.Type),
|
|
80
|
+
press: bridgeCaller(KeyboardEvent.Press)
|
|
81
|
+
};
|
|
82
|
+
return keyboard;
|
|
83
|
+
}
|
|
84
|
+
if (prop === "destroy") {
|
|
85
|
+
return (...args) => __async(this, null, function* () {
|
|
86
|
+
try {
|
|
87
|
+
const caller = bridgeCaller("destroy");
|
|
88
|
+
yield caller(...args);
|
|
89
|
+
} catch (e) {
|
|
90
|
+
}
|
|
91
|
+
return server.close();
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return bridgeCaller(prop);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
class AgentOverChromeBridge extends PageAgent {
|
|
99
|
+
constructor(opts) {
|
|
100
|
+
const page = getBridgePageInCliSide();
|
|
101
|
+
super(
|
|
102
|
+
page,
|
|
103
|
+
Object.assign(opts || {}, {
|
|
104
|
+
onTaskStartTip: (tip) => {
|
|
105
|
+
this.page.showStatusMessage(tip);
|
|
106
|
+
}
|
|
107
|
+
})
|
|
108
|
+
);
|
|
109
|
+
if (typeof (opts == null ? void 0 : opts.closeNewTabsAfterDisconnect) === "boolean") {
|
|
110
|
+
this.page.setDestroyOptions({
|
|
111
|
+
closeTab: opts.closeNewTabsAfterDisconnect
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
connectNewTabWithUrl(url, options) {
|
|
116
|
+
return __async(this, null, function* () {
|
|
117
|
+
yield this.page.connectNewTabWithUrl(url, options);
|
|
118
|
+
yield sleep(500);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
connectCurrentTab(options) {
|
|
122
|
+
return __async(this, null, function* () {
|
|
123
|
+
yield this.page.connectCurrentTab(options);
|
|
124
|
+
yield sleep(500);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
aiAction(prompt, options) {
|
|
128
|
+
return __async(this, null, function* () {
|
|
129
|
+
if (options) {
|
|
130
|
+
console.warn(
|
|
131
|
+
"the `options` parameter of aiAction is not supported in cli side"
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
return yield __superGet(AgentOverChromeBridge.prototype, this, "aiAction").call(this, prompt);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
destroy(closeNewTabsAfterDisconnect) {
|
|
138
|
+
return __async(this, null, function* () {
|
|
139
|
+
if (typeof closeNewTabsAfterDisconnect === "boolean") {
|
|
140
|
+
yield this.page.setDestroyOptions({
|
|
141
|
+
closeTab: closeNewTabsAfterDisconnect
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
yield __superGet(AgentOverChromeBridge.prototype, this, "destroy").call(this);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
export {
|
|
149
|
+
AgentOverChromeBridge,
|
|
150
|
+
getBridgePageInCliSide
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
//# sourceMappingURL=agent-cli-side.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../src/bridge-mode/agent-cli-side.ts"],"sourcesContent":["import { PageAgent, type PageAgentOpt } from '../common/agent';\nimport type {\n ChromePageDestroyOptions,\n KeyboardAction,\n MouseAction,\n} from '../page';\nimport { assert } from '@midscene/shared/utils';\nimport {\n type BridgeConnectTabOptions,\n BridgeEvent,\n BridgePageType,\n DefaultBridgeServerPort,\n KeyboardEvent,\n MouseEvent,\n} from './common';\nimport { BridgeServer } from './io-server';\nimport type { ExtensionBridgePageBrowserSide } from './page-browser-side';\n\ninterface ChromeExtensionPageCliSide extends ExtensionBridgePageBrowserSide {\n showStatusMessage: (message: string) => Promise<void>;\n}\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n// actually, this is a proxy to the page in browser side\nexport const getBridgePageInCliSide = (): ChromeExtensionPageCliSide => {\n const server = new BridgeServer(DefaultBridgeServerPort);\n server.listen();\n const bridgeCaller = (method: string) => {\n return async (...args: any[]) => {\n const response = await server.call(method, args);\n return response;\n };\n };\n const page = {\n showStatusMessage: async (message: string) => {\n await server.call(BridgeEvent.UpdateAgentStatus, [message]);\n },\n };\n\n return new Proxy(page, {\n get(target, prop, receiver) {\n assert(typeof prop === 'string', 'prop must be a string');\n\n if (prop === 'toJSON') {\n return () => {\n return {\n pageType: BridgePageType,\n };\n };\n }\n\n if (prop === 'pageType') {\n return BridgePageType;\n }\n\n if (prop === '_forceUsePageContext') {\n return undefined;\n }\n\n if (Object.keys(page).includes(prop)) {\n return page[prop as keyof typeof page];\n }\n\n if (prop === 'mouse') {\n const mouse: MouseAction = {\n click: bridgeCaller(MouseEvent.Click),\n wheel: bridgeCaller(MouseEvent.Wheel),\n move: bridgeCaller(MouseEvent.Move),\n drag: bridgeCaller(MouseEvent.Drag),\n };\n return mouse;\n }\n\n if (prop === 'keyboard') {\n const keyboard: KeyboardAction = {\n type: bridgeCaller(KeyboardEvent.Type),\n press: bridgeCaller(KeyboardEvent.Press),\n };\n return keyboard;\n }\n\n if (prop === 'destroy') {\n return async (...args: any[]) => {\n try {\n const caller = bridgeCaller('destroy');\n await caller(...args);\n } catch (e) {\n // console.error('error calling destroy', e);\n }\n return server.close();\n };\n }\n\n return bridgeCaller(prop);\n },\n }) as ChromeExtensionPageCliSide;\n};\n\nexport class AgentOverChromeBridge extends PageAgent<ChromeExtensionPageCliSide> {\n constructor(opts?: PageAgentOpt & { closeNewTabsAfterDisconnect?: boolean }) {\n const page = getBridgePageInCliSide();\n super(\n page,\n Object.assign(opts || {}, {\n onTaskStartTip: (tip: string) => {\n this.page.showStatusMessage(tip);\n },\n }),\n );\n\n if (typeof opts?.closeNewTabsAfterDisconnect === 'boolean') {\n this.page.setDestroyOptions({\n closeTab: opts.closeNewTabsAfterDisconnect,\n });\n }\n }\n\n async connectNewTabWithUrl(url: string, options?: BridgeConnectTabOptions) {\n await this.page.connectNewTabWithUrl(url, options);\n await sleep(500);\n }\n\n async connectCurrentTab(options?: BridgeConnectTabOptions) {\n await this.page.connectCurrentTab(options);\n await sleep(500);\n }\n\n async aiAction(prompt: string, options?: any) {\n if (options) {\n console.warn(\n 'the `options` parameter of aiAction is not supported in cli side',\n );\n }\n return await super.aiAction(prompt);\n }\n\n async destroy(closeNewTabsAfterDisconnect?: boolean) {\n if (typeof closeNewTabsAfterDisconnect === 'boolean') {\n await this.page.setDestroyOptions({\n closeTab: closeNewTabsAfterDisconnect,\n });\n }\n await super.destroy();\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"AAAA,SAAS,sCAAsC","names":[],"ignoreList":[],"sources":["../../../src/bridge-mode/browser.ts"],"sourcesContent":["import { ExtensionBridgePageBrowserSide } from '../bridge-mode/page-browser-side';\n\nexport { ExtensionBridgePageBrowserSide };\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const DefaultBridgeServerPort = 3766;
|
|
2
|
+
const DefaultLocalEndpoint = `http://127.0.0.1:${DefaultBridgeServerPort}`;
|
|
3
|
+
const BridgeCallTimeout = 3e4;
|
|
4
|
+
var BridgeEvent = /* @__PURE__ */ ((BridgeEvent2) => {
|
|
5
|
+
BridgeEvent2["Call"] = "bridge-call";
|
|
6
|
+
BridgeEvent2["CallResponse"] = "bridge-call-response";
|
|
7
|
+
BridgeEvent2["UpdateAgentStatus"] = "bridge-update-agent-status";
|
|
8
|
+
BridgeEvent2["Message"] = "bridge-message";
|
|
9
|
+
BridgeEvent2["Connected"] = "bridge-connected";
|
|
10
|
+
BridgeEvent2["Refused"] = "bridge-refused";
|
|
11
|
+
BridgeEvent2["ConnectNewTabWithUrl"] = "connectNewTabWithUrl";
|
|
12
|
+
BridgeEvent2["ConnectCurrentTab"] = "connectCurrentTab";
|
|
13
|
+
BridgeEvent2["SetDestroyOptions"] = "setDestroyOptions";
|
|
14
|
+
return BridgeEvent2;
|
|
15
|
+
})(BridgeEvent || {});
|
|
16
|
+
var MouseEvent = /* @__PURE__ */ ((MouseEvent2) => {
|
|
17
|
+
MouseEvent2["PREFIX"] = "mouse.";
|
|
18
|
+
MouseEvent2["Click"] = "mouse.click";
|
|
19
|
+
MouseEvent2["Wheel"] = "mouse.wheel";
|
|
20
|
+
MouseEvent2["Move"] = "mouse.move";
|
|
21
|
+
MouseEvent2["Drag"] = "mouse.drag";
|
|
22
|
+
return MouseEvent2;
|
|
23
|
+
})(MouseEvent || {});
|
|
24
|
+
var KeyboardEvent = /* @__PURE__ */ ((KeyboardEvent2) => {
|
|
25
|
+
KeyboardEvent2["PREFIX"] = "keyboard.";
|
|
26
|
+
KeyboardEvent2["Type"] = "keyboard.type";
|
|
27
|
+
KeyboardEvent2["Press"] = "keyboard.press";
|
|
28
|
+
return KeyboardEvent2;
|
|
29
|
+
})(KeyboardEvent || {});
|
|
30
|
+
const BridgePageType = "page-over-chrome-extension-bridge";
|
|
31
|
+
const BridgeErrorCodeNoClientConnected = "no-client-connected";
|
|
32
|
+
export {
|
|
33
|
+
BridgeCallTimeout,
|
|
34
|
+
BridgeErrorCodeNoClientConnected,
|
|
35
|
+
BridgeEvent,
|
|
36
|
+
BridgePageType,
|
|
37
|
+
DefaultBridgeServerPort,
|
|
38
|
+
DefaultLocalEndpoint,
|
|
39
|
+
KeyboardEvent,
|
|
40
|
+
MouseEvent
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"AAAO,MAAM,0BAA0B;AAChC,MAAM,uBAAuB,oBAAoB,uBAAuB;AACxE,MAAM,oBAAoB;AAE1B,IAAK,cAAL,kBAAKA,iBAAL;AACL,EAAAA,aAAA,UAAO;AACP,EAAAA,aAAA,kBAAe;AACf,EAAAA,aAAA,uBAAoB;AACpB,EAAAA,aAAA,aAAU;AACV,EAAAA,aAAA,eAAY;AACZ,EAAAA,aAAA,aAAU;AACV,EAAAA,aAAA,0BAAuB;AACvB,EAAAA,aAAA,uBAAoB;AACpB,EAAAA,aAAA,uBAAoB;AATV,SAAAA;AAAA;AAoBL,IAAK,aAAL,kBAAKC,gBAAL;AACL,EAAAA,YAAA,YAAS;AACT,EAAAA,YAAA,WAAQ;AACR,EAAAA,YAAA,WAAQ;AACR,EAAAA,YAAA,UAAO;AACP,EAAAA,YAAA,UAAO;AALG,SAAAA;AAAA;AAQL,IAAK,gBAAL,kBAAKC,mBAAL;AACL,EAAAA,eAAA,YAAS;AACT,EAAAA,eAAA,UAAO;AACP,EAAAA,eAAA,WAAQ;AAHE,SAAAA;AAAA;AAML,MAAM,iBAAiB;AAEvB,MAAM,mCAAmC","names":["BridgeEvent","MouseEvent","KeyboardEvent"],"ignoreList":[],"sources":["../../../src/bridge-mode/common.ts"],"sourcesContent":["export const DefaultBridgeServerPort = 3766;\nexport const DefaultLocalEndpoint = `http://127.0.0.1:${DefaultBridgeServerPort}`;\nexport const BridgeCallTimeout = 30000;\n\nexport enum BridgeEvent {\n Call = 'bridge-call',\n CallResponse = 'bridge-call-response',\n UpdateAgentStatus = 'bridge-update-agent-status',\n Message = 'bridge-message',\n Connected = 'bridge-connected',\n Refused = 'bridge-refused',\n ConnectNewTabWithUrl = 'connectNewTabWithUrl',\n ConnectCurrentTab = 'connectCurrentTab',\n SetDestroyOptions = 'setDestroyOptions',\n}\n\nexport interface BridgeConnectTabOptions {\n /**\n * If true, the page will always track the active tab.\n * @default true\n */\n forceSameTabNavigation?: boolean;\n}\n\nexport enum MouseEvent {\n PREFIX = 'mouse.',\n Click = 'mouse.click',\n Wheel = 'mouse.wheel',\n Move = 'mouse.move',\n Drag = 'mouse.drag',\n}\n\nexport enum KeyboardEvent {\n PREFIX = 'keyboard.',\n Type = 'keyboard.type',\n Press = 'keyboard.press',\n}\n\nexport const BridgePageType = 'page-over-chrome-extension-bridge';\n\nexport const BridgeErrorCodeNoClientConnected = 'no-client-connected';\n\nexport interface BridgeCall {\n method: string;\n args: any[];\n response: any;\n callTime: number;\n responseTime: number;\n callback: (error: Error | undefined, response: any) => void;\n error?: Error;\n}\n\nexport interface BridgeCallRequest {\n id: string;\n method: string;\n args: any[];\n}\n\nexport interface BridgeCallResponse {\n id: string;\n response: any;\n error?: any;\n}\n\nexport interface BridgeConnectedEventPayload {\n version: string;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"AAAA,SAAS,6BAA6B;AAItC,SAAS,wBAAwB","names":[],"ignoreList":[],"sources":["../../../src/bridge-mode/index.ts"],"sourcesContent":["import { AgentOverChromeBridge } from './agent-cli-side';\n\nexport { AgentOverChromeBridge };\n\nexport { overrideAIConfig } from '@midscene/core/env';\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
|