@cogitator-ai/browser 0.1.2

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 (106) hide show
  1. package/README.md +329 -0
  2. package/dist/__tests__/browser-tools.test.d.ts +2 -0
  3. package/dist/__tests__/browser-tools.test.d.ts.map +1 -0
  4. package/dist/__tests__/browser-tools.test.js +120 -0
  5. package/dist/__tests__/browser-tools.test.js.map +1 -0
  6. package/dist/__tests__/extraction.test.d.ts +2 -0
  7. package/dist/__tests__/extraction.test.d.ts.map +1 -0
  8. package/dist/__tests__/extraction.test.js +267 -0
  9. package/dist/__tests__/extraction.test.js.map +1 -0
  10. package/dist/__tests__/interaction.test.d.ts +2 -0
  11. package/dist/__tests__/interaction.test.d.ts.map +1 -0
  12. package/dist/__tests__/interaction.test.js +376 -0
  13. package/dist/__tests__/interaction.test.js.map +1 -0
  14. package/dist/__tests__/navigation.test.d.ts +2 -0
  15. package/dist/__tests__/navigation.test.d.ts.map +1 -0
  16. package/dist/__tests__/navigation.test.js +235 -0
  17. package/dist/__tests__/navigation.test.js.map +1 -0
  18. package/dist/__tests__/network.test.d.ts +2 -0
  19. package/dist/__tests__/network.test.d.ts.map +1 -0
  20. package/dist/__tests__/network.test.js +508 -0
  21. package/dist/__tests__/network.test.js.map +1 -0
  22. package/dist/__tests__/page-helpers.test.d.ts +2 -0
  23. package/dist/__tests__/page-helpers.test.d.ts.map +1 -0
  24. package/dist/__tests__/page-helpers.test.js +321 -0
  25. package/dist/__tests__/page-helpers.test.js.map +1 -0
  26. package/dist/__tests__/schemas.test.d.ts +2 -0
  27. package/dist/__tests__/schemas.test.d.ts.map +1 -0
  28. package/dist/__tests__/schemas.test.js +518 -0
  29. package/dist/__tests__/schemas.test.js.map +1 -0
  30. package/dist/__tests__/selectors.test.d.ts +2 -0
  31. package/dist/__tests__/selectors.test.d.ts.map +1 -0
  32. package/dist/__tests__/selectors.test.js +157 -0
  33. package/dist/__tests__/selectors.test.js.map +1 -0
  34. package/dist/__tests__/session.test.d.ts +2 -0
  35. package/dist/__tests__/session.test.d.ts.map +1 -0
  36. package/dist/__tests__/session.test.js +325 -0
  37. package/dist/__tests__/session.test.js.map +1 -0
  38. package/dist/__tests__/stealth.test.d.ts +2 -0
  39. package/dist/__tests__/stealth.test.d.ts.map +1 -0
  40. package/dist/__tests__/stealth.test.js +353 -0
  41. package/dist/__tests__/stealth.test.js.map +1 -0
  42. package/dist/__tests__/vision.test.d.ts +2 -0
  43. package/dist/__tests__/vision.test.d.ts.map +1 -0
  44. package/dist/__tests__/vision.test.js +226 -0
  45. package/dist/__tests__/vision.test.js.map +1 -0
  46. package/dist/index.d.ts +10 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +8 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/session.d.ts +29 -0
  51. package/dist/session.d.ts.map +1 -0
  52. package/dist/session.js +190 -0
  53. package/dist/session.js.map +1 -0
  54. package/dist/stealth/evasions.d.ts +2 -0
  55. package/dist/stealth/evasions.d.ts.map +1 -0
  56. package/dist/stealth/evasions.js +83 -0
  57. package/dist/stealth/evasions.js.map +1 -0
  58. package/dist/stealth/human-like.d.ts +5 -0
  59. package/dist/stealth/human-like.d.ts.map +1 -0
  60. package/dist/stealth/human-like.js +52 -0
  61. package/dist/stealth/human-like.js.map +1 -0
  62. package/dist/stealth/index.d.ts +8 -0
  63. package/dist/stealth/index.d.ts.map +1 -0
  64. package/dist/stealth/index.js +24 -0
  65. package/dist/stealth/index.js.map +1 -0
  66. package/dist/stealth/user-agents.d.ts +3 -0
  67. package/dist/stealth/user-agents.d.ts.map +1 -0
  68. package/dist/stealth/user-agents.js +55 -0
  69. package/dist/stealth/user-agents.js.map +1 -0
  70. package/dist/tools/extraction.d.ts +96 -0
  71. package/dist/tools/extraction.d.ts.map +1 -0
  72. package/dist/tools/extraction.js +196 -0
  73. package/dist/tools/extraction.js.map +1 -0
  74. package/dist/tools/index.d.ts +15 -0
  75. package/dist/tools/index.d.ts.map +1 -0
  76. package/dist/tools/index.js +40 -0
  77. package/dist/tools/index.js.map +1 -0
  78. package/dist/tools/interaction.d.ts +128 -0
  79. package/dist/tools/interaction.d.ts.map +1 -0
  80. package/dist/tools/interaction.js +229 -0
  81. package/dist/tools/interaction.js.map +1 -0
  82. package/dist/tools/navigation.d.ts +63 -0
  83. package/dist/tools/navigation.d.ts.map +1 -0
  84. package/dist/tools/navigation.js +140 -0
  85. package/dist/tools/navigation.js.map +1 -0
  86. package/dist/tools/network.d.ts +122 -0
  87. package/dist/tools/network.d.ts.map +1 -0
  88. package/dist/tools/network.js +223 -0
  89. package/dist/tools/network.js.map +1 -0
  90. package/dist/tools/vision.d.ts +83 -0
  91. package/dist/tools/vision.d.ts.map +1 -0
  92. package/dist/tools/vision.js +134 -0
  93. package/dist/tools/vision.js.map +1 -0
  94. package/dist/utils/page-helpers.d.ts +11 -0
  95. package/dist/utils/page-helpers.d.ts.map +1 -0
  96. package/dist/utils/page-helpers.js +73 -0
  97. package/dist/utils/page-helpers.js.map +1 -0
  98. package/dist/utils/schemas.d.ts +209 -0
  99. package/dist/utils/schemas.d.ts.map +1 -0
  100. package/dist/utils/schemas.js +156 -0
  101. package/dist/utils/schemas.js.map +1 -0
  102. package/dist/utils/selectors.d.ts +4 -0
  103. package/dist/utils/selectors.d.ts.map +1 -0
  104. package/dist/utils/selectors.js +39 -0
  105. package/dist/utils/selectors.js.map +1 -0
  106. package/package.json +45 -0
