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
@@ -1,10 +1,13 @@
1
+ # rbs_inline: enabled
2
+
1
3
  class Puppeteer::Frame
2
4
  using Puppeteer::DefineAsyncMethod
3
5
 
4
- # @param frame_manager [Puppeteer::FrameManager]
5
- # @param parent_frame [Puppeteer::Frame|nil]
6
- # @param frame_id [String]
7
- # @param client [Puppeteer::CDPSession]
6
+ # @rbs frame_manager: Puppeteer::FrameManager -- Owning frame manager
7
+ # @rbs parent_frame: Puppeteer::Frame? -- Parent frame
8
+ # @rbs frame_id: String -- Frame ID
9
+ # @rbs client: Puppeteer::CDPSession -- CDP session
10
+ # @rbs return: void -- No return value
8
11
  def initialize(frame_manager, parent_frame, frame_id, client)
9
12
  @frame_manager = frame_manager
10
13
  @parent_frame = parent_frame
@@ -13,6 +16,7 @@ class Puppeteer::Frame
13
16
  @has_started_loading = false
14
17
 
15
18
  @loader_id = ''
19
+ @url = 'about:blank'
16
20
  @lifecycle_events = Set.new
17
21
  @child_frames = Set.new
18
22
  if parent_frame
@@ -22,6 +26,7 @@ class Puppeteer::Frame
22
26
  update_client(client)
23
27
  end
24
28
 
29
+ # @rbs return: String -- Inspection string
25
30
  def inspect
26
31
  values = %i[id parent_frame detached loader_id lifecycle_events child_frames].map do |sym|
27
32
  value = instance_variable_get(:"@#{sym}")
@@ -30,62 +35,95 @@ class Puppeteer::Frame
30
35
  "#<Puppeteer::Frame #{values.join(' ')}>"
31
36
  end
32
37
 
38
+ # @rbs return: Puppeteer::CDPSession -- Current CDP session
33
39
  def _client
34
40
  @client
35
41
  end
36
42
 
37
- # @param client [Puppeteer::CDPSession]
38
43
  private def update_client(client)
39
44
  @client = client
40
45
  @main_world = Puppeteer::IsolaatedWorld.new(@client, @frame_manager, self, @frame_manager.timeout_settings)
41
46
  @puppeteer_world = Puppeteer::IsolaatedWorld.new(@client, @frame_manager, self, @frame_manager.timeout_settings)
42
47
  end
43
48
 
49
+ # @rbs return: Puppeteer::Page -- Owning page
44
50
  def page
45
51
  @frame_manager.page
46
52
  end
47
53
 
54
+ # @rbs return: bool -- Whether this is an OOPIF frame
48
55
  def oop_frame?
49
56
  @client != @frame_manager.client
50
57
  end
51
58
 
52
59
  attr_accessor :frame_manager, :id, :loader_id, :lifecycle_events, :main_world, :puppeteer_world
60
+ attr_reader :client
53
61
 
54
- def has_started_loading?
55
- @has_started_loading
62
+ # @rbs other: Object -- Other object to compare
63
+ # @rbs return: bool -- Equality result
64
+ def ==(other)
65
+ other = other.__getobj__ if other.is_a?(Puppeteer::ReactorRunner::Proxy)
66
+ return true if equal?(other)
67
+ return false unless other.is_a?(Puppeteer::Frame)
68
+ return false unless @id && other.id
69
+
70
+ @id == other.id
56
71
  end
57
72
 
58
- # @param url [String]
59
- # @param rederer [String]
60
- # @param timeout [number|nil]
61
- # @param wait_until [string|nil] 'load' | 'domcontentloaded' | 'networkidle0' | 'networkidle2'
62
- # @return [Puppeteer::HTTPResponse]
63
- def goto(url, referer: nil, timeout: nil, wait_until: nil)
64
- @frame_manager.navigate_frame(self, url, referer: referer, timeout: timeout, wait_until: wait_until)
73
+ # @rbs return: bool -- Whether loading has started
74
+ def has_started_loading?
75
+ @has_started_loading
65
76
  end
66
77
 
