craftdriver 0.0.3 → 0.1.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/README.md +67 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/bidi/connection.d.ts +62 -0
- package/dist/lib/bidi/connection.d.ts.map +1 -0
- package/dist/lib/bidi/connection.js +227 -0
- package/dist/lib/bidi/connection.js.map +1 -0
- package/dist/lib/bidi/index.d.ts +76 -0
- package/dist/lib/bidi/index.d.ts.map +1 -0
- package/dist/lib/bidi/index.js +114 -0
- package/dist/lib/bidi/index.js.map +1 -0
- package/dist/lib/bidi/logs.d.ts +104 -0
- package/dist/lib/bidi/logs.d.ts.map +1 -0
- package/dist/lib/bidi/logs.js +273 -0
- package/dist/lib/bidi/logs.js.map +1 -0
- package/dist/lib/bidi/network.d.ts +92 -0
- package/dist/lib/bidi/network.d.ts.map +1 -0
- package/dist/lib/bidi/network.js +259 -0
- package/dist/lib/bidi/network.js.map +1 -0
- package/dist/lib/bidi/storage.d.ts +81 -0
- package/dist/lib/bidi/storage.d.ts.map +1 -0
- package/dist/lib/bidi/storage.js +292 -0
- package/dist/lib/bidi/storage.js.map +1 -0
- package/dist/lib/bidi/types.d.ts +302 -0
- package/dist/lib/bidi/types.d.ts.map +1 -0
- package/dist/lib/bidi/types.js +6 -0
- package/dist/lib/bidi/types.js.map +1 -0
- package/dist/lib/browser.d.ts +142 -0
- package/dist/lib/browser.d.ts.map +1 -1
- package/dist/lib/browser.js +162 -11
- package/dist/lib/browser.js.map +1 -1
- package/dist/lib/driver.d.ts +2 -0
- package/dist/lib/driver.d.ts.map +1 -1
- package/dist/lib/driver.js +9 -1
- package/dist/lib/driver.js.map +1 -1
- package/dist/lib/elementHandle.d.ts +3 -0
- package/dist/lib/elementHandle.d.ts.map +1 -1
- package/dist/lib/elementHandle.js +33 -0
- package/dist/lib/elementHandle.js.map +1 -1
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -6,8 +6,6 @@ Think of it as a modern take on Selenium with automatic waits and ergonomic API,
|
|
|
6
6
|
|
|
7
7
|
## Getting started
|
|
8
8
|
|
|
9
|
-
Install from npm (package coming soon):
|
|
10
|
-
|
|
11
9
|
```bash
|
|
12
10
|
npm install craftdriver
|
|
13
11
|
```
|
|
@@ -26,7 +24,73 @@ await browser.expect('#result').toHaveText('Welcome testuser');
|
|
|
26
24
|
await browser.quit();
|
|
27
25
|
```
|
|
28
26
|
|
|
29
|
-
|
|
27
|
+
Mobile emulation:
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
const browser = await Browser.launch({
|
|
31
|
+
browserName: 'chrome',
|
|
32
|
+
mobileEmulation: 'iPhone 14',
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Network mocking:
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
const browser = await Browser.launch({
|
|
40
|
+
browserName: 'chrome',
|
|
41
|
+
enableBiDi: true,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
await browser.network.mock('**/api/users', {
|
|
45
|
+
status: 200,
|
|
46
|
+
body: { users: [] },
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Session persistence:
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
await browser.saveState('./session.json');
|
|
54
|
+
|
|
55
|
+
// Later: restore with storageState option
|
|
56
|
+
const browser2 = await Browser.launch({
|
|
57
|
+
browserName: 'chrome',
|
|
58
|
+
storageState: './session.json',
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Feature Overview
|
|
63
|
+
|
|
64
|
+
### Core Features
|
|
65
|
+
|
|
66
|
+
- **Simple API** - Easy to use, works as expected
|
|
67
|
+
- **TypeScript-first** - Full type definitions included
|
|
68
|
+
- **Flexible locators** - CSS, XPath, text, role, and semantic selectors that stay stable
|
|
69
|
+
- **Bulletproof interactions** - Reliable element, mouse, and keyboard control
|
|
70
|
+
- **Auto-waiting** - Smart waits built into all actions
|
|
71
|
+
- **Real browsers** - Test on actual Chrome, Edge, and other W3C-compliant browsers
|
|
72
|
+
- **Mobile emulation** - Test responsive designs with device presets (iPhone, Pixel, iPad)
|
|
73
|
+
|
|
74
|
+
### Advanced Features (BiDi)
|
|
75
|
+
|
|
76
|
+
- **Session persistence** - Save/load cookies and localStorage
|
|
77
|
+
- **Network mocking** - Intercept and mock HTTP requests
|
|
78
|
+
- **Console/Error logs** - Capture browser console messages
|
|
79
|
+
|
|
80
|
+
## Documentation
|
|
81
|
+
|
|
82
|
+
| Guide | Description |
|
|
83
|
+
| -------------------------------------------------- | --------------------------------------------------- |
|
|
84
|
+
| [Getting Started](./docs/getting-started.md) | Installation, prerequisites, and first test |
|
|
85
|
+
| [Browser API](./docs/browser-api.md) | Core browser control: navigation, clicks, forms |
|
|
86
|
+
| [Element API](./docs/element-api.md) | ElementHandle methods for interacting with elements |
|
|
87
|
+
| [Selectors](./docs/selectors.md) | CSS, XPath, and semantic locators (By helpers) |
|
|
88
|
+
| [Assertions](./docs/assertions.md) | Built-in expect API for testing |
|
|
89
|
+
| [Keyboard & Mouse](./docs/keyboard-mouse.md) | Low-level input simulation |
|
|
90
|
+
| [Session Management](./docs/session-management.md) | Cookies, localStorage, and session persistence |
|
|
91
|
+
| [Screenshots](./docs/screenshots.md) | Capturing page and element screenshots |
|
|
92
|
+
| [Mobile Emulation](./docs/mobile-emulation.md) | Test with mobile device viewports and touch events |
|
|
93
|
+
| [BiDi Features](./docs/bidi-features.md) | Network mocking and console log capture |
|
|
30
94
|
|
|
31
95
|
## Contributing
|
|
32
96
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { Browser, type LaunchOptions } from './lib/browser.js';
|
|
1
|
+
export { Browser, devices, type LaunchOptions, type MobileEmulation, type DeviceMetrics, type DeviceName, } from './lib/browser.js';
|
|
2
2
|
export { Key } from './lib/keys.js';
|
|
3
3
|
export { By } from './lib/by.js';
|
|
4
|
+
export { BiDiSession, BiDiConnection, NetworkInterceptor, LogMonitor, SessionStateManager, type SessionState, type StorageStateOptions, type MockResponse, type InterceptedRequest, type ConsoleMessage, type JavaScriptError, type LogMessage, } from './lib/bidi/index.js';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EACP,OAAO,EACP,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGjC,OAAO,EACL,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,UAAU,EACV,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// Public entrypoint: expose the simplified Browser API only
|
|
2
|
-
export { Browser } from './lib/browser.js';
|
|
2
|
+
export { Browser, devices, } from './lib/browser.js';
|
|
3
3
|
export { Key } from './lib/keys.js';
|
|
4
4
|
export { By } from './lib/by.js';
|
|
5
|
+
// BiDi features - network interception, logging, session state
|
|
6
|
+
export { BiDiSession, BiDiConnection, NetworkInterceptor, LogMonitor, SessionStateManager, } from './lib/bidi/index.js';
|
|
5
7
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,EACL,OAAO,EACP,OAAO,GAKR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC,+DAA+D;AAC/D,OAAO,EACL,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,UAAU,EACV,mBAAmB,GAQpB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebDriver BiDi WebSocket connection manager
|
|
3
|
+
* Handles bidirectional communication with the browser
|
|
4
|
+
*/
|
|
5
|
+
export type EventHandler = (params: Record<string, unknown>) => void;
|
|
6
|
+
export interface ConnectionOptions {
|
|
7
|
+
/** Connection timeout in ms (default: 30000) */
|
|
8
|
+
timeout?: number;
|
|
9
|
+
/** Auto-reconnect on disconnect */
|
|
10
|
+
autoReconnect?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare class BiDiConnection {
|
|
13
|
+
private ws;
|
|
14
|
+
private messageId;
|
|
15
|
+
private pending;
|
|
16
|
+
private eventHandlers;
|
|
17
|
+
private connected;
|
|
18
|
+
private wsUrl;
|
|
19
|
+
private options;
|
|
20
|
+
constructor(options?: ConnectionOptions);
|
|
21
|
+
/**
|
|
22
|
+
* Connect to WebDriver BiDi WebSocket endpoint
|
|
23
|
+
*/
|
|
24
|
+
connect(wsUrl: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Check if connected to BiDi endpoint
|
|
27
|
+
*/
|
|
28
|
+
isConnected(): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Send a BiDi command and wait for response
|
|
31
|
+
*/
|
|
32
|
+
send<T = unknown>(method: string, params?: Record<string, unknown>): Promise<T>;
|
|
33
|
+
/**
|
|
34
|
+
* Subscribe to BiDi events
|
|
35
|
+
*/
|
|
36
|
+
subscribe(events: string[], contexts?: string[]): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Unsubscribe from BiDi events
|
|
39
|
+
*/
|
|
40
|
+
unsubscribe(events: string[], contexts?: string[]): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Add event listener for specific BiDi event
|
|
43
|
+
*/
|
|
44
|
+
on(event: string, handler: EventHandler): () => void;
|
|
45
|
+
/**
|
|
46
|
+
* Remove event listener
|
|
47
|
+
*/
|
|
48
|
+
off(event: string, handler: EventHandler): void;
|
|
49
|
+
/**
|
|
50
|
+
* Wait for a specific event (one-time)
|
|
51
|
+
*/
|
|
52
|
+
once<T = Record<string, unknown>>(event: string, predicate?: (params: Record<string, unknown>) => boolean, timeout?: number): Promise<T>;
|
|
53
|
+
/**
|
|
54
|
+
* Close the connection
|
|
55
|
+
*/
|
|
56
|
+
close(): Promise<void>;
|
|
57
|
+
private handleMessage;
|
|
58
|
+
private handleResponse;
|
|
59
|
+
private handleEvent;
|
|
60
|
+
private rejectAllPending;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/lib/bidi/connection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAErE,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAGX;IACJ,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,OAAO,CAAoB;gBAEvB,OAAO,GAAE,iBAAsB;IAO3C;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6C3C;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IA6BzF;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrE;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvE;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI;IAYpD;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAI/C;;OAEG;IACH,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,EACxD,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,CAAC,CAAC;IAmBb;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,gBAAgB;CAMzB"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebDriver BiDi WebSocket connection manager
|
|
3
|
+
* Handles bidirectional communication with the browser
|
|
4
|
+
*/
|
|
5
|
+
import { WebSocket } from 'ws';
|
|
6
|
+
export class BiDiConnection {
|
|
7
|
+
ws = null;
|
|
8
|
+
messageId = 0;
|
|
9
|
+
pending = new Map();
|
|
10
|
+
eventHandlers = new Map();
|
|
11
|
+
connected = false;
|
|
12
|
+
wsUrl = '';
|
|
13
|
+
options;
|
|
14
|
+
constructor(options = {}) {
|
|
15
|
+
this.options = {
|
|
16
|
+
timeout: options.timeout ?? 30000,
|
|
17
|
+
autoReconnect: options.autoReconnect ?? false,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Connect to WebDriver BiDi WebSocket endpoint
|
|
22
|
+
*/
|
|
23
|
+
async connect(wsUrl) {
|
|
24
|
+
if (this.connected && this.ws) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
this.wsUrl = wsUrl;
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const timeout = setTimeout(() => {
|
|
30
|
+
reject(new Error(`BiDi connection timeout after ${this.options.timeout}ms`));
|
|
31
|
+
}, this.options.timeout);
|
|
32
|
+
try {
|
|
33
|
+
this.ws = new WebSocket(wsUrl);
|
|
34
|
+
this.ws.on('open', () => {
|
|
35
|
+
clearTimeout(timeout);
|
|
36
|
+
this.connected = true;
|
|
37
|
+
resolve();
|
|
38
|
+
});
|
|
39
|
+
this.ws.on('message', (data) => {
|
|
40
|
+
this.handleMessage(data.toString());
|
|
41
|
+
});
|
|
42
|
+
this.ws.on('close', () => {
|
|
43
|
+
this.connected = false;
|
|
44
|
+
this.rejectAllPending(new Error('WebSocket connection closed'));
|
|
45
|
+
if (this.options.autoReconnect && this.wsUrl) {
|
|
46
|
+
setTimeout(() => this.connect(this.wsUrl).catch(() => { }), 1000);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
this.ws.on('error', (err) => {
|
|
50
|
+
clearTimeout(timeout);
|
|
51
|
+
this.connected = false;
|
|
52
|
+
reject(err);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
clearTimeout(timeout);
|
|
57
|
+
reject(err);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if connected to BiDi endpoint
|
|
63
|
+
*/
|
|
64
|
+
isConnected() {
|
|
65
|
+
return this.connected && this.ws?.readyState === WebSocket.OPEN;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Send a BiDi command and wait for response
|
|
69
|
+
*/
|
|
70
|
+
async send(method, params = {}) {
|
|
71
|
+
if (!this.isConnected()) {
|
|
72
|
+
throw new Error('BiDi connection not established');
|
|
73
|
+
}
|
|
74
|
+
const id = ++this.messageId;
|
|
75
|
+
const command = { id, method, params };
|
|
76
|
+
return new Promise((resolve, reject) => {
|
|
77
|
+
const timeout = setTimeout(() => {
|
|
78
|
+
this.pending.delete(id);
|
|
79
|
+
reject(new Error(`BiDi command timeout: ${method}`));
|
|
80
|
+
}, this.options.timeout);
|
|
81
|
+
this.pending.set(id, {
|
|
82
|
+
resolve: (value) => {
|
|
83
|
+
clearTimeout(timeout);
|
|
84
|
+
resolve(value);
|
|
85
|
+
},
|
|
86
|
+
reject: (err) => {
|
|
87
|
+
clearTimeout(timeout);
|
|
88
|
+
reject(err);
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
this.ws.send(JSON.stringify(command));
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Subscribe to BiDi events
|
|
96
|
+
*/
|
|
97
|
+
async subscribe(events, contexts) {
|
|
98
|
+
const params = { events };
|
|
99
|
+
if (contexts?.length) {
|
|
100
|
+
params.contexts = contexts;
|
|
101
|
+
}
|
|
102
|
+
await this.send('session.subscribe', params);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Unsubscribe from BiDi events
|
|
106
|
+
*/
|
|
107
|
+
async unsubscribe(events, contexts) {
|
|
108
|
+
const params = { events };
|
|
109
|
+
if (contexts?.length) {
|
|
110
|
+
params.contexts = contexts;
|
|
111
|
+
}
|
|
112
|
+
await this.send('session.unsubscribe', params);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Add event listener for specific BiDi event
|
|
116
|
+
*/
|
|
117
|
+
on(event, handler) {
|
|
118
|
+
if (!this.eventHandlers.has(event)) {
|
|
119
|
+
this.eventHandlers.set(event, new Set());
|
|
120
|
+
}
|
|
121
|
+
this.eventHandlers.get(event).add(handler);
|
|
122
|
+
// Return unsubscribe function
|
|
123
|
+
return () => {
|
|
124
|
+
this.eventHandlers.get(event)?.delete(handler);
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Remove event listener
|
|
129
|
+
*/
|
|
130
|
+
off(event, handler) {
|
|
131
|
+
this.eventHandlers.get(event)?.delete(handler);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Wait for a specific event (one-time)
|
|
135
|
+
*/
|
|
136
|
+
once(event, predicate, timeout) {
|
|
137
|
+
return new Promise((resolve, reject) => {
|
|
138
|
+
const timeoutId = timeout
|
|
139
|
+
? setTimeout(() => {
|
|
140
|
+
unsubscribe();
|
|
141
|
+
reject(new Error(`Timeout waiting for event: ${event}`));
|
|
142
|
+
}, timeout)
|
|
143
|
+
: null;
|
|
144
|
+
const unsubscribe = this.on(event, (params) => {
|
|
145
|
+
if (!predicate || predicate(params)) {
|
|
146
|
+
if (timeoutId)
|
|
147
|
+
clearTimeout(timeoutId);
|
|
148
|
+
unsubscribe();
|
|
149
|
+
resolve(params);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Close the connection
|
|
156
|
+
*/
|
|
157
|
+
async close() {
|
|
158
|
+
if (this.ws) {
|
|
159
|
+
this.ws.close();
|
|
160
|
+
this.ws = null;
|
|
161
|
+
this.connected = false;
|
|
162
|
+
this.rejectAllPending(new Error('Connection closed'));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
handleMessage(data) {
|
|
166
|
+
let message;
|
|
167
|
+
try {
|
|
168
|
+
message = JSON.parse(data);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
console.error('Failed to parse BiDi message:', data);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if ('id' in message && message.id !== undefined) {
|
|
175
|
+
// Command response
|
|
176
|
+
this.handleResponse(message);
|
|
177
|
+
}
|
|
178
|
+
else if (message.type === 'event') {
|
|
179
|
+
// Event
|
|
180
|
+
this.handleEvent(message);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
handleResponse(response) {
|
|
184
|
+
const pending = this.pending.get(response.id);
|
|
185
|
+
if (!pending)
|
|
186
|
+
return;
|
|
187
|
+
this.pending.delete(response.id);
|
|
188
|
+
if (response.type === 'error') {
|
|
189
|
+
pending.reject(new Error(`BiDi error [${response.error}]: ${response.message}`));
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
pending.resolve(response.result);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
handleEvent(event) {
|
|
196
|
+
const handlers = this.eventHandlers.get(event.method);
|
|
197
|
+
if (handlers) {
|
|
198
|
+
for (const handler of handlers) {
|
|
199
|
+
try {
|
|
200
|
+
handler(event.params);
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
console.error(`Error in BiDi event handler for ${event.method}:`, err);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Also emit to wildcard handlers
|
|
208
|
+
const wildcardHandlers = this.eventHandlers.get('*');
|
|
209
|
+
if (wildcardHandlers) {
|
|
210
|
+
for (const handler of wildcardHandlers) {
|
|
211
|
+
try {
|
|
212
|
+
handler({ method: event.method, ...event.params });
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
console.error('Error in BiDi wildcard event handler:', err);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
rejectAllPending(error) {
|
|
221
|
+
for (const [, pending] of this.pending) {
|
|
222
|
+
pending.reject(error);
|
|
223
|
+
}
|
|
224
|
+
this.pending.clear();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/lib/bidi/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BiDi Session Manager
|
|
3
|
+
* Central manager for BiDi features with Classic WebDriver fallback
|
|
4
|
+
*/
|
|
5
|
+
import { BiDiConnection } from './connection.js';
|
|
6
|
+
import { NetworkInterceptor } from './network.js';
|
|
7
|
+
import { LogMonitor } from './logs.js';
|
|
8
|
+
import { SessionStateManager, type StorageStateOptions } from './storage.js';
|
|
9
|
+
import type { Driver } from '../driver.js';
|
|
10
|
+
import type { SessionState } from './types.js';
|
|
11
|
+
export interface BiDiSessionOptions {
|
|
12
|
+
/** WebSocket URL for BiDi connection */
|
|
13
|
+
wsUrl?: string;
|
|
14
|
+
/** Auto-initialize BiDi features */
|
|
15
|
+
autoInitialize?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare class BiDiSession {
|
|
18
|
+
private connection;
|
|
19
|
+
private driver;
|
|
20
|
+
private context?;
|
|
21
|
+
private _network?;
|
|
22
|
+
private _logs?;
|
|
23
|
+
private _storage?;
|
|
24
|
+
private initialized;
|
|
25
|
+
constructor(driver: Driver, options?: BiDiSessionOptions);
|
|
26
|
+
/**
|
|
27
|
+
* Connect to BiDi WebSocket endpoint
|
|
28
|
+
*/
|
|
29
|
+
connect(wsUrl: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Check if BiDi is connected
|
|
32
|
+
*/
|
|
33
|
+
isConnected(): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Get the BiDi connection (for advanced usage)
|
|
36
|
+
*/
|
|
37
|
+
getConnection(): BiDiConnection;
|
|
38
|
+
/**
|
|
39
|
+
* Network interception API
|
|
40
|
+
*/
|
|
41
|
+
get network(): NetworkInterceptor;
|
|
42
|
+
/**
|
|
43
|
+
* Log monitoring API
|
|
44
|
+
*/
|
|
45
|
+
get logs(): LogMonitor;
|
|
46
|
+
/**
|
|
47
|
+
* Session state/storage API
|
|
48
|
+
*/
|
|
49
|
+
get storage(): SessionStateManager;
|
|
50
|
+
/**
|
|
51
|
+
* Save session state to file (cookies + localStorage)
|
|
52
|
+
*/
|
|
53
|
+
saveState(path: string, options?: StorageStateOptions): Promise<SessionState>;
|
|
54
|
+
/**
|
|
55
|
+
* Load session state from file
|
|
56
|
+
*/
|
|
57
|
+
loadState(path: string): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Subscribe to BiDi events
|
|
60
|
+
*/
|
|
61
|
+
subscribe(events: string[]): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Add event listener
|
|
64
|
+
*/
|
|
65
|
+
on(event: string, handler: (params: Record<string, unknown>) => void): () => void;
|
|
66
|
+
/**
|
|
67
|
+
* Close BiDi connection
|
|
68
|
+
*/
|
|
69
|
+
close(): Promise<void>;
|
|
70
|
+
}
|
|
71
|
+
export { BiDiConnection } from './connection.js';
|
|
72
|
+
export { NetworkInterceptor, type MockResponse, type InterceptedRequest } from './network.js';
|
|
73
|
+
export { LogMonitor, type ConsoleMessage, type JavaScriptError, type LogMessage } from './logs.js';
|
|
74
|
+
export { SessionStateManager, type StorageStateOptions } from './storage.js';
|
|
75
|
+
export * from './types.js';
|
|
76
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/bidi/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAC,CAAkB;IAClC,OAAO,CAAC,QAAQ,CAAC,CAAqB;IACtC,OAAO,CAAC,KAAK,CAAC,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAsB;IACvC,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB;IAK5D;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3C;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,aAAa,IAAI,cAAc;IAI/B;;OAEG;IACH,IAAI,OAAO,IAAI,kBAAkB,CAKhC;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,UAAU,CAKrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,mBAAmB,CASjC;IAID;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;IAInF;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAIjF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B;AAGD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC7E,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BiDi Session Manager
|
|
3
|
+
* Central manager for BiDi features with Classic WebDriver fallback
|
|
4
|
+
*/
|
|
5
|
+
import { BiDiConnection } from './connection.js';
|
|
6
|
+
import { NetworkInterceptor } from './network.js';
|
|
7
|
+
import { LogMonitor } from './logs.js';
|
|
8
|
+
import { SessionStateManager } from './storage.js';
|
|
9
|
+
export class BiDiSession {
|
|
10
|
+
connection;
|
|
11
|
+
driver;
|
|
12
|
+
context;
|
|
13
|
+
_network;
|
|
14
|
+
_logs;
|
|
15
|
+
_storage;
|
|
16
|
+
initialized = false;
|
|
17
|
+
constructor(driver, options = {}) {
|
|
18
|
+
this.driver = driver;
|
|
19
|
+
this.connection = new BiDiConnection();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Connect to BiDi WebSocket endpoint
|
|
23
|
+
*/
|
|
24
|
+
async connect(wsUrl) {
|
|
25
|
+
await this.connection.connect(wsUrl);
|
|
26
|
+
// Get the current browsing context
|
|
27
|
+
const result = await this.connection.send('browsingContext.getTree', {});
|
|
28
|
+
if (result.contexts?.[0]) {
|
|
29
|
+
this.context = result.contexts[0].context;
|
|
30
|
+
}
|
|
31
|
+
// Eagerly initialize log monitoring so console/error capture starts immediately
|
|
32
|
+
this._logs = new LogMonitor(this.connection, this.context);
|
|
33
|
+
await this._logs.initialize();
|
|
34
|
+
this.initialized = true;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if BiDi is connected
|
|
38
|
+
*/
|
|
39
|
+
isConnected() {
|
|
40
|
+
return this.connection.isConnected();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the BiDi connection (for advanced usage)
|
|
44
|
+
*/
|
|
45
|
+
getConnection() {
|
|
46
|
+
return this.connection;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Network interception API
|
|
50
|
+
*/
|
|
51
|
+
get network() {
|
|
52
|
+
if (!this._network) {
|
|
53
|
+
this._network = new NetworkInterceptor(this.connection, this.context);
|
|
54
|
+
}
|
|
55
|
+
return this._network;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Log monitoring API
|
|
59
|
+
*/
|
|
60
|
+
get logs() {
|
|
61
|
+
if (!this._logs) {
|
|
62
|
+
this._logs = new LogMonitor(this.connection, this.context);
|
|
63
|
+
}
|
|
64
|
+
return this._logs;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Session state/storage API
|
|
68
|
+
*/
|
|
69
|
+
get storage() {
|
|
70
|
+
if (!this._storage) {
|
|
71
|
+
this._storage = new SessionStateManager(this.driver, this.isConnected() ? this.connection : null, this.context);
|
|
72
|
+
}
|
|
73
|
+
return this._storage;
|
|
74
|
+
}
|
|
75
|
+
// === Convenience methods ===
|
|
76
|
+
/**
|
|
77
|
+
* Save session state to file (cookies + localStorage)
|
|
78
|
+
*/
|
|
79
|
+
async saveState(path, options) {
|
|
80
|
+
return this.storage.saveState(path, options);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Load session state from file
|
|
84
|
+
*/
|
|
85
|
+
async loadState(path) {
|
|
86
|
+
return this.storage.loadState(path);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Subscribe to BiDi events
|
|
90
|
+
*/
|
|
91
|
+
async subscribe(events) {
|
|
92
|
+
await this.connection.subscribe(events);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Add event listener
|
|
96
|
+
*/
|
|
97
|
+
on(event, handler) {
|
|
98
|
+
return this.connection.on(event, handler);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Close BiDi connection
|
|
102
|
+
*/
|
|
103
|
+
async close() {
|
|
104
|
+
await this.connection.close();
|
|
105
|
+
this.initialized = false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Export all BiDi modules
|
|
109
|
+
export { BiDiConnection } from './connection.js';
|
|
110
|
+
export { NetworkInterceptor } from './network.js';
|
|
111
|
+
export { LogMonitor } from './logs.js';
|
|
112
|
+
export { SessionStateManager } from './storage.js';
|
|
113
|
+
export * from './types.js';
|
|
114
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/bidi/index.ts"],"names":[],"mappings":"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"}
|