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.
@@ -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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"}