Class: Puppeteer::Browser
Defined Under Namespace
Classes: TargetAlreadyExistError, TargetNotExistError, Version
Class Method Summary
collapse
Instance Method Summary
collapse
Methods included from IfPresent
#if_present
#add_event_listener, #emit_event, #observe_first, #on_event, #remove_event_listener
Methods included from DebugPrint
#debug_print, #debug_puts
Constructor Details
#initialize(connection:, context_ids:, ignore_https_errors:, default_viewport:, process:, close_callback:) ⇒ Browser
Returns a new instance of Browser.
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
# File 'lib/puppeteer/browser.rb', line 35
def initialize(connection:, context_ids:, ignore_https_errors:, default_viewport:, process:, close_callback:)
@ignore_https_errors = ignore_https_errors
@default_viewport = default_viewport
@process = process
@connection = connection
@close_callback = close_callback
@default_context = Puppeteer::BrowserContext.new(@connection, self, nil)
@contexts = {}
context_ids.each do |context_id|
@contexts[context_id] = Puppeteer::BrowserContext.new(@connection, self, context_id)
end
@targets = {}
@wait_for_creating_targets = {}
@connection.on_event(ConnectionEmittedEvents::Disconnected) do
emit_event(BrowserEmittedEvents::Disconnected)
end
@connection.on_event('Target.targetCreated', &method(:handle_target_created))
@connection.on_event('Target.targetDestroyed', &method(:handle_target_destroyed))
@connection.on_event('Target.targetInfoChanged', &method(:handle_target_info_changed))
end
|
Class Method Details
.create(connection:, context_ids:, ignore_https_errors:, default_viewport:, process:, close_callback:) ⇒ Object
16
17
18
19
20
21
22
23
24
25
26
27
|
# File 'lib/puppeteer/browser.rb', line 16
def self.create(connection:, context_ids:, ignore_https_errors:, default_viewport:, process:, close_callback:)
browser = Puppeteer::Browser.new(
connection: connection,
context_ids: context_ids,
ignore_https_errors: ignore_https_errors,
default_viewport: default_viewport,
process: process,
close_callback: close_callback,
)
connection.send_message('Target.setDiscoverTargets', discover: true)
browser
end
|
Instance Method Details
#async_wait_for_target(predicate: , timeout: nil) ⇒ Object
261
|
# File 'lib/puppeteer/browser.rb', line 261
define_async_method :async_wait_for_target
|
#browser_contexts ⇒ Object
87
88
89
|
# File 'lib/puppeteer/browser.rb', line 87
def browser_contexts
[@default_context].concat(@contexts.values)
end
|
#close ⇒ Object
278
279
280
281
|
# File 'lib/puppeteer/browser.rb', line 278
def close
@close_callback.call
disconnect
end
|
#connected? ⇒ Boolean
287
288
289
|
# File 'lib/puppeteer/browser.rb', line 287
def connected?
!@connection.closed?
end
|
81
82
83
84
85
|
# File 'lib/puppeteer/browser.rb', line 81
def create_incognito_browser_context
result = @connection.send_message('Target.createBrowserContext')
browser_context_id = result['browserContextId']
@contexts[browser_context_id] = Puppeteer::BrowserContext.new(@connection, self, browser_context_id)
end
|
#create_page_in_context(context_id) ⇒ !Promise<!Puppeteer.Page>
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
|
# File 'lib/puppeteer/browser.rb', line 185
def create_page_in_context(context_id)
create_target_params = { url: 'about:blank' }
if context_id
create_target_params[:browserContextId] = context_id
end
result = @connection.send_message('Target.createTarget', **create_target_params)
target_id = result['targetId']
target = @targets[target_id]
unless target
@wait_for_creating_targets[target_id] = resolvable_future
target = await @wait_for_creating_targets[target_id]
end
await target.initialized_promise
await target.page
end
|
92
93
94
|
# File 'lib/puppeteer/browser.rb', line 92
def default_browser_context
@default_context
end
|
#disconnect ⇒ Object
283
284
285
|
# File 'lib/puppeteer/browser.rb', line 283
def disconnect
@connection.dispose
end
|
#dispose_context(context_id) ⇒ Object
97
98
99
100
|
# File 'lib/puppeteer/browser.rb', line 97
def dispose_context(context_id)
@connection.send_message('Target.disposeBrowserContext', browserContextId: context_id)
@contexts.delete(context_id)
end
|
#handle_target_created(event) ⇒ Object
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
# File 'lib/puppeteer/browser.rb', line 109
def handle_target_created(event)
target_info = Puppeteer::Target::TargetInfo.new(event['targetInfo'])
browser_context_id = target_info.browser_context_id
context =
if browser_context_id && @contexts.has_key?(browser_context_id)
@contexts[browser_context_id]
else
@default_context
end
if @targets[target_info.target_id]
raise TargetAlreadyExistError.new
end
target = Puppeteer::Target.new(
target_info: target_info,
browser_context: context,
session_factory: -> { @connection.create_session(target_info) },
ignore_https_errors: @ignore_https_errors,
default_viewport: @default_viewport,
)
@targets[target_info.target_id] = target
if_present(@wait_for_creating_targets.delete(target_info.target_id)) do |promise|
promise.fulfill(target)
end
if await target.initialized_promise
emit_event(BrowserEmittedEvents::TargetCreated, target)
context.emit_event(BrowserContextEmittedEvents::TargetCreated, target)
end
end
|
#handle_target_destroyed(event) ⇒ Object
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
# File 'lib/puppeteer/browser.rb', line 140
def handle_target_destroyed(event)
target_id = event['targetId']
target = @targets[target_id]
target.ignore_initialize_callback_promise
@targets.delete(target_id)
if_present(@wait_for_creating_targets.delete(target_id)) do |promise|
promise.reject('target destroyed')
end
target.closed_callback
if await target.initialized_promise
emit_event(BrowserEmittedEvents::TargetDestroyed, target)
target.browser_context.emit_event(BrowserContextEmittedEvents::TargetDestroyed, target)
end
end
|
#handle_target_info_changed(event) ⇒ Object
162
163
164
165
166
167
168
169
170
171
172
|
# File 'lib/puppeteer/browser.rb', line 162
def handle_target_info_changed(event)
target_info = Puppeteer::Target::TargetInfo.new(event['targetInfo'])
target = @targets[target_info.target_id] or raise TargetNotExistError.new
previous_url = target.url
was_initialized = target.initialized?
target.handle_target_info_changed(target_info)
if was_initialized && previous_url != target.url
emit_event(BrowserEmittedEvents::TargetChanged, target)
target.browser_context.emit_event(BrowserContextEmittedEvents::TargetChanged, target)
end
end
|
#new_page ⇒ Object
179
180
181
|
# File 'lib/puppeteer/browser.rb', line 179
def new_page
@default_context.new_page
end
|
#on(event_name, &block) ⇒ Object
58
59
60
61
62
63
64
|
# File 'lib/puppeteer/browser.rb', line 58
def on(event_name, &block)
unless BrowserEmittedEvents.values.include?(event_name.to_s)
raise ArgumentError.new("Unknown event name: #{event_name}. Known events are #{BrowserEmittedEvents.values.to_a.join(", ")}")
end
super(event_name.to_s, &block)
end
|
#once(event_name, &block) ⇒ Object
67
68
69
70
71
72
73
|
# File 'lib/puppeteer/browser.rb', line 67
def once(event_name, &block)
unless BrowserEmittedEvents.values.include?(event_name.to_s)
raise ArgumentError.new("Unknown event name: #{event_name}. Known events are #{BrowserEmittedEvents.values.to_a.join(", ")}")
end
super(event_name.to_s, &block)
end
|
#pages ⇒ !Promise<!Array<!Puppeteer.Page>>
264
265
266
|
# File 'lib/puppeteer/browser.rb', line 264
def pages
browser_contexts.flat_map(&:pages)
end
|
76
77
78
|
# File 'lib/puppeteer/browser.rb', line 76
def process
@process
end
|
214
215
216
|
# File 'lib/puppeteer/browser.rb', line 214
def target
targets.find { |target| target.type == 'browser' }
end
|
#targets ⇒ !Array<!Target>
208
209
210
|
# File 'lib/puppeteer/browser.rb', line 208
def targets
@targets.values.select { |target| target.initialized? }
end
|
#user_agent ⇒ String
274
275
276
|
# File 'lib/puppeteer/browser.rb', line 274
def user_agent
get_version.user_agent
end
|
#version ⇒ String
269
270
271
|
# File 'lib/puppeteer/browser.rb', line 269
def version
get_version.product
end
|
#wait_for_target(predicate:, timeout: nil) ⇒ Puppeteer::Target
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
|
# File 'lib/puppeteer/browser.rb', line 225
def wait_for_target(predicate:, timeout: nil)
timeout_in_sec = (timeout || 30000).to_i / 1000.0
existing_target = targets.find { |target| predicate.call(target) }
return existing_target if existing_target
event_listening_ids = []
target_promise = resolvable_future
event_listening_ids << add_event_listener(BrowserEmittedEvents::TargetCreated) do |target|
if predicate.call(target)
target_promise.fulfill(target)
end
end
event_listening_ids << add_event_listener(BrowserEmittedEvents::TargetChanged) do |target|
if predicate.call(target)
target_promise.fulfill(target)
end
end
begin
if timeout_in_sec > 0
Timeout.timeout(timeout_in_sec) do
target_promise.value!
end
else
target_promise.value!
end
rescue Timeout::Error
raise Puppeteer::TimeoutError.new("waiting for target failed: timeout #{timeout}ms exceeded")
ensure
remove_event_listener(*event_listening_ids)
end
end
|
#ws_endpoint ⇒ String
175
176
177
|
# File 'lib/puppeteer/browser.rb', line 175
def ws_endpoint
@connection.url
end
|