67
- # @param timeout [number|nil]
68
- # @param wait_until [string|nil] 'load' | 'domcontentloaded' | 'networkidle0' | 'networkidle2'
69
- def wait_for_navigation(timeout: nil, wait_until: nil)
70
- @frame_manager.wait_for_frame_navigation(self, timeout: timeout, wait_until: wait_until)
78
+ # @rbs url: String -- URL to navigate
79
+ # @rbs referer: String? -- Referer header value
80
+ # @rbs referrer_policy: String? -- Referrer policy
81
+ # @rbs timeout: Numeric? -- Navigation timeout in milliseconds
82
+ # @rbs wait_until: String? -- Lifecycle event to wait for
83
+ # @rbs return: Puppeteer::HTTPResponse? -- Navigation response
84
+ def goto(url, referer: nil, referrer_policy: nil, timeout: nil, wait_until: nil)
85
+ @frame_manager.navigate_frame(
86
+ self,
87
+ url,
88
+ referer: referer,
89
+ referrer_policy: referrer_policy,
90
+ timeout: timeout,
91
+ wait_until: wait_until,
92
+ )
93
+ end
94
+
95
+ # @rbs timeout: Numeric? -- Navigation timeout in milliseconds
96
+ # @rbs wait_until: String? -- Lifecycle event to wait for
97
+ # @rbs ignore_same_document_navigation: bool -- Ignore same-document navigation
98
+ # @rbs return: Puppeteer::HTTPResponse? -- Navigation response
99
+ def wait_for_navigation(timeout: nil, wait_until: nil, ignore_same_document_navigation: false)
100
+ @frame_manager.wait_for_frame_navigation(
101
+ self,
102
+ timeout: timeout,
103
+ wait_until: wait_until,
104
+ ignore_same_document_navigation: ignore_same_document_navigation,
105
+ )
71
106
  end
72
107
 
73
108
  define_async_method :async_wait_for_navigation
74
109
 
110
+ # @rbs return: Puppeteer::ExecutionContext -- Main world execution context
75
111
  def execution_context
76
112
  @main_world.execution_context
77
113
  end
78
114
 
79
- # @param {Function|string} pageFunction
80
- # @return {!Promise<!Puppeteer.JSHandle>}
115
+ # @rbs page_function: String -- Function or expression to evaluate
116
+ # @rbs args: Array[untyped] -- Arguments for evaluation
117
+ # @rbs return: Puppeteer::JSHandle -- Handle to evaluation result
81
118
  def evaluate_handle(page_function, *args)
82
119
  @main_world.evaluate_handle(page_function, *args)
83
120
  end
84
121
 
85
122
  define_async_method :async_evaluate_handle
86
123
 
87
- # @param {Function|string} pageFunction
88
- # @param {!Array<*>} args
124
+ # @rbs page_function: String -- Function or expression to evaluate
125
+ # @rbs args: Array[untyped] -- Arguments for evaluation
126
+ # @rbs return: untyped -- Evaluation result
89
127
  def evaluate(page_function, *args)
90
128
  @main_world.evaluate(page_function, *args)
91
129
  end
@@ -93,8 +131,8 @@ class Puppeteer::Frame
93
131
  define_async_method :async_evaluate
94
132
 
95
133
  # `$()` in JavaScript.
96
- # @param {string} selector
97
- # @return {!Promise<?Puppeteer.ElementHandle>}
134
+ # @rbs selector: String -- CSS selector
135
+ # @rbs return: Puppeteer::ElementHandle? -- Matching element or nil
98
136
  def query_selector(selector)
99
137
  @main_world.query_selector(selector)
100
138
  end
@@ -103,8 +141,8 @@ class Puppeteer::Frame
103
141
  define_async_method :async_query_selector
104
142
 
105
143
  # `$x()` in JavaScript. $ is not allowed to use as a method name in Ruby.
106
- # @param {string} expression
107
- # @return {!Promise<!Array<!Puppeteer.ElementHandle>>}
144
+ # @rbs expression: String -- XPath expression
145
+ # @rbs return: Array[Puppeteer::ElementHandle] -- Matching elements
108
146
  def Sx(expression)
109
147
  param_xpath =
110
148
  if expression.start_with?('//')
@@ -119,10 +157,10 @@ class Puppeteer::Frame
119
157
  define_async_method :async_Sx
120
158
 
121
159
  # `$eval()` in JavaScript.
122
- # @param {string} selector
123
- # @param {Function|string} pageFunction
124
- # @param {!Array<*>} args
125
- # @return {!Promise<(!Object|undefined)>}
160
+ # @rbs selector: String -- CSS selector
161
+ # @rbs page_function: String -- Function or expression to evaluate
162
+ # @rbs args: Array[untyped] -- Arguments for evaluation
163
+ # @rbs return: untyped -- Evaluation result
126
164
  def eval_on_selector(selector, page_function, *args)
