playwriter 0.0.7 → 0.0.11

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/src/prompt.md CHANGED
@@ -4,6 +4,10 @@ if you get an error Extension not running tell user to install and enable the pl
4
4
 
5
5
  execute tool let you run playwright js code snippets to control user Chrome window, these js code snippets are preferred to be in a single line to make them more readable in agent interface. separating statements with semicolons
6
6
 
7
+ you can extract data from your script using `console.log`. But remember that console.log in `page.evaluate` callbacks are run in the browser, so you will not see them. Instead log the evaluate result
8
+
9
+ to keep some variables between calls, you can use `state` global object. constants and variables are reset between runs. Instead use code like `state.newPage = await browser.newPage();` to reuse the created page in later calls
10
+
7
11
  you MUST use multiple execute tool calls for running complex logic. this ensures
8
12
  - you have clear understanding of intermediate state between interactions
9
13
  - you can split finding an element from interacting with it. making it simpler to understand what is the issue when an action is not successful
@@ -13,17 +17,53 @@ it will control an existing user Chrome window. The js code will be run in a sa
13
17
  - state: an object shared between runs that you can mutate to persist functions and objects. for example `state.requests = []` to monitor network requests between runs
14
18
  - context: the playwright browser context. you can do things like `await context.pages()` to see user connected pages
15
19
  - page, the first page the user opened and made it accessible to this MCP. do things like `page.url()` to see current url. assume the user wants you to use this page for your playwright code
20
+ - require: node's require function to load modules
21
+ - all standard Node.js globals: setTimeout, setInterval, clearTimeout, clearInterval, URL, URLSearchParams, fetch, Buffer, TextEncoder, TextDecoder, crypto, AbortController, AbortSignal, structuredClone
16
22
 
17
23
  the chrome window can have more than one page. you can see other pages with `context.pages().find((p) => p.url().includes('localhost'))`. you can also open and close pages: `state.newPage = await context.newPage()`. store the page in state so that you can reuse it later
18
24
 
19
25
  you can control the browser in collaboration with the user. the user can help you get unstuck from captchas or difficult to find elements or reproducing a bug
20
26
 
27
+ ## capabilities
28
+
29
+ examples of things playwriter MCP can do:
30
+ - monitor logs for a page while the user reproduces a but to let you understand what is causing a bug
31
+ - monitor logs while also controlling the page, then read collected logs and debug an issue
32
+ - monitor xhr network requests while scrolling an infinite scroll page to extract data from a website
33
+ - get accessibility snapshot to see clickable elements on the page, then click or interact with them to automate a task like ordering pizza
34
+
35
+ ## finding the page to execute code in
36
+
37
+ if you plan to control a specific page for an url you can store it in `state` so you can reuse it later on:
38
+
39
+ ```js
40
+ const pages = context.pages().filter(x => x.url().includes('localhost'));
41
+ if (pages.length === 0) throw new Error('No page with URL matching localhost found');
42
+ if (pages.length > 1) throw new Error('Multiple pages with URL matching localhost found');
43
+ state.localhostPage = pages[0];
44
+ // do things with the page
45
+ await state.localhostPage.bringToFront();
46
+ ```
47
+
48
+ IMPORTANT! never call bringToFront unless specifically asked by the user. It is very bothering to the user otherwise! you don't need to call bringToFront before being able to interact. you can very well interact without calling it first. on any page in the background you have access to.
49
+
21
50
  ## rules
22
51
 
23
52
  - only call `page.close()` if the user asks you so or if you previously created this page yourself with `newPage`. do not close user created pages unless asked
24
53
  - try to never sleep or run `page.waitForTimeout` unless you have to. there are better ways to wait for an element
25
54
  - never close browser or context. NEVER call `browser.close()`
26
55
 
56
+ ## always check the current page state after an action
57
+
58
+ after you click a button or submit a form you ALWAYS have to then check what is the current state of the page. you cannot assume what happened after doing an action. instead run the following code to know what happened after the action:
59
+
60
+ `console.log('url:', page.url()); console.log(await accessibilitySnapshot({ page }).then(x => x.slice(0, 1000)));`
61
+
62
+ if nothing happened you may need to wait before the action completes, using something like `page.waitForNavigation({timeout: 3000})` or `await page.waitForLoadState('networkidle', {timeout: 3000})`
63
+
64
+ if nothing happens it could also means that you clicked the wrong button or link. try to search for other appropriate elements to click or submit
65
+
66
+
27
67
  ## event listeners
