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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -3
- data/AGENTS.md +169 -0
- data/CLAUDE/README.md +41 -0
- data/CLAUDE/architecture.md +253 -0
- data/CLAUDE/cdp_protocol.md +230 -0
- data/CLAUDE/concurrency.md +216 -0
- data/CLAUDE/porting_puppeteer.md +575 -0
- data/CLAUDE/rbs_type_checking.md +101 -0
- data/CLAUDE/spec_migration_plans.md +1041 -0
- data/CLAUDE/testing.md +278 -0
- data/CLAUDE.md +242 -0
- data/README.md +8 -0
- data/Rakefile +7 -0
- data/Steepfile +28 -0
- data/docs/api_coverage.md +105 -56
- data/lib/puppeteer/aria_query_handler.rb +3 -2
- data/lib/puppeteer/async_utils.rb +214 -0
- data/lib/puppeteer/browser.rb +98 -56
- data/lib/puppeteer/browser_connector.rb +18 -3
- data/lib/puppeteer/browser_context.rb +196 -3
- data/lib/puppeteer/browser_runner.rb +18 -10
- data/lib/puppeteer/cdp_session.rb +67 -23
- data/lib/puppeteer/chrome_target_manager.rb +65 -40
- data/lib/puppeteer/connection.rb +55 -36
- data/lib/puppeteer/console_message.rb +9 -1
- data/lib/puppeteer/console_patch.rb +47 -0
- data/lib/puppeteer/css_coverage.rb +5 -3
- data/lib/puppeteer/custom_query_handler.rb +80 -33
- data/lib/puppeteer/define_async_method.rb +31 -37
- data/lib/puppeteer/dialog.rb +47 -14
- data/lib/puppeteer/element_handle.rb +231 -62
- data/lib/puppeteer/emulation_manager.rb +1 -1
- data/lib/puppeteer/env.rb +1 -1
- data/lib/puppeteer/errors.rb +25 -2
- data/lib/puppeteer/event_callbackable.rb +15 -0
- data/lib/puppeteer/events.rb +4 -0
- data/lib/puppeteer/execution_context.rb +148 -3
- data/lib/puppeteer/file_chooser.rb +6 -0
- data/lib/puppeteer/frame.rb +162 -91
- data/lib/puppeteer/frame_manager.rb +69 -48
- data/lib/puppeteer/http_request.rb +114 -38
- data/lib/puppeteer/http_response.rb +24 -7
- data/lib/puppeteer/isolated_world.rb +64 -41
- data/lib/puppeteer/js_coverage.rb +5 -3
- data/lib/puppeteer/js_handle.rb +58 -16
- data/lib/puppeteer/keyboard.rb +30 -17
- data/lib/puppeteer/launcher/browser_options.rb +3 -1
- data/lib/puppeteer/launcher/chrome.rb +8 -5
- data/lib/puppeteer/launcher/launch_options.rb +7 -2
- data/lib/puppeteer/launcher.rb +4 -8
- data/lib/puppeteer/lifecycle_watcher.rb +38 -22
- data/lib/puppeteer/mouse.rb +273 -64
- data/lib/puppeteer/network_event_manager.rb +7 -0
- data/lib/puppeteer/network_manager.rb +393 -112
- data/lib/puppeteer/page/screenshot_task_queue.rb +14 -4
- data/lib/puppeteer/page.rb +568 -226
- data/lib/puppeteer/puppeteer.rb +171 -64
- data/lib/puppeteer/query_handler_manager.rb +112 -16
- data/lib/puppeteer/reactor_runner.rb +247 -0
- data/lib/puppeteer/remote_object.rb +127 -47
- data/lib/puppeteer/target.rb +74 -27
- data/lib/puppeteer/task_manager.rb +3 -1
- data/lib/puppeteer/timeout_helper.rb +6 -10
- data/lib/puppeteer/touch_handle.rb +39 -0
- data/lib/puppeteer/touch_screen.rb +72 -22
- data/lib/puppeteer/tracing.rb +3 -3
- data/lib/puppeteer/version.rb +1 -1
- data/lib/puppeteer/wait_task.rb +264 -101
- data/lib/puppeteer/web_socket.rb +2 -2
- data/lib/puppeteer/web_socket_transport.rb +91 -27
- data/lib/puppeteer/web_worker.rb +175 -0
- data/lib/puppeteer.rb +20 -4
- data/puppeteer-ruby.gemspec +15 -11
- data/sig/_external.rbs +8 -0
- data/sig/_supplementary.rbs +314 -0
- data/sig/puppeteer/browser.rbs +166 -0
- data/sig/puppeteer/cdp_session.rbs +64 -0
- data/sig/puppeteer/dialog.rbs +41 -0
- data/sig/puppeteer/element_handle.rbs +305 -0
- data/sig/puppeteer/execution_context.rbs +87 -0
- data/sig/puppeteer/frame.rbs +226 -0
- data/sig/puppeteer/http_request.rbs +214 -0
- data/sig/puppeteer/http_response.rbs +89 -0
- data/sig/puppeteer/js_handle.rbs +64 -0
- data/sig/puppeteer/keyboard.rbs +40 -0
- data/sig/puppeteer/mouse.rbs +113 -0
- data/sig/puppeteer/page.rbs +515 -0
- data/sig/puppeteer/puppeteer.rbs +98 -0
- data/sig/puppeteer/remote_object.rbs +78 -0
- data/sig/puppeteer/touch_handle.rbs +21 -0
- data/sig/puppeteer/touch_screen.rbs +35 -0
- data/sig/puppeteer/web_worker.rbs +83 -0
- metadata +116 -45
- data/CHANGELOG.md +0 -397
- data/lib/puppeteer/concurrent_ruby_utils.rb +0 -81
- data/lib/puppeteer/firefox_target_manager.rb +0 -157
- data/lib/puppeteer/launcher/firefox.rb +0 -453
data/lib/puppeteer/frame.rb
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
# rbs_inline: enabled
|
|
2
|
+
|
|
1
3
|
class Puppeteer::Frame
|
|
2
4
|
using Puppeteer::DefineAsyncMethod
|
|
3
5
|
|
|
4
|
-
# @
|
|
5
|
-
# @
|
|
6
|
-
# @
|
|
7
|
-
# @
|
|
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
|
-
|
|
55
|
-
|
|
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
|
-
# @
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
# @
|
|
68
|
-
# @
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
# @
|
|
80
|
-
# @
|
|
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
|
-
# @
|
|
88
|
-
# @
|
|
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
|
-
# @
|
|
97
|
-
# @return
|
|
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
|
-
# @
|
|
107
|
-
# @return
|
|
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
|
-
# @
|
|
123
|
-
# @
|
|
124
|
-
# @
|
|
125
|
-
# @return
|
|
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
|
-
# @
|
|
135
|
-
# @
|
|
136
|
-
# @
|
|
137
|
-
# @return
|
|
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
|
-
# @
|
|
147
|
-
# @
|
|
148
|
-
|
|
149
|
-
|
|
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
|
|
194
|
+
# @rbs return: String -- Page HTML content
|
|
156
195
|
def content
|
|
157
196
|
@puppeteer_world.content
|
|
158
197
|
end
|
|
159
198
|
|
|
160
|
-
# @
|
|
161
|
-
# @
|
|
162
|
-
# @
|
|
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
|
|
207
|
+
# @rbs return: String -- Frame name
|
|
168
208
|
def name
|
|
169
209
|
@name || ''
|
|
170
210
|
end
|
|
171
211
|
|
|
172
|
-
# @return
|
|
212
|
+
# @rbs return: String? -- Frame URL
|
|
173
213
|
def url
|
|
174
214
|
@url
|
|
175
215
|
end
|
|
176
216
|
|
|
177
|
-
# @return
|
|
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
|
-
# @
|
|
195
|
-
# @
|
|
196
|
-
# @
|
|
197
|
-
# @
|
|
198
|
-
# @
|
|
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
|
-
# @
|
|
204
|
-
# @
|
|
205
|
-
# @
|
|
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
|
-
# @
|
|
211
|
-
# @
|
|
212
|
-
# @
|
|
213
|
-
# @
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
# @
|
|
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
|
-
# @
|
|
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
|
-
# @
|
|
233
|
-
# @
|
|
234
|
-
# @return
|
|
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
|
-
# @
|
|
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
|
-
# @
|
|
249
|
-
# @
|
|
250
|
-
# @
|
|
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
|
-
# @
|
|
258
|
-
# @
|
|
259
|
-
# @
|
|
260
|
-
# @
|
|
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(
|
|
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
|
-
# @
|
|
333
|
+
# @rbs milliseconds: Numeric -- Time to wait in milliseconds
|
|
334
|
+
# @rbs return: void -- No return value
|
|
269
335
|
def wait_for_timeout(milliseconds)
|
|
270
|
-
|
|
336
|
+
Puppeteer::AsyncUtils.sleep_seconds(milliseconds / 1000.0)
|
|
271
337
|
end
|
|
272
338
|
|
|
273
|
-
# @
|
|
274
|
-
# @
|
|
275
|
-
# @
|
|
276
|
-
# @
|
|
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
|
-
# @
|
|
291
|
-
# @
|
|
292
|
-
# @
|
|
293
|
-
# @
|
|
294
|
-
# @return
|
|
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
|
|
368
|
+
# @rbs return: String -- Frame title
|
|
302
369
|
def title
|
|
303
370
|
@puppeteer_world.title
|
|
304
371
|
end
|
|
305
372
|
|
|
306
|
-
# @
|
|
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
|
-
# @
|
|
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
|