agent-browser 0.6.0 → 0.7.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.
- package/README.md +90 -9
- package/bin/agent-browser-darwin-arm64 +0 -0
- package/bin/agent-browser-darwin-x64 +0 -0
- package/bin/agent-browser-linux-arm64 +0 -0
- package/bin/agent-browser-linux-x64 +0 -0
- package/bin/agent-browser-win32-x64.exe +0 -0
- package/dist/actions.js +17 -11
- package/dist/actions.js.map +1 -1
- package/dist/browser.d.ts +24 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +241 -21
- package/dist/browser.js.map +1 -1
- package/dist/daemon.d.ts +5 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +51 -5
- package/dist/daemon.js.map +1 -1
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +11 -0
- package/dist/protocol.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +26 -23
- package/scripts/build-all-platforms.sh +0 -0
- package/scripts/copy-native.js +2 -1
- package/scripts/postinstall.js +1 -1
- package/skills/agent-browser/SKILL.md +132 -35
- package/skills/agent-browser/references/authentication.md +188 -0
- package/skills/agent-browser/references/proxy-support.md +175 -0
- package/skills/agent-browser/references/session-management.md +181 -0
- package/skills/agent-browser/references/snapshot-refs.md +186 -0
- package/skills/agent-browser/references/video-recording.md +162 -0
- package/skills/agent-browser/templates/authenticated-session.sh +91 -0
- package/skills/agent-browser/templates/capture-workflow.sh +68 -0
- package/skills/agent-browser/templates/form-automation.sh +64 -0
- package/dist/browser.test.d.ts +0 -2
- package/dist/browser.test.d.ts.map +0 -1
- package/dist/browser.test.js +0 -136
- package/dist/browser.test.js.map +0 -1
- package/dist/protocol.test.d.ts +0 -2
- package/dist/protocol.test.d.ts.map +0 -1
- package/dist/protocol.test.js +0 -176
- package/dist/protocol.test.js.map +0 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Template: Form Automation Workflow
|
|
3
|
+
# Fills and submits web forms with validation
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
FORM_URL="${1:?Usage: $0 <form-url>}"
|
|
8
|
+
|
|
9
|
+
echo "Automating form at: $FORM_URL"
|
|
10
|
+
|
|
11
|
+
# Navigate to form page
|
|
12
|
+
agent-browser open "$FORM_URL"
|
|
13
|
+
agent-browser wait --load networkidle
|
|
14
|
+
|
|
15
|
+
# Get interactive snapshot to identify form fields
|
|
16
|
+
echo "Analyzing form structure..."
|
|
17
|
+
agent-browser snapshot -i
|
|
18
|
+
|
|
19
|
+
# Example: Fill common form fields
|
|
20
|
+
# Uncomment and modify refs based on snapshot output
|
|
21
|
+
|
|
22
|
+
# Text inputs
|
|
23
|
+
# agent-browser fill @e1 "John Doe" # Name field
|
|
24
|
+
# agent-browser fill @e2 "user@example.com" # Email field
|
|
25
|
+
# agent-browser fill @e3 "+1-555-123-4567" # Phone field
|
|
26
|
+
|
|
27
|
+
# Password fields
|
|
28
|
+
# agent-browser fill @e4 "SecureP@ssw0rd!"
|
|
29
|
+
|
|
30
|
+
# Dropdowns
|
|
31
|
+
# agent-browser select @e5 "Option Value"
|
|
32
|
+
|
|
33
|
+
# Checkboxes
|
|
34
|
+
# agent-browser check @e6 # Check
|
|
35
|
+
# agent-browser uncheck @e7 # Uncheck
|
|
36
|
+
|
|
37
|
+
# Radio buttons
|
|
38
|
+
# agent-browser click @e8 # Select radio option
|
|
39
|
+
|
|
40
|
+
# Text areas
|
|
41
|
+
# agent-browser fill @e9 "Multi-line text content here"
|
|
42
|
+
|
|
43
|
+
# File uploads
|
|
44
|
+
# agent-browser upload @e10 /path/to/file.pdf
|
|
45
|
+
|
|
46
|
+
# Submit form
|
|
47
|
+
# agent-browser click @e11 # Submit button
|
|
48
|
+
|
|
49
|
+
# Wait for response
|
|
50
|
+
# agent-browser wait --load networkidle
|
|
51
|
+
# agent-browser wait --url "**/success" # Or wait for redirect
|
|
52
|
+
|
|
53
|
+
# Verify submission
|
|
54
|
+
echo "Form submission result:"
|
|
55
|
+
agent-browser get url
|
|
56
|
+
agent-browser snapshot -i
|
|
57
|
+
|
|
58
|
+
# Take screenshot of result
|
|
59
|
+
agent-browser screenshot /tmp/form-result.png
|
|
60
|
+
|
|
61
|
+
# Cleanup
|
|
62
|
+
agent-browser close
|
|
63
|
+
|
|
64
|
+
echo "Form automation complete"
|
package/dist/browser.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"browser.test.d.ts","sourceRoot":"","sources":["../src/browser.test.ts"],"names":[],"mappings":""}
|
package/dist/browser.test.js
DELETED
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
2
|
-
import { BrowserManager } from './browser.js';
|
|
3
|
-
describe('BrowserManager', () => {
|
|
4
|
-
let browser;
|
|
5
|
-
beforeAll(async () => {
|
|
6
|
-
browser = new BrowserManager();
|
|
7
|
-
await browser.launch({ headless: true });
|
|
8
|
-
});
|
|
9
|
-
afterAll(async () => {
|
|
10
|
-
await browser.close();
|
|
11
|
-
});
|
|
12
|
-
describe('launch and close', () => {
|
|
13
|
-
it('should report as launched', () => {
|
|
14
|
-
expect(browser.isLaunched()).toBe(true);
|
|
15
|
-
});
|
|
16
|
-
it('should have a page', () => {
|
|
17
|
-
const page = browser.getPage();
|
|
18
|
-
expect(page).toBeDefined();
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
describe('navigation', () => {
|
|
22
|
-
it('should navigate to URL', async () => {
|
|
23
|
-
const page = browser.getPage();
|
|
24
|
-
await page.goto('https://example.com');
|
|
25
|
-
expect(page.url()).toBe('https://example.com/');
|
|
26
|
-
});
|
|
27
|
-
it('should get page title', async () => {
|
|
28
|
-
const page = browser.getPage();
|
|
29
|
-
const title = await page.title();
|
|
30
|
-
expect(title).toBe('Example Domain');
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
describe('element interaction', () => {
|
|
34
|
-
it('should find element by selector', async () => {
|
|
35
|
-
const page = browser.getPage();
|
|
36
|
-
const heading = await page.locator('h1').textContent();
|
|
37
|
-
expect(heading).toBe('Example Domain');
|
|
38
|
-
});
|
|
39
|
-
it('should check element visibility', async () => {
|
|
40
|
-
const page = browser.getPage();
|
|
41
|
-
const isVisible = await page.locator('h1').isVisible();
|
|
42
|
-
expect(isVisible).toBe(true);
|
|
43
|
-
});
|
|
44
|
-
it('should count elements', async () => {
|
|
45
|
-
const page = browser.getPage();
|
|
46
|
-
const count = await page.locator('p').count();
|
|
47
|
-
expect(count).toBeGreaterThan(0);
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
describe('screenshots', () => {
|
|
51
|
-
it('should take screenshot as buffer', async () => {
|
|
52
|
-
const page = browser.getPage();
|
|
53
|
-
const buffer = await page.screenshot();
|
|
54
|
-
expect(buffer).toBeInstanceOf(Buffer);
|
|
55
|
-
expect(buffer.length).toBeGreaterThan(0);
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
describe('evaluate', () => {
|
|
59
|
-
it('should evaluate JavaScript', async () => {
|
|
60
|
-
const page = browser.getPage();
|
|
61
|
-
const result = await page.evaluate(() => document.title);
|
|
62
|
-
expect(result).toBe('Example Domain');
|
|
63
|
-
});
|
|
64
|
-
it('should evaluate with arguments', async () => {
|
|
65
|
-
const page = browser.getPage();
|
|
66
|
-
const result = await page.evaluate((x) => x * 2, 5);
|
|
67
|
-
expect(result).toBe(10);
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
describe('tabs', () => {
|
|
71
|
-
it('should create new tab', async () => {
|
|
72
|
-
const result = await browser.newTab();
|
|
73
|
-
expect(result.index).toBe(1);
|
|
74
|
-
expect(result.total).toBe(2);
|
|
75
|
-
});
|
|
76
|
-
it('should list tabs', async () => {
|
|
77
|
-
const tabs = await browser.listTabs();
|
|
78
|
-
expect(tabs.length).toBe(2);
|
|
79
|
-
});
|
|
80
|
-
it('should close tab', async () => {
|
|
81
|
-
// Switch to second tab and close it
|
|
82
|
-
const page = browser.getPage();
|
|
83
|
-
const tabs = await browser.listTabs();
|
|
84
|
-
if (tabs.length > 1) {
|
|
85
|
-
const result = await browser.closeTab(1);
|
|
86
|
-
expect(result.remaining).toBe(1);
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
describe('context operations', () => {
|
|
91
|
-
it('should get cookies from context', async () => {
|
|
92
|
-
const page = browser.getPage();
|
|
93
|
-
const cookies = await page.context().cookies();
|
|
94
|
-
expect(Array.isArray(cookies)).toBe(true);
|
|
95
|
-
});
|
|
96
|
-
it('should set and get cookies', async () => {
|
|
97
|
-
const page = browser.getPage();
|
|
98
|
-
const context = page.context();
|
|
99
|
-
await context.addCookies([{ name: 'test', value: 'value', url: 'https://example.com' }]);
|
|
100
|
-
const cookies = await context.cookies();
|
|
101
|
-
const testCookie = cookies.find((c) => c.name === 'test');
|
|
102
|
-
expect(testCookie?.value).toBe('value');
|
|
103
|
-
});
|
|
104
|
-
it('should clear cookies', async () => {
|
|
105
|
-
const page = browser.getPage();
|
|
106
|
-
const context = page.context();
|
|
107
|
-
await context.clearCookies();
|
|
108
|
-
const cookies = await context.cookies();
|
|
109
|
-
expect(cookies.length).toBe(0);
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
describe('storage via evaluate', () => {
|
|
113
|
-
it('should set and get localStorage', async () => {
|
|
114
|
-
const page = browser.getPage();
|
|
115
|
-
await page.evaluate(() => localStorage.setItem('testKey', 'testValue'));
|
|
116
|
-
const value = await page.evaluate(() => localStorage.getItem('testKey'));
|
|
117
|
-
expect(value).toBe('testValue');
|
|
118
|
-
});
|
|
119
|
-
it('should clear localStorage', async () => {
|
|
120
|
-
const page = browser.getPage();
|
|
121
|
-
await page.evaluate(() => localStorage.clear());
|
|
122
|
-
const value = await page.evaluate(() => localStorage.getItem('testKey'));
|
|
123
|
-
expect(value).toBeNull();
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
describe('viewport', () => {
|
|
127
|
-
it('should set viewport', async () => {
|
|
128
|
-
await browser.setViewport(1920, 1080);
|
|
129
|
-
const page = browser.getPage();
|
|
130
|
-
const size = page.viewportSize();
|
|
131
|
-
expect(size?.width).toBe(1920);
|
|
132
|
-
expect(size?.height).toBe(1080);
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
//# sourceMappingURL=browser.test.js.map
|
package/dist/browser.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"browser.test.js","sourceRoot":"","sources":["../src/browser.test.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.test.d.ts","sourceRoot":"","sources":["../src/protocol.test.ts"],"names":[],"mappings":""}
|
package/dist/protocol.test.js
DELETED
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { parseCommand } from './protocol.js';
|
|
3
|
-
// Helper to create command JSON string
|
|
4
|
-
const cmd = (obj) => JSON.stringify(obj);
|
|
5
|
-
describe('parseCommand', () => {
|
|
6
|
-
describe('navigation', () => {
|
|
7
|
-
it('should parse navigate command', () => {
|
|
8
|
-
const result = parseCommand(cmd({ id: '1', action: 'navigate', url: 'https://example.com' }));
|
|
9
|
-
expect(result.success).toBe(true);
|
|
10
|
-
if (result.success) {
|
|
11
|
-
expect(result.command.action).toBe('navigate');
|
|
12
|
-
expect(result.command.url).toBe('https://example.com');
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
it('should reject navigate without url', () => {
|
|
16
|
-
const result = parseCommand(cmd({ id: '1', action: 'navigate' }));
|
|
17
|
-
expect(result.success).toBe(false);
|
|
18
|
-
});
|
|
19
|
-
});
|
|
20
|
-
describe('click', () => {
|
|
21
|
-
it('should parse click command', () => {
|
|
22
|
-
const result = parseCommand(cmd({ id: '1', action: 'click', selector: '#btn' }));
|
|
23
|
-
expect(result.success).toBe(true);
|
|
24
|
-
if (result.success) {
|
|
25
|
-
expect(result.command.action).toBe('click');
|
|
26
|
-
expect(result.command.selector).toBe('#btn');
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
it('should reject click without selector', () => {
|
|
30
|
-
const result = parseCommand(cmd({ id: '1', action: 'click' }));
|
|
31
|
-
expect(result.success).toBe(false);
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
describe('type', () => {
|
|
35
|
-
it('should parse type command', () => {
|
|
36
|
-
const result = parseCommand(cmd({ id: '1', action: 'type', selector: '#input', text: 'hello' }));
|
|
37
|
-
expect(result.success).toBe(true);
|
|
38
|
-
if (result.success) {
|
|
39
|
-
expect(result.command.action).toBe('type');
|
|
40
|
-
expect(result.command.selector).toBe('#input');
|
|
41
|
-
expect(result.command.text).toBe('hello');
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
describe('fill', () => {
|
|
46
|
-
it('should parse fill command', () => {
|
|
47
|
-
const result = parseCommand(cmd({ id: '1', action: 'fill', selector: '#input', value: 'hello' }));
|
|
48
|
-
expect(result.success).toBe(true);
|
|
49
|
-
if (result.success) {
|
|
50
|
-
expect(result.command.action).toBe('fill');
|
|
51
|
-
expect(result.command.value).toBe('hello');
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
describe('wait', () => {
|
|
56
|
-
it('should parse wait with selector', () => {
|
|
57
|
-
const result = parseCommand(cmd({ id: '1', action: 'wait', selector: '#loading' }));
|
|
58
|
-
expect(result.success).toBe(true);
|
|
59
|
-
});
|
|
60
|
-
it('should parse wait with timeout', () => {
|
|
61
|
-
const result = parseCommand(cmd({ id: '1', action: 'wait', timeout: 5000 }));
|
|
62
|
-
expect(result.success).toBe(true);
|
|
63
|
-
});
|
|
64
|
-
it('should parse wait with text', () => {
|
|
65
|
-
const result = parseCommand(cmd({ id: '1', action: 'wait', text: 'Welcome' }));
|
|
66
|
-
expect(result.success).toBe(true);
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
describe('screenshot', () => {
|
|
70
|
-
it('should parse screenshot command', () => {
|
|
71
|
-
const result = parseCommand(cmd({ id: '1', action: 'screenshot', path: 'test.png' }));
|
|
72
|
-
expect(result.success).toBe(true);
|
|
73
|
-
});
|
|
74
|
-
it('should parse screenshot with fullPage', () => {
|
|
75
|
-
const result = parseCommand(cmd({ id: '1', action: 'screenshot', fullPage: true }));
|
|
76
|
-
expect(result.success).toBe(true);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
describe('cookies', () => {
|
|
80
|
-
it('should parse cookies_get', () => {
|
|
81
|
-
const result = parseCommand(cmd({ id: '1', action: 'cookies_get' }));
|
|
82
|
-
expect(result.success).toBe(true);
|
|
83
|
-
});
|
|
84
|
-
it('should parse cookies_set', () => {
|
|
85
|
-
const result = parseCommand(cmd({
|
|
86
|
-
id: '1',
|
|
87
|
-
action: 'cookies_set',
|
|
88
|
-
cookies: [{ name: 'session', value: 'abc123' }],
|
|
89
|
-
}));
|
|
90
|
-
expect(result.success).toBe(true);
|
|
91
|
-
});
|
|
92
|
-
it('should parse cookies_clear', () => {
|
|
93
|
-
const result = parseCommand(cmd({ id: '1', action: 'cookies_clear' }));
|
|
94
|
-
expect(result.success).toBe(true);
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
describe('storage', () => {
|
|
98
|
-
it('should parse storage_get', () => {
|
|
99
|
-
const result = parseCommand(cmd({ id: '1', action: 'storage_get', type: 'local' }));
|
|
100
|
-
expect(result.success).toBe(true);
|
|
101
|
-
});
|
|
102
|
-
it('should parse storage_set', () => {
|
|
103
|
-
const result = parseCommand(cmd({
|
|
104
|
-
id: '1',
|
|
105
|
-
action: 'storage_set',
|
|
106
|
-
type: 'local',
|
|
107
|
-
key: 'test',
|
|
108
|
-
value: 'value',
|
|
109
|
-
}));
|
|
110
|
-
expect(result.success).toBe(true);
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
describe('semantic locators', () => {
|
|
114
|
-
it('should parse getbyrole', () => {
|
|
115
|
-
const result = parseCommand(cmd({
|
|
116
|
-
id: '1',
|
|
117
|
-
action: 'getbyrole',
|
|
118
|
-
role: 'button',
|
|
119
|
-
subaction: 'click',
|
|
120
|
-
}));
|
|
121
|
-
expect(result.success).toBe(true);
|
|
122
|
-
});
|
|
123
|
-
it('should parse getbytext', () => {
|
|
124
|
-
const result = parseCommand(cmd({
|
|
125
|
-
id: '1',
|
|
126
|
-
action: 'getbytext',
|
|
127
|
-
text: 'Submit',
|
|
128
|
-
subaction: 'click',
|
|
129
|
-
}));
|
|
130
|
-
expect(result.success).toBe(true);
|
|
131
|
-
});
|
|
132
|
-
it('should parse getbylabel', () => {
|
|
133
|
-
const result = parseCommand(cmd({
|
|
134
|
-
id: '1',
|
|
135
|
-
action: 'getbylabel',
|
|
136
|
-
label: 'Email',
|
|
137
|
-
subaction: 'fill',
|
|
138
|
-
value: 'test@test.com',
|
|
139
|
-
}));
|
|
140
|
-
expect(result.success).toBe(true);
|
|
141
|
-
});
|
|
142
|
-
});
|
|
143
|
-
describe('tabs', () => {
|
|
144
|
-
it('should parse tab_new', () => {
|
|
145
|
-
const result = parseCommand(cmd({ id: '1', action: 'tab_new' }));
|
|
146
|
-
expect(result.success).toBe(true);
|
|
147
|
-
});
|
|
148
|
-
it('should parse tab_list', () => {
|
|
149
|
-
const result = parseCommand(cmd({ id: '1', action: 'tab_list' }));
|
|
150
|
-
expect(result.success).toBe(true);
|
|
151
|
-
});
|
|
152
|
-
it('should parse tab_switch', () => {
|
|
153
|
-
const result = parseCommand(cmd({ id: '1', action: 'tab_switch', index: 0 }));
|
|
154
|
-
expect(result.success).toBe(true);
|
|
155
|
-
});
|
|
156
|
-
it('should parse tab_close', () => {
|
|
157
|
-
const result = parseCommand(cmd({ id: '1', action: 'tab_close' }));
|
|
158
|
-
expect(result.success).toBe(true);
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
describe('invalid commands', () => {
|
|
162
|
-
it('should reject unknown action', () => {
|
|
163
|
-
const result = parseCommand(cmd({ id: '1', action: 'unknown' }));
|
|
164
|
-
expect(result.success).toBe(false);
|
|
165
|
-
});
|
|
166
|
-
it('should reject missing id', () => {
|
|
167
|
-
const result = parseCommand(cmd({ action: 'click', selector: '#btn' }));
|
|
168
|
-
expect(result.success).toBe(false);
|
|
169
|
-
});
|
|
170
|
-
it('should reject invalid JSON', () => {
|
|
171
|
-
const result = parseCommand('not json');
|
|
172
|
-
expect(result.success).toBe(false);
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
//# sourceMappingURL=protocol.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../src/protocol.test.ts"],"names":[],"mappings":"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"}
|