playwriter 0.0.0 → 0.0.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 +60 -0
- package/bin.js +3 -0
- package/dist/browser-config.d.ts +2 -0
- package/dist/browser-config.d.ts.map +1 -0
- package/dist/browser-config.js +59 -0
- package/dist/browser-config.js.map +1 -0
- package/dist/mcp-client.d.ts +16 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +52 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/mcp.d.ts +2 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +596 -0
- package/dist/mcp.js.map +1 -0
- package/dist/mcp.test.d.ts +2 -0
- package/dist/mcp.test.d.ts.map +1 -0
- package/dist/mcp.test.js +205 -0
- package/dist/mcp.test.js.map +1 -0
- package/dist/prompt.md +539 -0
- package/package.json +23 -7
- package/src/browser-config.ts +66 -0
- package/src/mcp-client.ts +73 -0
- package/src/mcp.test.ts +240 -0
- package/src/mcp.ts +751 -0
- package/src/prompt.md +539 -0
- package/src/snapshots/hacker-news-focused-accessibility.md +202 -0
- package/src/snapshots/hacker-news-initial-accessibility.md +202 -0
- package/src/snapshots/hacker-news-tabbed-accessibility.md +202 -0
- package/src/snapshots/shadcn-ui-accessibility.md +553 -0
- package/src/index.test.ts +0 -9
- package/src/index.ts +0 -0
package/dist/mcp.test.js
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { createMCPClient } from './mcp-client.js';
|
|
2
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
3
|
+
describe('MCP Server Tests', () => {
|
|
4
|
+
let client;
|
|
5
|
+
let cleanup = null;
|
|
6
|
+
beforeAll(async () => {
|
|
7
|
+
const result = await createMCPClient();
|
|
8
|
+
client = result.client;
|
|
9
|
+
cleanup = result.cleanup;
|
|
10
|
+
});
|
|
11
|
+
afterAll(async () => {
|
|
12
|
+
if (cleanup) {
|
|
13
|
+
await cleanup();
|
|
14
|
+
cleanup = null;
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
it('should capture console logs', async () => {
|
|
18
|
+
// Connect first (open a new page)
|
|
19
|
+
const connectResult = await client.callTool({
|
|
20
|
+
name: 'new_page',
|
|
21
|
+
arguments: {},
|
|
22
|
+
});
|
|
23
|
+
expect(connectResult.content).toBeDefined();
|
|
24
|
+
expect(connectResult.content).toMatchInlineSnapshot(`
|
|
25
|
+
[
|
|
26
|
+
{
|
|
27
|
+
"text": "Created new page. URL: about:blank. Total pages: 20",
|
|
28
|
+
"type": "text",
|
|
29
|
+
},
|
|
30
|
+
]
|
|
31
|
+
`);
|
|
32
|
+
// Navigate to a page and log something
|
|
33
|
+
const result = await client.callTool({
|
|
34
|
+
name: 'execute',
|
|
35
|
+
arguments: {
|
|
36
|
+
code: `
|
|
37
|
+
await page.goto('https://news.ycombinator.com');
|
|
38
|
+
await page.evaluate(() => {
|
|
39
|
+
console.log('Test log message');
|
|
40
|
+
console.error('Test error message');
|
|
41
|
+
});
|
|
42
|
+
`,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
expect(result.content).toBeDefined();
|
|
46
|
+
expect(result.content).toMatchInlineSnapshot(`
|
|
47
|
+
[
|
|
48
|
+
{
|
|
49
|
+
"text": "Code executed successfully (no output)",
|
|
50
|
+
"type": "text",
|
|
51
|
+
},
|
|
52
|
+
]
|
|
53
|
+
`);
|
|
54
|
+
// Get console logs
|
|
55
|
+
const logsResult = (await client.callTool({
|
|
56
|
+
name: 'console_logs',
|
|
57
|
+
arguments: {
|
|
58
|
+
limit: 10,
|
|
59
|
+
},
|
|
60
|
+
}));
|
|
61
|
+
expect(logsResult.content).toBeDefined();
|
|
62
|
+
expect(logsResult.content).toMatchInlineSnapshot(`
|
|
63
|
+
[
|
|
64
|
+
{
|
|
65
|
+
"text": "[log]: Test log message :1:32
|
|
66
|
+
[error]: Test error message :2:32",
|
|
67
|
+
"type": "text",
|
|
68
|
+
},
|
|
69
|
+
]
|
|
70
|
+
`);
|
|
71
|
+
// Close the page opened
|
|
72
|
+
await client.callTool({
|
|
73
|
+
name: 'close_page',
|
|
74
|
+
arguments: {},
|
|
75
|
+
});
|
|
76
|
+
}, 30000);
|
|
77
|
+
it('should capture accessibility snapshot of hacker news', async () => {
|
|
78
|
+
// Create new page
|
|
79
|
+
await client.callTool({
|
|
80
|
+
name: 'new_page',
|
|
81
|
+
arguments: {},
|
|
82
|
+
});
|
|
83
|
+
// Navigate to a specific old Hacker News story that won't change
|
|
84
|
+
await client.callTool({
|
|
85
|
+
name: 'execute',
|
|
86
|
+
arguments: {
|
|
87
|
+
code: `await page.goto('https://news.ycombinator.com/item?id=1', { waitUntil: 'networkidle' })`,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
// Get initial accessibility snapshot
|
|
91
|
+
const initialSnapshot = await client.callTool({
|
|
92
|
+
name: 'accessibility_snapshot',
|
|
93
|
+
arguments: {},
|
|
94
|
+
});
|
|
95
|
+
expect(initialSnapshot.content).toBeDefined();
|
|
96
|
+
// Save initial snapshot
|
|
97
|
+
const initialData = typeof initialSnapshot === 'object' &&
|
|
98
|
+
initialSnapshot.content?.[0]?.text
|
|
99
|
+
? tryJsonParse(initialSnapshot.content[0].text)
|
|
100
|
+
: initialSnapshot;
|
|
101
|
+
expect(initialData).toMatchFileSnapshot('snapshots/hacker-news-initial-accessibility.md');
|
|
102
|
+
expect(initialData).toContain('table');
|
|
103
|
+
expect(initialData).toContain('Hacker News');
|
|
104
|
+
// Focus on first link on the page
|
|
105
|
+
await client.callTool({
|
|
106
|
+
name: 'execute',
|
|
107
|
+
arguments: {
|
|
108
|
+
code: `
|
|
109
|
+
// Find and focus the first link
|
|
110
|
+
const firstLink = await page.$('a')
|
|
111
|
+
if (firstLink) {
|
|
112
|
+
await firstLink.focus()
|
|
113
|
+
const linkText = await firstLink.textContent()
|
|
114
|
+
console.log('Focused on first link:', linkText)
|
|
115
|
+
}
|
|
116
|
+
`,
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
// Get snapshot after focusing
|
|
120
|
+
const focusedSnapshot = await client.callTool({
|
|
121
|
+
name: 'accessibility_snapshot',
|
|
122
|
+
arguments: {},
|
|
123
|
+
});
|
|
124
|
+
expect(focusedSnapshot.content).toBeDefined();
|
|
125
|
+
// Save focused snapshot
|
|
126
|
+
const focusedData = typeof focusedSnapshot === 'object' &&
|
|
127
|
+
focusedSnapshot.content?.[0]?.text
|
|
128
|
+
? tryJsonParse(focusedSnapshot.content[0].text)
|
|
129
|
+
: focusedSnapshot;
|
|
130
|
+
expect(focusedData).toMatchFileSnapshot('snapshots/hacker-news-focused-accessibility.md');
|
|
131
|
+
// Verify the snapshot contains expected content
|
|
132
|
+
expect(focusedData).toBeDefined();
|
|
133
|
+
expect(focusedData).toContain('link');
|
|
134
|
+
// Press Tab to go to next item
|
|
135
|
+
await client.callTool({
|
|
136
|
+
name: 'execute',
|
|
137
|
+
arguments: {
|
|
138
|
+
code: `
|
|
139
|
+
await page.keyboard.press('Tab')
|
|
140
|
+
console.log('Pressed Tab key')
|
|
141
|
+
`,
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
// Get snapshot after tab navigation
|
|
145
|
+
const tabbedSnapshot = await client.callTool({
|
|
146
|
+
name: 'accessibility_snapshot',
|
|
147
|
+
arguments: {},
|
|
148
|
+
});
|
|
149
|
+
expect(tabbedSnapshot.content).toBeDefined();
|
|
150
|
+
// Save tabbed snapshot
|
|
151
|
+
const tabbedData = typeof tabbedSnapshot === 'object' &&
|
|
152
|
+
tabbedSnapshot.content?.[0]?.text
|
|
153
|
+
? tryJsonParse(tabbedSnapshot.content[0].text)
|
|
154
|
+
: tabbedSnapshot;
|
|
155
|
+
expect(tabbedData).toMatchFileSnapshot('snapshots/hacker-news-tabbed-accessibility.md');
|
|
156
|
+
// Verify the snapshot is different
|
|
157
|
+
expect(tabbedData).toBeDefined();
|
|
158
|
+
expect(tabbedData).toContain('Hacker News');
|
|
159
|
+
// Close the page opened
|
|
160
|
+
await client.callTool({
|
|
161
|
+
name: 'close_page',
|
|
162
|
+
arguments: {},
|
|
163
|
+
});
|
|
164
|
+
}, 30000);
|
|
165
|
+
it('should capture accessibility snapshot of shadcn UI', async () => {
|
|
166
|
+
// Create new page
|
|
167
|
+
await client.callTool({
|
|
168
|
+
name: 'new_page',
|
|
169
|
+
arguments: {},
|
|
170
|
+
});
|
|
171
|
+
// Navigate to shadcn UI
|
|
172
|
+
await client.callTool({
|
|
173
|
+
name: 'execute',
|
|
174
|
+
arguments: {
|
|
175
|
+
code: `await page.goto('https://ui.shadcn.com/', { waitUntil: 'networkidle' })`,
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
// Get accessibility snapshot
|
|
179
|
+
const snapshot = await client.callTool({
|
|
180
|
+
name: 'accessibility_snapshot',
|
|
181
|
+
arguments: {},
|
|
182
|
+
});
|
|
183
|
+
expect(snapshot.content).toBeDefined();
|
|
184
|
+
// Save snapshot
|
|
185
|
+
const data = typeof snapshot === 'object' && snapshot.content?.[0]?.text
|
|
186
|
+
? tryJsonParse(snapshot.content[0].text)
|
|
187
|
+
: snapshot;
|
|
188
|
+
expect(data).toMatchFileSnapshot('snapshots/shadcn-ui-accessibility.md');
|
|
189
|
+
expect(data).toContain('shadcn');
|
|
190
|
+
// Close the page opened
|
|
191
|
+
await client.callTool({
|
|
192
|
+
name: 'close_page',
|
|
193
|
+
arguments: {},
|
|
194
|
+
});
|
|
195
|
+
}, 30000);
|
|
196
|
+
});
|
|
197
|
+
function tryJsonParse(str) {
|
|
198
|
+
try {
|
|
199
|
+
return JSON.parse(str);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return str;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=mcp.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.test.js","sourceRoot":"","sources":["../src/mcp.test.ts"],"names":[],"mappings":"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"}
|