puppeteer-ruby 0.45.6 → 0.50.0.alpha5

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.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -3
  3. data/AGENTS.md +169 -0
  4. data/CLAUDE/README.md +41 -0
  5. data/CLAUDE/architecture.md +253 -0
  6. data/CLAUDE/cdp_protocol.md +230 -0
  7. data/CLAUDE/concurrency.md +216 -0
  8. data/CLAUDE/porting_puppeteer.md +575 -0
  9. data/CLAUDE/rbs_type_checking.md +101 -0
  10. data/CLAUDE/spec_migration_plans.md +1041 -0
  11. data/CLAUDE/testing.md +278 -0
  12. data/CLAUDE.md +242 -0
  13. data/README.md +8 -0
  14. data/Rakefile +7 -0
  15. data/Steepfile +28 -0
  16. data/docs/api_coverage.md +105 -56
  17. data/lib/puppeteer/aria_query_handler.rb +3 -2
  18. data/lib/puppeteer/async_utils.rb +214 -0
  19. data/lib/puppeteer/browser.rb +98 -56
  20. data/lib/puppeteer/browser_connector.rb +18 -3
  21. data/lib/puppeteer/browser_context.rb +196 -3
  22. data/lib/puppeteer/browser_runner.rb +18 -10
  23. data/lib/puppeteer/cdp_session.rb +67 -23
  24. data/lib/puppeteer/chrome_target_manager.rb +65 -40
  25. data/lib/puppeteer/connection.rb +55 -36
  26. data/lib/puppeteer/console_message.rb +9 -1
  27. data/lib/puppeteer/console_patch.rb +47 -0
  28. data/lib/puppeteer/css_coverage.rb +5 -3
  29. data/lib/puppeteer/custom_query_handler.rb +80 -33
  30. data/lib/puppeteer/define_async_method.rb +31 -37
  31. data/lib/puppeteer/dialog.rb +47 -14
  32. data/lib/puppeteer/element_handle.rb +231 -62
  33. data/lib/puppeteer/emulation_manager.rb +1 -1
  34. data/lib/puppeteer/env.rb +1 -1
  35. data/lib/puppeteer/errors.rb +25 -2
  36. data/lib/puppeteer/event_callbackable.rb +15 -0
  37. data/lib/puppeteer/events.rb +4 -0
  38. data/lib/puppeteer/execution_context.rb +148 -3
  39. data/lib/puppeteer/file_chooser.rb +6 -0
  40. data/lib/puppeteer/frame.rb +162 -91
  41. data/lib/puppeteer/frame_manager.rb +69 -48
  42. data/lib/puppeteer/http_request.rb +114 -38
  43. data/lib/puppeteer/http_response.rb +24 -7
  44. data/lib/puppeteer/isolated_world.rb +64 -41
  45. data/lib/puppeteer/js_coverage.rb +5 -3
  46. data/lib/puppeteer/js_handle.rb +58 -16
  47. data/lib/puppeteer/keyboard.rb +30 -17
  48. data/lib/puppeteer/launcher/browser_options.rb +3 -1
  49. data/lib/puppeteer/launcher/chrome.rb +8 -5
  50. data/lib/puppeteer/launcher/launch_options.rb +7 -2
  51. data/lib/puppeteer/launcher.rb +4 -8
  52. data/lib/puppeteer/lifecycle_watcher.rb +38 -22
  53. data/lib/puppeteer/mouse.rb +273 -64
  54. data/lib/puppeteer/network_event_manager.rb +7 -0
  55. data/lib/puppeteer/network_manager.rb +393 -112
  56. data/lib/puppeteer/page/screenshot_task_queue.rb +14 -4
  57. data/lib/puppeteer/page.rb +568 -226
  58. data/lib/puppeteer/puppeteer.rb +171 -64
  59. data/lib/puppeteer/query_handler_manager.rb +112 -16
  60. data/lib/puppeteer/reactor_runner.rb +247 -0
  61. data/lib/puppeteer/remote_object.rb +127 -47
  62. data/lib/puppeteer/target.rb +74 -27
  63. data/lib/puppeteer/task_manager.rb +3 -1
  64. data/lib/puppeteer/timeout_helper.rb +6 -10
  65. data/lib/puppeteer/touch_handle.rb +39 -0
  66. data/lib/puppeteer/touch_screen.rb +72 -22
  67. data/lib/puppeteer/tracing.rb +3 -3
  68. data/lib/puppeteer/version.rb +1 -1
  69. data/lib/puppeteer/wait_task.rb +264 -101
  70. data/lib/puppeteer/web_socket.rb +2 -2
  71. data/lib/puppeteer/web_socket_transport.rb +91 -27
  72. data/lib/puppeteer/web_worker.rb +175 -0
  73. data/lib/puppeteer.rb +20 -4
  74. data/puppeteer-ruby.gemspec +15 -11
  75. data/sig/_external.rbs +8 -0
  76. data/sig/_supplementary.rbs +314 -0
  77. data/sig/puppeteer/browser.rbs +166 -0
  78. data/sig/puppeteer/cdp_session.rbs +64 -0
  79. data/sig/puppeteer/dialog.rbs +41 -0
  80. data/sig/puppeteer/element_handle.rbs +305 -0
  81. data/sig/puppeteer/execution_context.rbs +87 -0
  82. data/sig/puppeteer/frame.rbs +226 -0
  83. data/sig/puppeteer/http_request.rbs +214 -0
  84. data/sig/puppeteer/http_response.rbs +89 -0
  85. data/sig/puppeteer/js_handle.rbs +64 -0
  86. data/sig/puppeteer/keyboard.rbs +40 -0
  87. data/sig/puppeteer/mouse.rbs +113 -0
  88. data/sig/puppeteer/page.rbs +515 -0
  89. data/sig/puppeteer/puppeteer.rbs +98 -0
  90. data/sig/puppeteer/remote_object.rbs +78 -0
  91. data/sig/puppeteer/touch_handle.rbs +21 -0
  92. data/sig/puppeteer/touch_screen.rbs +35 -0
  93. data/sig/puppeteer/web_worker.rbs +83 -0
  94. metadata +116 -45
  95. data/CHANGELOG.md +0 -397
  96. data/lib/puppeteer/concurrent_ruby_utils.rb +0 -81
  97. data/lib/puppeteer/firefox_target_manager.rb +0 -157
  98. data/lib/puppeteer/launcher/firefox.rb +0 -453