@@ -0,0 +1,157 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { smartSelect, findFormField } from '../utils/selectors.js';
3
+ function createMockPage() {
4
+ const locators = new Map();
5
+ const page = {
6
+ locator: vi.fn().mockImplementation((sel) => ({
7
+ count: vi.fn().mockResolvedValue(locators.get(sel)?.count ?? 0),
8
+ first: vi.fn().mockReturnValue({ selector: sel }),
9
+ })),
10
+ getByText: vi.fn().mockReturnValue({
11
+ count: vi.fn().mockResolvedValue(0),
12
+ first: vi.fn().mockReturnValue({ selector: 'text' }),
13
+ }),
14
+ getByLabel: vi.fn().mockReturnValue({
15
+ count: vi.fn().mockResolvedValue(0),
16
+ first: vi.fn().mockReturnValue({ selector: 'label' }),
17
+ }),
18
+ _setLocatorCount(sel, count) {
19
+ locators.set(sel, { count });
20
+ },
21
+ };
22
+ return page;
23
+ }
24
+ describe('smartSelect', () => {
25
+ it('finds element by CSS selector', async () => {
26
+ const page = createMockPage();
27
+ page._setLocatorCount('#main', 1);
28
+ const result = await smartSelect(page, '#main');
29
+ expect(result).toBeTruthy();
30
+ expect(page.locator).toHaveBeenCalledWith('#main');
31
+ });
32
+ it('falls through to XPath when CSS fails', async () => {
33
+ const page = createMockPage();
34
+ page._setLocatorCount('xpath=//div[@id="test"]', 1);
35
+ const result = await smartSelect(page, '//div[@id="test"]');
36
+ expect(result).toBeTruthy();
37
+ expect(page.locator).toHaveBeenCalledWith('xpath=//div[@id="test"]');
38
+ });
39
+ it('handles XPath expressions starting with (', async () => {
40
+ const page = createMockPage();
41
+ page._setLocatorCount('xpath=(//button)[1]', 1);
42
+ const result = await smartSelect(page, '(//button)[1]');
43
+ expect(result).toBeTruthy();
44
+ expect(page.locator).toHaveBeenCalledWith('xpath=(//button)[1]');
45
+ });
46
+ it('falls through to text match when CSS and XPath fail', async () => {
47
+ const page = createMockPage();
48
+ page.getByText.mockReturnValue({
49
+ count: vi.fn().mockResolvedValue(1),
50
+ first: vi.fn().mockReturnValue({ selector: 'text-match' }),
51
+ });
52
+ const result = await smartSelect(page, 'Submit Order');
53
+ expect(result).toBeTruthy();
54
+ expect(page.getByText).toHaveBeenCalledWith('Submit Order', { exact: false });
55
+ });
56
+ it('returns null when nothing matches', async () => {
57
+ const page = createMockPage();
58
+ const result = await smartSelect(page, 'nonexistent');
59
+ expect(result).toBeNull();
60
+ });
61
+ it('returns first element when multiple CSS matches', async () => {
62
+ const page = createMockPage();
63
+ page._setLocatorCount('.item', 5);
64
+ const result = await smartSelect(page, '.item');
65
+ expect(result).toBeTruthy();
66
+ });
67
+ it('does not try XPath for non-XPath identifiers', async () => {
68
+ const page = createMockPage();
69
+ await smartSelect(page, 'button.submit');
70
+ const xpathCalls = page.locator.mock.calls.filter((c) => typeof c[0] === 'string' && c[0].startsWith('xpath='));
71
+ expect(xpathCalls).toHaveLength(0);
72
+ });
73
+ });
74
+ describe('findFormField', () => {
75
+ it('finds input by name', async () => {
76
+ const page = createMockPage();
77
+ page._setLocatorCount('input[name="email"]', 1);
78
+ const result = await findFormField(page, 'email');
79
+ expect(result).toBeTruthy();
80
+ expect(page.locator).toHaveBeenCalledWith('input[name="email"]');
81
+ });
82
+ it('falls back to placeholder', async () => {
83
+ const page = createMockPage();
84
+ page._setLocatorCount('input[placeholder="Email"]', 1);
85
+ const result = await findFormField(page, 'Email');
86
+ expect(result).toBeTruthy();
87
+ expect(page.locator).toHaveBeenCalledWith('input[placeholder="Email"]');
88
+ });
89
+ it('falls back to aria-label', async () => {
90
+ const page = createMockPage();
91
+ page._setLocatorCount('input[aria-label="Search"]', 1);
92
+ const result = await findFormField(page, 'Search');
93
+ expect(result).toBeTruthy();
94
+ });
95
+ it('falls back to textarea name', async () => {
96
+ const page = createMockPage();
97
+ page._setLocatorCount('textarea[name="bio"]', 1);
98
+ const result = await findFormField(page, 'bio');
99
+ expect(result).toBeTruthy();
100
+ expect(page.locator).toHaveBeenCalledWith('textarea[name="bio"]');
101
+ });
102
+ it('falls back to textarea placeholder', async () => {
103
+ const page = createMockPage();
104
+ page._setLocatorCount('textarea[placeholder="Tell us about yourself"]', 1);
105
+ const result = await findFormField(page, 'Tell us about yourself');
106
+ expect(result).toBeTruthy();
107
+ });
108
+ it('falls back to select name', async () => {
109
+ const page = createMockPage();
110
+ page._setLocatorCount('select[name="country"]', 1);
111
+ const result = await findFormField(page, 'country');
112
+ expect(result).toBeTruthy();
113
+ expect(page.locator).toHaveBeenCalledWith('select[name="country"]');
114
+ });
115
+ it('falls back to label text with input', async () => {
116
+ const page = createMockPage();
117
+ page._setLocatorCount('label:has-text("Username") input', 1);
118
+ const result = await findFormField(page, 'Username');
119
+ expect(result).toBeTruthy();
120
+ });
121
+ it('falls back to label text with textarea', async () => {
122
+ const page = createMockPage();
123
+ page._setLocatorCount('label:has-text("Message") textarea', 1);
124
+ const result = await findFormField(page, 'Message');
125
+ expect(result).toBeTruthy();
126
+ });
127
+ it('falls back to label text with select', async () => {
128
+ const page = createMockPage();
129
+ page._setLocatorCount('label:has-text("Role") select', 1);
130
+ const result = await findFormField(page, 'Role');
131
+ expect(result).toBeTruthy();
132
+ });
133
+ it('falls back to getByLabel as last resort', async () => {
134
+ const page = createMockPage();
135
+ page.getByLabel.mockReturnValue({
136
+ count: vi.fn().mockResolvedValue(1),
137
+ first: vi.fn().mockReturnValue({ selector: 'label-match' }),
138
+ });
139
+ const result = await findFormField(page, 'Password');
140
+ expect(result).toBeTruthy();
141
+ expect(page.getByLabel).toHaveBeenCalledWith('Password');
142
+ });
143
+ it('returns null when no strategy matches', async () => {
144
+ const page = createMockPage();
145
+ const result = await findFormField(page, 'nonexistent');
146
+ expect(result).toBeNull();
147
+ });
148
+ it('stops at first matching strategy', async () => {
149
+ const page = createMockPage();
150
+ page._setLocatorCount('input[name="user"]', 1);
151
+ page._setLocatorCount('input[placeholder="user"]', 1);
152
+ await findFormField(page, 'user');
153
+ const placeholderCalls = page.locator.mock.calls.filter((c) => c[0] === 'input[placeholder="user"]');
154
+ expect(placeholderCalls).toHaveLength(0);
155
+ });
156
+ });
157
+ //# sourceMappingURL=selectors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors.test.js","sourceRoot":"","sources":["../../src/__tests__/selectors.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/session.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,325 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ function createPlaywrightMock() {
3
+ let currentUrl = 'about:blank';
4
+ let currentTitle = '';
5
+ const cookieStore = [];
6
+ const makePage = () => ({
7
+ goto: vi.fn().mockImplementation(async (url) => {
8
+ currentUrl = url;
9
+ currentTitle = 'Test Page';
10
+ return { status: () => 200 };
11
+ }),
12
+ close: vi.fn().mockResolvedValue(undefined),
13
+ url: vi.fn().mockImplementation(() => currentUrl),
14
+ title: vi.fn().mockImplementation(async () => currentTitle),
15
+ setViewportSize: vi.fn().mockResolvedValue(undefined),
16
+ goBack: vi.fn().mockResolvedValue(null),
17
+ goForward: vi.fn().mockResolvedValue(null),
18
+ reload: vi.fn().mockResolvedValue(null),
19
+ });
20
+ const firstPage = makePage();
21
+ const mockContext = {
22
+ newPage: vi.fn().mockImplementation(async () => makePage()),
23
+ addCookies: vi.fn().mockImplementation(async (cookies) => {
24
+ cookieStore.push(...cookies);
25
+ }),
26
+ cookies: vi.fn().mockImplementation(async () => [...cookieStore]),
27
+ close: vi.fn().mockResolvedValue(undefined),
28
+ };
29
+ mockContext.newPage.mockResolvedValueOnce(firstPage);
30
+ const mockBrowser = {
31
+ newContext: vi.fn().mockResolvedValue(mockContext),
32
+ close: vi.fn().mockResolvedValue(undefined),
33
+ isConnected: vi.fn().mockReturnValue(true),
34
+ };
35
+ const mockChromium = {
36
+ launch: vi.fn().mockResolvedValue(mockBrowser),
37
+ };
38
+ const mockFirefox = {
39
+ launch: vi.fn().mockResolvedValue(mockBrowser),
40
+ };
41
+ const mockWebkit = {
42
+ launch: vi.fn().mockResolvedValue(mockBrowser),
43
+ };
44
+ return {
45
+ module: {
46
+ chromium: mockChromium,
47
+ firefox: mockFirefox,
48
+ webkit: mockWebkit,
49
+ },
50
+ mockBrowser,
51
+ mockContext,
52
+ firstPage,
53
+ makePage,
54
+ cookieStore,
55
+ };
56
+ }
57
+ vi.mock('playwright', () => {
58
+ return {
59
+ default: {},
60
+ chromium: { launch: vi.fn() },
61
+ firefox: { launch: vi.fn() },
62
+ webkit: { launch: vi.fn() },
63
+ };
64
+ });
65
+ let pw;
66
+ beforeEach(async () => {
67
+ vi.resetModules();
68
+ pw = createPlaywrightMock();
69
+ const playwright = await import('playwright');
70
+ Object.assign(playwright, pw.module);
71
+ });
72
+ async function createAndStart(config) {
73
+ const { BrowserSession } = await import('../session.js');
74
+ const session = new BrowserSession(config);
75
+ await session.start();
76
+ return session;
77
+ }
78
+ describe('BrowserSession', () => {
79
+ it('creates session with default config', async () => {
80
+ const { BrowserSession } = await import('../session.js');
81
+ const session = new BrowserSession();
82
+ expect(session.config.headless).toBe(true);
83
+ expect(session.config.browser).toBe('chromium');
84
+ expect(session.config.viewport).toEqual({ width: 1280, height: 720 });
85
+ expect(session.config.timeout).toBe(30_000);
86
+ expect(session.config.actionTimeout).toBe(10_000);
87
+ });
88
+ it('creates session with custom config', async () => {
89
+ const { BrowserSession } = await import('../session.js');
90
+ const session = new BrowserSession({
91
+ headless: false,
92
+ browser: 'firefox',
93
+ viewport: { width: 1920, height: 1080 },
94
+ timeout: 60_000,
95
+ });
96
+ expect(session.config.headless).toBe(false);
97
+ expect(session.config.browser).toBe('firefox');
98
+ expect(session.config.viewport).toEqual({ width: 1920, height: 1080 });
99
+ expect(session.config.timeout).toBe(60_000);
100
+ expect(session.config.actionTimeout).toBe(10_000);
101
+ });
102
+ it('starts and closes browser successfully', async () => {
103
+ const session = await createAndStart();
104
+ expect(pw.module.chromium.launch).toHaveBeenCalledWith(expect.objectContaining({ headless: true }));
105
+ expect(pw.mockBrowser.newContext).toHaveBeenCalled();
106
+ expect(session.browser).toBe(pw.mockBrowser);
107
+ expect(session.context).toBe(pw.mockContext);
108
+ await session.close();
109
+ expect(pw.mockBrowser.close).toHaveBeenCalled();
110
+ expect(session.browser).toBeNull();
111
+ expect(session.context).toBeNull();
112
+ });
113
+ it('throws when accessing page before start', async () => {
114
+ const { BrowserSession } = await import('../session.js');
115
+ const session = new BrowserSession();
116
+ expect(() => session.page).toThrow('BrowserSession not started');
117
+ });
118
+ it('launches firefox when configured', async () => {
119
+ const { BrowserSession } = await import('../session.js');
120
+ const session = new BrowserSession({ browser: 'firefox' });
121
+ await session.start();
122
+ expect(pw.module.firefox.launch).toHaveBeenCalled();
123
+ });
124
+ it('launches webkit when configured', async () => {
125
+ const { BrowserSession } = await import('../session.js');
126
+ const session = new BrowserSession({ browser: 'webkit' });
127
+ await session.start();
128
+ expect(pw.module.webkit.launch).toHaveBeenCalled();
129
+ });
130
+ it('creates context with locale/timezone/geolocation/userAgent', async () => {
131
+ const { BrowserSession } = await import('../session.js');
132
+ const session = new BrowserSession({
133
+ locale: 'en-US',
134
+ timezone: 'America/New_York',
135
+ geolocation: { latitude: 40.7128, longitude: -74.006 },
136
+ userAgent: 'CustomAgent/1.0',
137
+ });
138
+ await session.start();
139
+ expect(pw.mockBrowser.newContext).toHaveBeenCalledWith(expect.objectContaining({
140
+ locale: 'en-US',
141
+ timezoneId: 'America/New_York',
142
+ geolocation: { latitude: 40.7128, longitude: -74.006 },
143
+ userAgent: 'CustomAgent/1.0',
144
+ }));
145
+ });
146
+ describe('tabs', () => {
147
+ it('starts with one tab', async () => {
148
+ const session = await createAndStart();
149
+ expect(session.tabs).toHaveLength(1);
150
+ });
151
+ it('returns a defensive copy of tabs', async () => {
152
+ const session = await createAndStart();
153
+ const tabs1 = session.tabs;
154
+ const tabs2 = session.tabs;
155
+ expect(tabs1).not.toBe(tabs2);
156
+ expect(tabs1).toEqual(tabs2);
157
+ });
158
+ it('creates new tab', async () => {
159
+ const session = await createAndStart();
160
+ await session.newTab();
161
+ expect(session.tabs).toHaveLength(2);
162
+ expect(pw.mockContext.newPage).toHaveBeenCalledTimes(2);
163
+ });
164
+ it('creates new tab with url', async () => {
165
+ const session = await createAndStart();
166
+ const page = await session.newTab('https://example.com');
167
+ expect(page.goto).toHaveBeenCalledWith('https://example.com', expect.any(Object));
168
+ });
169
+ it('new tab becomes active', async () => {
170
+ const session = await createAndStart();
171
+ const newPage = await session.newTab();
172
+ expect(session.page).toBe(newPage);
173
+ });
174
+ it('switches active tab', async () => {
175
+ const session = await createAndStart();
176
+ const firstPage = session.page;
177
+ await session.newTab();
178
+ session.switchTab(0);
179
+ expect(session.page).toBe(firstPage);
180
+ });
181
+ it('throws on invalid tab index', async () => {
182
+ const session = await createAndStart();
183
+ expect(() => session.switchTab(-1)).toThrow('Tab index -1 out of range');
184
+ expect(() => session.switchTab(5)).toThrow('Tab index 5 out of range');
185
+ });
186
+ it('closes a tab', async () => {
187
+ const session = await createAndStart();
188
+ await session.newTab();
189
+ expect(session.tabs).toHaveLength(2);
190
+ await session.closeTab(1);
191
+ expect(session.tabs).toHaveLength(1);
192
+ });
193
+ it('closes current tab and adjusts active index', async () => {
194
+ const session = await createAndStart();
195
+ const page1 = session.page;
196
+ await session.newTab();
197
+ await session.closeTab(1);
198
+ expect(session.page).toBe(page1);
199
+ });
200
+ it('closes active tab and falls back to previous', async () => {
201
+ const session = await createAndStart();
202
+ await session.newTab();
203
+ await session.newTab();
204
+ session.switchTab(1);
205
+ await session.closeTab(1);
206
+ expect(session.tabs).toHaveLength(2);
207
+ });
208
+ it('throws when closing last tab', async () => {
209
+ const session = await createAndStart();
210
+ await expect(session.closeTab(0)).rejects.toThrow('Cannot close the last tab');
211
+ });
212
+ });
213
+ describe('stealth', () => {
214
+ it('reports stealth disabled by default', async () => {
215
+ const { BrowserSession } = await import('../session.js');
216
+ const session = new BrowserSession();
217
+ expect(session.stealthEnabled).toBe(false);
218
+ expect(session.stealthConfig).toBeNull();
219
+ });
220
+ it('handles stealth: true with default config', async () => {
221
+ const { BrowserSession } = await import('../session.js');
222
+ const session = new BrowserSession({ stealth: true });
223
+ expect(session.stealthEnabled).toBe(true);
224
+ expect(session.stealthConfig).toEqual({
225
+ humanLikeTyping: true,
226
+ humanLikeMouse: true,
227
+ fingerprintRandomization: true,
228
+ blockWebDriver: true,
229
+ evasionScripts: [],
230
+ });
231
+ });
232
+ it('handles stealth object config', async () => {
233
+ const { BrowserSession } = await import('../session.js');
234
+ const stealthCfg = {
235
+ humanLikeTyping: true,
236
+ humanLikeMouse: false,
237
+ fingerprintRandomization: true,
238
+ blockWebDriver: false,
239
+ evasionScripts: ['custom.js'],
240
+ };
241
+ const session = new BrowserSession({ stealth: stealthCfg });
242
+ expect(session.stealthEnabled).toBe(true);
243
+ expect(session.stealthConfig).toEqual(stealthCfg);
244
+ });
245
+ });
246
+ describe('proxy', () => {
247
+ it('handles string proxy config', async () => {
248
+ const { BrowserSession } = await import('../session.js');
249
+ const session = new BrowserSession({ proxy: 'http://proxy.example.com:8080' });
250
+ await session.start();
251
+ expect(pw.module.chromium.launch).toHaveBeenCalledWith(expect.objectContaining({
252
+ proxy: { server: 'http://proxy.example.com:8080' },
253
+ }));
254
+ });
255
+ it('handles object proxy config', async () => {
256
+ const { BrowserSession } = await import('../session.js');
257
+ const session = new BrowserSession({
258
+ proxy: {
259
+ server: 'http://proxy.example.com:8080',
260
+ username: 'user',
261
+ password: 'pass',
262
+ },
263
+ });
264
+ await session.start();
265
+ expect(pw.module.chromium.launch).toHaveBeenCalledWith(expect.objectContaining({
266
+ proxy: {
267
+ server: 'http://proxy.example.com:8080',
268
+ username: 'user',
269
+ password: 'pass',
270
+ },
271
+ }));
272
+ });
273
+ });
274
+ describe('cookies', () => {
275
+ it('gets cookies from context', async () => {
276
+ const session = await createAndStart();
277
+ const cookies = await session.getCookies();
278
+ expect(pw.mockContext.cookies).toHaveBeenCalled();
279
+ expect(cookies).toEqual([]);
280
+ });
281
+ it('sets cookies on context', async () => {
282
+ const session = await createAndStart();
283
+ const cookies = [{ name: 'session', value: 'abc123', domain: '.example.com', path: '/' }];
284
+ await session.setCookies(cookies);
285
+ expect(pw.mockContext.addCookies).toHaveBeenCalledWith(cookies);
286
+ });
287
+ it('applies initial cookies on start', async () => {
288
+ const cookies = [{ name: 'token', value: 'xyz', domain: '.example.com', path: '/' }];
289
+ const { BrowserSession } = await import('../session.js');
290
+ const session = new BrowserSession({ cookies });
291
+ await session.start();
292
+ expect(pw.mockContext.addCookies).toHaveBeenCalledWith(cookies);
293
+ });
294
+ it('saves and loads cookies to/from file', async () => {
295
+ const { join } = await import('node:path');
296
+ const { mkdtemp, readFile, rm } = await import('node:fs/promises');
297
+ const { tmpdir } = await import('node:os');
298
+ const tmpDir = await mkdtemp(join(tmpdir(), 'cogitator-test-'));
299
+ const filePath = join(tmpDir, 'cookies.json');
300
+ try {
301
+ const session = await createAndStart();
302
+ await session.setCookies([
303
+ { name: 'test', value: 'val', domain: '.example.com', path: '/' },
304
+ ]);
305
+ await session.saveCookies(filePath);
306
+ const saved = JSON.parse(await readFile(filePath, 'utf-8'));
307
+ expect(saved).toHaveLength(1);
308
+ expect(saved[0].name).toBe('test');
309
+ pw.cookieStore.length = 0;
310
+ await session.loadCookies(filePath);
311
+ expect(pw.mockContext.addCookies).toHaveBeenCalledWith(expect.arrayContaining([expect.objectContaining({ name: 'test', value: 'val' })]));
312
+ }
313
+ finally {
314
+ await rm(tmpDir, { recursive: true });
315
+ }
316
+ });
317
+ });
318
+ it('close is safe to call multiple times', async () => {
319
+ const session = await createAndStart();
320
+ await session.close();
321
+ await session.close();
322
+ expect(pw.mockBrowser.close).toHaveBeenCalledTimes(1);
323
+ });
324
+ });
325
+ //# sourceMappingURL=session.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.test.js","sourceRoot":"","sources":["../../src/__tests__/session.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stealth.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stealth.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/stealth.test.ts"],"names":[],"mappings":""}