127
165
  @main_world.eval_on_selector(selector, page_function, *args)
128
166
  end
@@ -131,10 +169,10 @@ class Puppeteer::Frame
131
169
  define_async_method :async_eval_on_selector
132
170
 
133
171
  # `$$eval()` in JavaScript.
134
- # @param {string} selector
135
- # @param {Function|string} pageFunction
136
- # @param {!Array<*>} args
137
- # @return {!Promise<(!Object|undefined)>}
172
+ # @rbs selector: String -- CSS selector
173
+ # @rbs page_function: String -- Function or expression to evaluate
174
+ # @rbs args: Array[untyped] -- Arguments for evaluation
175
+ # @rbs return: untyped -- Evaluation result
138
176
  def eval_on_selector_all(selector, page_function, *args)
139
177
  @main_world.eval_on_selector_all(selector, page_function, *args)
140
178
  end
@@ -143,137 +181,166 @@ class Puppeteer::Frame
143
181
  define_async_method :async_eval_on_selector_all
144
182
 
145
183
  # `$$()` in JavaScript.
146
- # @param {string} selector
147
- # @return {!Promise<!Array<!Puppeteer.ElementHandle>>}
148
- def query_selector_all(selector)
149
- @main_world.query_selector_all(selector)
184
+ # @rbs selector: String -- CSS selector
185
+ # @rbs isolate: bool? -- Use isolated world for queries
186
+ # @rbs return: Array[Puppeteer::ElementHandle] -- Matching elements
187
+ def query_selector_all(selector, isolate: nil)
188
+ @main_world.query_selector_all(selector, isolate: isolate)
150
189
  end
151
190
  alias_method :SS, :query_selector_all
152
191
 
153
192
  define_async_method :async_query_selector_all
154
193
 
155
- # @return [String]
194
+ # @rbs return: String -- Page HTML content
156
195
  def content
157
196
  @puppeteer_world.content
158
197
  end
159
198
 
160
- # @param html [String]
161
- # @param timeout [Integer]
162
- # @param wait_until [String|Array<String>]
199
+ # @rbs html: String -- HTML content
200
+ # @rbs timeout: Numeric? -- Navigation timeout in milliseconds
201
+ # @rbs wait_until: String | Array[String] | nil -- Lifecycle events to wait for
202
+ # @rbs return: void -- No return value
163
203
  def set_content(html, timeout: nil, wait_until: nil)
164
204
  @puppeteer_world.set_content(html, timeout: timeout, wait_until: wait_until)
165
205
  end
166
206
 
167
- # @return [String]
207
+ # @rbs return: String -- Frame name
168
208
  def name
169
209
  @name || ''
170
210
  end
171
211
 
172
- # @return [String]
212
+ # @rbs return: String? -- Frame URL
173
213
  def url
174
214
  @url
175
215
  end
176
216
 
177
- # @return [Frame?]
217
+ # @rbs return: Puppeteer::Frame? -- Parent frame
178
218
  def parent_frame
179
219
  @parent_frame
180
220
  end
181
221
 
222
+ # @rbs return: Puppeteer::ElementHandle? -- Frame element handle
223
+ def frame_element
224
+ parent = parent_frame
225
+ return nil unless parent
226
+
227
+ response = parent.client.send_message('DOM.getFrameOwner', frameId: @id)
228
+ parent.main_world.adopt_backend_node(response['backendNodeId'])
229
+ end
230
+
182
231
  protected def _child_frames
183
232
  @child_frames
184
233
  end
185
234
 
235
+ # @rbs return: Array[Puppeteer::Frame] -- Child frames
186
236
  def child_frames
187
237
  @child_frames.to_a
188
238
  end
189
239
 
240
+ # @rbs return: bool -- Whether the frame is detached
190
241
  def detached?
191
242
  @detached
192
243
  end
193
244
 
194
- # @param url [String?]
195
- # @param path [String?]
196
- # @param content [String?]
197
- # @param type [String?]
198
- # @param id [String?]
245
+ # @rbs url: String? -- Script URL
246
+ # @rbs path: String? -- Path to script file
247
+ # @rbs content: String? -- Script contents
248
+ # @rbs type: String? -- Script type
249
+ # @rbs id: String? -- Script element ID
250
+ # @rbs return: Puppeteer::ElementHandle -- Script element handle
199
251
  def add_script_tag(url: nil, path: nil, content: nil, type: nil, id: nil)
200
252
  @main_world.add_script_tag(url: url, path: path, content: content, type: type, id: id)
201
253
  end
