@rpascene/web 0.30.8

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.
Files changed (135) hide show
  1. package/README.md +9 -0
  2. package/bin/midscene-playground +3 -0
  3. package/dist/es/bin.mjs +26 -0
  4. package/dist/es/bin.mjs.map +1 -0
  5. package/dist/es/bridge-mode/agent-cli-side.mjs +117 -0
  6. package/dist/es/bridge-mode/agent-cli-side.mjs.map +1 -0
  7. package/dist/es/bridge-mode/browser.mjs +2 -0
  8. package/dist/es/bridge-mode/common.mjs +37 -0
  9. package/dist/es/bridge-mode/common.mjs.map +1 -0
  10. package/dist/es/bridge-mode/index.mjs +4 -0
  11. package/dist/es/bridge-mode/io-client.mjs +101 -0
  12. package/dist/es/bridge-mode/io-client.mjs.map +1 -0
  13. package/dist/es/bridge-mode/io-server.mjs +208 -0
  14. package/dist/es/bridge-mode/io-server.mjs.map +1 -0
  15. package/dist/es/bridge-mode/page-browser-side.mjs +103 -0
  16. package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -0
  17. package/dist/es/chrome-extension/agent.mjs +9 -0
  18. package/dist/es/chrome-extension/agent.mjs.map +1 -0
  19. package/dist/es/chrome-extension/cdpInput.mjs +174 -0
  20. package/dist/es/chrome-extension/cdpInput.mjs.LICENSE.txt +5 -0
  21. package/dist/es/chrome-extension/cdpInput.mjs.map +1 -0
  22. package/dist/es/chrome-extension/dynamic-scripts.mjs +37 -0
  23. package/dist/es/chrome-extension/dynamic-scripts.mjs.map +1 -0
  24. package/dist/es/chrome-extension/index.mjs +5 -0
  25. package/dist/es/chrome-extension/page.mjs +633 -0
  26. package/dist/es/chrome-extension/page.mjs.map +1 -0
  27. package/dist/es/index.mjs +6 -0
  28. package/dist/es/playwright/ai-fixture.mjs +325 -0
  29. package/dist/es/playwright/ai-fixture.mjs.map +1 -0
  30. package/dist/es/playwright/index.mjs +23 -0
  31. package/dist/es/playwright/index.mjs.map +1 -0
  32. package/dist/es/playwright/page.mjs +9 -0
  33. package/dist/es/playwright/page.mjs.map +1 -0
  34. package/dist/es/playwright/reporter/index.mjs +90 -0
  35. package/dist/es/playwright/reporter/index.mjs.map +1 -0
  36. package/dist/es/puppeteer/agent-launcher.mjs +132 -0
  37. package/dist/es/puppeteer/agent-launcher.mjs.map +1 -0
  38. package/dist/es/puppeteer/base-page.mjs +491 -0
  39. package/dist/es/puppeteer/base-page.mjs.map +1 -0
  40. package/dist/es/puppeteer/index.mjs +17 -0
  41. package/dist/es/puppeteer/index.mjs.map +1 -0
  42. package/dist/es/puppeteer/page.mjs +9 -0
  43. package/dist/es/puppeteer/page.mjs.map +1 -0
  44. package/dist/es/static/index.mjs +3 -0
  45. package/dist/es/static/static-agent.mjs +10 -0
  46. package/dist/es/static/static-agent.mjs.map +1 -0
  47. package/dist/es/static/static-page.mjs +132 -0
  48. package/dist/es/static/static-page.mjs.map +1 -0
  49. package/dist/es/web-element.mjs +96 -0
  50. package/dist/es/web-element.mjs.map +1 -0
  51. package/dist/es/web-page.mjs +206 -0
  52. package/dist/es/web-page.mjs.map +1 -0
  53. package/dist/lib/bin.js +54 -0
  54. package/dist/lib/bin.js.map +1 -0
  55. package/dist/lib/bridge-mode/agent-cli-side.js +154 -0
  56. package/dist/lib/bridge-mode/agent-cli-side.js.map +1 -0
  57. package/dist/lib/bridge-mode/browser.js +38 -0
  58. package/dist/lib/bridge-mode/browser.js.map +1 -0
  59. package/dist/lib/bridge-mode/common.js +95 -0
  60. package/dist/lib/bridge-mode/common.js.map +1 -0
  61. package/dist/lib/bridge-mode/index.js +46 -0
  62. package/dist/lib/bridge-mode/index.js.map +1 -0
  63. package/dist/lib/bridge-mode/io-client.js +135 -0
  64. package/dist/lib/bridge-mode/io-client.js.map +1 -0
  65. package/dist/lib/bridge-mode/io-server.js +245 -0
  66. package/dist/lib/bridge-mode/io-server.js.map +1 -0
  67. package/dist/lib/bridge-mode/page-browser-side.js +147 -0
  68. package/dist/lib/bridge-mode/page-browser-side.js.map +1 -0
  69. package/dist/lib/chrome-extension/agent.js +43 -0
  70. package/dist/lib/chrome-extension/agent.js.map +1 -0
  71. package/dist/lib/chrome-extension/cdpInput.js +208 -0
  72. package/dist/lib/chrome-extension/cdpInput.js.LICENSE.txt +5 -0
  73. package/dist/lib/chrome-extension/cdpInput.js.map +1 -0
  74. package/dist/lib/chrome-extension/dynamic-scripts.js +77 -0
  75. package/dist/lib/chrome-extension/dynamic-scripts.js.map +1 -0
  76. package/dist/lib/chrome-extension/index.js +60 -0
  77. package/dist/lib/chrome-extension/index.js.map +1 -0
  78. package/dist/lib/chrome-extension/page.js +667 -0
  79. package/dist/lib/chrome-extension/page.js.map +1 -0
  80. package/dist/lib/index.js +60 -0
  81. package/dist/lib/index.js.map +1 -0
  82. package/dist/lib/playwright/ai-fixture.js +362 -0
  83. package/dist/lib/playwright/ai-fixture.js.map +1 -0
  84. package/dist/lib/playwright/index.js +66 -0
  85. package/dist/lib/playwright/index.js.map +1 -0
  86. package/dist/lib/playwright/page.js +43 -0
  87. package/dist/lib/playwright/page.js.map +1 -0
  88. package/dist/lib/playwright/reporter/index.js +124 -0
  89. package/dist/lib/playwright/reporter/index.js.map +1 -0
  90. package/dist/lib/puppeteer/agent-launcher.js +194 -0
  91. package/dist/lib/puppeteer/agent-launcher.js.map +1 -0
  92. package/dist/lib/puppeteer/base-page.js +531 -0
  93. package/dist/lib/puppeteer/base-page.js.map +1 -0
  94. package/dist/lib/puppeteer/index.js +57 -0
  95. package/dist/lib/puppeteer/index.js.map +1 -0
  96. package/dist/lib/puppeteer/page.js +43 -0
  97. package/dist/lib/puppeteer/page.js.map +1 -0
  98. package/dist/lib/static/index.js +52 -0
  99. package/dist/lib/static/index.js.map +1 -0
  100. package/dist/lib/static/static-agent.js +44 -0
  101. package/dist/lib/static/static-agent.js.map +1 -0
  102. package/dist/lib/static/static-page.js +166 -0
  103. package/dist/lib/static/static-page.js.map +1 -0
  104. package/dist/lib/web-element.js +136 -0
  105. package/dist/lib/web-element.js.map +1 -0
  106. package/dist/lib/web-page.js +256 -0
  107. package/dist/lib/web-page.js.map +1 -0
  108. package/dist/types/bin.d.ts +1 -0
  109. package/dist/types/bridge-mode/agent-cli-side.d.ts +32 -0
  110. package/dist/types/bridge-mode/browser.d.ts +2 -0
  111. package/dist/types/bridge-mode/common.d.ts +60 -0
  112. package/dist/types/bridge-mode/index.d.ts +4 -0
  113. package/dist/types/bridge-mode/io-client.d.ts +10 -0
  114. package/dist/types/bridge-mode/io-server.d.ts +26 -0
  115. package/dist/types/bridge-mode/page-browser-side.d.ts +18 -0
  116. package/dist/types/chrome-extension/agent.d.ts +5 -0
  117. package/dist/types/chrome-extension/cdpInput.d.ts +52 -0
  118. package/dist/types/chrome-extension/dynamic-scripts.d.ts +3 -0
  119. package/dist/types/chrome-extension/index.d.ts +5 -0
  120. package/dist/types/chrome-extension/page.d.ts +95 -0
  121. package/dist/types/index.d.ts +9 -0
  122. package/dist/types/playwright/ai-fixture.d.ts +117 -0
  123. package/dist/types/playwright/index.d.ts +12 -0
  124. package/dist/types/playwright/page.d.ts +6 -0
  125. package/dist/types/playwright/reporter/index.d.ts +18 -0
  126. package/dist/types/puppeteer/agent-launcher.d.ts +29 -0
  127. package/dist/types/puppeteer/base-page.d.ts +90 -0
  128. package/dist/types/puppeteer/index.d.ts +9 -0
  129. package/dist/types/puppeteer/page.d.ts +6 -0
  130. package/dist/types/static/index.d.ts +2 -0
  131. package/dist/types/static/static-agent.d.ts +5 -0
  132. package/dist/types/static/static-page.d.ts +52 -0
  133. package/dist/types/web-element.d.ts +51 -0
  134. package/dist/types/web-page.d.ts +59 -0
  135. package/package.json +164 -0