28
68
 
29
69
  always detach event listener you create at the end of a message using `page.removeAllListeners()` or similar so that you never leak them in future messages
@@ -32,8 +72,15 @@ always detach event listener you create at the end of a message using `page.remo
32
72
 
33
73
  you have access to some functions in addition to playwright methods:
34
74
 
35
- - `async accessibilitySnapshot(page)`: gets a human readable snapshot of clickable elements on the page. useful to see the overall structure of the page and what elements you can interact with
36
- - `async resetPlaywright()`: recreates the CDP connection and resets the browser/page/context. Use this when the MCP stops responding, you get connection errors, assertion failures, or timeout issues. After calling this, the page and context variables are automatically updated in the execution environment. IMPORTANT: this completely resets the execution context, removing any custom properties you may have added to the global scope AND clearing all keys from the `state` object. Only `page`, `context`, `state` (empty), `console`, and utility functions will remain
75
+ - `async accessibilitySnapshot({ page, search, contextLines, showDiffSinceLastCall })`: gets a human readable snapshot of clickable elements on the page. useful to see the overall structure of the page and what elements you can interact with.
76
+ - `page`: the page object to snapshot
77
+ - `search`: (optional) a string or regex to filter the snapshot. If provided, returns the first 10 matches with surrounding context
78
+ - `contextLines`: (optional) number of lines of context to show around each match (default: 10)
79
+ - `showDiffSinceLastCall`: (optional) if true, returns a unified diff patch showing only changes since the last snapshot call for this page. Disables search when enabled. Useful to see what changed after an action.
80
+ - `getLatestLogs({ page, count, search })`: retrieves browser console logs. The system automatically captures and stores up to 5000 logs per page. Logs are cleared when a page reloads or navigates.
81
+ - `page`: (optional) filter logs by a specific page instance. Only returns logs from that page
82
+ - `count`: (optional) limit number of logs to return. If not specified, returns all available logs
83
+ - `search`: (optional) string or regex to filter logs. Only returns logs that match
37
84
 
38
85
  To bring a tab to front and focus it, use the standard Playwright method `await page.bringToFront()`
39
86
 
@@ -57,7 +104,37 @@ example:
57
104
 
58
105
  Then you can use `page.locator(`aria-ref=${ref}`)` to get an element with a specific `ref` and interact with it.
59
106
 
60
- `const componentsLink = page.locator('aria-ref=e14').click()`
107
+ `const componentsLink = page.locator('aria-ref=e14').click()`
108
+
109
+ IMPORTANT: notice that we do not add any quotes in `aria-ref`! it MUST be called without quotes
110
+
111
+ ## getting selector for a locator identified by snapshot aria-ref
112
+
113
+ in some cases you want to get a selector for a locator you just identified using `const element = page.locator('aria-ref=${ref}')`. To do so you can use `await getLocatorStringForElement(element)`. This is useful if you need to find other elements of the same type in a list for example. If you know the selector you can usually change a bit the selector to find the other elements of the same type in the list or table
114
+
115
+ ```js
116
+ const loc = page.locator('aria-ref=123');
117
+ console.log(await getLocatorStringForElement(loc));
118
+ // => "getByRole('button', { name: 'Save' })" or similar
119
+ ```
120
+
121
+ ## finding specific elements with snapshot
122
+
123
+ You can use `search` to find specific elements in the snapshot without reading the whole page structure. This is useful for finding forms, textareas, or specific text.
124
+
125
+ Example: find a textarea or form using case-insensitive regex:
126
+
127
+ ```js
128
+ const snapshot = await accessibilitySnapshot({ page, search: /textarea|form/i })
129
+ console.log(snapshot)
130
+ ```
131
+
132
+ Example: find elements containing "Login":
133
+
134
+ ```js
135
+ const snapshot = await accessibilitySnapshot({ page, search: "Login" })
136
+ console.log(snapshot)
137
+ ```
61
138
 
62
139
  ## getting outputs of code execution
63
140
 
@@ -98,3 +175,44 @@ later, you can read logs that you care about. For example, to get the last 100 l
98
175
  `console.log('errors:'); state.logs.filter(log => log.type === 'error').slice(-100).forEach(x => console.log(x))`
99
176
 
100
177
  then to reset logs: `state.logs = []` and to stop listening: `page.removeAllListeners('console')`
178
+
179
+ ## using getLatestLogs to read browser console logs
180
+
181
+ The system automatically captures and stores up to 5000 browser console logs per page. Logs are automatically cleared when a page reloads or navigates to a new URL. You can retrieve logs using the `getLatestLogs` function:
182
+
183
+ ```js
184
+ // Get all browser console logs from all pages (up to 5000 per page)
185
+ const allLogs = await getLatestLogs()
186
+ console.log(allLogs)
187
+
188
+ // Get last 50 browser error logs
189
+ const errorLogs = await getLatestLogs({ count: 50, search: /\[error\]/ })
190
+ console.log(errorLogs)
191
+
192
+ // Get all browser logs from the current page only
193
+ const pageLogs = await getLatestLogs({ page })
194
+ console.log(pageLogs)
195
+
196
+ // Find browser logs containing specific text
197
+ const authLogs = await getLatestLogs({ search: 'authentication failed' })
198
+ console.log(authLogs)
199
+
200
+ // Example output format:
201
+ // [log] User clicked login button
202
+ // [error] Failed to fetch /api/auth
203
+ // [warn] Session expiring soon
204
+ ```
205
+
206
+ ## loading file content into inputs
207
+
208
+ you can use the `require` function to read files and fill inputs with their content:
209
+
210
+ ```js
211
+ const fs = require('node:fs'); const content = fs.readFileSync('/path/to/file.txt', 'utf-8'); await page.locator('textarea').fill(content)
212
+ ```
213
+
214
+ for example, to fill a textarea with the content of a markdown file:
215
+
216
+ ```js
217
+ const fs = require('node:fs'); const readme = fs.readFileSync('./README.md', 'utf-8'); await page.locator('#description').fill(readme); console.log('Filled textarea with README content')
218
+ ```
@@ -1,318 +1,105 @@
1
1
  Return value:
2
2
  - table [ref=e3]:
3
3
  - rowgroup [ref=e4]:
4
- - row "Hacker Newsnew | threads | past | comments | ask | show | jobs | submit xmorse (70) | logout" [ref=e5]:
5
- - cell "Hacker Newsnew | threads | past | comments | ask | show | jobs | submit xmorse (70) | logout" [ref=e6]:
4
+ - row "Hacker Newsnew | past | comments | ask | show | jobs | submit login" [ref=e5]:
5
+ - cell "Hacker Newsnew | past | comments | ask | show | jobs | submit login" [ref=e6]:
6
6
  - table [ref=e7]:
7
7
  - rowgroup [ref=e8]:
8
- - row "Hacker Newsnew | threads | past | comments | ask | show | jobs | submit xmorse (70) | logout" [ref=e9]:
8
+ - row "Hacker Newsnew | past | comments | ask | show | jobs | submit login" [ref=e9]:
9
9
  - cell [ref=e10]:
10
10
  - link [ref=e11] [cursor=pointer]:
11
11
  - /url: https://news.ycombinator.com
12
12
  - img [ref=e12]
13
- - cell "Hacker Newsnew | threads | past | comments | ask | show | jobs | submit" [ref=e13]:
13
+ - cell "Hacker Newsnew | past | comments | ask | show | jobs | submit" [ref=e13]:
14
14
  - generic [ref=e14]:
15
15
  - link "Hacker News" [ref=e16] [cursor=pointer]:
16
16
  - /url: news
17
17
  - link "new" [ref=e17] [cursor=pointer]:
18
18
  - /url: newest
19
19
  - text: "|"
20
- - link "threads" [ref=e18] [cursor=pointer]:
21
- - /url: threads?id=xmorse
22
- - text: "|"
23
- - link "past" [ref=e19] [cursor=pointer]:
20
+ - link "past" [ref=e18] [cursor=pointer]:
24
21
  - /url: front
25
22
  - text: "|"
26
- - link "comments" [ref=e20] [cursor=pointer]:
23
+ - link "comments" [ref=e19] [cursor=pointer]:
27
24
  - /url: newcomments
28
25
  - text: "|"
29
- - link "ask" [ref=e21] [cursor=pointer]:
26
+ - link "ask" [ref=e20] [cursor=pointer]:
30
27
  - /url: ask
31
28
  - text: "|"
32
- - link "show" [ref=e22] [cursor=pointer]:
29
+ - link "show" [ref=e21] [cursor=pointer]:
33
30
  - /url: show
34
31
  - text: "|"
35
- - link "jobs" [ref=e23] [cursor=pointer]:
32
+ - link "jobs" [ref=e22] [cursor=pointer]:
36
33
  - /url: jobs
37
34
  - text: "|"
38
- - link "submit" [ref=e24] [cursor=pointer]:
35
+ - link "submit" [ref=e23] [cursor=pointer]:
39
36
  - /url: submit
40
- - cell "xmorse (70) | logout" [ref=e25]:
41
- - generic [ref=e26]:
42
- - link "xmorse" [ref=e27] [cursor=pointer]:
43
- - /url: user?id=xmorse
44
- - text: (70) |
45
- - link "logout" [ref=e28] [cursor=pointer]:
46
- - /url: logout?auth=227f860372905c327e92615af914e1e41ec43fff&goto=item%3Fid%3D1
47
- - row [ref=e29]
48
- - row [ref=e30]:
49
- - cell [ref=e31]:
50
- - table [ref=e32]:
51
- - rowgroup [ref=e33]:
52
- - row "upvote Y Combinator (ycombinator.com)" [ref=e34]:
53
- - cell [ref=e35]
54
- - cell "upvote" [ref=e36]:
55
- - link "upvote" [ref=e38] [cursor=pointer]:
56
- - /url: vote?id=1&how=up&auth=e52b391ec392eb381ace51126fd80e19d48c1d7b&goto=item%3Fid%3D1
57
- - generic "upvote" [ref=e39]
58
- - cell "Y Combinator (ycombinator.com)" [ref=e40]:
59
- - generic [ref=e41]:
60
- - link "Y Combinator" [ref=e42] [cursor=pointer]:
37
+ - cell "login" [ref=e24]:
38
+ - link "login" [ref=e26] [cursor=pointer]:
39
+ - /url: login?goto=item%3Fid%3D1
40
+ - row [ref=e27]
41
+ - row "upvote Y Combinator (ycombinator.com) 57 points by pg on Oct 9, 2006 | hide | past | favorite | 3 comments upvote sama on Oct 9, 2006 [–] \"the rising star of venture capital\" -unknown VC eating lunch on SHR upvote pg on Oct 9, 2006 | [–] Is there anywhere to eat on Sandhill Road? upvote dmon on Feb 25, 2007 | | [–] sure" [ref=e28]:
42
+ - cell "upvote Y Combinator (ycombinator.com) 57 points by pg on Oct 9, 2006 | hide | past | favorite | 3 comments upvote sama on Oct 9, 2006 [–] \"the rising star of venture capital\" -unknown VC eating lunch on SHR upvote pg on Oct 9, 2006 | [] Is there anywhere to eat on Sandhill Road? upvote dmon on Feb 25, 2007 | | [–] sure" [ref=e29]:
43
+ - table [ref=e30]:
44
+ - rowgroup [ref=e31]:
45
+ - row "upvote Y Combinator (ycombinator.com)" [ref=e32]:
46
+ - cell [ref=e33]
47
+ - cell "upvote" [ref=e34]:
48
+ - link "upvote" [ref=e36] [cursor=pointer]:
49
+ - /url: vote?id=1&how=up&goto=item%3Fid%3D1
50
+ - generic "upvote" [ref=e37]
51
+ - cell "Y Combinator (ycombinator.com)" [ref=e38]:
52
+ - generic [ref=e39]:
53
+ - link "Y Combinator" [ref=e40] [cursor=pointer]:
61
54
  - /url: http://ycombinator.com
62
- - generic [ref=e43]:
55
+ - generic [ref=e41]:
63
56
  - text: (
64
- - link "ycombinator.com" [ref=e44] [cursor=pointer]:
57
+ - link "ycombinator.com" [ref=e42] [cursor=pointer]:
65
58
  - /url: from?site=ycombinator.com
66
59
  - text: )
67
- - row "57 points by pg on Oct 9, 2006 | hide | past | favorite | 16 comments" [ref=e45]:
68
- - cell [ref=e46]
69
- - cell "57 points by pg on Oct 9, 2006 | hide | past | favorite | 16 comments" [ref=e47]:
70
- - generic [ref=e48]:
60
+ - row "57 points by pg on Oct 9, 2006 | hide | past | favorite | 3 comments" [ref=e43]:
61
+ - cell [ref=e44]
62
+ - cell "57 points by pg on Oct 9, 2006 | hide | past | favorite | 3 comments" [ref=e45]:
63
+ - generic [ref=e46]:
71
64
  - text: 57 points by
72
- - link "pg" [ref=e49] [cursor=pointer]:
65
+ - link "pg" [ref=e47] [cursor=pointer]:
73
66
  - /url: user?id=pg
74
- - generic "2006-10-09T18:21:51 1160418111" [ref=e50]:
75
- - link "on Oct 9, 2006" [ref=e51] [cursor=pointer]:
67
+ - generic "2006-10-09T18:21:51 1160418111" [ref=e48]:
68
+ - link "on Oct 9, 2006" [ref=e49] [cursor=pointer]:
76
69
  - /url: item?id=1
77
70
  - text: "|"
78
- - link "hide" [ref=e52] [cursor=pointer]:
79
- - /url: hide?id=1&auth=e52b391ec392eb381ace51126fd80e19d48c1d7b&goto=item%3Fid%3D1
71
+ - link "hide" [ref=e50] [cursor=pointer]:
72
+ - /url: hide?id=1&goto=item%3Fid%3D1
80
73
  - text: "|"
81
- - link "past" [ref=e53] [cursor=pointer]:
74
+ - link "past" [ref=e51] [cursor=pointer]:
82
75
  - /url: https://hn.algolia.com/?query=Y%20Combinator&type=story&dateRange=all&sort=byDate&storyText=false&prefix&page=0
83
76
  - text: "|"
84
- - link "favorite" [ref=e54] [cursor=pointer]:
85
- - /url: fave?id=1&auth=e52b391ec392eb381ace51126fd80e19d48c1d7b
77
+ - link "favorite" [ref=e52] [cursor=pointer]:
78
+ - /url: fave?id=1&auth=5328fcfde7333d68e67a8a2334e25acee5599932
86
79
  - text: "|"
87
- - link "16 comments" [ref=e55] [cursor=pointer]:
80
+ - link "3 comments" [ref=e53] [cursor=pointer]:
88
81
  - /url: item?id=1
89
- - row [ref=e56]:
90
- - cell [ref=e57]
91
- - cell [ref=e58]
92
- - table [ref=e59]:
93
- - rowgroup [ref=e60]:
94
- - row "upvote sama on Oct 9, 2006 | [–] \"the rising star of venture capital\" -unknown VC eating lunch on SHR" [ref=e61]:
95
- - cell "upvote sama on Oct 9, 2006 | [–] \"the rising star of venture capital\" -unknown VC eating lunch on SHR" [ref=e62]:
96
- - table [ref=e63]:
97
- - rowgroup [ref=e64]:
98
- - row "upvote sama on Oct 9, 2006 | [–] \"the rising star of venture capital\" -unknown VC eating lunch on SHR" [ref=e65]:
99
- - cell [ref=e66]:
82
+ - row [ref=e54]:
83
+ - cell [ref=e55]
84
+ - cell [ref=e56]
85
+ - table [ref=e57]:
86
+ - rowgroup [ref=e58]:
87
+ - row "upvote sama on Oct 9, 2006 [–] \"the rising star of venture capital\" -unknown VC eating lunch on SHR" [ref=e59]:
88
+ - cell "upvote sama on Oct 9, 2006 [–] \"the rising star of venture capital\" -unknown VC eating lunch on SHR" [ref=e60]:
89
+ - table [ref=e61]:
90
+ - rowgroup [ref=e62]:
91
+ - row "upvote sama on Oct 9, 2006 [–] \"the rising star of venture capital\" -unknown VC eating lunch on SHR" [ref=e63]:
92
+ - cell [ref=e64]:
100
93
  - img
101
- - cell "upvote" [ref=e67]:
102
- - link "upvote" [ref=e69] [cursor=pointer]:
103
- - /url: vote?id=15&how=up&auth=709295bd69cc8638fcf14a7b807bb0efabd69a2d&goto=item%3Fid%3D1#15
104
- - generic "upvote" [ref=e70]
105
- - cell "sama on Oct 9, 2006 | [–] \"the rising star of venture capital\" -unknown VC eating lunch on SHR" [ref=e71]:
106
- - generic [ref=e73]:
107
- - link "sama" [ref=e74] [cursor=pointer]:
94
+ - cell "upvote" [ref=e65]:
95
+ - link "upvote" [ref=e67] [cursor=pointer]:
96
+ - /url: vote?id=15&how=up&goto=item%3Fid%3D1
97
+ - generic "upvote" [ref=e68]
98
+ - cell "sama on Oct 9, 2006 [–] \"the rising star of venture capital\" -unknown VC eating lunch on SHR" [ref=e69]:
99
+ - generic [ref=e71]:
100
+ - link "sama" [ref=e72] [cursor=pointer]:
108
101
  - /url: user?id=sama
109
- - generic "2006-10-09T19:51:01 1160423461" [ref=e75]:
110
- - link "on Oct 9, 2006" [ref=e76] [cursor=pointer]:
111
- - /url: item?id=15
112
- - generic [ref=e77]:
113
- - text: "|"
114
- - link [ref=e78] [cursor=pointer]:
115
- - /url: "#487171"
116
- - text: next
117
- - link "[–]" [ref=e79] [cursor=pointer]:
118
- - /url: javascript:void(0)
119
- - generic [ref=e80]:
120
- - generic [ref=e81]: "\"the rising star of venture capital\" -unknown VC eating lunch on SHR"
121
- - generic:
122
- - paragraph
123
- - row "upvote pg on Oct 9, 2006 | | [–] Is there anywhere to eat on Sandhill Road?" [ref=e82]:
124
- - cell "upvote pg on Oct 9, 2006 | | [–] Is there anywhere to eat on Sandhill Road?" [ref=e83]:
125
- - table [ref=e84]:
126
- - rowgroup [ref=e85]:
127
- - row "upvote pg on Oct 9, 2006 | | [–] Is there anywhere to eat on Sandhill Road?" [ref=e86]:
128
- - cell [ref=e87]:
129
- - img [ref=e88]
130
- - cell "upvote" [ref=e89]:
131
- - link "upvote" [ref=e91] [cursor=pointer]:
132
- - /url: vote?id=17&how=up&auth=3c24b126f8f812f8c3a24a0b9143eac42ca15476&goto=item%3Fid%3D1#17
133
- - generic "upvote" [ref=e92]
134
- - cell "pg on Oct 9, 2006 | | [–] Is there anywhere to eat on Sandhill Road?" [ref=e93]:
135
- - generic [ref=e95]:
136
- - link "pg" [ref=e96] [cursor=pointer]:
137
- - /url: user?id=pg
138
- - generic "2006-10-09T19:52:45 1160423565" [ref=e97]:
139
- - link "on Oct 9, 2006" [ref=e98] [cursor=pointer]:
140
- - /url: item?id=17
141
- - generic [ref=e99]:
142
- - text: "|"
143
- - link [ref=e100] [cursor=pointer]:
144
- - /url: "#15"
145
- - text: parent
146
- - text: "|"
147
- - link [ref=e101] [cursor=pointer]:
148
- - /url: "#487171"
149
- - text: next
150
- - link "[–]" [ref=e102] [cursor=pointer]:
151
- - /url: javascript:void(0)
152
- - generic [ref=e103]:
153
- - generic [ref=e104]: Is there anywhere to eat on Sandhill Road?
154
- - generic:
155
- - paragraph
156
- - row "upvote dmon on Feb 25, 2007 | | | [–] sure" [ref=e105]:
157
- - cell "upvote dmon on Feb 25, 2007 | | | [–] sure" [ref=e106]:
158
- - table [ref=e107]:
159
- - rowgroup [ref=e108]:
160
- - row "upvote dmon on Feb 25, 2007 | | | [–] sure" [ref=e109]:
161
- - cell [ref=e110]:
162
- - img [ref=e111]
163
- - cell "upvote" [ref=e112]:
164
- - link "upvote" [ref=e114] [cursor=pointer]:
165
- - /url: vote?id=1079&how=up&auth=851f0b1e178c46300e9d2218764827726415a50d&goto=item%3Fid%3D1#1079
166
- - generic "upvote" [ref=e115]
167
- - cell "dmon on Feb 25, 2007 | | | [–] sure" [ref=e116]:
168
- - generic [ref=e118]:
169
- - link "dmon" [ref=e119] [cursor=pointer]:
170
- - /url: user?id=dmon
171
- - generic "2007-02-25T22:18:23 1172441903" [ref=e120]:
172
- - link "on Feb 25, 2007" [ref=e121] [cursor=pointer]:
173
- - /url: item?id=1079
174
- - generic [ref=e122]:
175
- - text: "|"
176
- - link [ref=e123] [cursor=pointer]:
177
- - /url: "#15"
178
- - text: root
179
- - text: "|"
180
- - link [ref=e124] [cursor=pointer]:
181
- - /url: "#17"
182
- - text: parent
183
- - text: "|"
184
- - link [ref=e125] [cursor=pointer]:
185
- - /url: "#487171"
186
- - text: next
187
- - link "[–]" [ref=e126] [cursor=pointer]:
188
- - /url: javascript:void(0)
189
- - generic [ref=e127]:
190
- - generic [ref=e128]: sure
191
- - generic:
192
- - paragraph
193
- - row "jacquesm on Feb 19, 2009 [dead] | | [–] So, just to see how hard it is to make the longest span between article and comment :) Congratulations on your second birthday YC, and thanks to Paul Graham for writing this forum. I had a really good look at the good a few days ago and I was quite impressed with how elegant the whole thing is put together. Lisp would not be my language of choice for a website like this, and yet, after seeing how concise it was I'm tempted to play around with lisp in a web environment." [ref=e129]:
194
- - cell "jacquesm on Feb 19, 2009 [dead] | | [–] So, just to see how hard it is to make the longest span between article and comment :) Congratulations on your second birthday YC, and thanks to Paul Graham for writing this forum. I had a really good look at the good a few days ago and I was quite impressed with how elegant the whole thing is put together. Lisp would not be my language of choice for a website like this, and yet, after seeing how concise it was I'm tempted to play around with lisp in a web environment." [ref=e130]:
195
- - table [ref=e131]:
196
- - rowgroup [ref=e132]:
197
- - row "jacquesm on Feb 19, 2009 [dead] | | [–] So, just to see how hard it is to make the longest span between article and comment :) Congratulations on your second birthday YC, and thanks to Paul Graham for writing this forum. I had a really good look at the good a few days ago and I was quite impressed with how elegant the whole thing is put together. Lisp would not be my language of choice for a website like this, and yet, after seeing how concise it was I'm tempted to play around with lisp in a web environment." [ref=e133]:
198
- - cell [ref=e134]:
199
- - img
200
- - cell [ref=e135]:
201
- - img [ref=e137]
202
- - cell "jacquesm on Feb 19, 2009 [dead] | | [–] So, just to see how hard it is to make the longest span between article and comment :) Congratulations on your second birthday YC, and thanks to Paul Graham for writing this forum. I had a really good look at the good a few days ago and I was quite impressed with how elegant the whole thing is put together. Lisp would not be my language of choice for a website like this, and yet, after seeing how concise it was I'm tempted to play around with lisp in a web environment." [ref=e138]:
203
- - generic [ref=e140]:
204
- - link "jacquesm" [ref=e141] [cursor=pointer]:
205
- - /url: user?id=jacquesm
206
- - generic "2009-02-19T12:21:23 1235046083" [ref=e142]:
207
- - link "on Feb 19, 2009" [ref=e143] [cursor=pointer]:
208
- - /url: item?id=487171
209
- - text: "[dead]"
210
- - generic [ref=e144]:
211
- - text: "|"
212
- - link [ref=e145] [cursor=pointer]:
213
- - /url: "#15"
214
- - text: prev
215
- - text: "|"
216
- - link [ref=e146] [cursor=pointer]:
217
- - /url: "#234509"
218
- - text: next
219
- - link "[–]" [ref=e147] [cursor=pointer]:
220
- - /url: javascript:void(0)
221
- - generic [ref=e148]:
222
- - generic [ref=e149]:
223
- - text: So, just to see how hard it is to make the longest span between article and comment :)
224
- - paragraph [ref=e150]: Congratulations on your second birthday YC, and thanks to Paul Graham for writing this forum. I had a really good look at the good a few days ago and I was quite impressed with how elegant the whole thing is put together.
225
- - paragraph [ref=e151]: Lisp would not be my language of choice for a website like this, and yet, after seeing how concise it was I'm tempted to play around with lisp in a web environment.
226
- - generic:
227
- - paragraph
228
- - row "kleevr on July 2, 2008 [dead] | | [11 more]" [ref=e152]:
229
- - cell "kleevr on July 2, 2008 [dead] | | [11 more]" [ref=e153]:
230
- - table [ref=e154]:
231
- - rowgroup [ref=e155]:
232
- - row "kleevr on July 2, 2008 [dead] | | [11 more]" [ref=e156]:
233
- - cell [ref=e157]:
234
- - img
235
- - cell "kleevr on July 2, 2008 [dead] | | [11 more]" [ref=e158]:
236
- - generic [ref=e160]:
237
- - link "kleevr" [ref=e161] [cursor=pointer]:
238
- - /url: user?id=kleevr
239
- - generic "2008-07-02T20:29:48 1215030588" [ref=e162]:
240
- - link "on July 2, 2008" [ref=e163] [cursor=pointer]:
241
- - /url: item?id=234509
242
- - text: "[dead]"
243
- - generic [ref=e164]:
244
- - text: "|"
245
- - link [ref=e165] [cursor=pointer]:
246
- - /url: "#487171"
247
- - text: prev
248
- - text: "|"
249
- - link [ref=e166] [cursor=pointer]:
250
- - /url: "#82729"
251
- - text: next
252
- - link "[11 more]" [ref=e167] [cursor=pointer]:
253
- - /url: javascript:void(0)
254
- - row "vice on Nov 22, 2007 [dead] | [–] I'm nX 1 too ;)" [ref=e168]:
255
- - cell "vice on Nov 22, 2007 [dead] | [–] I'm nX 1 too ;)" [ref=e169]:
256
- - table [ref=e170]:
257
- - rowgroup [ref=e171]:
258
- - row "vice on Nov 22, 2007 [dead] | [–] I'm nX 1 too ;)" [ref=e172]:
259
- - cell [ref=e173]:
260
- - img
261
- - cell [ref=e174]:
262
- - img [ref=e176]
263
- - cell "vice on Nov 22, 2007 [dead] | [–] I'm nX 1 too ;)" [ref=e177]:
264
- - generic [ref=e179]:
265
- - link "vice" [ref=e180] [cursor=pointer]:
266
- - /url: user?id=vice
267
- - generic "2007-11-22T12:50:54 1195735854" [ref=e181]:
268
- - link "on Nov 22, 2007" [ref=e182] [cursor=pointer]:
269
- - /url: item?id=82729
270
- - text: "[dead]"
271
- - generic [ref=e183]:
272
- - text: "|"
273
- - link [ref=e184] [cursor=pointer]:
274
- - /url: "#234509"
275
- - text: prev
276
- - link "[–]" [ref=e185] [cursor=pointer]:
277
- - /url: javascript:void(0)
278
- - generic [ref=e186]:
279
- - generic [ref=e187]:
280
- - text: I'm nX 1 too
281
- - paragraph [ref=e188]: ;)
282
- - generic:
283
- - paragraph
284
- - row "Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact Search:" [ref=e189]:
285
- - cell "Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact Search:" [ref=e190]:
286
- - img
287
- - table [ref=e191]:
288
- - rowgroup [ref=e192]:
289
- - row [ref=e193]:
290
- - cell [ref=e194]
291
- - generic [ref=e195]:
292
- - generic [ref=e196]:
293
- - link "Guidelines" [ref=e197] [cursor=pointer]:
294
- - /url: newsguidelines.html
295
- - text: "|"
296
- - link "FAQ" [ref=e198] [cursor=pointer]:
297
- - /url: newsfaq.html
298
- - text: "|"
299
- - link "Lists" [ref=e199] [cursor=pointer]:
300
- - /url: lists
301
- - text: "|"
302
- - link "API" [ref=e200] [cursor=pointer]:
303
- - /url: https://github.com/HackerNews/API
304
- - text: "|"
305
- - link "Security" [ref=e201] [cursor=pointer]:
306
- - /url: security.html
307
- - text: "|"
308
- - link "Legal" [ref=e202] [cursor=pointer]:
309
- - /url: https://www.ycombinator.com/legal/
310
- - text: "|"
311
- - link "Apply to YC" [ref=e203] [cursor=pointer]:
312
- - /url: https://www.ycombinator.com/apply/
313
- - text: "|"
314
- - link "Contact" [ref=e204] [cursor=pointer]:
315
- - /url: mailto:hn@ycombinator.com
316
- - generic [ref=e205]:
317
- - text: "Search:"
318
- - textbox [ref=e206]
102
+ - generic "2006-10-09T19:51:01 1160423461" [ref=e73]:
103
+ - link "on Oct 9, 2006" [ref=e74] [c
104
+
105
+ [Truncated to 6000 characters. Better manage your logs or paginate them to read the full logs]