202
254
 
203
- # @param url [String?]
204
- # @param path [String?]
205
- # @param content [String?]
255
+ # @rbs url: String? -- Stylesheet URL
256
+ # @rbs path: String? -- Path to stylesheet file
257
+ # @rbs content: String? -- Stylesheet contents
258
+ # @rbs return: Puppeteer::ElementHandle -- Style element handle
206
259
  def add_style_tag(url: nil, path: nil, content: nil)
207
260
  @main_world.add_style_tag(url: url, path: path, content: content)
208
261
  end
209
262
 
210
- # @param selector [String]
211
- # @param delay [Number]
212
- # @param button [String] "left"|"right"|"middle"
213
- # @param click_count [Number]
214
- def click(selector, delay: nil, button: nil, click_count: nil)
215
- @puppeteer_world.click(selector, delay: delay, button: button, click_count: click_count)
263
+ # @rbs selector: String -- CSS selector
264
+ # @rbs delay: Numeric? -- Delay between down and up (ms)
265
+ # @rbs button: String? -- Mouse button
266
+ # @rbs click_count: Integer? -- Deprecated: use count (click_count only sets clickCount)
267
+ # @rbs count: Integer? -- Number of clicks to perform
268
+ # @rbs return: void -- No return value
269
+ def click(selector, delay: nil, button: nil, click_count: nil, count: nil)
270
+ @puppeteer_world.click(selector, delay: delay, button: button, click_count: click_count, count: count)
216
271
  end
217
272
 
218
273
  define_async_method :async_click
219
274
 
220
- # @param {string} selector
275
+ # @rbs selector: String -- CSS selector
276
+ # @rbs return: void -- No return value
221
277
  def focus(selector)
222
278
  @puppeteer_world.focus(selector)
223
279
  end
224
280
 
225
281
  define_async_method :async_focus
226
282
 
227
- # @param {string} selector
283
+ # @rbs selector: String -- CSS selector
284
+ # @rbs return: void -- No return value
228
285
  def hover(selector)
229
286
  @puppeteer_world.hover(selector)
230
287
  end
231
288
 
232
- # @param {string} selector
233
- # @param {!Array<string>} values
234
- # @return {!Promise<!Array<string>>}
289
+ # @rbs selector: String -- CSS selector
290
+ # @rbs values: Array[String] -- Option values to select
291
+ # @rbs return: Array[String] -- Selected values
235
292
  def select(selector, *values)
236
293
  @puppeteer_world.select(selector, *values)
237
294
  end
238
295
 
239
296
  define_async_method :async_select
240
297
 
241
- # @param {string} selector
298
+ # @rbs selector: String -- CSS selector
299
+ # @rbs return: void -- No return value
242
300
  def tap(selector)
243
301
  @puppeteer_world.tap(selector)
244
302
  end
245
303
 
246
304
  define_async_method :async_tap
247
305
 
248
- # @param selector [String]
249
- # @param text [String]
250
- # @param delay [Number]
306
+ # @rbs selector: String -- CSS selector
307
+ # @rbs text: String -- Text to type
308
+ # @rbs delay: Numeric? -- Delay between key presses (ms)
309
+ # @rbs return: void -- No return value
251
310
  def type_text(selector, text, delay: nil)
252
311
  @main_world.type_text(selector, text, delay: delay)
253
312
  end
254
313
 
255
314
  define_async_method :async_type_text
256
315
 
257
- # @param selector [String]
258
- # @param visible [Boolean] Wait for element visible (not 'display: none' nor 'visibility: hidden') on true. default to false.
259
- # @param hidden [Boolean] Wait for element invisible ('display: none' nor 'visibility: hidden') on true. default to false.
260
- # @param timeout [Integer]
316
+ # @rbs selector: String -- CSS selector
317
+ # @rbs visible: bool? -- Wait for element to be visible
318
+ # @rbs hidden: bool? -- Wait for element to be hidden
319
+ # @rbs timeout: Numeric? -- Maximum wait time in milliseconds
320
+ # @rbs return: Puppeteer::ElementHandle? -- Matching element or nil
261
321
  def wait_for_selector(selector, visible: nil, hidden: nil, timeout: nil)
262
322
  query_handler_manager = Puppeteer::QueryHandlerManager.instance
263
- query_handler_manager.detect_query_handler(selector).wait_for(self, visible: visible, hidden: hidden, timeout: timeout)
323
+ query_handler_manager.detect_query_handler(selector).wait_for(
324
+ self,
325
+ visible: visible,
326
+ hidden: hidden,
327
+ timeout: timeout,
328
+ )
264
329
  end