@@ -0,0 +1,1041 @@
1
+ # Puppeteer Test Comparison Report
2
+
3
+ This report compares test files between [puppeteer/puppeteer](https://github.com/puppeteer/puppeteer/tree/main/test/src) (Node.js) and [puppeteer-ruby](https://github.com/YusukeIwaki/puppeteer-ruby/tree/main/spec/integration).
4
+
5
+ ---
6
+
7
+ ## Migration Rules
8
+
9
+ ### 1. Faithful Porting Principle
10
+ Tests must be **faithfully ported** from Node.js Puppeteer to Ruby RSpec:
11
+ - `describe` blocks in Node.js should correspond to `describe` or `context` blocks in Ruby
12
+ - `it` blocks should have equivalent test cases with the same test name (converted to snake_case)
13
+ - Test logic and assertions should match the original implementation
14
+ - If a test cannot be ported exactly (e.g., due to language differences), document the reason
15
+
16
+ ### 2. File Naming Convention
17
+ - **`xxx_spec.rb`**: Contains tests ported from Node.js Puppeteer
18
+ - These files should only contain faithful ports of upstream tests
19
+ - The structure should mirror the Node.js test file as closely as possible
20
+
21
+ - **`xxx_ext_spec.rb`**: Contains Ruby-only tests (extensions)
22
+ - Tests that exist only in Ruby (not in Node.js) MUST be placed here
23
+ - Ruby-specific features, additional validations, or regression tests go here
24
+ - Examples: Ruby block-style APIs, Ruby-specific error handling
25
+
26
+ ### 3. Comparison Granularity
27
+ - Compare at the `it` (test case) level, not just file level
28
+ - Each `it` block should be tracked as a separate item
29
+ - Document any tests that appear to have independent implementations rather than faithful ports
30
+
31
+ ### 4. Handling Differences
32
+ - **Language differences**: Some Node.js patterns don't translate directly to Ruby
33
+ - `async/await` → Ruby's synchronous style or Async gem
34
+ - `AbortSignal` → Not supported in Ruby (document as N/A)
35
+ - `Symbol.dispose` → Ruby's block-based resource management
36
+ - **Feature gaps**: Document features that don't exist in puppeteer-ruby yet
37
+
38
+ ### 5. Progress Tracking
39
+ - Update this document whenever migration work is done
40
+ - Mark tests as `[PORTED]`, `[MISSING IN RUBY]`, or `[RUBY ONLY]`
41
+ - Use the Phase-based tracking checklist to monitor overall progress
42
+
43
+ ---
44
+
45
+ **Legend:**
46
+ - `[MISSING IN RUBY]` - Test exists in Node.js but not ported to RSpec
47
+ - `[RUBY ONLY]` - Test exists only in Ruby (should be moved to `xxx_ext_spec.rb`)
48
+ - `[PORTED]` - Test successfully ported
49
+ - `[PARTIAL]` - Test exists but implementation differs significantly
50
+ - `[ ]` - Not started
51
+ - `[x]` - Completed
52
+
53
+ ---
54
+
55
+ ## Spec File Mapping Overview
56
+
57
+ ### Node.js → Ruby Mapping Status
58
+
59
+ | Node.js Spec | Ruby Spec | Status |
60
+ |--------------|-----------|--------|
61
+ | acceptInsecureCerts.spec.ts | - | No Ruby equivalent (feature may be in launcher_spec) |
62
+ | accessibility.spec.ts | - | **[MISSING]** Not ported |
63
+ | ariaqueryhandler.spec.ts | aria_query_handler_spec.rb | [x] Ported |
64
+ | autofill.spec.ts | - | **[MISSING]** Not ported |
65
+ | bluetooth-emulation.spec.ts | - | Low priority (specialized feature) |
66
+ | browser.spec.ts | browser_spec.rb | [x] Ported |
67
+ | browsercontext.spec.ts | browser_context_spec.rb | [x] Ported |
68
+ | browsercontext-cookies.spec.ts | browser_context_cookies_spec.rb | [x] Ported |
69
+ | click.spec.ts | click_spec.rb | [x] Ported |
70
+ | connect.spec.ts | (in launcher_spec.rb) | [x] Ported |
71
+ | cookies.spec.ts | cookies_spec.rb | [x] Ported |
72
+ | coverage.spec.ts | coverage_spec.rb | [x] Ported |
73
+ | debugInfo.spec.ts | - | Low priority (debugging feature) |
74
+ | defaultbrowsercontext.spec.ts | (in browser_context_spec.rb) | [x] Ported |
75
+ | device-request-prompt.spec.ts | - | **[MISSING]** Not ported |
76
+ | dialog.spec.ts | dialog_spec.rb | [x] Ported |
77
+ | download.spec.ts | download_spec.rb | [x] Ported |
78
+ | drag-and-drop.spec.ts | drag_and_drop_spec.rb | [x] Ported |
79
+ | elementhandle.spec.ts | element_handle_spec.rb | [x] Ported |
80
+ | emulation.spec.ts | emulation_spec.rb | [x] Ported |
81
+ | evaluation.spec.ts | evaluation_spec.rb | [x] Ported |
82
+ | fixtures.spec.ts | - | N/A (test infrastructure) |
83
+ | frame.spec.ts | frame_spec.rb | [x] Ported |
84
+ | headful.spec.ts | - | Low priority (headful-specific) |
85
+ | idle_override.spec.ts | idle_override_spec.rb | [x] Ported |
86
+ | injected.spec.ts | - | N/A (internal implementation) |
87
+ | input.spec.ts | input_spec.rb | [x] Ported |
88
+ | jshandle.spec.ts | js_handle_spec.rb | [x] Ported |
89
+ | keyboard.spec.ts | keyboard_spec.rb | [x] Ported |
90
+ | launcher.spec.ts | launcher_spec.rb | [x] Ported |
91
+ | locator.spec.ts | - | **[MISSING]** Locator API not ported |
92
+ | mouse.spec.ts | mouse_spec.rb | [x] Ported |
93
+ | navigation.spec.ts | navigation_spec.rb | [x] Ported |
94
+ | network.spec.ts | network_spec.rb | [x] Ported |
95
+ | oopif.spec.ts | oopif_spec.rb | [x] Ported |
96
+ | page.spec.ts | page_spec.rb | [x] Ported |
97
+ | proxy.spec.ts | - | **[MISSING]** Not ported |
98
+ | queryhandler.spec.ts | query_handler_spec.rb | [x] Ported |
99
+ | queryselector.spec.ts | query_selector_spec.rb | [x] Ported |
100
+ | requestinterception.spec.ts | request_interception_spec.rb | [x] Ported |
101
+ | requestinterception-experimental.spec.ts | request_interception_experimental_spec.rb | [x] Ported |
102
+ | screenshot.spec.ts | screenshot_spec.rb | [x] Ported |
103
+ | stacktrace.spec.ts | - | Low priority (debugging feature) |
104
+ | target.spec.ts | target_spec.rb | [PARTIAL] AbortSignal not supported |
105
+ | touchscreen.spec.ts | touchscreen_spec.rb | [x] Ported |
106
+ | tracing.spec.ts | tracing_spec.rb | [x] Ported |
107
+ | waittask.spec.ts | wait_task_spec.rb | [x] Ported |
108
+ | webExtension.spec.ts | - | Low priority (Chrome extension feature) |
109
+ | webgl.spec.ts | - | Low priority (WebGL-specific) |
110
+ | worker.spec.ts | worker_spec.rb | [x] Ported |
111
+
112
+ ---
113
+
114
+ ## High Priority Missing Features
115
+
116
+ ### 1. Accessibility API (`accessibility.spec.ts`)
117
+ **Priority: HIGH** - Important for web accessibility testing
118
+
119
+ Node.js tests include:
120
+ - `Accessibility > should work`
121
+ - `Accessibility > should report uninteresting nodes`
122
+ - `Accessibility > iframes` (same-origin, cross-origin)
123
+ - `Accessibility > filtering children of leaf nodes`
124
+ - `Accessibility > elementHandle()` - get ElementHandle from snapshot
125
+
126
+ **Ruby status:** Not implemented. Need to add `Page#accessibility` API.
127
+
128
+ ### 2. Locator API (`locator.spec.ts`)
129
+ **Priority: HIGH** - Modern element interaction API
130
+
131
+ Node.js tests include:
132
+ - `Locator.click` - with retries, timeouts, visibility checks
133
+ - `Locator.hover`
134
+ - `Locator.scroll`
135
+ - `Locator.fill` - for inputs, textareas, selects, contenteditable
136
+ - `Locator.race` - race multiple locators
137
+ - `Locator.prototype.map/filter/wait/clone`
138
+ - `FunctionLocator`
139
+
140
+ **Ruby status:** Not implemented. This is a significant new API addition.
141
+
142
+ ### 3. Navigation Tests (`navigation.spec.ts`)
143
+ **Priority: HIGH** - Core navigation functionality
144
+
145
+ **Ruby status:** Ported to `spec/integration/navigation_spec.rb`.
146
+
147
+ ### 4. Network Tests (`network.spec.ts`)
148
+ **Priority: HIGH** - Network inspection is core functionality
149
+
150
+ **Ruby status:** Ported to `spec/integration/network_spec.rb`.
151
+
152
+ ### 5. Target API (`target.spec.ts`)
153
+ **Priority: MEDIUM** - Target management
154
+
155
+ Missing tests:
156
+ - `Browser.waitForTarget` with abort
157
+
158
+ **Ruby status:** Ported to `spec/integration/target_spec.rb`, with AbortSignal test skipped.
159
+
160
+ ---
161
+
162
+ ## Medium Priority Missing Features
163
+
164
+ ### 6. Download API (`download.spec.ts`)
165
+ **Priority: MEDIUM** - File download handling
166
+
167
+ Node.js tests:
168
+ - `Browser.createBrowserContext > should download to configured location`
169
+ - `Browser.createBrowserContext > should not download to location`
170
+
171
+ **Ruby status:** Ported (see `spec/integration/download_spec.rb`).
172
+
173
+ ### 7. Proxy Support (`proxy.spec.ts`)
174
+ **Priority: MEDIUM** - Proxy configuration
175
+
176
+ **Ruby status:** Not implemented. Would need proxy launch options.
177
+
178
+ ### 8. Device Request Prompt (`device-request-prompt.spec.ts`)
179
+ **Priority: LOW** - Bluetooth/USB device selection
180
+
181
+ **Ruby status:** Not implemented. Specialized feature.
182
+
183
+ ---
184
+
185
+ ## Migration Progress Tracking
186
+
187
+ ### Phase 1: Core Functionality Gaps (High Priority)
188
+ - [ ] Port `accessibility.spec.ts` tests → Create `accessibility_spec.rb`
189
+ - [x] Port missing `navigation.spec.ts` tests → Create `navigation_spec.rb`
190
+ - [x] Port missing `network.spec.ts` tests → Expand `network_spec.rb`
191
+ - [x] Port missing `target.spec.ts` tests → Create `target_spec.rb` (AbortSignal pending)
192
+
193
+ ### Phase 2: New APIs (High Priority)
194
+ - [ ] Implement Locator API and port `locator.spec.ts` tests
195
+
196
+ ### Phase 3: Medium Priority
197
+ - [x] Port `download.spec.ts` tests
198
+ - [ ] Port `proxy.spec.ts` tests
199
+ - [x] Port missing `waittask.spec.ts` tests (especially `Frame.waitForFunction`)
200
+
201
+ ### Phase 4: Clean Up
202
+ - [ ] Move Ruby-only tests to `_ext_spec.rb` files
203
+ - [ ] Port remaining edge case tests from Node.js
204
+
205
+ ---
206
+
207
+ ## Detailed File-by-File Comparison
208
+
209
+ ---
210
+
211
+ ## 1. browsercontext.spec.ts vs browser_context_spec.rb
212
+
213
+ ### Ported Tests
214
+ | Node.js Test | Ruby Test | Status |
215
+ |--------------|-----------|--------|
216
+ | should have default context | should have default context | [PORTED] |
217
+ | should not be able to close default context | cannot be closed | [PORTED] |
218
+ | should create new context | should create new incognito context | [PORTED] |
219
+ | should close all belonging targets once closing context | should close all belonging targets once closing context | [PORTED] |
220
+ | window.open should use parent tab context | window.open should use parent tab context | [PORTED] |
221
+ | should fire target events | should fire target events | [PORTED] |
222
+ | should wait for a target | should wait for a target | [PORTED] |
223
+ | should timeout waiting for a non-existent target | should timeout waiting for a non-existent target | [PORTED] |
224
+ | should isolate localStorage and cookies | should isolate localStorage and cookies | [PORTED] |
225
+ | should work across sessions | should work across sessions | [PORTED] |
226
+ | should provide a context id | should provide a context id | [PORTED] |
227
+
228
+ ### Missing in Ruby
229
+ | Node.js Test | Notes |
230
+ |--------------|-------|
231
+ | BrowserContext.overridePermissions > should be prompt by default | [MISSING IN RUBY] |
232
+ | BrowserContext.overridePermissions > should deny permission when not listed | [MISSING IN RUBY] |
233
+ | BrowserContext.overridePermissions > should fail when bad permission is given | [MISSING IN RUBY] |
234
+ | BrowserContext.overridePermissions > should grant permission when listed | [MISSING IN RUBY] |
235
+ | BrowserContext.overridePermissions > should reset permissions | [MISSING IN RUBY] |
236
+ | BrowserContext.overridePermissions > should trigger permission onchange | [MISSING IN RUBY] |
237
+ | BrowserContext.overridePermissions > should isolate permissions between browser contexts | [MISSING IN RUBY] |
238
+ | BrowserContext.overridePermissions > should grant persistent-storage | [MISSING IN RUBY] |
239
+
240
+ ---
241
+
242
+ ## 2. browser.spec.ts vs browser_spec.rb
243
+
244
+ ### Ported Tests
245
+ | Node.js Test | Ruby Test | Status |
246
+ |--------------|-----------|--------|
247
+ | Browser.version > should return version | should return version | [PORTED] |
248
+ | Browser.userAgent > should include Browser engine | should include WebKit | [PORTED] |
249
+ | Browser.target > should return browser target | should return browser target | [PORTED] |
250
+ | Browser.isConnected > should set the browser connected state | should return the browser connected state | [PORTED] |
251
+
252
+ ### Missing in Ruby
253
+ | Node.js Test | Notes |
254
+ |--------------|-------|
255
+ | Browser.userAgent > should include Browser name | [MISSING IN RUBY] |
256
+ | Browser.process > should return child_process instance | [MISSING IN RUBY] |
257
+ | Browser.process > should not return child_process for remote browser | [MISSING IN RUBY] |
258
+ | Browser.process > should keep connected after the last page is closed | [MISSING IN RUBY] |
259
+ | Browser.screens > should return default screen info | [MISSING IN RUBY] |
260
+ | Browser.add\|removeScreen > should add and remove a screen | [MISSING IN RUBY] |
261
+ | Browser.get\|setWindowBounds > should get and set browser window bounds | [MISSING IN RUBY] |
262
+ | Browser.get\|setWindowBounds > should set and get browser window maximized state | [MISSING IN RUBY] |
263
+
264
+ ---
265
+
266
+ ## 3. click.spec.ts vs click_spec.rb
267
+
268
+ ### Ported Tests (All tests appear to be faithfully ported)
269
+ | Node.js Test | Ruby Test | Status |
270
+ |--------------|-----------|--------|
271
+ | should click the button | should click the button | [PORTED] |
272
+ | should click svg | should click svg | [PORTED] |
273
+ | should click the button if window.Node is removed | should click the button if window.Node is removed | [PORTED] |
274
+ | should click on a span with an inline element inside | should click on a span with an inline element inside | [PORTED] |
275
+ | should not throw UnhandledPromiseRejection when page closes | should not throw UnhandledPromiseRejection when page closes | [PORTED] |
276
+ | should click the button after navigation | should click the button after navigation | [PORTED] |
277
+ | should click with disabled javascript | should click with disabled javascript | [PORTED] |
278
+ | should scroll and click with disabled javascript | should scroll and click with disabled javascript | [PORTED] |
279
+ | should click when one of inline box children is outside of viewport | should click when one of inline box children is outside of viewport | [PORTED] |
280
+ | should select the text by triple clicking | should select the text by triple clicking | [PORTED] |
281
+ | should click offscreen buttons | should click offscreen buttons | [PORTED] |
282
+ | should click half-offscreen elements | should click half-offscreen elements | [PORTED] |
283
+ | should click wrapped links | should click wrapped links | [PORTED] |
284
+ | should click on checkbox input and toggle | should click on checkbox input and toggle | [PORTED] |
285
+ | should click on checkbox label and toggle | should click on checkbox label and toggle | [PORTED] |
286
+ | should fail to click a missing button | should fail to click a missing button | [PORTED] |
287
+ | should not hang with touch-enabled viewports | should not hang with touch-enabled viewports | [PORTED] |
288
+ | should scroll and click the button | should scroll and click the button | [PORTED] |
289
+ | should double click the button | should double click the button | [PORTED] |
290
+ | should double multiple times | should double multiple times | [PORTED] |
291
+ | should click a partially obscured button | should click a partially obscured button | [PORTED] |
292
+ | should click a rotated button | should click a rotated button | [PORTED] |
293
+ | should fire contextmenu event on right click | should fire contextmenu event on right click | [PORTED] |
294
+ | should fire aux event on middle click | should fire aux event on middle click | [PORTED] |
295
+ | should fire back click | should fire back click | [PORTED] |
296
+ | should fire forward click | should fire forward click | [PORTED] |
297
+ | should click links which cause navigation | should click links which cause navigation | [PORTED] |
298
+ | should click the button inside an iframe | should click the button inside an iframe | [PORTED] |
299
+ | should click the button with fixed position inside an iframe | should click the button with fixed position inside an iframe | [PORTED] |
300
+ | should click the button with deviceScaleFactor set | should click the button with deviceScaleFactor set | [PORTED] |
301
+
302
+ ---
303
+
304
+ ## 4. cookies.spec.ts vs cookies_spec.rb
305
+
306
+ ### Ported Tests
307
+ | Node.js Test | Ruby Test | Status |
308
+ |--------------|-----------|--------|
309
+ | Page.cookies > should return no cookies in pristine browser context | should return no cookies in pristine browser context | [PORTED] |
310
+ | Page.cookies > should get a cookie | should get a cookie | [PORTED] |
311
+ | Page.cookies > should properly report httpOnly cookie | should properly report httpOnly cookie | [PORTED] |
312
+ | Page.cookies > should properly report "Strict" sameSite cookie | should properly report "Strict" sameSite cookie | [PORTED] |
313
+ | Page.cookies > should properly report "Lax" sameSite cookie | should properly report "Lax" sameSite cookie | [PORTED] |
314
+ | Page.cookies > should get multiple cookies | should get multiple cookies | [PORTED] |
315
+ | Page.cookies > should get cookies from multiple urls | should get cookies from multiple urls | [PORTED] |
316
+ | Page.setCookie > should work | should work | [PORTED] |
317
+ | Page.setCookie > should isolate cookies in browser contexts | should isolate cookies in browser contexts | [PORTED] |
318
+ | Page.setCookie > should set multiple cookies | should set multiple cookies | [PORTED] |
319
+ | Page.setCookie > should have \|expires\| set to \|-1\| for session cookies | should have \|expires\| set to \|-1\| for session cookies | [PORTED] |
320
+ | Page.setCookie > should set cookie with reasonable defaults | should set cookie with reasonable defaults | [PORTED] |
321
+ | Page.setCookie > should set a cookie with a path | should set a cookie with a path | [PORTED] |
322
+ | Page.setCookie > should not set a cookie on a blank page | should not set a cookie on a blank page | [PORTED] |
323
+ | Page.setCookie > should not set a cookie with blank page URL | should not set a cookie with blank page URL | [PORTED] |
324
+ | Page.setCookie > should not set a cookie on a data URL page | should not set a cookie on a data URL page | [PORTED] |
325
+ | Page.setCookie > should default to setting secure cookie for HTTPS websites | should default to setting secure cookie for HTTPS websites | [PORTED] |
326
+ | Page.setCookie > should be able to set insecure cookie for HTTP website | should be able to set unsecure cookie for HTTP website | [PORTED] |
327
+ | Page.setCookie > should set a cookie on a different domain | should set a cookie on a different domain | [PORTED] |
328
+ | Page.setCookie > should set cookies from a frame | should set cookies from a frame | [PORTED] |
329
+ | Page.deleteCookie > should delete cookie | should work | [PORTED] |
330
+
331
+ ### Missing in Ruby
332
+ | Node.js Test | Notes |
333
+ |--------------|-------|
334
+ | Page.cookies > should get cookies from subdomain if the domain field allows it | [MISSING IN RUBY] |
335
+ | Page.cookies > should not get cookies from subdomain if the cookie is for top-level domain | [MISSING IN RUBY] |
336
+ | Page.cookies > should get cookies from nested path | [MISSING IN RUBY] |
337
+ | Page.cookies > should not get cookies from not nested path | [MISSING IN RUBY] |
338
+ | Page.setCookie > should set cookie with all available properties | [MISSING IN RUBY] |
339
+ | Page.setCookie > should set a cookie with a partitionKey | [MISSING IN RUBY] |
340
+ | Page.setCookie > should set secure same-site cookies from a frame | [MISSING IN RUBY] (commented out in Ruby) |
341
+ | Page.deleteCookie > should not delete cookie for different domain | [MISSING IN RUBY] |
342
+ | Page.deleteCookie > should delete cookie for specified URL | [MISSING IN RUBY] |
343
+ | Page.deleteCookie > should delete cookie for specified URL regardless of the current page | [MISSING IN RUBY] |
344
+ | Page.deleteCookie > should only delete cookie from the default partition if partitionkey is not specified | [MISSING IN RUBY] |
345
+ | Page.deleteCookie > should delete cookie with partition key if partition key is specified | [MISSING IN RUBY] |
346
+
347
+ ### Ruby Only
348
+ | Ruby Test | Notes |
349
+ |-----------|-------|
350
+ | should fail if specifying wrong cookie | [RUBY ONLY] - Ruby-specific validation |
351
+
352
+ ---
353
+
354
+ ## 5. dialog.spec.ts vs dialog_spec.rb
355
+
356
+ ### Ported Tests (Fully ported)
357
+ | Node.js Test | Ruby Test | Status |
358
+ |--------------|-----------|--------|
359
+ | should fire | should fire | [PORTED] |
360
+ | should allow accepting prompts | should allow accepting prompts | [PORTED] |
361
+ | should dismiss the prompt | should dismiss the prompt | [PORTED] |
362
+
363
+ ---
364
+
365
+ ## 6. elementhandle.spec.ts vs element_handle_spec.rb
366
+
367
+ ### Ported Tests
368
+ | Node.js Test | Ruby Test | Status |
369
+ |--------------|-----------|--------|
370
+ | ElementHandle.boundingBox > should work | should work | [PORTED] |
371
+ | ElementHandle.boundingBox > should handle nested frames | should handle nested frames | [PORTED] |
372
+ | ElementHandle.boundingBox > should return null for invisible elements | should return null for invisible elements | [PORTED] |
373
+ | ElementHandle.boundingBox > should force a layout | should force a layout | [PORTED] |
374
+ | ElementHandle.boundingBox > should work with SVG nodes | should work with SVG nodes | [PORTED] |
375
+ | ElementHandle.boxModel > should work | should work | [PORTED] |
376
+ | ElementHandle.boxModel > should return null for invisible elements | should return null for invisible elements | [PORTED] |
377
+ | ElementHandle.boxModel > should correctly compute box model with offsets | should correctly compute box model with offsets | [PORTED] |
378
+ | ElementHandle.contentFrame > should work | should work | [PORTED] |
379
+ | ElementHandle.isVisible and ElementHandle.isHidden > should work | should work | [PORTED] |
380
+ | ElementHandle.click > should work | should work | [PORTED] |
381
+ | ElementHandle.click > should return Point data | should return Point data | [PORTED] |
382
+ | ElementHandle.click > should work for Shadow DOM v1 | should work for Shadow DOM v1 | [PORTED] |
383
+ | ElementHandle.click > should not work for TextNodes | should throw for TextNodes | [PORTED] |
384
+ | ElementHandle.click > should throw for detached nodes | should throw for detached nodes | [PORTED] |
385
+ | ElementHandle.click > should throw for hidden nodes | should throw for hidden nodes | [PORTED] |
386
+ | ElementHandle.click > should throw for recursively hidden nodes | should throw for recursively hidden nodes | [PORTED] |
387
+ | ElementHandle.click > should throw for <br> elements | should throw for <br> elements | [PORTED] |
388
+ | ElementHandle.touchStart > should work | should work | [PORTED] |
389
+ | ElementHandle.touchStart > should work with the returned Touch | should work with the returned Touch | [PORTED] |
390
+ | ElementHandle.touchMove > should work | should work | [PORTED] |
391
+ | ElementHandle.touchMove > should work with a pre-existing Touch | should work with a pre-existing Touch | [PORTED] |
392
+ | ElementHandle.touchEnd > should work | should work | [PORTED] |
393
+ | ElementHandle.clickablePoint > should work | should work | [PORTED] |
394
+ | ElementHandle.clickablePoint > should not work if the click box is not visible | should not work if click box is not visible | [PORTED] |
395
+ | ElementHandle.clickablePoint > should not work if the click box is not visible due to the iframe | should not work if click box is not visible due to iframe | [PORTED] |
396
+ | ElementHandle.clickablePoint > should work for iframes | should work for iframes | [PORTED] |
397
+ | Element.waitForSelector > should wait correctly with waitForSelector on an element | should wait correctly with waitForSelector on an element | [PORTED] |
398
+ | ElementHandle.hover > should work | should work | [PORTED] |
399
+ | ElementHandle.isIntersectingViewport > should work | should work | [PORTED] |
400
+ | ElementHandle.isIntersectingViewport > should work with threshold | should work with threshold | [PORTED] |
401
+ | ElementHandle.isIntersectingViewport > should work with threshold of 1 | should work with threshold of 1 | [PORTED] |
402
+ | ElementHandle.isIntersectingViewport > should work with svg elements | should work with svg elements | [PORTED] |
403
+ | Custom queries > should register and unregister | should register and unregister | [PORTED] |
404
+ | Custom queries > should throw with invalid query names | should throw with invalid query names | [PORTED] |
405
+ | Custom queries > should work for multiple elements | should work for multiple elements | [PORTED] |
406
+ | Custom queries > should eval correctly | should eval correctly | [PORTED] |
407
+ | Custom queries > should work when both queryOne and queryAll are registered | should work when both queryOne and queryAll are registered | [PORTED] |
408
+ | ElementHandle.toElement > should work | should work | [PORTED] |
409
+ | ElementHandle.dispose > should dispose cached isolated handler | should dispose element handles | [PORTED] |
410
+ | ElementHandle.move > should work | should work | [PORTED] |
411
+
412
+ ### Missing in Ruby
413
+ | Node.js Test | Notes |
414
+ |--------------|-------|
415
+ | Custom queries > should wait correctly with waitForSelector | [MISSING IN RUBY] (commented out) |
416
+ | Custom queries > should wait correctly with waitForSelector on an element | [MISSING IN RUBY] (commented out) |
417
+ | Custom queries > should work with function shorthands | [MISSING IN RUBY] |
418
+ | ElementHandle[Symbol.dispose] > should work | [MISSING IN RUBY] |
419
+ | ElementHandle[Symbol.asyncDispose] > should work | [MISSING IN RUBY] |
420
+
421
+ ### Ruby Only
422
+ | Ruby Test | Notes |
423
+ |-----------|-------|
424
+ | #wait_for_xpath > should wait correctly with waitForXPath on an element | [RUBY ONLY] - XPath specific test |
425
+
426
+ ---
427
+
428
+ ## 7. evaluation.spec.ts vs evaluation_spec.rb
429
+
430
+ ### Ported Tests (Comprehensive porting)
431
+ Most tests are faithfully ported. Notable coverage includes:
432
+ - All basic `Page.evaluate` tests
433
+ - BigInt, NaN, Infinity, -Infinity transfer tests
434
+ - Arrays, RegEx transfer tests
435
+ - Error handling tests
436
+ - `Page.evaluateOnNewDocument` tests
437
+ - `Page.removeScriptToEvaluateOnNewDocument` tests
438
+ - `Frame.evaluate` tests
439
+
440
+ ### Missing in Ruby
441
+ | Node.js Test | Notes |
442
+ |--------------|-------|
443
+ | Page.evaluateOnNewDocument > should work with CSP | Partially implemented (test exists but CSP handling may differ) |
444
+
445
+ ---
446
+
447
+ ## 8. frame.spec.ts vs frame_spec.rb
448
+
449
+ ### Ported Tests
450
+ | Node.js Test | Ruby Test | Status |
451
+ |--------------|-----------|--------|
452
+ | Frame.evaluateHandle > should work | should work | [PORTED] |
453
+ | Frame.evaluate > should throw for detached frames | should throw for detached frames | [PORTED] |
454
+ | Frame.evaluate > allows readonly array to be an argument | allows readonly array to be an argument | [PORTED] |
455
+ | Frame.page > should retrieve the page from a frame | should retrieve the page from a frame | [PORTED] |
456
+ | Frame Management > should handle nested frames | should handle nested frames | [PORTED] |
457
+ | Frame Management > should send events when frames are manipulated dynamically | should send events when frames are manipulated dynamically | [PORTED] |
458
+ | Frame Management > should send "framenavigated" when navigating on anchor URLs | should send "framenavigated" when navigating on anchor URLs | [PORTED] |
459
+ | Frame Management > should persist mainFrame on cross-process navigation | should persist mainFrame on cross-process navigation | [PORTED] |
460
+ | Frame Management > should not send attach/detach events for main frame | should not send attach/detach events for main frame | [PORTED] |
461
+ | Frame Management > should detach child frames on navigation | should detach child frames on navigation | [PORTED] |
462
+ | Frame Management > should support framesets | should support framesets | [PORTED] |
463
+ | Frame Management > should click elements in a frameset | should click elements in a frameset | [PORTED] |
464
+ | Frame Management > should report frame from-inside shadow DOM | should report frame from-inside shadow DOM | [PORTED] |
465
+ | Frame Management > should report frame.parent() | should report frame.parent() | [PORTED] |
466
+ | Frame Management > should report different frame instance when frame re-attaches | should report different frame instance when frame re-attaches | [PORTED] |
467
+ | Frame Management > should support url fragment | should support url fragment | [PORTED] |
468
+ | Frame Management > should support lazy frames | should support lazy frames | [PORTED] |
469
+ | Frame.client > should return the client instance | should return the client instance | [PORTED] |
470
+ | Frame.prototype.frameElement > should work | should work | [PORTED] |
471
+ | Frame.prototype.frameElement > should handle shadow roots | should handle shadow roots | [PORTED] |
472
+ | Frame.prototype.frameElement > should return ElementHandle in the correct world | should return ElementHandle in the correct world | [PORTED] |
473
+
474
+ ---
475
+
476
+ ## 9. input.spec.ts vs input_spec.rb
477
+
478
+ ### Ported Tests (All major tests ported)
479
+ | Node.js Test | Ruby Test | Status |
480
+ |--------------|-----------|--------|
481
+ | ElementHandle.uploadFile > should upload the file | should upload the file | [PORTED] |
482
+ | ElementHandle.uploadFile > should read the file | should read the file | [PORTED] |
483
+ | Page.waitForFileChooser > should work when file input is attached to DOM | should work when file input is attached to DOM | [PORTED] |
484
+ | Page.waitForFileChooser > should work when file input is not attached to DOM | should work when file input is not attached to DOM | [PORTED] |
485
+ | Page.waitForFileChooser > should respect timeout | should respect timeout | [PORTED] |
486
+ | Page.waitForFileChooser > should respect default timeout when there is no custom timeout | should respect default timeout when there is no custom timeout | [PORTED] |
487
+ | Page.waitForFileChooser > should prioritize exact timeout over default timeout | should prioritize exact timeout over default timeout | [PORTED] |
488
+ | Page.waitForFileChooser > should work with no timeout | should work with no timeout | [PORTED] |
489
+ | Page.waitForFileChooser > should return the same file chooser when there are many watchdogs simultaneously | should return the same file chooser when there are many watchdogs simultaneously | [PORTED] |
490
+ | FileChooser.accept > should accept single file | should accept single file | [PORTED] |
491
+ | FileChooser.accept > should be able to read selected file | should be able to read selected file | [PORTED] |
492
+ | FileChooser.accept > should be able to reset selected files with empty file list | should be able to reset selected files with empty file list | [PORTED] |
493
+ | FileChooser.accept > should not accept multiple files for single-file input | should not accept multiple files for single-file input | [PORTED] |
494
+ | FileChooser.accept > should succeed even for non-existent files | should succeed even for non-existent files | [PORTED] |
495
+ | FileChooser.accept > should error on read of non-existent files | should error on read of non-existent files | [PORTED] |
496
+ | FileChooser.accept > should fail when accepting file chooser twice | should fail when accepting file chooser twice | [PORTED] |
497
+ | FileChooser.cancel > should cancel dialog | should cancel dialog | [PORTED] |
498
+ | FileChooser.cancel > should fail when canceling file chooser twice | should fail when canceling file chooser twice | [PORTED] |
499
+ | FileChooser.isMultiple > should work for single file pick | should work for single file pick | [PORTED] |
500
+ | FileChooser.isMultiple > should work for "multiple" | should work for "multiple" | [PORTED] |
501
+ | FileChooser.isMultiple > should work for "webkitdirectory" | should work for "webkitdirectory" | [PORTED] |
502
+
503
+ ### Missing in Ruby
504
+ | Node.js Test | Notes |
505
+ |--------------|-------|
506
+ | Page.waitForFileChooser > should be able to abort | [MISSING IN RUBY] - AbortController not supported |
507
+
508
+ ---
509
+
510
+ ## 10. jshandle.spec.ts vs js_handle_spec.rb
511
+
512
+ ### Ported Tests (Comprehensive)
513
+ All major tests are ported including:
514
+ - `Page.evaluateHandle` tests
515
+ - `JSHandle.getProperty` tests
516
+ - `JSHandle.jsonValue` tests (including dates, circular objects)
517
+ - `JSHandle.getProperties` tests
518
+ - `JSHandle.asElement` tests
519
+ - `JSHandle.toString` tests
520
+ - Symbol dispose tests
521
+ - `JSHandle.move` tests
522
+
523
+ ---
524
+
525
+ ## 11. keyboard.spec.ts vs keyboard_spec.rb
526
+
527
+ ### Ported Tests (All major tests ported)
528
+ All keyboard tests appear to be faithfully ported including:
529
+ - Type into textarea
530
+ - Arrow key movement
531
+ - Keyboard shortcuts/commands
532
+ - `ElementHandle.press`
533
+ - `sendCharacter` tests
534
+ - Modifier keys (Shift, Alt, Control)
535
+ - Multiple modifiers
536
+ - Proper codes while typing
537
+ - Repeat property
538
+ - Unicode/emoji typing
539
+ - Location specification
540
+ - Meta key tests
541
+
542
+ ---
543
+
544
+ ## 12. launcher.spec.ts vs launcher_spec.rb
545
+
546
+ ### Ported Tests
547
+ | Node.js Test | Ruby Test | Status |
548
+ |--------------|-----------|--------|
549
+ | Browser.disconnect > should reject navigation when browser closes | should reject navigation when browser closes | [PORTED] |
550
+ | Browser.disconnect > should reject waitForSelector when browser closes | should reject wait_for_selector when browser closes | [PORTED] |
551
+ | Browser.close > should terminate network waiters | should terminate network waiters | [PORTED] |
552
+ | Puppeteer.launch > should reject all promises when browser is closed | should reject all promises when browser is closed | [PORTED] |
553
+ | Puppeteer.launch > should reject if executable path is invalid | should reject if executable path is invalid | [PORTED] |
554
+ | Puppeteer.launch > userDataDir option | user_data_dir option | [PORTED] |
555
+ | Puppeteer.launch > userDataDir argument | user_data_dir argument | [PORTED] |
556
+ | Puppeteer.launch > userDataDir option should restore state | user_data_dir option should restore state | [PORTED] |
557
+ | Puppeteer.launch > userDataDir option should restore cookies | user_data_dir option should restore cookies | [PORTED] |
558
+ | Puppeteer.launch > should filter out ignored default arguments in Chrome | should filter out ignored default arguments | [PORTED] |
559
+ | Puppeteer.launch > should have default URL when launching browser | should have default URL when launching browser | [PORTED] |
560
+ | Puppeteer.launch > should have custom URL when launching browser | should have custom URL when launching browser | [PORTED] |
561
+ | Puppeteer.launch > should pass the timeout parameter to browser.waitForTarget | should pass the timeout parameter to browser.waitForTarget | [PORTED] |
562
+ | Puppeteer.launch > should set the default viewport | should set the default viewport | [PORTED] |
563
+ | Puppeteer.launch > should disable the default viewport | should disable the default viewport | [PORTED] |
564
+ | Puppeteer.launch > should set the debugging port | should set the debugging port | [PORTED] |
565
+ | Puppeteer.connect > should be able to connect multiple times to the same browser | should be able to connect multiple times to the same browser | [PORTED] |
566
+ | Puppeteer.connect > should be able to close remote browser | should be able to close remote browser | [PORTED] |
567
+ | Puppeteer.connect > should be able to reconnect to a disconnected browser | should be able to reconnect to a disconnected browser | [PORTED] |
568
+ | Puppeteer.connect > should be able to connect to the same page simultaneously | should be able to connect to the same page simultaneously | [PORTED] |
569
+ | Puppeteer.executablePath > should work | returns browser executable path | [PORTED] |
570
+ | Browser target events > should work | should work | [PORTED] |
571
+ | Browser.Events.disconnected > should be emitted when: browser gets closed, disconnected or underlying websocket gets closed | should be emitted when: browser gets closed, disconnected or underlying websocket gets closed | [PORTED] |
572
+
573
+ ### Missing in Ruby
574
+ | Node.js Test | Notes |
575
+ |--------------|-------|
576
+ | Puppeteer.launch > can launch and close the browser | [MISSING IN RUBY] |
577
+ | Puppeteer.launch > can launch multiple instances without node warnings | [MISSING IN RUBY] |
578
+ | Puppeteer.launch > should close browser with beforeunload page | [MISSING IN RUBY] |
579
+ | Puppeteer.launch > tmp profile should be cleaned up | [MISSING IN RUBY] |
580
+ | Puppeteer.launch > userDataDir option restores preferences | [MISSING IN RUBY] |
581
+ | Puppeteer.launch > userDataDir argument with non-existent dir | [MISSING IN RUBY] |
582
+ | Puppeteer.launch > should return the default arguments | [MISSING IN RUBY] |
583
+ | Puppeteer.launch > should report the correct product | [MISSING IN RUBY] |
584
+ | Puppeteer.launch > should filter out ignored default argument in Firefox | [MISSING IN RUBY] |
585
+ | Puppeteer.launch > should work with timeout = 0 | [MISSING IN RUBY] |
586
+ | Puppeteer.launch > should not allow setting debuggingPort and pipe | [MISSING IN RUBY] |
587
+ | Puppeteer.launch > throws an error if executable path is not valid with pipe=true | [MISSING IN RUBY] |
588
+ | Puppeteer.connect > should be able to connect to a browser with no page targets | [MISSING IN RUBY] |
589
+ | Puppeteer.connect > should support acceptInsecureCerts option | [MISSING IN RUBY] |
590
+ | Puppeteer.connect > should support targetFilter option in puppeteer.launch | [MISSING IN RUBY] |
591
+ | Puppeteer.connect > should support targetFilter option | [MISSING IN RUBY] |
592
+ | Puppeteer.connect > should be able to reconnect | [MISSING IN RUBY] |
593
+ | Puppeteer.executablePath > returns executablePath for channel | [MISSING IN RUBY] |
594
+ | Puppeteer.executablePath > when executable path is configured > its value is used | [MISSING IN RUBY] |
595
+
596
+ ### Ruby Only
597
+ | Ruby Test | Notes |
598
+ |-----------|-------|
599
+ | should work with no default arguments | [RUBY ONLY] |
600
+ | should take fullPage screenshots when defaultViewport is null | [RUBY ONLY] |
601
+ | should take Element screenshots when defaultViewport is null | [RUBY ONLY] |
602
+ | Puppeteer.default_args tests | [RUBY ONLY] - Ruby-specific API |
603
+ | #product | [RUBY ONLY] |
604
+
605
+ ---
606
+
607
+ ## 13. mouse.spec.ts vs mouse_spec.rb
608
+
609
+ ### Ported Tests (All major tests ported)
610
+ | Node.js Test | Ruby Test | Status |
611
+ |--------------|-----------|--------|
612
+ | should click the document | should click the document | [PORTED] |
613
+ | should resize the textarea | should resize the textarea | [PORTED] |
614
+ | should select the text with mouse | should select the text with mouse | [PORTED] |
615
+ | should trigger hover state | should trigger hover state | [PORTED] |
616
+ | should trigger hover state with removed window.Node | should trigger hover state with removed window.Node | [PORTED] |
617
+ | should set modifier keys on click | should set modifier keys on click | [PORTED] |
618
+ | should send mouse wheel events | should send mouse wheel events | [PORTED] |
619
+ | should set ctrlKey on the wheel event | should set ctrlKey on the wheel event | [PORTED] |
620
+ | should tween mouse movement | should tween mouse movement | [PORTED] |
621
+ | should work with mobile viewports and cross process navigations | should work with mobile viewports and cross process navigations | [PORTED] |
622
+ | should not throw if buttons are pressed twice | should not throw if buttons are pressed twice | [PORTED] |
623
+ | should not throw if clicking in parallel | should not throw if clicking in parallel | [PORTED] |
624
+ | should reset properly | should reset properly | [PORTED] |
625
+ | should evaluate before mouse event | should evaluate before mouse event | [PORTED] |
626
+
627
+ ---
628
+
629
+ ## 14. network.spec.ts vs network_spec.rb
630
+
631
+ ### Ported Tests
632
+ | Node.js Test | Ruby Test | Status |
633
+ |--------------|-----------|--------|
634
+ | Request.initiator > should return the initiator | shoud return the initiator | [PORTED] |
635
+ | Response.statusText > should work | should work | [PORTED] |
636
+
637
+ ### Missing in Ruby (Significant gaps)
638
+ | Node.js Test | Notes |
639
+ |--------------|-------|
640
+ | Page.Events.Request > should fire for navigation requests | [MISSING IN RUBY] |
641
+ | Page.Events.Request > should fire for iframes | [MISSING IN RUBY] |
642
+ | Page.Events.Request > should fire for fetches | [MISSING IN RUBY] |
643
+ | Request.frame > (all tests) | [MISSING IN RUBY] |
644
+ | Request.headers > (all tests) | [MISSING IN RUBY] |
645
+ | Response.headers > should work | [MISSING IN RUBY] |
646
+ | Response.fromCache > (all tests) | [MISSING IN RUBY] |
647
+ | Response.fromServiceWorker > (all tests) | [MISSING IN RUBY] |
648
+ | Request.fetchPostData > (all tests) | [MISSING IN RUBY] |
649
+ | Response.text > (all tests) | [MISSING IN RUBY] |
650
+ | Response.json > should work | [MISSING IN RUBY] |
651
+ | Response.buffer > (all tests) | [MISSING IN RUBY] |
652
+ | Response.statusText > handles missing status text | [MISSING IN RUBY] |
653
+ | Response.timing > returns timing information | [MISSING IN RUBY] |
654
+ | Network Events > (all tests) | [MISSING IN RUBY] |
655
+ | Request.isNavigationRequest > (all tests) | [MISSING IN RUBY] |
656
+ | Page.setExtraHTTPHeaders > (all tests) | [MISSING IN RUBY] |
657
+ | Page.authenticate > (all tests) | [MISSING IN RUBY] |
658
+ | raw network headers > (all tests) | [MISSING IN RUBY] |
659
+ | Page.setBypassServiceWorker > (all tests) | [MISSING IN RUBY] |
660
+ | Request.resourceType > (all tests) | [MISSING IN RUBY] |
661
+ | Response.remoteAddress > (all tests) | [MISSING IN RUBY] |
662
+
663
+ **Note:** The Ruby network_spec.rb is minimal compared to Node.js. Many network tests may exist in other spec files or require porting.
664
+
665
+ ---
666
+
667
+ ## 15. page.spec.ts vs page_spec.rb
668
+
669
+ ### Ported Tests (Extensive coverage)
670
+ Most Page tests are faithfully ported. Key areas covered:
671
+ - Page.close tests
672
+ - Page.Events.Load
673
+ - Event handler adding/removing
674
+ - Page.Events.error
675
+ - Page.Events.Popup (all variations)
676
+ - Page.setGeolocation
677
+ - Page.setOfflineMode
678
+ - Page.Events.Console (comprehensive)
679
+ - Page.Events.DOMContentLoaded
680
+ - Page.metrics
681
+ - Page.waitForRequest
682
+ - Page.waitForResponse
683
+ - Page.waitForNetworkIdle
684
+ - Page.waitForFrame
685
+ - Page.exposeFunction (comprehensive)
686
+ - Page.removeExposedFunction
687
+ - Page.Events.PageError
688
+ - Page.setUserAgent
689
+ - Page.setContent
690
+ - Page.setBypassCSP
691
+ - Page.addScriptTag
692
+ - Page.addStyleTag
693
+ - Page.url
694
+ - Page.setJavaScriptEnabled
695
+ - Page.reload
696
+ - Page.setCacheEnabled
697
+ - Page.pdf
698
+ - Page.title
699
+ - Page.select
700
+ - Page.Events.Close
701
+ - Page.browser
702
+ - Page.browserContext
703
+ - Page.client
704
+ - Page.bringToFront
705
+
706
+ ### Missing in Ruby
707
+ | Node.js Test | Notes |
708
+ |--------------|-------|
709
+ | Page.newPage > should open pages in a new window | skipped |
710
+ | Page.newPage > should open pages in a new window at the specified position | skipped |
711
+ | Page.newPage > should open pages in a new window in maximized state | skipped |
712
+ | Page.newPage > should create a background page | skipped |
713
+ | Page.waitForRequest > should be cancellable | [MISSING IN RUBY] - AbortSignal not supported |
714
+ | Page.waitForResponse > should be cancellable | [MISSING IN RUBY] - AbortSignal not supported |
715
+ | Page.waitForNetworkIdle > should be cancelable | [MISSING IN RUBY] - AbortSignal not supported |
716
+ | Page.waitForFrame > should be cancellable | [MISSING IN RUBY] - AbortSignal not supported |
717
+ | Page.exposeFunction > should await returned promise | [MISSING IN RUBY] - Ruby doesn't have async functions |
718
+ | Page.exposeFunction > should fallback to default export when passed a module object | skipped |
719
+ | Page.setUserAgent > should work with options parameter | skipped |
720
+ | Page.setUserAgent > should work with platform option | skipped |
721
+ | Page.setUserAgent > should work with platform option without userAgent | skipped |
722
+ | Page.resize > should resize the browser window to fit page content | skipped |
723
+
724
+ ---
725
+
726
+ ## 16. queryselector.spec.ts vs query_selector_spec.rb
727
+
728
+ ### Ported Tests (All major tests ported)
729
+ All querySelector tests are faithfully ported including:
730
+ - Page.$eval tests
731
+ - Page.$$eval tests
732
+ - Page.$ tests
733
+ - Page.$$ tests (including xpath)
734
+ - ElementHandle.$ tests
735
+ - ElementHandle.$eval tests
736
+ - ElementHandle.$$eval tests
737
+ - ElementHandle.$$ tests (including xpath)
738
+ - QueryAll custom handler tests
739
+
740
+ ---
741
+
742
+ ## 17. requestinterception.spec.ts vs request_interception_spec.rb
743
+
744
+ ### Ported Tests (Comprehensive coverage)
745
+ The Ruby spec has extensive request interception tests including:
746
+ - Page.setRequestInterception basics
747
+ - Request.continue
748
+ - Request.respond
749
+ - Request.abort
750
+ - Request.resourceType
751
+
752
+ ### Missing in Ruby
753
+ | Node.js Test | Notes |
754
+ |--------------|-------|
755
+ | should work with keep alive redirects | [MISSING IN RUBY] |
756
+ | should not allow mutating request headers | [MISSING IN RUBY] |
757
+ | should work with requests without networkId | [MISSING IN RUBY] |
758
+ | should work with file URLs | [MISSING IN RUBY] |
759
+ | Request.continue > should fail if the header value is invalid | [MISSING IN RUBY] |
760
+ | Request.respond > should report correct content-length header with string | [MISSING IN RUBY] |
761
+ | Request.respond > should report correct content-length header with buffer | [MISSING IN RUBY] |
762
+ | Request.respond > should report correct encoding from page when content-type is set | [MISSING IN RUBY] |
763
+
764
+ ---
765
+
766
+ ## 18. screenshot.spec.ts vs screenshot_spec.rb
767
+
768
+ ### Ported Tests
769
+ | Node.js Test | Ruby Test | Status |
770
+ |--------------|-----------|--------|
771
+ | Page.screenshot > should work | should work | [PORTED] |
772
+ | Page.screenshot > should clip rect | should clip rect | [PORTED] |
773
+ | Page.screenshot > should use scale for clip | should use scale for clip | [PORTED] |
774
+ | Page.screenshot > should run in parallel | should run in parallel | [PORTED] |
775
+ | Page.screenshot > should take fullPage screenshots | should take fullPage screenshots | [PORTED] |
776
+ | Page.screenshot > should work with webp | should work with webp | [PORTED] |
777
+ | Page.screenshot > should work in "fromSurface: false" mode | should work in "fromSurface: false" mode | [PORTED] |
778
+ | ElementHandle.screenshot > should work | should work | [PORTED] |
779
+ | ElementHandle.screenshot > should take into account padding and border | should take into account padding and border | [PORTED] |
780
+ | ElementHandle.screenshot > should capture full element when larger than viewport | should capture full element when larger than viewport | [PORTED] |
781
+ | ElementHandle.screenshot > should scroll element into view | should scroll element into view | [PORTED] |
782
+ | ElementHandle.screenshot > should work with a rotated element | should work with a rotated element | [PORTED] |
783
+ | ElementHandle.screenshot > should fail to screenshot a detached element | should fail to screenshot a detached element | [PORTED] |
784
+ | ElementHandle.screenshot > should work for an element with fractional dimensions | should work for an element with fractional dimensions | [PORTED] |
785
+ | ElementHandle.screenshot > should work for an element with an offset | should work for an element with an offset | [PORTED] |
786
+
787
+ ### Missing in Ruby
788
+ | Node.js Test | Notes |
789
+ |--------------|-------|
790
+ | Page.screenshot > should get screenshot bigger than the viewport | [MISSING IN RUBY] |
791
+ | Page.screenshot > should clip clip bigger than the viewport without "captureBeyondViewport" | [MISSING IN RUBY] |
792
+ | Page.screenshot > should take fullPage screenshots without captureBeyondViewport | [MISSING IN RUBY] |
793
+ | Page.screenshot > should run in parallel in multiple pages | [MISSING IN RUBY] (commented out) |
794
+ | Page.screenshot > should work with odd clip size on Retina displays | [MISSING IN RUBY] (commented out) |
795
+ | Page.screenshot > should return base64 | [MISSING IN RUBY] (commented out) |
796
+ | Page.screenshot > should take fullPage screenshots when defaultViewport is null | [MISSING IN RUBY] |
797
+ | Page.screenshot > should restore to original viewport size after taking fullPage screenshots when defaultViewport is null | [MISSING IN RUBY] |
798
+ | ElementHandle.screenshot > should work with a null viewport | [MISSING IN RUBY] |
799
+ | ElementHandle.screenshot > should not hang with zero width/height element | [MISSING IN RUBY] |
800
+ | ElementHandle.screenshot > should run in parallel in multiple pages | [MISSING IN RUBY] |
801
+ | ElementHandle.screenshot > should run in parallel with page.close() | [MISSING IN RUBY] |
802
+ | ElementHandle.screenshot > should use element clip | [MISSING IN RUBY] |
803
+ | Cdp > should allow transparency | [MISSING IN RUBY] (commented out) |
804
+ | Cdp > should render white background on jpeg file | [MISSING IN RUBY] (commented out) |
805
+
806
+ ### Ruby Only
807
+ | Ruby Test | Notes |
808
+ |-----------|-------|
809
+ | full_page > keep input value (with Mobile viewport) | [RUBY ONLY] - Regression test for issue #96 |
810
+ | full_page > keep input value (with 1200x1200 viewport) | [RUBY ONLY] - Regression test for issue #96 |
811
+
812
+ ---
813
+
814
+ ## 19. waittask.spec.ts vs wait_task_spec.rb
815
+
816
+ ### Ported Tests
817
+ All tests from `waittask.spec.ts` have been ported to `spec/integration/wait_task_spec.rb`, including:
818
+ - `Frame.waitForFunction` coverage (string input, polling modes, timeouts, navigation survival, cancellation)
819
+ - `Frame.waitForSelector` coverage (shadow DOM, pseudo-classes, visibility/hidden variants, xpath)
820
+ - protocol timeout behavior
821
+
822
+ ---
823
+
824
+ ## 20. worker.spec.ts vs worker_spec.rb
825
+
826
+ ### Ported Tests
827
+ | Node.js Test | Ruby Test | Status |
828
+ |--------------|-----------|--------|
829
+ | Page.workers | Page.workers | [PORTED] |
830
+ | should emit created and destroyed events | should emit created and destroyed events | [PORTED] |
831
+ | should report console logs | should report console logs | [PORTED] |
832
+ | should work with console logs | should work with console logs | [PORTED] |
833
+ | should have an execution context | should have an execution context | [PORTED] |
834
+ | should report errors | should report errors | [PORTED] |
835
+ | can be closed | can be closed | [PORTED] |
836
+ | should work with waitForNetworkIdle | should work with waitForNetworkIdle | [PORTED] |
837
+ | should retrieve body for main worker requests | should retrieve body for main worker requests | [PORTED] |
838
+
839
+ **Note:** All worker tests are faithfully ported.
840
+
841
+ ---
842
+
843
+ ---
844
+
845
+ ## 21. emulation.spec.ts vs emulation_spec.rb
846
+
847
+ ### Ported Tests (Comprehensive)
848
+ | Node.js Test | Ruby Test | Status |
849
+ |--------------|-----------|--------|
850
+ | Page.viewport > should get the proper viewport size | should get the proper viewport size | [PORTED] |
851
+ | Page.viewport > should support mobile emulation | should support mobile emulation | [PORTED] |
852
+ | Page.viewport > should support touch emulation | should support touch emulation | [PORTED] |
853
+ | Page.viewport > should be detectable by Modernizr | should be detectable by Modernizr | [PORTED] |
854
+ | Page.viewport > should detect touch when applying viewport with touches | should detect touch when applying viewport with touches | [PORTED] |
855
+ | Page.viewport > should support landscape emulation | should support landscape emulation | [PORTED] |
856
+ | Page.emulate > should work | should work | [PORTED] |
857
+ | Page.emulate > should support clicking | should support clicking | [PORTED] |
858
+ | Page.emulateMediaType > should work | should work | [PORTED] |
859
+ | Page.emulateMediaType > should throw in case of bad argument | should throw in case of bad argument | [PORTED] |
860
+ | Page.emulateMediaFeatures > should work | should work | [PORTED] |
861
+ | Page.emulateMediaFeatures > should throw in case of bad argument | should throw in case of bad argument | [PORTED] |
862
+ | Page.emulateTimezone > should work | should work | [PORTED] |
863
+ | Page.emulateTimezone > should throw for invalid timezone IDs | should throw for invalid timezone IDs | [PORTED] |
864
+ | Page.emulateVisionDeficiency > should work | should work | [PORTED] |
865
+ | Page.emulateVisionDeficiency > should throw for invalid vision deficiencies | should throw for invalid vision deficiencies | [PORTED] |
866
+ | Page.emulateNetworkConditions > should change navigator.connection.effectiveType | should change navigator.connection.effectiveType | [PORTED] |
867
+ | Page.emulateCPUThrottling > should change the CPU throttling rate successfully | should change the CPU throttling rate successfully | [PORTED] |
868
+
869
+ ### Missing in Ruby
870
+ | Node.js Test | Notes |
871
+ |--------------|-------|
872
+ | Page.viewport > should update media queries when resolution changes | [MISSING IN RUBY] |
873
+ | Page.viewport > should load correct pictures when emulation dpr | [MISSING IN RUBY] |
874
+ | Page.emulate > should work twice on about:blank | [MISSING IN RUBY] |
875
+ | Page.emulateNetworkConditions > should support offline | [MISSING IN RUBY] |
876
+ | Page.emulateFocusedPage > should emulate focus | [MISSING IN RUBY] |
877
+ | Page.emulateFocusedPage > should reset focus | [MISSING IN RUBY] |
878
+
879
+ ---
880
+
881
+ ## 22. touchscreen.spec.ts vs touchscreen_spec.rb
882
+
883
+ ### Ported Tests (Comprehensive)
884
+ All touchscreen tests are faithfully ported including:
885
+ - `Touchscreen.prototype.tap` - basic tap, tap with existing touch
886
+ - `Touchscreen.prototype.touchMove` - basic move, two touches, three touches, move separately
887
+ - `Touchscreen.prototype.touchEnd` - error handling
888
+
889
+ ---
890
+
891
+ ## 23. drag-and-drop.spec.ts vs drag_and_drop_spec.rb
892
+
893
+ ### Ported Tests (All ported)
894
+ | Node.js Test | Ruby Test | Status |
895
+ |--------------|-----------|--------|
896
+ | should emit a dragIntercepted event when dragged | should emit a dragIntercepted event when dragged | [PORTED] |
897
+ | should emit a dragEnter | should emit a dragEnter | [PORTED] |
898
+ | should emit a dragOver event | should emit a dragOver event | [PORTED] |
899
+ | can be dropped | can be dropped | [PORTED] |
900
+ | can be dragged and dropped with a single function | can be dragged and dropped with a single function | [PORTED] |
901
+
902
+ ### Ruby Only
903
+ | Ruby Test | Notes |
904
+ |-----------|-------|
905
+ | should throw an exception if not enabled before usage | [RUBY ONLY] - Additional validation test |
906
+ | can be disabled | [RUBY ONLY] - Tests disabling drag interception |
907
+
908
+ ---
909
+
910
+ ## 24. coverage.spec.ts vs coverage_spec.rb
911
+
912
+ ### Ported Tests (Comprehensive)
913
+ All JSCoverage and CSSCoverage tests are ported including:
914
+ - Basic coverage collection
915
+ - Source URL reporting
916
+ - Anonymous scripts handling
917
+ - Multiple scripts/stylesheets
918
+ - Range reporting
919
+ - Media queries
920
+ - Reset on navigation
921
+ - Raw script coverage
922
+
923
+ ### Ruby Only
924
+ | Ruby Test | Notes |
925
+ |-----------|-------|
926
+ | should work with block | [RUBY ONLY] - Ruby block-style API |
927
+
928
+ ---
929
+
930
+ ## 25. tracing.spec.ts vs tracing_spec.rb
931
+
932
+ ### Ported Tests (All ported)
933
+ All tracing tests are faithfully ported.
934
+
935
+ ---
936
+
937
+ ## 26. oopif.spec.ts vs oopif_spec.rb
938
+
939
+ ### Ported Tests (Comprehensive)
940
+ Most OOPIF tests are ported including:
941
+ - OOP iframes vs normal iframes
942
+ - Navigation within OOP iframes
943
+ - Frames within OOP frames
944
+ - Detached OOP frames
945
+ - Evaluating in OOP iframes
946
+ - clickablePoint, boundingBox, boxModel for OOPIF elements
947
+
948
+ ### Missing in Ruby
949
+ | Node.js Test | Notes |
950
+ |--------------|-------|
951
+ | should recover cross-origin frames on reconnect | [MISSING IN RUBY] |
952
+ | should detect existing OOPIFs when Puppeteer connects | [MISSING IN RUBY] |
953
+ | should exposeFunction on a page with a PDF viewer | [MISSING IN RUBY] |
954
+ | should evaluate on a page with a PDF viewer | [MISSING IN RUBY] |
955
+ | should support evaluateOnNewDocument | [MISSING IN RUBY] |
956
+ | should support removing evaluateOnNewDocument scripts | [MISSING IN RUBY] |
957
+ | should support exposeFunction | [MISSING IN RUBY] |
958
+ | should support removing exposed function | [MISSING IN RUBY] |
959
+ | should report google.com frame | [MISSING IN RUBY] |
960
+ | should expose events within OOPIFs | [MISSING IN RUBY] |
961
+ | should retrieve body for OOPIF document requests | [MISSING IN RUBY] |
962
+
963
+ ---
964
+
965
+ ## 27. aria_query_handler.spec.ts vs aria_query_handler_spec.rb
966
+
967
+ ### Ported Tests (Core functionality ported)
968
+ - parseAriaSelector tests
969
+ - queryOne tests (find by role, name, first matching)
970
+ - queryAll tests
971
+ - queryAllArray tests
972
+ - waitForSelector (aria) - basic waiting, visibility
973
+
974
+ ### Missing in Ruby
975
+ | Node.js Test | Notes |
976
+ |--------------|-------|
977
+ | waitForSelector > should work for ElementHandle.waitForSelector | [MISSING IN RUBY] |
978
+ | waitForSelector > should survive cross-process navigation | [MISSING IN RUBY] |
979
+ | waitForSelector > should wait for visible recursively | [MISSING IN RUBY] |
980
+ | waitForSelector > hidden should wait for visibility: hidden | [MISSING IN RUBY] |
981
+ | waitForSelector > should have error message specifically for awaiting element | [MISSING IN RUBY] |
982
+ | waitForSelector > should respond to node attribute mutation | [MISSING IN RUBY] |
983
+ | waitForSelector > should have correct stack trace for timeout | [MISSING IN RUBY] |
984
+ | Chromium web test queries | [MISSING IN RUBY] |
985
+
986
+ ---
987
+
988
+ ## Summary
989
+
990
+ ### Overall Statistics
991
+
992
+ | Category | Count |
993
+ |----------|-------|
994
+ | Node.js spec files | 47 |
995
+ | Ruby spec files | 42 |
996
+ | Fully ported spec files | 35 |
997
+ | Partially ported spec files | 1 |
998
+ | Missing spec files (important) | 4 |
999
+ | Low priority/N/A spec files | 11 |
1000
+
1001
+ ### Spec Files Status Summary
1002
+
1003
+ **Fully Ported (35):**
1004
+ aria_query_handler, browser, browser_context, browser_context_cookies, click, connect (in launcher), cookies, coverage, defaultbrowsercontext (in browser_context), dialog, download, drag_and_drop, element_handle, emulation, evaluation, frame, idle_override, input, js_handle, keyboard, launcher, mouse, navigation, network, oopif, page, query_handler, query_selector, request_interception, request_interception_experimental, screenshot, touchscreen, tracing, waittask, worker
1005
+
1006
+ **Partially Ported (1):**
1007
+ - target.spec.ts → target_spec.rb (AbortSignal unsupported)
1008
+
1009
+ **Missing - High Priority (4):**
1010
+ 1. **accessibility.spec.ts** - Accessibility API not implemented
1011
+ 2. **locator.spec.ts** - Locator API not implemented
1012
+ 3. **proxy.spec.ts** - Proxy support not implemented
1013
+ 4. **autofill.spec.ts** - Autofill not implemented
1014
+
1015
+ **Low Priority/N/A (11):**
1016
+ acceptInsecureCerts, bluetooth-emulation, debugInfo, device-request-prompt, fixtures, headful, injected, stacktrace, webExtension, webgl
1017
+
1018
+ ### Priority Recommendations
1019
+
1020
+ #### High Priority (Core functionality gaps)
1021
+ 1. **Accessibility API** - Add `Page#accessibility` and port accessibility.spec.ts
1022
+ 2. **Locator API** - Implement Locator class and port locator.spec.ts
1023
+
1024
+ #### Medium Priority
1025
+ 1. **proxy.spec.ts** - Proxy configuration support
1026
+ 2. **target.spec.ts** - AbortSignal support for waitForTarget
1027
+ 3. **oopif.spec.ts** - Several advanced OOPIF tests missing
1028
+
1029
+ #### Low Priority (Feature-specific)
1030
+ 1. AbortSignal/cancellation tests (Ruby doesn't support this pattern)
1031
+ 2. Firefox-specific tests (puppeteer-ruby focuses on Chrome)
1032
+ 3. WebGL, Bluetooth, Web Extension tests
1033
+
1034
+ ### Files that may need `_ext_spec.rb` split
1035
+ The following Ruby-only tests should potentially be moved to extension spec files:
1036
+ - `cookies_spec.rb` - "should fail if specifying wrong cookie" (Ruby-specific validation)
1037
+ - `screenshot_spec.rb` - Issue #96 regression tests
1038
+ - `launcher_spec.rb` - Ruby-specific API tests (default_args, product)
1039
+ - `element_handle_spec.rb` - XPath-specific tests
1040
+ - `drag_and_drop_spec.rb` - Ruby-specific validation tests
1041
+ - `coverage_spec.rb` - Ruby block-style API tests