@@ -0,0 +1,117 @@
1
+ import { type PlaywrightWebPage } from './index';
2
+ import type { Agent as PageAgent } from '@rpascene/core/agent';
3
+ import { type TestInfo, type TestType } from '@playwright/test';
4
+ import type { Page as OriginPlaywrightPage } from 'playwright';
5
+ export type APITestType = Pick<TestType<any, any>, 'step'>;
6
+ export declare const rpasceneDumpAnnotationId = "RPASCENE_DUMP_ANNOTATION";
7
+ type PlaywrightCacheConfig = {
8
+ strategy?: 'read-only' | 'read-write' | 'write-only';
9
+ id?: string;
10
+ };
11
+ type PlaywrightCache = false | true | PlaywrightCacheConfig;
12
+ export declare const PlaywrightAiFixture: (options?: {
13
+ forceSameTabNavigation?: boolean;
14
+ waitForNetworkIdleTimeout?: number;
15
+ waitForNavigationTimeout?: number;
16
+ cache?: PlaywrightCache;
17
+ }) => {
18
+ agentForPage: ({ page }: {
19
+ page: OriginPlaywrightPage;
20
+ }, use: any, testInfo: TestInfo) => Promise<void>;
21
+ ai: ({ page }: {
22
+ page: OriginPlaywrightPage;
23
+ }, use: any, testInfo: TestInfo) => Promise<void>;
24
+ aiAction: ({ page }: {
25
+ page: OriginPlaywrightPage;
26
+ }, use: any, testInfo: TestInfo) => Promise<void>;
27
+ aiTap: ({ page }: {
28
+ page: OriginPlaywrightPage;
29
+ }, use: any, testInfo: TestInfo) => Promise<void>;
30
+ aiRightClick: ({ page }: {
31
+ page: OriginPlaywrightPage;
32
+ }, use: any, testInfo: TestInfo) => Promise<void>;
33
+ aiDoubleClick: ({ page }: {
34
+ page: OriginPlaywrightPage;
35
+ }, use: any, testInfo: TestInfo) => Promise<void>;
36
+ aiHover: ({ page }: {
37
+ page: OriginPlaywrightPage;
38
+ }, use: any, testInfo: TestInfo) => Promise<void>;
39
+ aiInput: ({ page }: {
40
+ page: OriginPlaywrightPage;
41
+ }, use: any, testInfo: TestInfo) => Promise<void>;
42
+ aiKeyboardPress: ({ page }: {
43
+ page: OriginPlaywrightPage;
44
+ }, use: any, testInfo: TestInfo) => Promise<void>;
45
+ aiScroll: ({ page }: {
46
+ page: OriginPlaywrightPage;
47
+ }, use: any, testInfo: TestInfo) => Promise<void>;
48
+ aiQuery: ({ page }: {
49
+ page: OriginPlaywrightPage;
50
+ }, use: any, testInfo: TestInfo) => Promise<void>;
51
+ aiAssert: ({ page }: {
52
+ page: OriginPlaywrightPage;
53
+ }, use: any, testInfo: TestInfo) => Promise<void>;
54
+ aiWaitFor: ({ page }: {
55
+ page: OriginPlaywrightPage;
56
+ }, use: any, testInfo: TestInfo) => Promise<void>;
57
+ aiLocate: ({ page }: {
58
+ page: OriginPlaywrightPage;
59
+ }, use: any, testInfo: TestInfo) => Promise<void>;
60
+ aiNumber: ({ page }: {
61
+ page: OriginPlaywrightPage;
62
+ }, use: any, testInfo: TestInfo) => Promise<void>;
63
+ aiString: ({ page }: {
64
+ page: OriginPlaywrightPage;
65
+ }, use: any, testInfo: TestInfo) => Promise<void>;
66
+ aiBoolean: ({ page }: {
67
+ page: OriginPlaywrightPage;
68
+ }, use: any, testInfo: TestInfo) => Promise<void>;
69
+ aiAsk: ({ page }: {
70
+ page: OriginPlaywrightPage;
71
+ }, use: any, testInfo: TestInfo) => Promise<void>;
72
+ runYaml: ({ page }: {
73
+ page: OriginPlaywrightPage;
74
+ }, use: any, testInfo: TestInfo) => Promise<void>;
75
+ setAIActionContext: ({ page }: {
76
+ page: OriginPlaywrightPage;
77
+ }, use: any, testInfo: TestInfo) => Promise<void>;
78
+ evaluateJavaScript: ({ page }: {
79
+ page: OriginPlaywrightPage;
80
+ }, use: any, testInfo: TestInfo) => Promise<void>;
81
+ logScreenshot: ({ page }: {
82
+ page: OriginPlaywrightPage;
83
+ }, use: any, testInfo: TestInfo) => Promise<void>;
84
+ freezePageContext: ({ page }: {
85
+ page: OriginPlaywrightPage;
86
+ }, use: any, testInfo: TestInfo) => Promise<void>;
87
+ unfreezePageContext: ({ page }: {
88
+ page: OriginPlaywrightPage;
89
+ }, use: any, testInfo: TestInfo) => Promise<void>;
90
+ };
91
+ export type PlayWrightAiFixtureType = {
92
+ agentForPage: (page?: any, opts?: any) => Promise<PageAgent<PlaywrightWebPage>>;
93
+ ai: <T = any>(prompt: string) => Promise<T>;
94
+ aiAction: (taskPrompt: string) => ReturnType<PageAgent['aiAction']>;
95
+ aiTap: (...args: Parameters<PageAgent['aiTap']>) => ReturnType<PageAgent['aiTap']>;
96
+ aiRightClick: (...args: Parameters<PageAgent['aiRightClick']>) => ReturnType<PageAgent['aiRightClick']>;
97
+ aiDoubleClick: (...args: Parameters<PageAgent['aiDoubleClick']>) => ReturnType<PageAgent['aiDoubleClick']>;
98
+ aiHover: (...args: Parameters<PageAgent['aiHover']>) => ReturnType<PageAgent['aiHover']>;
99
+ aiInput: (...args: Parameters<PageAgent['aiInput']>) => ReturnType<PageAgent['aiInput']>;
100
+ aiKeyboardPress: (...args: Parameters<PageAgent['aiKeyboardPress']>) => ReturnType<PageAgent['aiKeyboardPress']>;
101
+ aiScroll: (...args: Parameters<PageAgent['aiScroll']>) => ReturnType<PageAgent['aiScroll']>;
102
+ aiQuery: <T = any>(...args: Parameters<PageAgent['aiQuery']>) => Promise<T>;
103
+ aiAssert: (...args: Parameters<PageAgent['aiAssert']>) => ReturnType<PageAgent['aiAssert']>;
104
+ aiWaitFor: (...args: Parameters<PageAgent['aiWaitFor']>) => Promise<void>;
105
+ aiLocate: (...args: Parameters<PageAgent['aiLocate']>) => ReturnType<PageAgent['aiLocate']>;
106
+ aiNumber: (...args: Parameters<PageAgent['aiNumber']>) => ReturnType<PageAgent['aiNumber']>;
107
+ aiString: (...args: Parameters<PageAgent['aiString']>) => ReturnType<PageAgent['aiString']>;
108
+ aiBoolean: (...args: Parameters<PageAgent['aiBoolean']>) => ReturnType<PageAgent['aiBoolean']>;
109
+ aiAsk: (...args: Parameters<PageAgent['aiAsk']>) => ReturnType<PageAgent['aiAsk']>;
110
+ runYaml: (...args: Parameters<PageAgent['runYaml']>) => ReturnType<PageAgent['runYaml']>;
111
+ setAIActionContext: (...args: Parameters<PageAgent['setAIActionContext']>) => ReturnType<PageAgent['setAIActionContext']>;
112
+ evaluateJavaScript: (...args: Parameters<PageAgent['evaluateJavaScript']>) => ReturnType<PageAgent['evaluateJavaScript']>;
113
+ logScreenshot: (...args: Parameters<PageAgent['logScreenshot']>) => ReturnType<PageAgent['logScreenshot']>;
114
+ freezePageContext: (...args: Parameters<PageAgent['freezePageContext']>) => ReturnType<PageAgent['freezePageContext']>;
115
+ unfreezePageContext: (...args: Parameters<PageAgent['unfreezePageContext']>) => ReturnType<PageAgent['unfreezePageContext']>;
116
+ };
117
+ export {};
@@ -0,0 +1,12 @@
1
+ import { Agent as PageAgent } from '@rpascene/core/agent';
2
+ import type { Page as PlaywrightPage } from 'playwright';
3
+ import { WebPage as PlaywrightWebPage } from './page';
4
+ export type { PlayWrightAiFixtureType } from './ai-fixture';
5
+ export { PlaywrightAiFixture } from './ai-fixture';
6
+ export { overrideAIConfig } from '@rpascene/shared/env';
7
+ export { WebPage as PlaywrightWebPage } from './page';
8
+ import type { WebPageAgentOpt } from '../web-element';
9
+ export declare class PlaywrightAgent extends PageAgent<PlaywrightWebPage> {
10
+ constructor(page: PlaywrightPage, opts?: WebPageAgentOpt);
11
+ waitForNetworkIdle(timeout?: number): Promise<void>;
12
+ }
@@ -0,0 +1,6 @@
1
+ import type { Page as PlaywrightPageType } from 'playwright';
2
+ import { Page as BasePage } from '../puppeteer/base-page';
3
+ import type { WebPageOpt } from '../web-element';
4
+ export declare class WebPage extends BasePage<'playwright', PlaywrightPageType> {
5
+ constructor(page: PlaywrightPageType, opts?: WebPageOpt);
6
+ }
@@ -0,0 +1,18 @@
1
+ import type { FullConfig, Reporter, Suite, TestCase, TestResult } from '@playwright/test/reporter';
2
+ interface RpasceneReporterOptions {
3
+ type?: 'merged' | 'separate';
4
+ }
5
+ declare class RpasceneReporter implements Reporter {
6
+ private mergedFilename?;
7
+ private testTitleToFilename;
8
+ mode?: 'merged' | 'separate';
9
+ constructor(options?: RpasceneReporterOptions);
10
+ private static getMode;
11
+ private getSeparatedFilename;
12
+ private getReportFilename;
13
+ private updateReport;
14
+ onBegin(config: FullConfig, suite: Suite): Promise<void>;
15
+ onTestBegin(_test: TestCase, _result: TestResult): void;
16
+ onTestEnd(test: TestCase, result: TestResult): void;
17
+ }
18
+ export default RpasceneReporter;
@@ -0,0 +1,29 @@
1
+ import { PuppeteerAgent } from './index';
2
+ import type { Cache, RpasceneYamlScriptWebEnv } from '@rpascene/core';
3
+ import { type Browser } from 'puppeteer';
4
+ export declare const defaultUA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36";
5
+ export declare const defaultViewportWidth = 1440;
6
+ export declare const defaultViewportHeight = 768;
7
+ export declare const defaultViewportScale: number;
8
+ export declare const defaultWaitForNetworkIdleTimeout = 2000;
9
+ interface FreeFn {
10
+ name: string;
11
+ fn: () => void;
12
+ }
13
+ export declare function launchPuppeteerPage(target: RpasceneYamlScriptWebEnv, preference?: {
14
+ headed?: boolean;
15
+ keepWindow?: boolean;
16
+ }, browser?: Browser): Promise<{
17
+ page: import("puppeteer").Page;
18
+ freeFn: FreeFn[];
19
+ }>;
20
+ export declare function puppeteerAgentForTarget(target: RpasceneYamlScriptWebEnv, preference?: {
21
+ headed?: boolean;
22
+ keepWindow?: boolean;
23
+ testId?: string;
24
+ cache?: Cache;
25
+ }, browser?: Browser): Promise<{
26
+ agent: PuppeteerAgent;
27
+ freeFn: FreeFn[];
28
+ }>;
29
+ export {};
@@ -0,0 +1,90 @@
1
+ import { type WebPageAgentOpt } from '../web-element';
2
+ import type { DeviceAction, ElementCacheFeature, ElementTreeNode, Point, Rect, Size, UIContext } from '@rpascene/core';
3
+ import type { AbstractInterface } from '@rpascene/core/device';
4
+ import type { ElementInfo } from '@rpascene/shared/extractor';
5
+ import { type DebugFunction } from '@rpascene/shared/logger';
6
+ import type { Page as PlaywrightPage } from 'playwright';
7
+ import type { Page as PuppeteerPage } from 'puppeteer';
8
+ import { type KeyInput, type MouseButton } from '../web-page';
9
+ export declare const debugPage: DebugFunction;
10
+ export declare class Page<AgentType extends 'puppeteer' | 'playwright', InterfaceType extends PuppeteerPage | PlaywrightPage> implements AbstractInterface {
11
+ underlyingPage: InterfaceType;
12
+ protected waitForNavigationTimeout: number;
13
+ protected waitForNetworkIdleTimeout: number;
14
+ private viewportSize?;
15
+ private onBeforeInvokeAction?;
16
+ private onAfterInvokeAction?;
17
+ private customActions?;
18
+ interfaceType: AgentType;
19
+ actionSpace(): DeviceAction[];
20
+ private evaluate;
21
+ constructor(underlyingPage: InterfaceType, interfaceType: AgentType, opts?: WebPageAgentOpt);
22
+ evaluateJavaScript<T = any>(script: string): Promise<T>;
23
+ waitForNavigation(): Promise<void>;
24
+ waitForNetworkIdle(): Promise<void>;
25
+ getElementsInfo(): Promise<ElementInfo[]>;
26
+ getXpathsById(id: string): Promise<any>;
27
+ getXpathsByPoint(point: Point, isOrderSensitive: boolean): Promise<any>;
28
+ getElementInfoByXpath(xpath: string): Promise<any>;
29
+ cacheFeatureForRect(rect: Rect, opt?: {
30
+ _orderSensitive: boolean;
31
+ }): Promise<ElementCacheFeature>;
32
+ rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect>;
33
+ getElementsNodeTree(): Promise<ElementTreeNode<ElementInfo>>;
34
+ size(): Promise<Size>;
35
+ screenshotBase64(): Promise<string>;
36
+ url(): Promise<string>;
37
+ describe(): string;
38
+ get mouse(): {
39
+ click: (x: number, y: number, options?: {
40
+ button?: MouseButton;
41
+ count?: number;
42
+ }) => Promise<void>;
43
+ wheel: (deltaX: number, deltaY: number) => Promise<void>;
44
+ move: (x: number, y: number) => Promise<void>;
45
+ drag: (from: {
46
+ x: number;
47
+ y: number;
48
+ }, to: {
49
+ x: number;
50
+ y: number;
51
+ }) => Promise<void>;
52
+ };
53
+ get keyboard(): {
54
+ type: (text: string) => Promise<void>;
55
+ press: (action: {
56
+ key: KeyInput;
57
+ command?: string;
58
+ } | {
59
+ key: KeyInput;
60
+ command?: string;
61
+ }[]) => Promise<void>;
62
+ down: (key: KeyInput) => Promise<void>;
63
+ up: (key: KeyInput) => Promise<void>;
64
+ };
65
+ clearInput(element: ElementInfo): Promise<void>;
66
+ private everMoved;
67
+ private moveToPointBeforeScroll;
68
+ scrollUntilTop(startingPoint?: Point): Promise<void>;
69
+ scrollUntilBottom(startingPoint?: Point): Promise<void>;
70
+ scrollUntilLeft(startingPoint?: Point): Promise<void>;
71
+ scrollUntilRight(startingPoint?: Point): Promise<void>;
72
+ scrollUp(distance?: number, startingPoint?: Point): Promise<void>;
73
+ scrollDown(distance?: number, startingPoint?: Point): Promise<void>;
74
+ scrollLeft(distance?: number, startingPoint?: Point): Promise<void>;
75
+ scrollRight(distance?: number, startingPoint?: Point): Promise<void>;
76
+ navigate(url: string): Promise<void>;
77
+ beforeInvokeAction(name: string, param: any): Promise<void>;
78
+ afterInvokeAction(name: string, param: any): Promise<void>;
79
+ destroy(): Promise<void>;
80
+ getContext(): Promise<UIContext>;
81
+ swipe(from: {
82
+ x: number;
83
+ y: number;
84
+ }, to: {
85
+ x: number;
86
+ y: number;
87
+ }, duration?: number): Promise<void>;
88
+ longPress(x: number, y: number, duration?: number): Promise<void>;
89
+ }
90
+ export declare function forceClosePopup(page: PuppeteerPage | PlaywrightPage, debugProfile: DebugFunction): void;
@@ -0,0 +1,9 @@
1
+ import type { WebPageAgentOpt } from '../web-element';
2
+ import { Agent as PageAgent } from '@rpascene/core/agent';
3
+ import type { Page as PuppeteerPage } from 'puppeteer';
4
+ import { PuppeteerWebPage } from './page';
5
+ export { PuppeteerWebPage } from './page';
6
+ export declare class PuppeteerAgent extends PageAgent<PuppeteerWebPage> {
7
+ constructor(page: PuppeteerPage, opts?: WebPageAgentOpt);
8
+ }
9
+ export { overrideAIConfig } from '@rpascene/shared/env';
@@ -0,0 +1,6 @@
1
+ import type { WebPageOpt } from '../web-element';
2
+ import type { Page as PuppeteerPageType } from 'puppeteer';
3
+ import { Page as BasePage } from './base-page';
4
+ export declare class PuppeteerWebPage extends BasePage<'puppeteer', PuppeteerPageType> {
5
+ constructor(page: PuppeteerPageType, opts?: WebPageOpt);
6
+ }
@@ -0,0 +1,2 @@
1
+ export { StaticPageAgent } from './static-agent';
2
+ export { default as StaticPage } from './static-page';
@@ -0,0 +1,5 @@
1
+ import { Agent as PageAgent } from '@rpascene/core/agent';
2
+ import type StaticPage from './static-page';
3
+ export declare class StaticPageAgent extends PageAgent {
4
+ constructor(page: StaticPage);
5
+ }
@@ -0,0 +1,52 @@
1
+ import type { DeviceAction, Point, UIContext } from '@rpascene/core';
2
+ import type { AbstractInterface } from '@rpascene/core/device';
3
+ type WebUIContext = UIContext & {
4
+ screenshotBase64?: string;
5
+ size: {
6
+ width: number;
7
+ height: number;
8
+ dpr?: number;
9
+ };
10
+ };
11
+ export default class StaticPage implements AbstractInterface {
12
+ interfaceType: string;
13
+ private uiContext;
14
+ constructor(uiContext: WebUIContext);
15
+ actionSpace(): DeviceAction[];
16
+ evaluateJavaScript<T = unknown>(script: string): Promise<T>;
17
+ getElementsInfo(): Promise<never>;
18
+ getElementsNodeTree(): Promise<never>;
19
+ getXpathsById(id: string): Promise<never>;
20
+ getXpathsByPoint(point: Point): Promise<never>;
21
+ getElementInfoByXpath(xpath: string): Promise<never>;
22
+ size(): Promise<{
23
+ dpr: number;
24
+ width: number;
25
+ height: number;
26
+ }>;
27
+ screenshotBase64(): Promise<string>;
28
+ url(): Promise<string>;
29
+ scrollUntilTop(startingPoint?: Point): Promise<never>;
30
+ scrollUntilBottom(startingPoint?: Point): Promise<never>;
31
+ scrollUntilLeft(startingPoint?: Point): Promise<never>;
32
+ scrollUntilRight(startingPoint?: Point): Promise<never>;
33
+ scrollUp(distance?: number, startingPoint?: Point): Promise<never>;
34
+ scrollDown(distance?: number, startingPoint?: Point): Promise<never>;
35
+ scrollLeft(distance?: number, startingPoint?: Point): Promise<never>;
36
+ scrollRight(distance?: number, startingPoint?: Point): Promise<never>;
37
+ clearInput(): Promise<never>;
38
+ mouse: {
39
+ click: () => never;
40
+ wheel: () => never;
41
+ move: () => never;
42
+ drag: () => never;
43
+ };
44
+ keyboard: {
45
+ type: () => never;
46
+ press: () => never;
47
+ };
48
+ destroy(): Promise<void>;
49
+ getContext(): Promise<UIContext>;
50
+ updateContext(newContext: WebUIContext): void;
51
+ }
52
+ export {};
@@ -0,0 +1,51 @@
1
+ import type { AgentOpt, DeviceAction, Rect, UIContext, WebElementInfo } from '@rpascene/core';
2
+ import type { AbstractInterface } from '@rpascene/core/device';
3
+ import type { NodeType } from '@rpascene/shared/constants';
4
+ import type ChromeExtensionProxyPage from './chrome-extension/page';
5
+ import type { PlaywrightWebPage } from './playwright';
6
+ import type { PuppeteerWebPage } from './puppeteer';
7
+ import type { StaticPage } from './static';
8
+ export type { WebElementInfo };
9
+ export type WebPageAgentOpt = AgentOpt & WebPageOpt;
10
+ export type WebPageOpt = {
11
+ waitForNavigationTimeout?: number;
12
+ waitForNetworkIdleTimeout?: number;
13
+ forceSameTabNavigation?: boolean;
14
+ beforeInvokeAction?: () => Promise<void>;
15
+ afterInvokeAction?: () => Promise<void>;
16
+ customActions?: DeviceAction<any>[];
17
+ };
18
+ export type WebPage = PlaywrightWebPage | PuppeteerWebPage | StaticPage | ChromeExtensionProxyPage;
19
+ export declare class WebElementInfoImpl implements WebElementInfo {
20
+ content: string;
21
+ rect: Rect;
22
+ center: [number, number];
23
+ id: string;
24
+ indexId: number;
25
+ attributes: {
26
+ nodeType: NodeType;
27
+ [key: string]: string;
28
+ };
29
+ xpaths?: string[];
30
+ isVisible: boolean;
31
+ allPaths?: any;
32
+ containerPaths?: any;
33
+ constructor({ content, rect, id, attributes, indexId, xpaths, isVisible, allPaths, containerPaths }: {
34
+ content: string;
35
+ rect: Rect;
36
+ id: string;
37
+ attributes: {
38
+ nodeType: NodeType;
39
+ [key: string]: string;
40
+ };
41
+ indexId: number;
42
+ xpaths?: string[];
43
+ isVisible: boolean;
44
+ allPaths?: any;
45
+ containerPaths?: any;
46
+ });
47
+ }
48
+ export declare function WebPageContextParser(page: AbstractInterface, _opt: {
49
+ uploadServerUrl?: string;
50
+ }): Promise<UIContext>;
51
+ export declare const limitOpenNewTabScript = "\nif (!window.__RPASCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {\n window.__RPASCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__ = true;\n\n // Intercept the window.open method (only once)\n window.open = function(url) {\n console.log('Blocked window.open:', url);\n window.location.href = url;\n return null;\n };\n\n // Block all a tag clicks with target=\"_blank\" (only once)\n document.addEventListener('click', function(e) {\n const target = e.target.closest('a');\n if (target && target.target === '_blank') {\n e.preventDefault();\n console.log('Blocked new tab:', target.href);\n window.location.href = target.href;\n target.removeAttribute('target');\n }\n }, true);\n}\n";
@@ -0,0 +1,59 @@
1
+ import type { Point } from '@rpascene/core';
2
+ import { AbstractInterface, type DeviceAction } from '@rpascene/core/device';
3
+ import type { ElementInfo } from '@rpascene/shared/extractor';
4
+ export declare function getKeyCommands(value: string | string[]): Array<{
5
+ key: string;
6
+ command?: string;
7
+ }>;
8
+ export declare type KeyInput = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | 'Power' | 'Eject' | 'Abort' | 'Help' | 'Backspace' | 'Tab' | 'Numpad5' | 'NumpadEnter' | 'Enter' | '\r' | '\n' | 'ShiftLeft' | 'ShiftRight' | 'ControlLeft' | 'ControlRight' | 'AltLeft' | 'AltRight' | 'Pause' | 'CapsLock' | 'Escape' | 'Convert' | 'NonConvert' | 'Space' | 'Numpad9' | 'PageUp' | 'Numpad3' | 'PageDown' | 'End' | 'Numpad1' | 'Home' | 'Numpad7' | 'ArrowLeft' | 'Numpad4' | 'Numpad8' | 'ArrowUp' | 'ArrowRight' | 'Numpad6' | 'Numpad2' | 'ArrowDown' | 'Select' | 'Open' | 'PrintScreen' | 'Insert' | 'Numpad0' | 'Delete' | 'NumpadDecimal' | 'Digit0' | 'Digit1' | 'Digit2' | 'Digit3' | 'Digit4' | 'Digit5' | 'Digit6' | 'Digit7' | 'Digit8' | 'Digit9' | 'KeyA' | 'KeyB' | 'KeyC' | 'KeyD' | 'KeyE' | 'KeyF' | 'KeyG' | 'KeyH' | 'KeyI' | 'KeyJ' | 'KeyK' | 'KeyL' | 'KeyM' | 'KeyN' | 'KeyO' | 'KeyP' | 'KeyQ' | 'KeyR' | 'KeyS' | 'KeyT' | 'KeyU' | 'KeyV' | 'KeyW' | 'KeyX' | 'KeyY' | 'KeyZ' | 'MetaLeft' | 'MetaRight' | 'ContextMenu' | 'NumpadMultiply' | 'NumpadAdd' | 'NumpadSubtract' | 'NumpadDivide' | 'F1' | 'F2' | 'F3' | 'F4' | 'F5' | 'F6' | 'F7' | 'F8' | 'F9' | 'F10' | 'F11' | 'F12' | 'F13' | 'F14' | 'F15' | 'F16' | 'F17' | 'F18' | 'F19' | 'F20' | 'F21' | 'F22' | 'F23' | 'F24' | 'NumLock' | 'ScrollLock' | 'AudioVolumeMute' | 'AudioVolumeDown' | 'AudioVolumeUp' | 'MediaTrackNext' | 'MediaTrackPrevious' | 'MediaStop' | 'MediaPlayPause' | 'Semicolon' | 'Equal' | 'NumpadEqual' | 'Comma' | 'Minus' | 'Period' | 'Slash' | 'Backquote' | 'BracketLeft' | 'Backslash' | 'BracketRight' | 'Quote' | 'AltGraph' | 'Props' | 'Cancel' | 'Clear' | 'Shift' | 'Control' | 'Alt' | 'Accept' | 'ModeChange' | ' ' | 'Print' | 'Execute' | '\u0000' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' | 'Meta' | '*' | '+' | '-' | '/' | ';' | '=' | ',' | '.' | '`' | '[' | '\\' | ']' | "'" | 'Attn' | 'CrSel' | 'ExSel' | 'EraseEof' | 'Play' | 'ZoomOut' | ')' | '!' | '@' | '#' | '$' | '%' | '^' | '&' | '(' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z' | ':' | '<' | '_' | '>' | '?' | '~' | '{' | '|' | '}' | '"' | 'SoftLeft' | 'SoftRight' | 'Camera' | 'Call' | 'EndCall' | 'VolumeDown' | 'VolumeUp';
9
+ export type MouseButton = 'left' | 'right' | 'middle';
10
+ export interface MouseAction {
11
+ click: (x: number, y: number, options: {
12
+ button: MouseButton;
13
+ count?: number;
14
+ }) => Promise<void>;
15
+ wheel: (deltaX: number, deltaY: number) => Promise<void>;
16
+ move: (x: number, y: number) => Promise<void>;
17
+ drag: (from: {
18
+ x: number;
19
+ y: number;
20
+ }, to: {
21
+ x: number;
22
+ y: number;
23
+ }) => Promise<void>;
24
+ }
25
+ export interface KeyboardAction {
26
+ type: (text: string) => Promise<void>;
27
+ press: (action: {
28
+ key: KeyInput;
29
+ command?: string;
30
+ } | {
31
+ key: KeyInput;
32
+ command?: string;
33
+ }[]) => Promise<void>;
34
+ }
35
+ export interface ChromePageDestroyOptions {
36
+ closeTab?: boolean;
37
+ }
38
+ export declare abstract class AbstractWebPage extends AbstractInterface {
39
+ get mouse(): MouseAction;
40
+ get keyboard(): KeyboardAction;
41
+ clearInput(element: ElementInfo): Promise<void>;
42
+ abstract scrollUntilTop(startingPoint?: Point): Promise<void>;
43
+ abstract scrollUntilBottom(startingPoint?: Point): Promise<void>;
44
+ abstract scrollUntilLeft(startingPoint?: Point): Promise<void>;
45
+ abstract scrollUntilRight(startingPoint?: Point): Promise<void>;
46
+ abstract scrollUp(distance?: number, startingPoint?: Point): Promise<void>;
47
+ abstract scrollDown(distance?: number, startingPoint?: Point): Promise<void>;
48
+ abstract scrollLeft(distance?: number, startingPoint?: Point): Promise<void>;
49
+ abstract scrollRight(distance?: number, startingPoint?: Point): Promise<void>;
50
+ abstract longPress(x: number, y: number, duration?: number): Promise<void>;
51
+ abstract swipe(from: {
52
+ x: number;
53
+ y: number;
54
+ }, to: {
55
+ x: number;
56
+ y: number;
57
+ }, duration?: number): Promise<void>;
58
+ }
59
+ export declare const commonWebActionsForWebPage: <T extends AbstractWebPage>(page: T) => DeviceAction<any>[];
package/package.json ADDED
@@ -0,0 +1,164 @@
1
+ {
2
+ "name": "@rpascene/web",
3
+ "description": "Automate browser actions, extract data, and perform assertions using AI. It offers JavaScript SDK, Chrome extension, and support for scripting in YAML.",
4
+ "keywords": [
5
+ "AI UI automation",
6
+ "AI testing",
7
+ "Computer use",
8
+ "Browser use",
9
+ "Android use"
10
+ ],
11
+ "version": "0.30.8",
12
+ "repository": "",
13
+ "homepage": "",
14
+ "main": "./dist/lib/index.js",
15
+ "types": "./dist/types/index.d.ts",
16
+ "module": "./dist/es/index.mjs",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/types/index.d.ts",
20
+ "require": "./dist/lib/index.js",
21
+ "import": "./dist/es/index.mjs"
22
+ },
23
+ "./bridge-mode": {
24
+ "types": "./dist/types/bridge-mode/index.d.ts",
25
+ "require": "./dist/lib/bridge-mode/index.js",
26
+ "import": "./dist/es/bridge-mode/index.mjs"
27
+ },
28
+ "./bridge-mode-browser": {
29
+ "types": "./dist/types/bridge-mode/browser.d.ts",
30
+ "require": "./dist/lib/bridge-mode/browser.js",
31
+ "import": "./dist/es/bridge-mode/browser.mjs"
32
+ },
33
+ "./utils": {
34
+ "types": "./dist/types/common/utils.d.ts",
35
+ "require": "./dist/lib/common/utils.js",
36
+ "import": "./dist/es/common/utils.mjs"
37
+ },
38
+ "./ui-utils": {
39
+ "types": "./dist/types/common/ui-utils.d.ts",
40
+ "require": "./dist/lib/common/ui-utils.js",
41
+ "import": "./dist/es/common/ui-utils.mjs"
42
+ },
43
+ "./puppeteer": {
44
+ "types": "./dist/types/puppeteer/index.d.ts",
45
+ "require": "./dist/lib/puppeteer/index.js",
46
+ "import": "./dist/es/puppeteer/index.mjs"
47
+ },
48
+ "./puppeteer-agent-launcher": {
49
+ "types": "./dist/types/puppeteer/agent-launcher.d.ts",
50
+ "require": "./dist/lib/puppeteer/agent-launcher.js",
51
+ "import": "./dist/es/puppeteer/agent-launcher.mjs"
52
+ },
53
+ "./playwright": {
54
+ "types": "./dist/types/playwright/index.d.ts",
55
+ "require": "./dist/lib/playwright/index.js",
56
+ "import": "./dist/es/playwright/index.mjs"
57
+ },
58
+ "./playwright-report": {
59
+ "types": "./dist/types/playwright/reporter/index.d.ts",
60
+ "require": "./dist/lib/playwright/reporter/index.js",
61
+ "import": "./dist/es/playwright/reporter/index.mjs"
62
+ },
63
+ "./playwright-reporter": {
64
+ "types": "./dist/types/playwright/reporter/index.d.ts",
65
+ "require": "./dist/lib/playwright/reporter/index.js",
66
+ "import": "./dist/es/playwright/reporter/index.mjs"
67
+ },
68
+ "./chrome-extension": {
69
+ "types": "./dist/types/chrome-extension/index.d.ts",
70
+ "require": "./dist/lib/chrome-extension/index.js",
71
+ "import": "./dist/es/chrome-extension/index.mjs"
72
+ },
73
+ "./yaml": {
74
+ "types": "./dist/types/yaml/index.d.ts",
75
+ "require": "./dist/lib/yaml/index.js",
76
+ "import": "./dist/es/yaml/index.mjs"
77
+ },
78
+ "./agent": {
79
+ "types": "./dist/types/common/agent.d.ts",
80
+ "require": "./dist/lib/common/agent.js",
81
+ "import": "./dist/es/common/agent.mjs"
82
+ },
83
+ "./static": {
84
+ "types": "./dist/types/static/index.d.ts",
85
+ "require": "./dist/lib/static/index.js",
86
+ "import": "./dist/es/static/index.mjs"
87
+ }
88
+ },
89
+ "watch": {
90
+ "build": {
91
+ "patterns": ["src"],
92
+ "extensions": "tsx,less,scss,css,js,jsx,ts",
93
+ "quiet": false
94
+ }
95
+ },
96
+ "scripts": {
97
+ "dev": "npm run build && npx npm-watch",
98
+ "dev:server": "npm run build && ./bin/rpascene-playground",
99
+ "build": "rslib build",
100
+ "build:watch": "rslib build --watch",
101
+ "playground": "DEBUG=rpascene:* tsx demo/playground.ts",
102
+ "test": "vitest --run",
103
+ "test:u": "vitest --run -u",
104
+ "test:ai": "AI_TEST_TYPE=web npm run test",
105
+ "test:ai:cache": "RPASCENE_CACHE=true npm run test:ai",
106
+ "e2e": "playwright test --config=tests/playwright.config.ts",
107
+ "e2e:report": "RPASCENE_REPORT=true playwright test --config=tests/playwright.config.ts",
108
+ "e2e:cache": "RPASCENE_CACHE=true playwright test --config=tests/playwright.config.ts",
109
+ "e2e:ui": "playwright test --config=tests/playwright.config.ts --ui",
110
+ "e2e:ui:cache": "RPASCENE_CACHE=true playwright test --config=tests/playwright.config.ts --ui"
111
+ },
112
+ "bin": {
113
+ "rpascene-playground": "./bin/rpascene-playground"
114
+ },
115
+ "files": ["static", "dist", "iife-script", "README.md", "bin"],
116
+ "dependencies": {
117
+ "@rpascene/core": "workspace:*",
118
+ "@rpascene/playground": "workspace:*",
119
+ "@rpascene/shared": "workspace:*",
120
+ "cors": "^2.8.5",
121
+ "dayjs": "^1.11.11",
122
+ "dotenv": "^16.4.5",
123
+ "http-server": "14.1.1",
124
+ "socket.io": "^4.8.1",
125
+ "socket.io-client": "4.8.1"
126
+ },
127
+ "devDependencies": {
128
+ "@types/js-yaml": "4.0.9",
129
+ "devtools-protocol": "0.0.1380148",
130
+ "@playwright/test": "^1.44.1",
131
+ "@rslib/core": "^0.11.2",
132
+ "@types/chrome": "0.0.279",
133
+ "@types/cors": "^2.8.17",
134
+ "@types/http-server": "^0.12.4",
135
+ "@types/node": "^18.0.0",
136
+ "playwright": "1.44.1",
137
+ "puppeteer": "24.2.0",
138
+ "js-yaml": "4.1.0",
139
+ "tsx": "^4.19.2",
140
+ "typescript": "^5.8.3",
141
+ "vitest": "3.0.5"
142
+ },
143
+ "peerDependencies": {
144
+ "@playwright/test": "^1.44.1",
145
+ "playwright": "^1.44.1",
146
+ "puppeteer": ">=20.0.0"
147
+ },
148
+ "peerDependenciesMeta": {
149
+ "@playwright/test": {
150
+ "optional": true
151
+ },
152
+ "puppeteer": {
153
+ "optional": true
154
+ }
155
+ },
156
+ "engines": {
157
+ "node": ">=18.0.0"
158
+ },
159
+ "publishConfig": {
160
+ "access": "public",
161
+ "registry": "https://registry.npmjs.org"
162
+ },
163
+ "license": "MIT"
164
+ }