cbrowser 7.4.8 → 7.4.12
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/browser.d.ts +6 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +226 -2
- package/dist/browser.js.map +1 -1
- package/dist/cli.js +24 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +55 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +208 -0
- package/dist/config.js.map +1 -1
- package/dist/mcp-server-remote.d.ts.map +1 -1
- package/dist/mcp-server-remote.js +18 -3
- package/dist/mcp-server-remote.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +18 -1
- package/dist/mcp-server.js.map +1 -1
- package/dist/personas.d.ts.map +1 -1
- package/dist/personas.js +30 -11
- package/dist/personas.js.map +1 -1
- package/package.json +1 -1
package/dist/browser.d.ts
CHANGED
|
@@ -17,7 +17,12 @@ export declare class CBrowser {
|
|
|
17
17
|
private networkResponses;
|
|
18
18
|
private harEntries;
|
|
19
19
|
private isRecordingHar;
|
|
20
|
+
private skipSessionRestore;
|
|
20
21
|
constructor(userConfig?: Partial<CBrowserConfig>);
|
|
22
|
+
private get sessionStateFile();
|
|
23
|
+
private saveSessionState;
|
|
24
|
+
private loadSessionState;
|
|
25
|
+
private clearSessionState;
|
|
21
26
|
/**
|
|
22
27
|
* Launch the browser.
|
|
23
28
|
*/
|
|
@@ -32,6 +37,7 @@ export declare class CBrowser {
|
|
|
32
37
|
reset(): Promise<void>;
|
|
33
38
|
/**
|
|
34
39
|
* Get the current page, launching if needed.
|
|
40
|
+
* If the page exists but is at about:blank, restores the previous session.
|
|
35
41
|
*/
|
|
36
42
|
getPage(): Promise<Page>;
|
|
37
43
|
/**
|
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAA2C,KAAK,IAAI,EAAiD,MAAM,YAAY,CAAC;AAI/H,OAAO,EAAE,KAAK,cAAc,EAAgE,MAAM,aAAa,CAAC;AAEhH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,aAAa,EAKb,cAAc,EACd,aAAa,EACb,cAAc,EAEd,WAAW,EACX,cAAc,EAId,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAEhB,eAAe,EAEf,kBAAkB,EAElB,kBAAkB,EAElB,YAAY,EAIZ,oBAAoB,EA2DrB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/browser.js
CHANGED
|
@@ -55,11 +55,66 @@ class CBrowser {
|
|
|
55
55
|
networkResponses = new Map();
|
|
56
56
|
harEntries = [];
|
|
57
57
|
isRecordingHar = false;
|
|
58
|
+
skipSessionRestore = false;
|
|
58
59
|
constructor(userConfig = {}) {
|
|
59
60
|
this.config = (0, config_js_1.mergeConfig)(userConfig);
|
|
60
61
|
this.paths = (0, config_js_1.ensureDirectories)((0, config_js_1.getPaths)(this.config.dataDir));
|
|
61
62
|
}
|
|
62
63
|
// =========================================================================
|
|
64
|
+
// Session State Persistence
|
|
65
|
+
// =========================================================================
|
|
66
|
+
get sessionStateFile() {
|
|
67
|
+
return (0, path_1.join)(this.paths.dataDir, "browser-state", "last-session.json");
|
|
68
|
+
}
|
|
69
|
+
saveSessionState(url, viewport) {
|
|
70
|
+
try {
|
|
71
|
+
// Don't save about:blank or empty URLs
|
|
72
|
+
if (!url || url === "about:blank" || url === "")
|
|
73
|
+
return;
|
|
74
|
+
const state = {
|
|
75
|
+
url,
|
|
76
|
+
timestamp: Date.now(),
|
|
77
|
+
viewport,
|
|
78
|
+
};
|
|
79
|
+
const stateDir = (0, path_1.join)(this.paths.dataDir, "browser-state");
|
|
80
|
+
if (!(0, fs_1.existsSync)(stateDir)) {
|
|
81
|
+
(0, fs_1.mkdirSync)(stateDir, { recursive: true });
|
|
82
|
+
}
|
|
83
|
+
(0, fs_1.writeFileSync)(this.sessionStateFile, JSON.stringify(state, null, 2));
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
// Silently fail - this is a best-effort feature
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
loadSessionState() {
|
|
90
|
+
try {
|
|
91
|
+
if (!(0, fs_1.existsSync)(this.sessionStateFile))
|
|
92
|
+
return null;
|
|
93
|
+
const content = (0, fs_1.readFileSync)(this.sessionStateFile, "utf-8");
|
|
94
|
+
const state = JSON.parse(content);
|
|
95
|
+
// Expire sessions older than 1 hour
|
|
96
|
+
const oneHour = 60 * 60 * 1000;
|
|
97
|
+
if (Date.now() - state.timestamp > oneHour) {
|
|
98
|
+
(0, fs_1.unlinkSync)(this.sessionStateFile);
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
return state;
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
clearSessionState() {
|
|
108
|
+
try {
|
|
109
|
+
if ((0, fs_1.existsSync)(this.sessionStateFile)) {
|
|
110
|
+
(0, fs_1.unlinkSync)(this.sessionStateFile);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
// Silently fail
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// =========================================================================
|
|
63
118
|
// Lifecycle
|
|
64
119
|
// =========================================================================
|
|
65
120
|
/**
|
|
@@ -169,11 +224,50 @@ class CBrowser {
|
|
|
169
224
|
}
|
|
170
225
|
// Set up network request/response tracking for HAR
|
|
171
226
|
this.setupNetworkTracking();
|
|
227
|
+
// Restore previous session URL if available (persistent mode only)
|
|
228
|
+
if (this.config.persistent && !this.skipSessionRestore) {
|
|
229
|
+
const savedSession = this.loadSessionState();
|
|
230
|
+
if (savedSession && savedSession.url && savedSession.url !== "about:blank") {
|
|
231
|
+
try {
|
|
232
|
+
if (this.config.verbose) {
|
|
233
|
+
console.log(`🔄 Restoring session: ${savedSession.url}`);
|
|
234
|
+
}
|
|
235
|
+
await this.page.goto(savedSession.url, {
|
|
236
|
+
waitUntil: "domcontentloaded",
|
|
237
|
+
timeout: 15000,
|
|
238
|
+
});
|
|
239
|
+
// Wait for network idle and JS hydration
|
|
240
|
+
await this.page.waitForLoadState("networkidle", { timeout: 10000 }).catch(() => { });
|
|
241
|
+
await this.page.waitForTimeout(1000);
|
|
242
|
+
// Apply saved viewport if available
|
|
243
|
+
if (savedSession.viewport) {
|
|
244
|
+
await this.page.setViewportSize(savedSession.viewport);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch (e) {
|
|
248
|
+
// If restore fails, continue with blank page
|
|
249
|
+
if (this.config.verbose) {
|
|
250
|
+
console.log(`⚠️ Could not restore session: ${e.message}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
172
255
|
}
|
|
173
256
|
/**
|
|
174
257
|
* Close the browser.
|
|
175
258
|
*/
|
|
176
259
|
async close() {
|
|
260
|
+
// Save current URL before closing so next invocation can restore it
|
|
261
|
+
if (this.page && !this.page.isClosed()) {
|
|
262
|
+
try {
|
|
263
|
+
const currentUrl = this.page.url();
|
|
264
|
+
const viewport = this.page.viewportSize();
|
|
265
|
+
this.saveSessionState(currentUrl, viewport || undefined);
|
|
266
|
+
}
|
|
267
|
+
catch (e) {
|
|
268
|
+
// Ignore errors during cleanup
|
|
269
|
+
}
|
|
270
|
+
}
|
|
177
271
|
if (this.context) {
|
|
178
272
|
await this.context.close().catch(() => { });
|
|
179
273
|
this.context = null;
|
|
@@ -188,6 +282,8 @@ class CBrowser {
|
|
|
188
282
|
* Reset persistent browser state (clear cookies, localStorage, etc.)
|
|
189
283
|
*/
|
|
190
284
|
async reset() {
|
|
285
|
+
// Clear session state first (to prevent close() from saving)
|
|
286
|
+
this.clearSessionState();
|
|
191
287
|
await this.close();
|
|
192
288
|
const browserStateDir = (0, path_1.join)(this.paths.dataDir, "browser-state");
|
|
193
289
|
if ((0, fs_1.existsSync)(browserStateDir)) {
|
|
@@ -201,11 +297,41 @@ class CBrowser {
|
|
|
201
297
|
}
|
|
202
298
|
/**
|
|
203
299
|
* Get the current page, launching if needed.
|
|
300
|
+
* If the page exists but is at about:blank, restores the previous session.
|
|
204
301
|
*/
|
|
205
302
|
async getPage() {
|
|
206
303
|
if (!this.page) {
|
|
207
304
|
await this.launch();
|
|
208
305
|
}
|
|
306
|
+
// Check if page is at about:blank and needs session restoration
|
|
307
|
+
if (this.page && this.config.persistent && !this.skipSessionRestore) {
|
|
308
|
+
const currentUrl = this.page.url();
|
|
309
|
+
if (currentUrl === "about:blank" || currentUrl === "") {
|
|
310
|
+
const savedSession = this.loadSessionState();
|
|
311
|
+
if (savedSession && savedSession.url && savedSession.url !== "about:blank") {
|
|
312
|
+
try {
|
|
313
|
+
if (this.config.verbose) {
|
|
314
|
+
console.log(`🔄 Restoring session: ${savedSession.url}`);
|
|
315
|
+
}
|
|
316
|
+
await this.page.goto(savedSession.url, {
|
|
317
|
+
waitUntil: "domcontentloaded",
|
|
318
|
+
timeout: 15000,
|
|
319
|
+
});
|
|
320
|
+
// Wait for network idle and JS hydration
|
|
321
|
+
await this.page.waitForLoadState("networkidle", { timeout: 10000 }).catch(() => { });
|
|
322
|
+
await this.page.waitForTimeout(1000);
|
|
323
|
+
if (savedSession.viewport) {
|
|
324
|
+
await this.page.setViewportSize(savedSession.viewport);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
catch (e) {
|
|
328
|
+
if (this.config.verbose) {
|
|
329
|
+
console.log(`⚠️ Could not restore session: ${e.message}`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
209
335
|
return this.page;
|
|
210
336
|
}
|
|
211
337
|
// =========================================================================
|
|
@@ -632,7 +758,10 @@ class CBrowser {
|
|
|
632
758
|
* Navigate to a URL.
|
|
633
759
|
*/
|
|
634
760
|
async navigate(url) {
|
|
761
|
+
// Skip session restore since we're explicitly navigating to a new URL
|
|
762
|
+
this.skipSessionRestore = true;
|
|
635
763
|
const page = await this.getPage();
|
|
764
|
+
this.skipSessionRestore = false;
|
|
636
765
|
const startTime = Date.now();
|
|
637
766
|
const errors = [];
|
|
638
767
|
const warnings = [];
|
|
@@ -1524,6 +1653,82 @@ class CBrowser {
|
|
|
1524
1653
|
catch {
|
|
1525
1654
|
// Invalid CSS selector, continue
|
|
1526
1655
|
}
|
|
1656
|
+
// Strategy 8: Input by name attribute
|
|
1657
|
+
try {
|
|
1658
|
+
const byName = page.locator(`input[name="${selector}"]`).first();
|
|
1659
|
+
if (await byName.count() > 0)
|
|
1660
|
+
return byName;
|
|
1661
|
+
}
|
|
1662
|
+
catch { }
|
|
1663
|
+
// Strategy 9: Input by type attribute (e.g., "email", "password")
|
|
1664
|
+
try {
|
|
1665
|
+
const byType = page.locator(`input[type="${selector}"]`).first();
|
|
1666
|
+
if (await byType.count() > 0)
|
|
1667
|
+
return byType;
|
|
1668
|
+
}
|
|
1669
|
+
catch { }
|
|
1670
|
+
// Strategy 10: Element by id
|
|
1671
|
+
try {
|
|
1672
|
+
const byId = page.locator(`#${selector}`).first();
|
|
1673
|
+
if (await byId.count() > 0)
|
|
1674
|
+
return byId;
|
|
1675
|
+
}
|
|
1676
|
+
catch { }
|
|
1677
|
+
// Strategy 11: Textarea by name
|
|
1678
|
+
try {
|
|
1679
|
+
const byTextarea = page.locator(`textarea[name="${selector}"]`).first();
|
|
1680
|
+
if (await byTextarea.count() > 0)
|
|
1681
|
+
return byTextarea;
|
|
1682
|
+
}
|
|
1683
|
+
catch { }
|
|
1684
|
+
// Strategy 12: Role link with name
|
|
1685
|
+
try {
|
|
1686
|
+
const byLink = page.getByRole("link", { name: selector }).first();
|
|
1687
|
+
if (await byLink.count() > 0)
|
|
1688
|
+
return byLink;
|
|
1689
|
+
}
|
|
1690
|
+
catch { }
|
|
1691
|
+
// Strategy 13: Fuzzy attribute match via JS
|
|
1692
|
+
try {
|
|
1693
|
+
const fuzzyHandle = await page.evaluateHandle((search) => {
|
|
1694
|
+
const inputs = Array.from(document.querySelectorAll("input, textarea, select, button, a, [role='button'], [role='link']"));
|
|
1695
|
+
const searchLower = search.toLowerCase();
|
|
1696
|
+
for (const el of inputs) {
|
|
1697
|
+
const name = el.getAttribute("name")?.toLowerCase() || "";
|
|
1698
|
+
const id = el.getAttribute("id")?.toLowerCase() || "";
|
|
1699
|
+
const placeholder = el.getAttribute("placeholder")?.toLowerCase() || "";
|
|
1700
|
+
const type = el.getAttribute("type")?.toLowerCase() || "";
|
|
1701
|
+
const ariaLabel = el.getAttribute("aria-label")?.toLowerCase() || "";
|
|
1702
|
+
const text = el.innerText?.toLowerCase() || "";
|
|
1703
|
+
if (name.includes(searchLower) || id.includes(searchLower) ||
|
|
1704
|
+
placeholder.includes(searchLower) || type === searchLower ||
|
|
1705
|
+
ariaLabel.includes(searchLower) || text.includes(searchLower)) {
|
|
1706
|
+
return el;
|
|
1707
|
+
}
|
|
1708
|
+
}
|
|
1709
|
+
return null;
|
|
1710
|
+
}, selector);
|
|
1711
|
+
const element = fuzzyHandle.asElement();
|
|
1712
|
+
if (element) {
|
|
1713
|
+
// Convert ElementHandle back to Locator isn't directly possible,
|
|
1714
|
+
// but we can get a selector from it
|
|
1715
|
+
const generatedSelector = await page.evaluate((el) => {
|
|
1716
|
+
if (el.id)
|
|
1717
|
+
return `#${el.id}`;
|
|
1718
|
+
const name = el.getAttribute("name");
|
|
1719
|
+
if (name)
|
|
1720
|
+
return `[name="${name}"]`;
|
|
1721
|
+
const testId = el.getAttribute("data-testid");
|
|
1722
|
+
if (testId)
|
|
1723
|
+
return `[data-testid="${testId}"]`;
|
|
1724
|
+
return null;
|
|
1725
|
+
}, element);
|
|
1726
|
+
if (generatedSelector) {
|
|
1727
|
+
return page.locator(generatedSelector).first();
|
|
1728
|
+
}
|
|
1729
|
+
}
|
|
1730
|
+
}
|
|
1731
|
+
catch { }
|
|
1527
1732
|
return null;
|
|
1528
1733
|
}
|
|
1529
1734
|
// =========================================================================
|
|
@@ -1566,8 +1771,27 @@ class CBrowser {
|
|
|
1566
1771
|
})));
|
|
1567
1772
|
break;
|
|
1568
1773
|
default:
|
|
1569
|
-
// Generic text extraction
|
|
1570
|
-
data = await page.evaluate(() =>
|
|
1774
|
+
// Generic text extraction with fallbacks for SPAs
|
|
1775
|
+
data = await page.evaluate(() => {
|
|
1776
|
+
let text = document.body.innerText;
|
|
1777
|
+
// Fallback: if innerText is empty (SPA hydration), try textContent
|
|
1778
|
+
if (!text || text.trim() === "") {
|
|
1779
|
+
text = document.body.textContent || "";
|
|
1780
|
+
}
|
|
1781
|
+
// Second fallback: extract from visible elements
|
|
1782
|
+
if (!text || text.trim() === "") {
|
|
1783
|
+
const elements = Array.from(document.querySelectorAll("h1, h2, h3, h4, h5, h6, p, span, li, td, th, a, label, div"));
|
|
1784
|
+
const texts = [];
|
|
1785
|
+
for (const el of elements) {
|
|
1786
|
+
const t = el.innerText?.trim();
|
|
1787
|
+
if (t && t.length > 0 && !texts.includes(t)) {
|
|
1788
|
+
texts.push(t);
|
|
1789
|
+
}
|
|
1790
|
+
}
|
|
1791
|
+
text = texts.join("\n");
|
|
1792
|
+
}
|
|
1793
|
+
return text;
|
|
1794
|
+
});
|
|
1571
1795
|
}
|
|
1572
1796
|
return {
|
|
1573
1797
|
data,
|