@saiden/browse 0.2.5
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.
Potentially problematic release.
This version of @saiden/browse might be problematic. Click here for more details.
- package/README.md +210 -0
- package/dist/browser.d.ts +48 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.integration.test.d.ts +2 -0
- package/dist/browser.integration.test.d.ts.map +1 -0
- package/dist/browser.integration.test.js +173 -0
- package/dist/browser.integration.test.js.map +1 -0
- package/dist/browser.js +250 -0
- package/dist/browser.js.map +1 -0
- package/dist/browser.test.d.ts +2 -0
- package/dist/browser.test.d.ts.map +1 -0
- package/dist/browser.test.js +73 -0
- package/dist/browser.test.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +247 -0
- package/dist/cli.js.map +1 -0
- package/dist/image.d.ts +21 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +131 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +41 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +103 -0
- package/dist/logger.js.map +1 -0
- package/dist/logger.test.d.ts +2 -0
- package/dist/logger.test.d.ts.map +1 -0
- package/dist/logger.test.js +146 -0
- package/dist/logger.test.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +541 -0
- package/dist/mcp.js.map +1 -0
- package/dist/server.d.ts +20 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +88 -0
- package/dist/server.js.map +1 -0
- package/dist/server.test.d.ts +2 -0
- package/dist/server.test.d.ts.map +1 -0
- package/dist/server.test.js +164 -0
- package/dist/server.test.js.map +1 -0
- package/dist/types.d.ts +125 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +74 -0
package/dist/browser.js
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { webkit } from 'playwright';
|
|
3
|
+
import * as image from './image.js';
|
|
4
|
+
export class ClaudeBrowser {
|
|
5
|
+
browser = null;
|
|
6
|
+
context = null;
|
|
7
|
+
page = null;
|
|
8
|
+
options;
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.options = {
|
|
11
|
+
headless: options.headless ?? true,
|
|
12
|
+
width: options.width ?? 1280,
|
|
13
|
+
height: options.height ?? 800,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
async launch() {
|
|
17
|
+
this.browser = await webkit.launch({ headless: this.options.headless });
|
|
18
|
+
this.context = await this.browser.newContext({
|
|
19
|
+
viewport: {
|
|
20
|
+
width: this.options.width,
|
|
21
|
+
height: this.options.height,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
this.page = await this.context.newPage();
|
|
25
|
+
}
|
|
26
|
+
async close() {
|
|
27
|
+
if (this.browser) {
|
|
28
|
+
await this.browser.close();
|
|
29
|
+
this.browser = null;
|
|
30
|
+
this.context = null;
|
|
31
|
+
this.page = null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
ensurePage() {
|
|
35
|
+
if (!this.page) {
|
|
36
|
+
throw new Error('Browser not launched. Call launch() first.');
|
|
37
|
+
}
|
|
38
|
+
return this.page;
|
|
39
|
+
}
|
|
40
|
+
/** Get the current page instance (for advanced usage) */
|
|
41
|
+
getPage() {
|
|
42
|
+
return this.page;
|
|
43
|
+
}
|
|
44
|
+
/** Get the browser context (for advanced usage like cookies) */
|
|
45
|
+
getContext() {
|
|
46
|
+
return this.context;
|
|
47
|
+
}
|
|
48
|
+
async goto(url) {
|
|
49
|
+
const page = this.ensurePage();
|
|
50
|
+
await page.goto(url, { waitUntil: 'networkidle' });
|
|
51
|
+
return { url: page.url(), title: await page.title() };
|
|
52
|
+
}
|
|
53
|
+
async click(selector) {
|
|
54
|
+
const page = this.ensurePage();
|
|
55
|
+
await page.click(selector);
|
|
56
|
+
await page.waitForLoadState('networkidle').catch(() => { });
|
|
57
|
+
return { url: page.url() };
|
|
58
|
+
}
|
|
59
|
+
async type(selector, text) {
|
|
60
|
+
const page = this.ensurePage();
|
|
61
|
+
await page.fill(selector, text);
|
|
62
|
+
}
|
|
63
|
+
async query(selector) {
|
|
64
|
+
const page = this.ensurePage();
|
|
65
|
+
return page.$$eval(selector, (nodes) => nodes.map((el) => {
|
|
66
|
+
const attrs = {};
|
|
67
|
+
for (const attr of el.attributes) {
|
|
68
|
+
attrs[attr.name] = attr.value;
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
tag: el.tagName.toLowerCase(),
|
|
72
|
+
text: el.textContent?.trim().slice(0, 200) || '',
|
|
73
|
+
attributes: attrs,
|
|
74
|
+
};
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
async screenshot(path, fullPage = false) {
|
|
78
|
+
const page = this.ensurePage();
|
|
79
|
+
const resolvedPath = resolve(path || 'screenshot.png');
|
|
80
|
+
const buffer = await page.screenshot({ path: resolvedPath, fullPage });
|
|
81
|
+
return { path: resolvedPath, buffer };
|
|
82
|
+
}
|
|
83
|
+
async getUrl() {
|
|
84
|
+
const page = this.ensurePage();
|
|
85
|
+
return { url: page.url(), title: await page.title() };
|
|
86
|
+
}
|
|
87
|
+
async getHtml(full = false) {
|
|
88
|
+
const page = this.ensurePage();
|
|
89
|
+
const html = await page.content();
|
|
90
|
+
return full ? html : html.slice(0, 10000);
|
|
91
|
+
}
|
|
92
|
+
async back() {
|
|
93
|
+
const page = this.ensurePage();
|
|
94
|
+
await page.goBack();
|
|
95
|
+
return { url: page.url() };
|
|
96
|
+
}
|
|
97
|
+
async forward() {
|
|
98
|
+
const page = this.ensurePage();
|
|
99
|
+
await page.goForward();
|
|
100
|
+
return { url: page.url() };
|
|
101
|
+
}
|
|
102
|
+
async reload() {
|
|
103
|
+
const page = this.ensurePage();
|
|
104
|
+
await page.reload();
|
|
105
|
+
return { url: page.url() };
|
|
106
|
+
}
|
|
107
|
+
async wait(ms = 1000) {
|
|
108
|
+
const page = this.ensurePage();
|
|
109
|
+
await page.waitForTimeout(ms);
|
|
110
|
+
}
|
|
111
|
+
async newPage() {
|
|
112
|
+
if (!this.context) {
|
|
113
|
+
throw new Error('Browser not launched. Call launch() first.');
|
|
114
|
+
}
|
|
115
|
+
this.page = await this.context.newPage();
|
|
116
|
+
}
|
|
117
|
+
async eval(script) {
|
|
118
|
+
const page = this.ensurePage();
|
|
119
|
+
return page.evaluate(script);
|
|
120
|
+
}
|
|
121
|
+
async executeCommand(cmd) {
|
|
122
|
+
try {
|
|
123
|
+
switch (cmd.cmd) {
|
|
124
|
+
case 'goto': {
|
|
125
|
+
const result = await this.goto(cmd.url);
|
|
126
|
+
return { ok: true, ...result };
|
|
127
|
+
}
|
|
128
|
+
case 'click': {
|
|
129
|
+
const result = await this.click(cmd.selector);
|
|
130
|
+
return { ok: true, ...result };
|
|
131
|
+
}
|
|
132
|
+
case 'type': {
|
|
133
|
+
await this.type(cmd.selector, cmd.text);
|
|
134
|
+
return { ok: true };
|
|
135
|
+
}
|
|
136
|
+
case 'query': {
|
|
137
|
+
const elements = await this.query(cmd.selector);
|
|
138
|
+
return { ok: true, count: elements.length, elements };
|
|
139
|
+
}
|
|
140
|
+
case 'screenshot': {
|
|
141
|
+
const result = await this.screenshot(cmd.path, cmd.fullPage);
|
|
142
|
+
return { ok: true, path: result.path };
|
|
143
|
+
}
|
|
144
|
+
case 'url': {
|
|
145
|
+
const result = await this.getUrl();
|
|
146
|
+
return { ok: true, ...result };
|
|
147
|
+
}
|
|
148
|
+
case 'html': {
|
|
149
|
+
const html = await this.getHtml(cmd.full);
|
|
150
|
+
return { ok: true, html };
|
|
151
|
+
}
|
|
152
|
+
case 'back': {
|
|
153
|
+
const result = await this.back();
|
|
154
|
+
return { ok: true, ...result };
|
|
155
|
+
}
|
|
156
|
+
case 'forward': {
|
|
157
|
+
const result = await this.forward();
|
|
158
|
+
return { ok: true, ...result };
|
|
159
|
+
}
|
|
160
|
+
case 'reload': {
|
|
161
|
+
const result = await this.reload();
|
|
162
|
+
return { ok: true, ...result };
|
|
163
|
+
}
|
|
164
|
+
case 'wait': {
|
|
165
|
+
await this.wait(cmd.ms);
|
|
166
|
+
return { ok: true };
|
|
167
|
+
}
|
|
168
|
+
case 'newpage': {
|
|
169
|
+
await this.newPage();
|
|
170
|
+
return { ok: true };
|
|
171
|
+
}
|
|
172
|
+
case 'close': {
|
|
173
|
+
await this.close();
|
|
174
|
+
return { ok: true };
|
|
175
|
+
}
|
|
176
|
+
case 'eval': {
|
|
177
|
+
const result = await this.eval(cmd.script);
|
|
178
|
+
return { ok: true, result };
|
|
179
|
+
}
|
|
180
|
+
case 'favicon': {
|
|
181
|
+
const result = await image.createFavicon(cmd.input, cmd.outputDir);
|
|
182
|
+
return { ok: true, files: result.files, outputDir: result.outputDir };
|
|
183
|
+
}
|
|
184
|
+
case 'convert': {
|
|
185
|
+
const result = await image.convert(cmd.input, cmd.output, cmd.format);
|
|
186
|
+
return {
|
|
187
|
+
ok: true,
|
|
188
|
+
path: result.path,
|
|
189
|
+
width: result.width,
|
|
190
|
+
height: result.height,
|
|
191
|
+
format: result.format,
|
|
192
|
+
size: result.size,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
case 'resize': {
|
|
196
|
+
const result = await image.resize(cmd.input, cmd.output, cmd.width, cmd.height, cmd.fit);
|
|
197
|
+
return {
|
|
198
|
+
ok: true,
|
|
199
|
+
path: result.path,
|
|
200
|
+
width: result.width,
|
|
201
|
+
height: result.height,
|
|
202
|
+
format: result.format,
|
|
203
|
+
size: result.size,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
case 'crop': {
|
|
207
|
+
const result = await image.crop(cmd.input, cmd.output, cmd.left, cmd.top, cmd.width, cmd.height);
|
|
208
|
+
return {
|
|
209
|
+
ok: true,
|
|
210
|
+
path: result.path,
|
|
211
|
+
width: result.width,
|
|
212
|
+
height: result.height,
|
|
213
|
+
format: result.format,
|
|
214
|
+
size: result.size,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
case 'compress': {
|
|
218
|
+
const result = await image.compress(cmd.input, cmd.output, cmd.quality);
|
|
219
|
+
return {
|
|
220
|
+
ok: true,
|
|
221
|
+
path: result.path,
|
|
222
|
+
width: result.width,
|
|
223
|
+
height: result.height,
|
|
224
|
+
format: result.format,
|
|
225
|
+
size: result.size,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
case 'thumbnail': {
|
|
229
|
+
const result = await image.thumbnail(cmd.input, cmd.output, cmd.size);
|
|
230
|
+
return {
|
|
231
|
+
ok: true,
|
|
232
|
+
path: result.path,
|
|
233
|
+
width: result.width,
|
|
234
|
+
height: result.height,
|
|
235
|
+
format: result.format,
|
|
236
|
+
size: result.size,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
default: {
|
|
240
|
+
const _exhaustive = cmd;
|
|
241
|
+
return { ok: false, error: `Unknown command: ${_exhaustive.cmd}` };
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
return { ok: false, error: err.message };
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAgD,MAAM,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAGpC,MAAM,OAAO,aAAa;IAChB,OAAO,GAAmB,IAAI,CAAC;IAC/B,OAAO,GAA0B,IAAI,CAAC;IACtC,IAAI,GAAgB,IAAI,CAAC;IACzB,OAAO,CAA2B;IAE1C,YAAY,UAA0B,EAAE;QACtC,IAAI,CAAC,OAAO,GAAG;YACb,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,GAAG;SAC9B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YAC3C,QAAQ,EAAE;gBACR,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;gBACzB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;aAC5B;SACF,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,yDAAyD;IACzD,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,gEAAgE;IAChE,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;QACnD,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAgB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3B,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC3D,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,IAAY;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAgB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CACrC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;YACf,MAAM,KAAK,GAA2B,EAAE,CAAC;YACzC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAChC,CAAC;YACD,OAAO;gBACL,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE;gBAC7B,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE;gBAChD,UAAU,EAAE,KAAK;aAClB,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAa,EAAE,QAAQ,GAAG,KAAK;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAmB;QACtC,IAAI,CAAC;YACH,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC;gBAChB,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;gBACjC,CAAC;gBACD,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAC9C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;gBACjC,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;gBACtB,CAAC;gBACD,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAChD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;gBACxD,CAAC;gBACD,KAAK,YAAY,CAAC,CAAC,CAAC;oBAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAC7D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;gBACzC,CAAC;gBACD,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;oBACnC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;gBACjC,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC1C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAC5B,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;oBACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;gBACjC,CAAC;gBACD,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;oBACpC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;gBACjC,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;oBACnC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;gBACjC,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACxB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;gBACtB,CAAC;gBACD,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;oBACrB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;gBACtB,CAAC;gBACD,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;oBACnB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;gBACtB,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC3C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBAC9B,CAAC;gBACD,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;oBACnE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;gBACxE,CAAC;gBACD,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;oBACtE,OAAO;wBACL,EAAE,EAAE,IAAI;wBACR,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;qBAClB,CAAC;gBACJ,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;oBACzF,OAAO;wBACL,EAAE,EAAE,IAAI;wBACR,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;qBAClB,CAAC;gBACJ,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAC7B,GAAG,CAAC,KAAK,EACT,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,KAAK,EACT,GAAG,CAAC,MAAM,CACX,CAAC;oBACF,OAAO;wBACL,EAAE,EAAE,IAAI;wBACR,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;qBAClB,CAAC;gBACJ,CAAC;gBACD,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;oBACxE,OAAO;wBACL,EAAE,EAAE,IAAI;wBACR,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;qBAClB,CAAC;gBACJ,CAAC;gBACD,KAAK,WAAW,CAAC,CAAC,CAAC;oBACjB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBACtE,OAAO;wBACL,EAAE,EAAE,IAAI;wBACR,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;qBAClB,CAAC;gBACJ,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC;oBACR,MAAM,WAAW,GAAU,GAAG,CAAC;oBAC/B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAqB,WAA+B,CAAC,GAAG,EAAE,EAAE,CAAC;gBAC1F,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;QACtD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.test.d.ts","sourceRoot":"","sources":["../src/browser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { ClaudeBrowser } from './browser.js';
|
|
3
|
+
describe('ClaudeBrowser', () => {
|
|
4
|
+
describe('constructor', () => {
|
|
5
|
+
it('creates browser with default options', () => {
|
|
6
|
+
const browser = new ClaudeBrowser();
|
|
7
|
+
expect(browser).toBeInstanceOf(ClaudeBrowser);
|
|
8
|
+
});
|
|
9
|
+
it('accepts custom options', () => {
|
|
10
|
+
const browser = new ClaudeBrowser({
|
|
11
|
+
headless: false,
|
|
12
|
+
width: 1920,
|
|
13
|
+
height: 1080,
|
|
14
|
+
});
|
|
15
|
+
expect(browser).toBeInstanceOf(ClaudeBrowser);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
describe('ensurePage (via executeCommand)', () => {
|
|
19
|
+
it('throws error when browser not launched', async () => {
|
|
20
|
+
const browser = new ClaudeBrowser();
|
|
21
|
+
const result = await browser.executeCommand({ cmd: 'url' });
|
|
22
|
+
expect(result.ok).toBe(false);
|
|
23
|
+
if (!result.ok) {
|
|
24
|
+
expect(result.error).toContain('Browser not launched');
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('executeCommand', () => {
|
|
29
|
+
it('returns error for commands without launch', async () => {
|
|
30
|
+
const browser = new ClaudeBrowser();
|
|
31
|
+
const gotoResult = await browser.executeCommand({ cmd: 'goto', url: 'https://example.com' });
|
|
32
|
+
expect(gotoResult.ok).toBe(false);
|
|
33
|
+
const clickResult = await browser.executeCommand({ cmd: 'click', selector: '#btn' });
|
|
34
|
+
expect(clickResult.ok).toBe(false);
|
|
35
|
+
const typeResult = await browser.executeCommand({
|
|
36
|
+
cmd: 'type',
|
|
37
|
+
selector: '#input',
|
|
38
|
+
text: 'test',
|
|
39
|
+
});
|
|
40
|
+
expect(typeResult.ok).toBe(false);
|
|
41
|
+
const queryResult = await browser.executeCommand({ cmd: 'query', selector: '.item' });
|
|
42
|
+
expect(queryResult.ok).toBe(false);
|
|
43
|
+
const screenshotResult = await browser.executeCommand({ cmd: 'screenshot' });
|
|
44
|
+
expect(screenshotResult.ok).toBe(false);
|
|
45
|
+
const htmlResult = await browser.executeCommand({ cmd: 'html' });
|
|
46
|
+
expect(htmlResult.ok).toBe(false);
|
|
47
|
+
const backResult = await browser.executeCommand({ cmd: 'back' });
|
|
48
|
+
expect(backResult.ok).toBe(false);
|
|
49
|
+
const forwardResult = await browser.executeCommand({ cmd: 'forward' });
|
|
50
|
+
expect(forwardResult.ok).toBe(false);
|
|
51
|
+
const reloadResult = await browser.executeCommand({ cmd: 'reload' });
|
|
52
|
+
expect(reloadResult.ok).toBe(false);
|
|
53
|
+
const waitResult = await browser.executeCommand({ cmd: 'wait', ms: 100 });
|
|
54
|
+
expect(waitResult.ok).toBe(false);
|
|
55
|
+
const evalResult = await browser.executeCommand({ cmd: 'eval', script: '1+1' });
|
|
56
|
+
expect(evalResult.ok).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
it('handles close command without error when not launched', async () => {
|
|
59
|
+
const browser = new ClaudeBrowser();
|
|
60
|
+
const result = await browser.executeCommand({ cmd: 'close' });
|
|
61
|
+
expect(result.ok).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
it('handles newpage command error when not launched', async () => {
|
|
64
|
+
const browser = new ClaudeBrowser();
|
|
65
|
+
const result = await browser.executeCommand({ cmd: 'newpage' });
|
|
66
|
+
expect(result.ok).toBe(false);
|
|
67
|
+
if (!result.ok) {
|
|
68
|
+
expect(result.error).toContain('Browser not launched');
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=browser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.test.js","sourceRoot":"","sources":["../src/browser.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, resolve } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { parseArgs } from 'node:util';
|
|
6
|
+
import { ClaudeBrowser } from './browser.js';
|
|
7
|
+
import * as image from './image.js';
|
|
8
|
+
import { startServer } from './server.js';
|
|
9
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
const pkg = JSON.parse(readFileSync(resolve(__dirname, '../package.json'), 'utf-8'));
|
|
11
|
+
const { values, positionals } = parseArgs({
|
|
12
|
+
allowPositionals: true,
|
|
13
|
+
options: {
|
|
14
|
+
output: { type: 'string', short: 'o', default: 'screenshot.png' },
|
|
15
|
+
width: { type: 'string', short: 'w', default: '1280' },
|
|
16
|
+
height: { type: 'string', short: 'h', default: '800' },
|
|
17
|
+
fullpage: { type: 'boolean', short: 'f', default: false },
|
|
18
|
+
wait: { type: 'string', default: '2000' },
|
|
19
|
+
headed: { type: 'boolean', default: false },
|
|
20
|
+
interactive: { type: 'boolean', short: 'i', default: false },
|
|
21
|
+
query: { type: 'string', short: 'q' },
|
|
22
|
+
json: { type: 'boolean', short: 'j', default: false },
|
|
23
|
+
click: { type: 'string', short: 'c', multiple: true },
|
|
24
|
+
type: { type: 'string', short: 't', multiple: true },
|
|
25
|
+
help: { type: 'boolean', default: false },
|
|
26
|
+
version: { type: 'boolean', short: 'v', default: false },
|
|
27
|
+
// Image processing options
|
|
28
|
+
favicon: { type: 'string' },
|
|
29
|
+
convert: { type: 'string' },
|
|
30
|
+
resize: { type: 'string' },
|
|
31
|
+
compress: { type: 'string' },
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
const HELP = `
|
|
35
|
+
Usage: claude-browse [options] <url>
|
|
36
|
+
|
|
37
|
+
Options:
|
|
38
|
+
-o, --output <file> Output screenshot path (default: screenshot.png)
|
|
39
|
+
-w, --width <px> Viewport width (default: 1280)
|
|
40
|
+
-h, --height <px> Viewport height (default: 800)
|
|
41
|
+
-f, --fullpage Capture full page scroll
|
|
42
|
+
--wait <ms> Wait time after load (default: 2000)
|
|
43
|
+
--headed Show browser window
|
|
44
|
+
-i, --interactive Keep browser open for manual interaction
|
|
45
|
+
-q, --query <selector> Query elements by CSS selector and show attributes
|
|
46
|
+
-j, --json Output query results as JSON
|
|
47
|
+
-c, --click <selector> Click on element (can be repeated for multiple clicks)
|
|
48
|
+
-t, --type <sel>=<text> Type text into input (can be repeated)
|
|
49
|
+
-v, --version Show version
|
|
50
|
+
--help Show this help
|
|
51
|
+
|
|
52
|
+
Image Processing:
|
|
53
|
+
--favicon <dir> Generate favicon set to directory (from screenshot or input)
|
|
54
|
+
--convert <format> Convert screenshot to format (png, jpeg, webp, avif)
|
|
55
|
+
--resize <WxH> Resize screenshot (e.g., 800x600 or 800 for width only)
|
|
56
|
+
--compress <quality> Compress with quality 1-100
|
|
57
|
+
|
|
58
|
+
Examples:
|
|
59
|
+
claude-browse https://example.com
|
|
60
|
+
claude-browse -o page.png -w 1920 -h 1080 https://example.com
|
|
61
|
+
claude-browse -i --headed https://example.com
|
|
62
|
+
claude-browse -q "a[href]" https://example.com
|
|
63
|
+
claude-browse -q "img" -j https://example.com
|
|
64
|
+
claude-browse -c "button.submit" https://example.com
|
|
65
|
+
claude-browse -t "input[name=q]=hello" -c "button[type=submit]" https://google.com
|
|
66
|
+
claude-browse -c ".cookie-accept" -c "a.nav-link" -q "h1" https://example.com
|
|
67
|
+
|
|
68
|
+
Image processing examples:
|
|
69
|
+
claude-browse https://example.com --favicon ./favicons/
|
|
70
|
+
claude-browse https://example.com -o page.webp --convert webp
|
|
71
|
+
claude-browse https://example.com --resize 800x600
|
|
72
|
+
claude-browse https://example.com --compress 60
|
|
73
|
+
|
|
74
|
+
Server mode (default):
|
|
75
|
+
claude-browse # Start server on port 13373
|
|
76
|
+
claude-browse --headed # Start with visible browser
|
|
77
|
+
|
|
78
|
+
# Send commands via curl:
|
|
79
|
+
curl -X POST http://localhost:13373 -d '{"cmd":"goto","url":"https://example.com"}'
|
|
80
|
+
curl -X POST http://localhost:13373 -d '{"cmd":"click","selector":"button"}'
|
|
81
|
+
curl -X POST http://localhost:13373 -d '{"cmd":"type","selector":"input","text":"hello"}'
|
|
82
|
+
curl -X POST http://localhost:13373 -d '{"cmd":"query","selector":"a[href]"}'
|
|
83
|
+
curl -X POST http://localhost:13373 -d '{"cmd":"screenshot","path":"shot.png"}'
|
|
84
|
+
curl -X POST http://localhost:13373 -d '{"cmd":"url"}'
|
|
85
|
+
curl -X POST http://localhost:13373 -d '{"cmd":"html"}'
|
|
86
|
+
curl -X POST http://localhost:13373 -d '{"cmd":"close"}'
|
|
87
|
+
|
|
88
|
+
# Image processing via server:
|
|
89
|
+
curl localhost:13373 -d '{"cmd":"favicon","input":"screenshot.png","outputDir":"./favicons"}'
|
|
90
|
+
curl localhost:13373 -d '{"cmd":"convert","input":"img.png","output":"img.webp","format":"webp"}'
|
|
91
|
+
curl localhost:13373 -d '{"cmd":"resize","input":"img.png","output":"small.png","width":400}'
|
|
92
|
+
curl localhost:13373 -d '{"cmd":"compress","input":"img.png","output":"compressed.png","quality":60}'
|
|
93
|
+
`;
|
|
94
|
+
function getViewportConfig() {
|
|
95
|
+
return {
|
|
96
|
+
headless: !values.headed,
|
|
97
|
+
width: Number.parseInt(values.width),
|
|
98
|
+
height: Number.parseInt(values.height),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
async function runServerMode() {
|
|
102
|
+
const port = 13373;
|
|
103
|
+
const server = await startServer({ port, ...getViewportConfig() });
|
|
104
|
+
process.on('SIGINT', async () => {
|
|
105
|
+
console.log('\nShutting down...');
|
|
106
|
+
await server.stop();
|
|
107
|
+
process.exit(0);
|
|
108
|
+
});
|
|
109
|
+
await new Promise(() => { });
|
|
110
|
+
}
|
|
111
|
+
async function processTypeActions(browser) {
|
|
112
|
+
const typeActions = values.type;
|
|
113
|
+
if (!typeActions?.length)
|
|
114
|
+
return;
|
|
115
|
+
for (const typeAction of typeActions) {
|
|
116
|
+
const eqIndex = typeAction.indexOf('=');
|
|
117
|
+
if (eqIndex === -1) {
|
|
118
|
+
console.error(`Invalid --type format: "${typeAction}" (expected selector=text)`);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const selector = typeAction.slice(0, eqIndex);
|
|
122
|
+
const text = typeAction.slice(eqIndex + 1);
|
|
123
|
+
console.log(`Typing "${text}" into: ${selector}`);
|
|
124
|
+
await browser.type(selector, text);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async function processClickActions(browser) {
|
|
128
|
+
const clickActions = values.click;
|
|
129
|
+
if (!clickActions?.length)
|
|
130
|
+
return;
|
|
131
|
+
for (const selector of clickActions) {
|
|
132
|
+
console.log(`Clicking: ${selector}`);
|
|
133
|
+
await browser.click(selector);
|
|
134
|
+
await browser.wait(500);
|
|
135
|
+
}
|
|
136
|
+
const { url: currentUrl } = await browser.getUrl();
|
|
137
|
+
console.log(`Current URL: ${currentUrl}`);
|
|
138
|
+
}
|
|
139
|
+
function printElement(el, index) {
|
|
140
|
+
console.log(`[${index + 1}] <${el.tag}>`);
|
|
141
|
+
for (const [name, value] of Object.entries(el.attributes)) {
|
|
142
|
+
console.log(` ${name}="${value}"`);
|
|
143
|
+
}
|
|
144
|
+
if (el.text) {
|
|
145
|
+
const truncated = el.text.length > 100 ? `${el.text.slice(0, 100)}...` : el.text;
|
|
146
|
+
console.log(` text: "${truncated}"`);
|
|
147
|
+
}
|
|
148
|
+
console.log();
|
|
149
|
+
}
|
|
150
|
+
async function runQueryMode(browser) {
|
|
151
|
+
const elements = await browser.query(values.query);
|
|
152
|
+
if (values.json) {
|
|
153
|
+
console.log(JSON.stringify(elements, null, 2));
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
console.log(`Found ${elements.length} element(s) matching "${values.query}":\n`);
|
|
157
|
+
elements.forEach(printElement);
|
|
158
|
+
}
|
|
159
|
+
await browser.close();
|
|
160
|
+
process.exit(0);
|
|
161
|
+
}
|
|
162
|
+
async function runInteractiveMode(browser) {
|
|
163
|
+
console.log('Interactive mode - browser will stay open.');
|
|
164
|
+
console.log('Press Ctrl+C to exit.');
|
|
165
|
+
process.on('SIGINT', async () => {
|
|
166
|
+
console.log('\nClosing browser...');
|
|
167
|
+
await browser.close();
|
|
168
|
+
process.exit(0);
|
|
169
|
+
});
|
|
170
|
+
await new Promise(() => { });
|
|
171
|
+
}
|
|
172
|
+
async function processImageOptions(screenshotPath) {
|
|
173
|
+
// Process image options on the screenshot
|
|
174
|
+
if (values.favicon) {
|
|
175
|
+
console.log(`Generating favicon set to: ${values.favicon}`);
|
|
176
|
+
const result = await image.createFavicon(screenshotPath, values.favicon);
|
|
177
|
+
console.log(`Created ${result.files.length} favicon files`);
|
|
178
|
+
}
|
|
179
|
+
if (values.convert) {
|
|
180
|
+
const format = values.convert;
|
|
181
|
+
const outputPath = screenshotPath.replace(/\.[^.]+$/, `.${format}`);
|
|
182
|
+
console.log(`Converting to ${format}: ${outputPath}`);
|
|
183
|
+
await image.convert(screenshotPath, outputPath, format);
|
|
184
|
+
}
|
|
185
|
+
if (values.resize) {
|
|
186
|
+
const resizeValue = values.resize;
|
|
187
|
+
const [widthStr, heightStr] = resizeValue.split('x');
|
|
188
|
+
const width = Number.parseInt(widthStr);
|
|
189
|
+
const height = heightStr ? Number.parseInt(heightStr) : undefined;
|
|
190
|
+
console.log(`Resizing to ${width}${height ? `x${height}` : ''}`);
|
|
191
|
+
await image.resize(screenshotPath, screenshotPath, width, height);
|
|
192
|
+
}
|
|
193
|
+
if (values.compress) {
|
|
194
|
+
const quality = Number.parseInt(values.compress);
|
|
195
|
+
console.log(`Compressing with quality ${quality}`);
|
|
196
|
+
await image.compress(screenshotPath, screenshotPath, quality);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
async function runScreenshotMode(browser) {
|
|
200
|
+
const outputPath = resolve(values.output);
|
|
201
|
+
console.log(`Saving screenshot to: ${outputPath}`);
|
|
202
|
+
await browser.screenshot(outputPath, values.fullpage);
|
|
203
|
+
// Process any image options
|
|
204
|
+
await processImageOptions(outputPath);
|
|
205
|
+
await browser.close();
|
|
206
|
+
console.log('Done!');
|
|
207
|
+
}
|
|
208
|
+
async function runBrowserMode() {
|
|
209
|
+
const url = positionals[0];
|
|
210
|
+
const browser = new ClaudeBrowser(getViewportConfig());
|
|
211
|
+
await browser.launch();
|
|
212
|
+
console.log(`Navigating to: ${url}`);
|
|
213
|
+
await browser.goto(url);
|
|
214
|
+
await browser.wait(Number.parseInt(values.wait));
|
|
215
|
+
await processTypeActions(browser);
|
|
216
|
+
await processClickActions(browser);
|
|
217
|
+
if (values.query) {
|
|
218
|
+
await runQueryMode(browser);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
if (values.interactive) {
|
|
222
|
+
await runInteractiveMode(browser);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
await runScreenshotMode(browser);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
async function main() {
|
|
229
|
+
if (values.version) {
|
|
230
|
+
console.log(`claude-browse ${pkg.version}`);
|
|
231
|
+
process.exit(0);
|
|
232
|
+
}
|
|
233
|
+
if (values.help) {
|
|
234
|
+
console.log(HELP);
|
|
235
|
+
process.exit(0);
|
|
236
|
+
}
|
|
237
|
+
if (positionals.length === 0) {
|
|
238
|
+
await runServerMode();
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
await runBrowserMode();
|
|
242
|
+
}
|
|
243
|
+
main().catch((err) => {
|
|
244
|
+
console.error('Error:', err.message);
|
|
245
|
+
process.exit(1);
|
|
246
|
+
});
|
|
247
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/image.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type FitType = 'cover' | 'contain' | 'fill' | 'inside' | 'outside';
|
|
2
|
+
export type FormatType = 'png' | 'jpeg' | 'webp' | 'avif';
|
|
3
|
+
export type ThumbnailSize = 'small' | 'medium' | 'large';
|
|
4
|
+
export interface FaviconResult {
|
|
5
|
+
files: string[];
|
|
6
|
+
outputDir: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ImageResult {
|
|
9
|
+
path: string;
|
|
10
|
+
width?: number;
|
|
11
|
+
height?: number;
|
|
12
|
+
format?: string;
|
|
13
|
+
size?: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function createFavicon(input: string, outputDir: string): Promise<FaviconResult>;
|
|
16
|
+
export declare function convert(input: string, output: string, format: FormatType): Promise<ImageResult>;
|
|
17
|
+
export declare function resize(input: string, output: string, width: number, height?: number, fit?: FitType): Promise<ImageResult>;
|
|
18
|
+
export declare function crop(input: string, output: string, left: number, top: number, width: number, height: number): Promise<ImageResult>;
|
|
19
|
+
export declare function compress(input: string, output: string, quality?: number): Promise<ImageResult>;
|
|
20
|
+
export declare function thumbnail(input: string, output: string, size?: ThumbnailSize): Promise<ImageResult>;
|
|
21
|
+
//# sourceMappingURL=image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC1E,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAC1D,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAiBzD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAMD,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA2B5F;AAED,wBAAsB,OAAO,CAC3B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,WAAW,CAAC,CA+BtB;AAED,wBAAsB,MAAM,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,GAAG,GAAE,OAAiB,GACrB,OAAO,CAAC,WAAW,CAAC,CAatB;AAED,wBAAsB,IAAI,CACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CAatB;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,SAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAqChG;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,aAAwB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAGtB"}
|