265
330
 
266
331
  define_async_method :async_wait_for_selector
267
332
 
268
- # @param milliseconds [Integer] the number of milliseconds to wait.
333
+ # @rbs milliseconds: Numeric -- Time to wait in milliseconds
334
+ # @rbs return: void -- No return value
269
335
  def wait_for_timeout(milliseconds)
270
- sleep(milliseconds / 1000.0)
336
+ Puppeteer::AsyncUtils.sleep_seconds(milliseconds / 1000.0)
271
337
  end
272
338
 
273
- # @param xpath [String]
274
- # @param visible [Boolean] Wait for element visible (not 'display: none' nor 'visibility: hidden') on true. default to false.
275
- # @param hidden [Boolean] Wait for element invisible ('display: none' nor 'visibility: hidden') on true. default to false.
276
- # @param timeout [Integer]
339
+ # @rbs xpath: String -- XPath expression
340
+ # @rbs visible: bool? -- Wait for element to be visible
341
+ # @rbs hidden: bool? -- Wait for element to be hidden
342
+ # @rbs timeout: Numeric? -- Maximum wait time in milliseconds
343
+ # @rbs return: Puppeteer::ElementHandle? -- Matching element or nil
277
344
  def wait_for_xpath(xpath, visible: nil, hidden: nil, timeout: nil)
278
345
  param_xpath =
279
346
  if xpath.start_with?('//')
@@ -287,37 +354,38 @@ class Puppeteer::Frame
287
354
 
288
355
  define_async_method :async_wait_for_xpath
289
356
 
290
- # @param page_function [String]
291
- # @param args [Integer|Array]
292
- # @param polling [String]
293
- # @param timeout [Integer]
294
- # @return [Puppeteer::JSHandle]
357
+ # @rbs page_function: String -- Function or expression to evaluate
358
+ # @rbs args: Array[untyped] -- Arguments for evaluation
359
+ # @rbs polling: String | Numeric | nil -- Polling strategy
360
+ # @rbs timeout: Numeric? -- Maximum wait time in milliseconds
361
+ # @rbs return: Puppeteer::JSHandle -- Handle to evaluation result
295
362
  def wait_for_function(page_function, args: [], polling: nil, timeout: nil)
296
363
  @main_world.wait_for_function(page_function, args: args, polling: polling, timeout: timeout)
297
364
  end
298
365
 
299
366
  define_async_method :async_wait_for_function
300
367
 
301
- # @return [String]
368
+ # @rbs return: String -- Frame title
302
369
  def title
303
370
  @puppeteer_world.title
304
371
  end
305
372
 
306
- # @param frame_payload [Hash]
373
+ # @rbs frame_payload: Hash[String, untyped] -- Frame payload
374
+ # @rbs return: void -- No return value
307
375
  def navigated(frame_payload)
308
376
  @name = frame_payload['name']
309
377
  @url = "#{frame_payload['url']}#{frame_payload['urlFragment']}"
310
-
311
- # Ensure loaderId updated.
312
- # The order of [Page.lifecycleEvent name="init"] and [Page.frameNavigated] is random... for some reason...
313
- @loader_id = frame_payload['loaderId'] if frame_payload['loaderId']
314
378
  end
315
379
 
316
- # @param url [String]
380
+ # @rbs url: String -- Updated URL
381
+ # @rbs return: void -- No return value
317
382
  def navigated_within_document(url)
318
383
  @url = url
319
384
  end
320
385
 
386
+ # @rbs loader_id: String -- Loader ID
387
+ # @rbs name: String -- Lifecycle event name
388
+ # @rbs return: void -- No return value
321
389
  def handle_lifecycle_event(loader_id, name)
322
390
  if name == 'init'
323
391
  @loader_id = loader_id
@@ -326,15 +394,18 @@ class Puppeteer::Frame
326
394
  @lifecycle_events << name
327
395
  end
328
396
 
397
+ # @rbs return: void -- No return value
329
398
  def handle_loading_started
330
399
  @has_started_loading = true
331
400
  end
332
401
 
402
+ # @rbs return: void -- No return value
333
403
  def handle_loading_stopped
334
404
  @lifecycle_events << 'DOMContentLoaded'
335
405
  @lifecycle_events << 'load'
336
406
  end
337
407
 
408
+ # @rbs return: void -- No return value
338
409
  def detach
339
410
  @detached = true
340
411
  @main_world.detach