cbrowser 10.5.0 → 10.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analysis/accessibility-empathy.d.ts.map +1 -1
- package/dist/analysis/accessibility-empathy.js +2 -2
- package/dist/analysis/accessibility-empathy.js.map +1 -1
- package/dist/analysis/agent-ready-audit.d.ts +1 -1
- package/dist/analysis/agent-ready-audit.d.ts.map +1 -1
- package/dist/analysis/agent-ready-audit.js +2 -2
- package/dist/analysis/agent-ready-audit.js.map +1 -1
- package/dist/analysis/bug-hunter.js +2 -2
- package/dist/analysis/bug-hunter.js.map +1 -1
- package/dist/analysis/competitive-benchmark.d.ts.map +1 -1
- package/dist/analysis/competitive-benchmark.js +1 -1
- package/dist/analysis/competitive-benchmark.js.map +1 -1
- package/dist/analysis/natural-language.js +1 -1
- package/dist/analysis/natural-language.js.map +1 -1
- package/dist/browser/index.d.ts +12 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +9 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/overlay-handler.d.ts +42 -0
- package/dist/browser/overlay-handler.d.ts.map +1 -0
- package/dist/browser/overlay-handler.js +334 -0
- package/dist/browser/overlay-handler.js.map +1 -0
- package/dist/browser/selector-cache.d.ts +69 -0
- package/dist/browser/selector-cache.d.ts.map +1 -0
- package/dist/browser/selector-cache.js +193 -0
- package/dist/browser/selector-cache.js.map +1 -0
- package/dist/browser/session-manager.d.ts +60 -0
- package/dist/browser/session-manager.d.ts.map +1 -0
- package/dist/browser/session-manager.js +261 -0
- package/dist/browser/session-manager.js.map +1 -0
- package/dist/browser.d.ts +8 -39
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +65 -642
- package/dist/browser.js.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/cognitive/focus-hierarchies.d.ts.map +1 -1
- package/dist/cognitive/focus-hierarchies.js +1 -1
- package/dist/cognitive/focus-hierarchies.js.map +1 -1
- package/dist/cognitive/index.d.ts.map +1 -1
- package/dist/cognitive/index.js +1 -1
- package/dist/cognitive/index.js.map +1 -1
- package/dist/daemon.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server-remote.d.ts.map +1 -1
- package/dist/mcp-server-remote.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js.map +1 -1
- package/dist/performance/metrics.js +1 -1
- package/dist/performance/metrics.js.map +1 -1
- package/dist/personas.d.ts.map +1 -1
- package/dist/testing/coverage.d.ts.map +1 -1
- package/dist/testing/coverage.js +1 -1
- package/dist/testing/coverage.js.map +1 -1
- package/dist/testing/test-repair.js +2 -2
- package/dist/testing/test-repair.js.map +1 -1
- package/dist/version.js.map +1 -1
- package/dist/visual/cross-browser.js +1 -1
- package/dist/visual/cross-browser.js.map +1 -1
- package/dist/visual/regression.js +1 -1
- package/dist/visual/regression.js.map +1 -1
- package/dist/visual/responsive.js +1 -1
- package/dist/visual/responsive.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Selector Cache - Self-healing selector persistence
|
|
3
|
+
*
|
|
4
|
+
* Stores working selector alternatives for faster element finding.
|
|
5
|
+
* Extracted from CBrowser class for better modularity.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
/**
|
|
10
|
+
* Manages self-healing selector cache for faster element finding.
|
|
11
|
+
*/
|
|
12
|
+
export class SelectorCacheManager {
|
|
13
|
+
config;
|
|
14
|
+
cache = null;
|
|
15
|
+
currentDomain = "unknown";
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Set current domain for cache key generation.
|
|
21
|
+
*/
|
|
22
|
+
setCurrentDomain(domain) {
|
|
23
|
+
this.currentDomain = domain;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get current domain.
|
|
27
|
+
*/
|
|
28
|
+
getCurrentDomain() {
|
|
29
|
+
return this.currentDomain;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get the cache file path.
|
|
33
|
+
*/
|
|
34
|
+
getCachePath() {
|
|
35
|
+
return join(this.config.dataDir, "selector-cache.json");
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Load the cache from disk.
|
|
39
|
+
*/
|
|
40
|
+
load() {
|
|
41
|
+
if (this.cache)
|
|
42
|
+
return this.cache;
|
|
43
|
+
const cachePath = this.getCachePath();
|
|
44
|
+
if (existsSync(cachePath)) {
|
|
45
|
+
try {
|
|
46
|
+
const data = readFileSync(cachePath, "utf-8");
|
|
47
|
+
this.cache = JSON.parse(data);
|
|
48
|
+
return this.cache;
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
if (this.config.verbose) {
|
|
52
|
+
console.debug(`[CBrowser] Corrupted selector cache, starting fresh: ${e.message}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
this.cache = { version: 1, entries: {} };
|
|
57
|
+
return this.cache;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Save the cache to disk.
|
|
61
|
+
*/
|
|
62
|
+
save() {
|
|
63
|
+
if (!this.cache)
|
|
64
|
+
return;
|
|
65
|
+
const cachePath = this.getCachePath();
|
|
66
|
+
writeFileSync(cachePath, JSON.stringify(this.cache, null, 2));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get cache key for a selector.
|
|
70
|
+
*/
|
|
71
|
+
getKey(selector, domain) {
|
|
72
|
+
const d = domain || this.currentDomain;
|
|
73
|
+
return `${d}::${selector.toLowerCase()}`;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Cache a working alternative selector.
|
|
77
|
+
*/
|
|
78
|
+
cacheAlternative(original, working, reason = "Alternative found") {
|
|
79
|
+
// Reject empty or meaningless selectors
|
|
80
|
+
if (!working || working.trim() === "" || working === 'text=""' || working === "text=''") {
|
|
81
|
+
if (this.config.verbose) {
|
|
82
|
+
console.log(`⚠️ Rejected invalid selector for caching: "${working}"`);
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const cache = this.load();
|
|
87
|
+
const key = this.getKey(original);
|
|
88
|
+
const domain = this.currentDomain;
|
|
89
|
+
cache.entries[key] = {
|
|
90
|
+
originalSelector: original,
|
|
91
|
+
workingSelector: working,
|
|
92
|
+
domain,
|
|
93
|
+
successCount: 1,
|
|
94
|
+
failCount: 0,
|
|
95
|
+
lastUsed: new Date().toISOString(),
|
|
96
|
+
reason,
|
|
97
|
+
};
|
|
98
|
+
this.save();
|
|
99
|
+
if (this.config.verbose) {
|
|
100
|
+
console.log(`📦 Cached healed selector: "${original}" → "${working}"`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get a cached alternative selector if available.
|
|
105
|
+
*/
|
|
106
|
+
getCached(original) {
|
|
107
|
+
const cache = this.load();
|
|
108
|
+
const key = this.getKey(original);
|
|
109
|
+
const entry = cache.entries[key] || null;
|
|
110
|
+
if (entry && (entry.workingSelector === 'text=""' || entry.workingSelector === "text=''" || entry.workingSelector.trim() === "")) {
|
|
111
|
+
return null; // Reject invalid cached selectors
|
|
112
|
+
}
|
|
113
|
+
return entry;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Update cache entry statistics.
|
|
117
|
+
*/
|
|
118
|
+
updateStats(original, success) {
|
|
119
|
+
const cache = this.load();
|
|
120
|
+
const key = this.getKey(original);
|
|
121
|
+
const entry = cache.entries[key];
|
|
122
|
+
if (entry) {
|
|
123
|
+
if (success) {
|
|
124
|
+
entry.successCount++;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
entry.failCount++;
|
|
128
|
+
}
|
|
129
|
+
entry.lastUsed = new Date().toISOString();
|
|
130
|
+
this.save();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get cache statistics.
|
|
135
|
+
*/
|
|
136
|
+
getStats() {
|
|
137
|
+
const cache = this.load();
|
|
138
|
+
const entries = Object.values(cache.entries);
|
|
139
|
+
const byDomain = {};
|
|
140
|
+
for (const entry of entries) {
|
|
141
|
+
byDomain[entry.domain] = (byDomain[entry.domain] || 0) + 1;
|
|
142
|
+
}
|
|
143
|
+
const topHealedSelectors = entries
|
|
144
|
+
.sort((a, b) => b.successCount - a.successCount)
|
|
145
|
+
.slice(0, 10)
|
|
146
|
+
.map((e) => ({
|
|
147
|
+
original: e.originalSelector,
|
|
148
|
+
working: e.workingSelector,
|
|
149
|
+
heals: e.successCount,
|
|
150
|
+
}));
|
|
151
|
+
return {
|
|
152
|
+
totalEntries: entries.length,
|
|
153
|
+
totalHeals: entries.reduce((sum, e) => sum + e.successCount, 0),
|
|
154
|
+
byDomain,
|
|
155
|
+
topHealedSelectors,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Clear the cache.
|
|
160
|
+
*/
|
|
161
|
+
clear(domain) {
|
|
162
|
+
const cache = this.load();
|
|
163
|
+
let cleared = 0;
|
|
164
|
+
if (domain) {
|
|
165
|
+
// Clear only for specific domain
|
|
166
|
+
for (const [key, entry] of Object.entries(cache.entries)) {
|
|
167
|
+
if (entry.domain === domain) {
|
|
168
|
+
delete cache.entries[key];
|
|
169
|
+
cleared++;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
// Clear all
|
|
175
|
+
cleared = Object.keys(cache.entries).length;
|
|
176
|
+
cache.entries = {};
|
|
177
|
+
}
|
|
178
|
+
this.save();
|
|
179
|
+
return cleared;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* List all cached selectors.
|
|
183
|
+
*/
|
|
184
|
+
list(domain) {
|
|
185
|
+
const cache = this.load();
|
|
186
|
+
let entries = Object.values(cache.entries);
|
|
187
|
+
if (domain) {
|
|
188
|
+
entries = entries.filter((e) => e.domain === domain);
|
|
189
|
+
}
|
|
190
|
+
return entries.sort((a, b) => b.successCount - a.successCount);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=selector-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selector-cache.js","sourceRoot":"","sources":["../../src/browser/selector-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Manager - Handles browser session persistence
|
|
3
|
+
*
|
|
4
|
+
* Extracted from CBrowser class for better modularity.
|
|
5
|
+
*/
|
|
6
|
+
import type { Page, BrowserContext } from "playwright";
|
|
7
|
+
import type { SavedSession, LoadSessionResult, SessionMetadata } from "../types.js";
|
|
8
|
+
export interface SessionManagerConfig {
|
|
9
|
+
sessionsDir: string;
|
|
10
|
+
viewportWidth: number;
|
|
11
|
+
viewportHeight: number;
|
|
12
|
+
verbose?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Manages browser session persistence - save, load, list, delete sessions.
|
|
16
|
+
*/
|
|
17
|
+
export declare class SessionManager {
|
|
18
|
+
private config;
|
|
19
|
+
constructor(config: SessionManagerConfig);
|
|
20
|
+
/**
|
|
21
|
+
* Save the current session to disk.
|
|
22
|
+
*/
|
|
23
|
+
save(name: string, page: Page, context: BrowserContext): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Load a saved session from disk.
|
|
26
|
+
*/
|
|
27
|
+
load(name: string, page: Page, context: BrowserContext): Promise<LoadSessionResult>;
|
|
28
|
+
/**
|
|
29
|
+
* List all saved session names.
|
|
30
|
+
*/
|
|
31
|
+
list(): string[];
|
|
32
|
+
/**
|
|
33
|
+
* List all saved sessions with rich metadata.
|
|
34
|
+
*/
|
|
35
|
+
listDetailed(): SessionMetadata[];
|
|
36
|
+
/**
|
|
37
|
+
* Get detailed info for a single session.
|
|
38
|
+
*/
|
|
39
|
+
getDetails(name: string): SavedSession | null;
|
|
40
|
+
/**
|
|
41
|
+
* Delete a saved session.
|
|
42
|
+
*/
|
|
43
|
+
delete(name: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Delete sessions older than a given number of days.
|
|
46
|
+
*/
|
|
47
|
+
cleanup(olderThanDays: number): {
|
|
48
|
+
deleted: string[];
|
|
49
|
+
kept: string[];
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Export a session to a portable JSON file.
|
|
53
|
+
*/
|
|
54
|
+
export(name: string, outputPath: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Import a session from a JSON file.
|
|
57
|
+
*/
|
|
58
|
+
import(inputPath: string, name: string): boolean;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/browser/session-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAU,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpF,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,oBAAoB;IAIxC;;OAEG;IACG,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC;IAoDhB;;OAEG;IACG,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC;IAoE7B;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAOhB;;OAEG;IACH,YAAY,IAAI,eAAe,EAAE;IAiCjC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAa7C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAS7B;;OAEG;IACH,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IA4BrE;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAQjD;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;CAajD"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Manager - Handles browser session persistence
|
|
3
|
+
*
|
|
4
|
+
* Extracted from CBrowser class for better modularity.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync, readdirSync, statSync, unlinkSync } from "fs";
|
|
7
|
+
import { join } from "path";
|
|
8
|
+
/**
|
|
9
|
+
* Manages browser session persistence - save, load, list, delete sessions.
|
|
10
|
+
*/
|
|
11
|
+
export class SessionManager {
|
|
12
|
+
config;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Save the current session to disk.
|
|
18
|
+
*/
|
|
19
|
+
async save(name, page, context) {
|
|
20
|
+
const cookies = await context.cookies();
|
|
21
|
+
let localStorage = {};
|
|
22
|
+
try {
|
|
23
|
+
localStorage = await page.evaluate(() => {
|
|
24
|
+
const data = {};
|
|
25
|
+
for (let i = 0; i < window.localStorage.length; i++) {
|
|
26
|
+
const key = window.localStorage.key(i);
|
|
27
|
+
if (key)
|
|
28
|
+
data[key] = window.localStorage.getItem(key) || "";
|
|
29
|
+
}
|
|
30
|
+
return data;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
console.debug(`[CBrowser] localStorage inaccessible: ${e.message}`);
|
|
35
|
+
}
|
|
36
|
+
let sessionStorage = {};
|
|
37
|
+
try {
|
|
38
|
+
sessionStorage = await page.evaluate(() => {
|
|
39
|
+
const data = {};
|
|
40
|
+
for (let i = 0; i < window.sessionStorage.length; i++) {
|
|
41
|
+
const key = window.sessionStorage.key(i);
|
|
42
|
+
if (key)
|
|
43
|
+
data[key] = window.sessionStorage.getItem(key) || "";
|
|
44
|
+
}
|
|
45
|
+
return data;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
console.debug(`[CBrowser] sessionStorage inaccessible: ${e.message}`);
|
|
50
|
+
}
|
|
51
|
+
const url = page.url();
|
|
52
|
+
const domain = new URL(url).hostname;
|
|
53
|
+
const session = {
|
|
54
|
+
name,
|
|
55
|
+
created: new Date().toISOString(),
|
|
56
|
+
lastUsed: new Date().toISOString(),
|
|
57
|
+
domain,
|
|
58
|
+
url,
|
|
59
|
+
viewport: {
|
|
60
|
+
width: this.config.viewportWidth,
|
|
61
|
+
height: this.config.viewportHeight,
|
|
62
|
+
},
|
|
63
|
+
cookies: cookies,
|
|
64
|
+
localStorage,
|
|
65
|
+
sessionStorage,
|
|
66
|
+
};
|
|
67
|
+
const sessionPath = join(this.config.sessionsDir, `${name}.json`);
|
|
68
|
+
writeFileSync(sessionPath, JSON.stringify(session, null, 2));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Load a saved session from disk.
|
|
72
|
+
*/
|
|
73
|
+
async load(name, page, context) {
|
|
74
|
+
const sessionPath = join(this.config.sessionsDir, `${name}.json`);
|
|
75
|
+
if (!existsSync(sessionPath)) {
|
|
76
|
+
return {
|
|
77
|
+
success: false,
|
|
78
|
+
name,
|
|
79
|
+
cookiesRestored: 0,
|
|
80
|
+
localStorageKeysRestored: 0,
|
|
81
|
+
sessionStorageKeysRestored: 0,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
const session = JSON.parse(readFileSync(sessionPath, "utf-8"));
|
|
85
|
+
const result = {
|
|
86
|
+
success: true,
|
|
87
|
+
name,
|
|
88
|
+
cookiesRestored: session.cookies.length,
|
|
89
|
+
localStorageKeysRestored: Object.keys(session.localStorage).length,
|
|
90
|
+
sessionStorageKeysRestored: Object.keys(session.sessionStorage).length,
|
|
91
|
+
};
|
|
92
|
+
// Cross-domain warning
|
|
93
|
+
const currentUrl = page.url();
|
|
94
|
+
if (currentUrl && currentUrl !== "about:blank") {
|
|
95
|
+
try {
|
|
96
|
+
const currentDomain = new URL(currentUrl).hostname;
|
|
97
|
+
if (session.domain && currentDomain !== session.domain) {
|
|
98
|
+
result.warning = `Session '${name}' was saved for ${session.domain} but current page is ${currentDomain}. Some cookies may not apply.`;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
console.debug(`[CBrowser] URL parsing failed: ${e.message}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Restore cookies
|
|
106
|
+
if (session.cookies.length > 0) {
|
|
107
|
+
await context.addCookies(session.cookies);
|
|
108
|
+
}
|
|
109
|
+
// Navigate to saved URL
|
|
110
|
+
await page.goto(session.url, { waitUntil: "networkidle" });
|
|
111
|
+
// Restore localStorage
|
|
112
|
+
await page.evaluate((data) => {
|
|
113
|
+
for (const [key, value] of Object.entries(data)) {
|
|
114
|
+
window.localStorage.setItem(key, value);
|
|
115
|
+
}
|
|
116
|
+
}, session.localStorage);
|
|
117
|
+
// Restore sessionStorage
|
|
118
|
+
await page.evaluate((data) => {
|
|
119
|
+
for (const [key, value] of Object.entries(data)) {
|
|
120
|
+
window.sessionStorage.setItem(key, value);
|
|
121
|
+
}
|
|
122
|
+
}, session.sessionStorage);
|
|
123
|
+
// Refresh to apply storage
|
|
124
|
+
await page.reload({ waitUntil: "networkidle" });
|
|
125
|
+
// Update lastUsed
|
|
126
|
+
session.lastUsed = new Date().toISOString();
|
|
127
|
+
writeFileSync(sessionPath, JSON.stringify(session, null, 2));
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* List all saved session names.
|
|
132
|
+
*/
|
|
133
|
+
list() {
|
|
134
|
+
const files = readdirSync(this.config.sessionsDir);
|
|
135
|
+
return files
|
|
136
|
+
.filter((f) => f.endsWith(".json") && f !== "last-session.json")
|
|
137
|
+
.map((f) => f.replace(".json", ""));
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* List all saved sessions with rich metadata.
|
|
141
|
+
*/
|
|
142
|
+
listDetailed() {
|
|
143
|
+
const files = readdirSync(this.config.sessionsDir);
|
|
144
|
+
const sessions = [];
|
|
145
|
+
for (const file of files) {
|
|
146
|
+
if (!file.endsWith(".json") || file === "last-session.json")
|
|
147
|
+
continue;
|
|
148
|
+
const filePath = join(this.config.sessionsDir, file);
|
|
149
|
+
try {
|
|
150
|
+
const data = JSON.parse(readFileSync(filePath, "utf-8"));
|
|
151
|
+
const stats = statSync(filePath);
|
|
152
|
+
sessions.push({
|
|
153
|
+
name: data.name || file.replace(".json", ""),
|
|
154
|
+
created: data.created,
|
|
155
|
+
lastUsed: data.lastUsed,
|
|
156
|
+
domain: data.domain,
|
|
157
|
+
url: data.url,
|
|
158
|
+
cookies: data.cookies?.length || 0,
|
|
159
|
+
localStorageKeys: Object.keys(data.localStorage || {}).length,
|
|
160
|
+
sessionStorageKeys: Object.keys(data.sessionStorage || {}).length,
|
|
161
|
+
sizeBytes: stats.size,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
catch (e) {
|
|
165
|
+
if (this.config.verbose) {
|
|
166
|
+
console.debug(`[CBrowser] Skipping malformed session file ${file}: ${e.message}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return sessions.sort((a, b) => new Date(b.lastUsed).getTime() - new Date(a.lastUsed).getTime());
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get detailed info for a single session.
|
|
174
|
+
*/
|
|
175
|
+
getDetails(name) {
|
|
176
|
+
const sessionPath = join(this.config.sessionsDir, `${name}.json`);
|
|
177
|
+
if (!existsSync(sessionPath))
|
|
178
|
+
return null;
|
|
179
|
+
try {
|
|
180
|
+
return JSON.parse(readFileSync(sessionPath, "utf-8"));
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
if (this.config.verbose) {
|
|
184
|
+
console.debug(`[CBrowser] Failed to load session ${name}: ${e.message}`);
|
|
185
|
+
}
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Delete a saved session.
|
|
191
|
+
*/
|
|
192
|
+
delete(name) {
|
|
193
|
+
const sessionPath = join(this.config.sessionsDir, `${name}.json`);
|
|
194
|
+
if (existsSync(sessionPath)) {
|
|
195
|
+
unlinkSync(sessionPath);
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Delete sessions older than a given number of days.
|
|
202
|
+
*/
|
|
203
|
+
cleanup(olderThanDays) {
|
|
204
|
+
const cutoff = Date.now() - olderThanDays * 24 * 60 * 60 * 1000;
|
|
205
|
+
const deleted = [];
|
|
206
|
+
const kept = [];
|
|
207
|
+
const files = readdirSync(this.config.sessionsDir);
|
|
208
|
+
for (const file of files) {
|
|
209
|
+
if (!file.endsWith(".json") || file === "last-session.json")
|
|
210
|
+
continue;
|
|
211
|
+
const filePath = join(this.config.sessionsDir, file);
|
|
212
|
+
const name = file.replace(".json", "");
|
|
213
|
+
try {
|
|
214
|
+
const data = JSON.parse(readFileSync(filePath, "utf-8"));
|
|
215
|
+
const lastUsed = new Date(data.lastUsed).getTime();
|
|
216
|
+
if (lastUsed < cutoff) {
|
|
217
|
+
unlinkSync(filePath);
|
|
218
|
+
deleted.push(name);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
kept.push(name);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch (e) {
|
|
225
|
+
console.debug(`[CBrowser] Session cleanup error for ${name}: ${e.message}`);
|
|
226
|
+
kept.push(name);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return { deleted, kept };
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Export a session to a portable JSON file.
|
|
233
|
+
*/
|
|
234
|
+
export(name, outputPath) {
|
|
235
|
+
const sessionPath = join(this.config.sessionsDir, `${name}.json`);
|
|
236
|
+
if (!existsSync(sessionPath))
|
|
237
|
+
return false;
|
|
238
|
+
const data = readFileSync(sessionPath, "utf-8");
|
|
239
|
+
writeFileSync(outputPath, data);
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Import a session from a JSON file.
|
|
244
|
+
*/
|
|
245
|
+
import(inputPath, name) {
|
|
246
|
+
if (!existsSync(inputPath))
|
|
247
|
+
return false;
|
|
248
|
+
try {
|
|
249
|
+
const data = JSON.parse(readFileSync(inputPath, "utf-8"));
|
|
250
|
+
data.name = name;
|
|
251
|
+
const sessionPath = join(this.config.sessionsDir, `${name}.json`);
|
|
252
|
+
writeFileSync(sessionPath, JSON.stringify(data, null, 2));
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
catch (e) {
|
|
256
|
+
console.debug(`[CBrowser] Import failed: ${e.message}`);
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/browser/session-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/browser.d.ts
CHANGED
|
@@ -18,6 +18,9 @@ export declare class CBrowser {
|
|
|
18
18
|
private harEntries;
|
|
19
19
|
private isRecordingHar;
|
|
20
20
|
private skipSessionRestore;
|
|
21
|
+
private sessionManager;
|
|
22
|
+
private selectorCacheManager;
|
|
23
|
+
private overlayHandler;
|
|
21
24
|
constructor(userConfig?: Partial<CBrowserConfig>);
|
|
22
25
|
private get sessionStateFile();
|
|
23
26
|
private saveSessionState;
|
|
@@ -233,7 +236,7 @@ export declare class CBrowser {
|
|
|
233
236
|
* Handle filling a custom input (hidden input with custom UI).
|
|
234
237
|
* Handles autocomplete, datepickers, custom text inputs, etc.
|
|
235
238
|
*/
|
|
236
|
-
handleCustomInput(hiddenInput: Locator, value: string,
|
|
239
|
+
handleCustomInput(hiddenInput: Locator, value: string, _options?: {
|
|
237
240
|
verbose?: boolean;
|
|
238
241
|
}): Promise<{
|
|
239
242
|
success: boolean;
|
|
@@ -249,57 +252,23 @@ export declare class CBrowser {
|
|
|
249
252
|
retryDelay?: number;
|
|
250
253
|
dismissOverlays?: boolean;
|
|
251
254
|
}): Promise<SmartRetryResult>;
|
|
252
|
-
/** Common overlay patterns for detection */
|
|
253
|
-
private static readonly OVERLAY_PATTERNS;
|
|
254
255
|
/**
|
|
255
256
|
* Detect and dismiss overlays (cookie consent, age verification, newsletter popups).
|
|
256
257
|
* Constitutional safety: Yellow zone - logs all dismissed overlays.
|
|
257
258
|
*/
|
|
258
259
|
dismissOverlay(options?: DismissOverlayOptions): Promise<DismissOverlayResult>;
|
|
259
|
-
/** Text content keywords for overlay type classification */
|
|
260
|
-
private static readonly OVERLAY_TEXT_PATTERNS;
|
|
261
|
-
/**
|
|
262
|
-
* Classify an overlay by its text content.
|
|
263
|
-
*/
|
|
264
|
-
private classifyOverlayType;
|
|
265
|
-
/**
|
|
266
|
-
* Detect overlays on the page by analyzing position, z-index, pattern matching, and text content.
|
|
267
|
-
* Returns overlays sorted by z-index (highest first) so the topmost blocking overlay is dismissed first.
|
|
268
|
-
*/
|
|
269
|
-
private detectOverlays;
|
|
270
|
-
/**
|
|
271
|
-
* Try clicking a button, with force fallback if another element intercepts.
|
|
272
|
-
*/
|
|
273
|
-
private tryClickOverlayButton;
|
|
274
|
-
/**
|
|
275
|
-
* Attempt to dismiss a single detected overlay.
|
|
276
|
-
*/
|
|
277
|
-
private tryDismissOverlay;
|
|
278
260
|
/**
|
|
279
261
|
* Find alternative selectors for an element.
|
|
280
262
|
*/
|
|
281
263
|
private findAlternativeSelectors;
|
|
282
|
-
private selectorCache;
|
|
283
264
|
/**
|
|
284
|
-
* Get
|
|
265
|
+
* Get current page domain for cache key generation.
|
|
285
266
|
*/
|
|
286
|
-
private
|
|
287
|
-
/**
|
|
288
|
-
* Load the selector cache from disk.
|
|
289
|
-
*/
|
|
290
|
-
private loadSelectorCache;
|
|
291
|
-
/**
|
|
292
|
-
* Save the selector cache to disk.
|
|
293
|
-
*/
|
|
294
|
-
private saveSelectorCache;
|
|
295
|
-
/**
|
|
296
|
-
* Get cache key for a selector (includes domain for context).
|
|
297
|
-
*/
|
|
298
|
-
private getSelectorCacheKey;
|
|
267
|
+
private getCurrentDomain;
|
|
299
268
|
/**
|
|
300
|
-
*
|
|
269
|
+
* Sync the current domain to the selector cache manager.
|
|
301
270
|
*/
|
|
302
|
-
private
|
|
271
|
+
private syncCacheDomain;
|
|
303
272
|
/**
|
|
304
273
|
* Cache a working alternative selector for future use.
|
|
305
274
|
*/
|