Class: Puppeteer::Page
- Inherits:
-
Object
show all
- Includes:
- DebugPrint, EventCallbackable, IfPresent
- Defined in:
- lib/puppeteer/page.rb,
lib/puppeteer/page/metrics.rb,
lib/puppeteer/page/pdf_options.rb,
lib/puppeteer/page/screenshot_options.rb,
lib/puppeteer/page/screenshot_task_queue.rb
Defined Under Namespace
Classes: FileChooserTimeoutError, JavaScriptExpression, JavaScriptFunction, Metrics, MetricsEvent, PDFOptions, PageError, PrintToPdfIsNotImplementedError, ScreenshotOptions, ScreenshotTaskQueue, TargetCrashedError
Constant Summary
collapse
- VISION_DEFICIENCY_TYPES =
%w[
none
achromatopsia
blurredVision
deuteranopia
protanopia
tritanopia
].freeze
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
-
#add_script_tag(url: nil, path: nil, content: nil, type: nil, id: nil) ⇒ Object
-
#add_style_tag(url: nil, path: nil, content: nil) ⇒ Object
-
#async_wait_for_navigation(timeout: nil, wait_until: nil) ⇒ Object
-
#async_wait_for_request(url: nil, predicate: nil, timeout: nil) ⇒ Object
Waits until request URL matches or request matches the given predicate.
-
#async_wait_for_response(url: nil, predicate: nil, timeout: nil) ⇒ Object
-
#authenticate(username: nil, password: nil) ⇒ Object
-
#bring_to_front ⇒ Object
Brings page to front (activates tab).
-
#browser ⇒ Object
-
#browser_context ⇒ Object
-
#bypass_csp=(enabled) ⇒ Object
-
#cache_enabled=(enabled) ⇒ Object
-
#click(selector, delay: nil, button: nil, click_count: nil) ⇒ Object
-
#close(run_before_unload: false) ⇒ Object
-
#closed? ⇒ boolean
-
#content ⇒ String
-
#content=(html) ⇒ Object
-
#cookies(*urls) ⇒ Array<Hash>
-
#create_pdf_stream(options = {}) ⇒ Enumerable<String>
-
#default_navigation_timeout=(timeout) ⇒ Object
-
#default_timeout=(timeout) ⇒ Object
-
#delete_cookie(*cookies) ⇒ Object
-
#drag_interception_enabled=(enabled) ⇒ Object
-
#drag_interception_enabled? ⇒ Boolean
(also: #drag_interception_enabled)
-
#emulate(device) ⇒ Object
-
#emulate_cpu_throttling(factor) ⇒ Object
-
#emulate_idle_state(is_user_active: nil, is_screen_unlocked: nil) ⇒ Object
-
#emulate_media_features(features) ⇒ Object
-
#emulate_media_type(media_type) ⇒ Object
-
#emulate_network_conditions(network_condition) ⇒ Object
-
#emulate_timezone(timezone_id) ⇒ Object
-
#emulate_vision_deficiency(vision_deficiency_type) ⇒ Object
-
#eval_on_selector(selector, page_function, *args) ⇒ Object
(also: #Seval)
-
#eval_on_selector_all(selector, page_function, *args) ⇒ Object
(also: #SSeval)
‘$$eval()` in JavaScript.
-
#evaluate(page_function, *args) ⇒ !Promise<*>
-
#evaluate_handle(page_function, *args) ⇒ !Promise<!Puppeteer.JSHandle>
-
#evaluate_on_new_document(page_function, *args) ⇒ Object
-
#expose_function(name, puppeteer_function) ⇒ Object
-
#extra_http_headers=(headers) ⇒ Object
-
#focus(selector) ⇒ Object
-
#frames ⇒ Object
-
#geolocation=(geolocation) ⇒ Object
-
#go_back(timeout: nil, wait_until: nil) ⇒ Object
-
#go_forward(timeout: nil, wait_until: nil) ⇒ Object
-
#goto(url, referer: nil, timeout: nil, wait_until: nil) ⇒ Object
-
#handle_binding_called(event) ⇒ Object
-
#handle_file_chooser(event) ⇒ Object
-
#hover(selector) ⇒ Object
-
#init ⇒ Object
-
#initialize(client, target, ignore_https_errors) ⇒ Page
constructor
-
#keyboard(&block) ⇒ Object
-
#main_frame ⇒ Object
-
#metrics ⇒ Object
-
#offline_mode=(enabled) ⇒ Object
-
#on(event_name, &block) ⇒ Object
-
#once(event_name, &block) ⇒ Object
-
#pdf(options = {}) ⇒ String
-
#query_objects(prototype_handle) ⇒ !Promise<!Puppeteer.JSHandle>
-
#query_selector(selector) ⇒ !Promise<?Puppeteer.ElementHandle>
(also: #S)
-
#query_selector_all(selector) ⇒ !Promise<!Array<!Puppeteer.ElementHandle>>
(also: #SS)
-
#reload(timeout: nil, wait_until: nil) ⇒ Puppeteer::Response
-
#request_interception=(value) ⇒ Object
-
#screenshot(type: nil, path: nil, full_page: nil, clip: nil, quality: nil, omit_background: nil, encoding: nil) ⇒ Object
-
#select(selector, *values) ⇒ !Promise<!Array<string>>
-
#set_content(html, timeout: nil, wait_until: nil) ⇒ Object
-
#set_cookie(*cookies) ⇒ Object
-
#Sx(expression) ⇒ !Promise<!Array<!Puppeteer.ElementHandle>>
-
#tap(selector: nil, &block) ⇒ Object
-
#title ⇒ String
-
#type_text(selector, text, delay: nil) ⇒ Object
-
#url ⇒ String
-
#user_agent=(user_agent) ⇒ Object
-
#wait_for_file_chooser(timeout: nil) ⇒ Puppeteer::FileChooser
-
#wait_for_function(page_function, args: [], polling: nil, timeout: nil) ⇒ Puppeteer::JSHandle
-
#wait_for_navigation(timeout: nil, wait_until: nil) ⇒ Object
-
#wait_for_request(url: nil, predicate: nil, timeout: nil) ⇒ Object
-
#wait_for_response(url: nil, predicate: nil, timeout: nil) ⇒ Object
-
#wait_for_selector(selector, visible: nil, hidden: nil, timeout: nil) ⇒ Object
-
#wait_for_timeout(milliseconds) ⇒ Object
-
#wait_for_xpath(xpath, visible: nil, hidden: nil, timeout: nil) ⇒ Object
-
#workers ⇒ Object
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(client, target, ignore_https_errors) ⇒ Page
Returns a new instance of Page.
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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
|
# File 'lib/puppeteer/page.rb', line 33
def initialize(client, target, ignore_https_errors)
@closed = false
@client = client
@target = target
@keyboard = Puppeteer::Keyboard.new(client)
@mouse = Puppeteer::Mouse.new(client, @keyboard)
@timeout_settings = Puppeteer::TimeoutSettings.new
@touchscreen = Puppeteer::TouchScreen.new(client, @keyboard)
@frame_manager = Puppeteer::FrameManager.new(client, self, ignore_https_errors, @timeout_settings)
@emulation_manager = Puppeteer::EmulationManager.new(client)
@tracing = Puppeteer::Tracing.new(client)
@page_bindings = {}
@coverage = Puppeteer::Coverage.new(client)
@javascript_enabled = true
@screenshot_task_queue = ScreenshotTaskQueue.new
@workers = {}
@user_drag_interception_enabled = false
@client.on_event('Target.attachedToTarget') do |event|
if event['targetInfo']['type'] != 'worker'
@client.async_send_message('Target.detachFromTarget', sessionId: event['sessionId'])
next
end
session = Puppeteer::Connection.from_session(@client).session(event['sessionId'])
end
@client.on_event('Target.detachedFromTarget') do |event|
session_id = event['sessionId']
worker = @workers[session_id]
next unless worker
emit_event(PageEmittedEvents::WorkerDestroyed, worker)
@workers.delete(session_id)
end
@frame_manager.on_event(FrameManagerEmittedEvents::FrameAttached) do |event|
emit_event(PageEmittedEvents::FrameAttached, event)
end
@frame_manager.on_event(FrameManagerEmittedEvents::FrameDetached) do |event|
emit_event(PageEmittedEvents::FrameDetached, event)
end
@frame_manager.on_event(FrameManagerEmittedEvents::FrameNavigated) do |event|
emit_event(PageEmittedEvents::FrameNavigated, event)
end
network_manager = @frame_manager.network_manager
network_manager.on_event(NetworkManagerEmittedEvents::Request) do |event|
emit_event(PageEmittedEvents::Request, event)
end
network_manager.on_event(NetworkManagerEmittedEvents::Response) do |event|
emit_event(PageEmittedEvents::Response, event)
end
network_manager.on_event(NetworkManagerEmittedEvents::RequestFailed) do |event|
emit_event(PageEmittedEvents::RequestFailed, event)
end
network_manager.on_event(NetworkManagerEmittedEvents::RequestFinished) do |event|
emit_event(PageEmittedEvents::RequestFinished, event)
end
@file_chooser_interception_is_disabled = false
@file_chooser_interceptors = Set.new
@client.on_event('Page.domContentEventFired') do |event|
emit_event(PageEmittedEvents::DOMContentLoaded)
end
@client.on_event('Page.loadEventFired') do |event|
emit_event(PageEmittedEvents::Load)
end
@client.on('Runtime.consoleAPICalled') do |event|
handle_console_api(event)
end
@client.on('Runtime.bindingCalled') do |event|
handle_binding_called(event)
end
@client.on_event('Page.javascriptDialogOpening') do |event|
handle_dialog_opening(event)
end
@client.on_event('Runtime.exceptionThrown') do |exception|
handle_exception(exception['exceptionDetails'])
end
@client.on_event('Inspector.targetCrashed') do |event|
handle_target_crashed
end
@client.on_event('Performance.metrics') do |event|
emit_event(PageEmittedEvents::Metrics, MetricsEvent.new(event))
end
@client.on_event('Log.entryAdded') do |event|
handle_log_entry_added(event)
end
@client.on_event('Page.fileChooserOpened') do |event|
handle_file_chooser(event)
end
@target.is_closed_promise.then do
emit_event(PageEmittedEvents::Close)
@closed = true
end
end
|
Instance Attribute Details
#accessibility ⇒ Object
Returns the value of attribute accessibility.
261
262
263
|
# File 'lib/puppeteer/page.rb', line 261
def accessibility
@accessibility
end
|
#coverage ⇒ Object
Returns the value of attribute coverage.
261
262
263
|
# File 'lib/puppeteer/page.rb', line 261
def coverage
@coverage
end
|
#javascript_enabled ⇒ Object
Also known as:
javascript_enabled?
Returns the value of attribute javascript_enabled.
217
218
219
|
# File 'lib/puppeteer/page.rb', line 217
def javascript_enabled
@javascript_enabled
end
|
#mouse ⇒ Object
Returns the value of attribute mouse.
1137
1138
1139
|
# File 'lib/puppeteer/page.rb', line 1137
def mouse
@mouse
end
|
#target ⇒ Object
Returns the value of attribute target.
217
218
219
|
# File 'lib/puppeteer/page.rb', line 217
def target
@target
end
|
#touch_screen ⇒ Object
Returns the value of attribute touch_screen.
261
262
263
|
# File 'lib/puppeteer/page.rb', line 261
def touch_screen
@touch_screen
end
|
#tracing ⇒ Object
Returns the value of attribute tracing.
261
262
263
|
# File 'lib/puppeteer/page.rb', line 261
def tracing
@tracing
end
|
#viewport ⇒ Object
Returns the value of attribute viewport.
912
913
914
|
# File 'lib/puppeteer/page.rb', line 912
def viewport
@viewport
end
|
Class Method Details
.create(client, target, ignore_https_errors, default_viewport) ⇒ !Promise<!Page>
21
22
23
24
25
26
27
28
|
# File 'lib/puppeteer/page.rb', line 21
def self.create(client, target, ignore_https_errors, default_viewport)
page = Puppeteer::Page.new(client, target, ignore_https_errors)
page.init
if default_viewport
page.viewport = default_viewport
end
page
end
|
Instance Method Details
#add_script_tag(url: nil, path: nil, content: nil, type: nil, id: nil) ⇒ Object
408
409
410
|
# File 'lib/puppeteer/page.rb', line 408
def add_script_tag(url: nil, path: nil, content: nil, type: nil, id: nil)
main_frame.add_script_tag(url: url, path: path, content: content, type: type, id: id)
end
|
#add_style_tag(url: nil, path: nil, content: nil) ⇒ Object
415
416
417
|
# File 'lib/puppeteer/page.rb', line 415
def add_style_tag(url: nil, path: nil, content: nil)
main_frame.add_style_tag(url: url, path: path, content: content)
end
|
#async_wait_for_navigation(timeout: nil, wait_until: nil) ⇒ Object
685
|
# File 'lib/puppeteer/page.rb', line 685
define_async_method :async_wait_for_navigation
|
#async_wait_for_request(url: nil, predicate: nil, timeout: nil) ⇒ Object
Waits until request URL matches or request matches the given predicate.
Waits until request URL matches
wait_for_request(url: 'https://example.com/awesome')
Waits until request matches the given predicate
wait_for_request(predicate: -> (req){ req.url.start_with?('https://example.com/search') })
755
|
# File 'lib/puppeteer/page.rb', line 755
define_async_method :async_wait_for_request
|
#async_wait_for_response(url: nil, predicate: nil, timeout: nil) ⇒ Object
781
|
# File 'lib/puppeteer/page.rb', line 781
define_async_method :async_wait_for_response
|
#authenticate(username: nil, password: nil) ⇒ Object
498
499
500
|
# File 'lib/puppeteer/page.rb', line 498
def authenticate(username: nil, password: nil)
@frame_manager.network_manager.authenticate(username: username, password: password)
end
|
#bring_to_front ⇒ Object
Brings page to front (activates tab).
807
808
809
|
# File 'lib/puppeteer/page.rb', line 807
def bring_to_front
@client.send_message('Page.bringToFront')
end
|
#browser ⇒ Object
220
221
222
|
# File 'lib/puppeteer/page.rb', line 220
def browser
@target.browser
end
|
#browser_context ⇒ Object
224
225
226
|
# File 'lib/puppeteer/page.rb', line 224
def browser_context
@target.browser_context
end
|
#bypass_csp=(enabled) ⇒ Object
825
826
827
|
# File 'lib/puppeteer/page.rb', line 825
def bypass_csp=(enabled)
@client.send_message('Page.setBypassCSP', enabled: enabled)
end
|
#cache_enabled=(enabled) ⇒ Object
960
961
962
|
# File 'lib/puppeteer/page.rb', line 960
def cache_enabled=(enabled)
@frame_manager.network_manager.cache_enabled = enabled
end
|
#click(selector, delay: nil, button: nil, click_count: nil) ⇒ Object
1143
1144
1145
|
# File 'lib/puppeteer/page.rb', line 1143
def click(selector, delay: nil, button: nil, click_count: nil)
main_frame.click(selector, delay: delay, button: button, click_count: click_count)
end
|
#close(run_before_unload: false) ⇒ Object
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
|
# File 'lib/puppeteer/page.rb', line 1113
def close(run_before_unload: false)
unless @client.connection
raise 'Protocol error: Connection closed. Most likely the page has been closed.'
end
if run_before_unload
@client.send_message('Page.close')
else
@client.connection.send_message('Target.closeTarget', targetId: @target.target_id)
await @target.is_closed_promise
25.times do
break if @closed
sleep 0.004
end
end
end
|
#closed? ⇒ boolean
1133
1134
1135
|
# File 'lib/puppeteer/page.rb', line 1133
def closed?
@closed
end
|
#content ⇒ String
644
645
646
|
# File 'lib/puppeteer/page.rb', line 644
def content
main_frame.content
end
|
#content=(html) ⇒ Object
656
657
658
|
# File 'lib/puppeteer/page.rb', line 656
def content=(html)
main_frame.set_content(html)
end
|
#cookies(*urls) ⇒ Array<Hash>
375
376
377
|
# File 'lib/puppeteer/page.rb', line 375
def cookies(*urls)
@client.send_message('Network.getCookies', urls: (urls.empty? ? [url] : urls))['cookies']
end
|
#create_pdf_stream(options = {}) ⇒ Enumerable<String>
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
|
# File 'lib/puppeteer/page.rb', line 1062
def create_pdf_stream(options = {})
timeout_helper = Puppeteer::TimeoutHelper.new('Page.printToPDF',
timeout_ms: options[:timeout],
default_timeout_ms: 30000)
pdf_options = PDFOptions.new(options)
omit_background = options[:omit_background]
set_transparent_background_color if omit_background
result =
begin
timeout_helper.with_timeout do
@client.send_message('Page.printToPDF', pdf_options.page_print_args)
end
ensure
reset_default_background_color if omit_background
end
Puppeteer::ProtocolStreamReader.new(
client: @client,
handle: result['stream'],
).read_as_chunks
end
|
#default_navigation_timeout=(timeout) ⇒ Object
297
298
299
|
# File 'lib/puppeteer/page.rb', line 297
def default_navigation_timeout=(timeout)
@timeout_settings.default_navigation_timeout = timeout
end
|
#default_timeout=(timeout) ⇒ Object
302
303
304
|
# File 'lib/puppeteer/page.rb', line 302
def default_timeout=(timeout)
@timeout_settings.default_timeout = timeout
end
|
#delete_cookie(*cookies) ⇒ Object
379
380
381
382
383
384
385
386
|
# File 'lib/puppeteer/page.rb', line 379
def delete_cookie(*cookies)
page_url = url
starts_with_http = page_url.start_with?("http")
cookies.each do |cookie|
item = (starts_with_http ? { url: page_url } : {}).merge(cookie)
@client.send_message("Network.deleteCookies", item)
end
end
|
#drag_interception_enabled=(enabled) ⇒ Object
282
283
284
285
|
# File 'lib/puppeteer/page.rb', line 282
def drag_interception_enabled=(enabled)
@user_drag_interception_enabled = enabled
@client.send_message('Input.setInterceptDrags', enabled: enabled)
end
|
#drag_interception_enabled? ⇒ Boolean
Also known as:
drag_interception_enabled
145
146
147
|
# File 'lib/puppeteer/page.rb', line 145
def drag_interception_enabled?
@user_drag_interception_enabled
end
|
#emulate(device) ⇒ Object
812
813
814
815
|
# File 'lib/puppeteer/page.rb', line 812
def emulate(device)
self.viewport = device.viewport
self.user_agent = device.user_agent
end
|
#emulate_cpu_throttling(factor) ⇒ Object
839
840
841
842
843
844
845
|
# File 'lib/puppeteer/page.rb', line 839
def emulate_cpu_throttling(factor)
if factor.nil? || factor >= 1
@client.send_message('Emulation.setCPUThrottlingRate', rate: factor || 1)
else
raise ArgumentError.new('Throttling rate should be greater or equal to 1')
end
end
|
#emulate_idle_state(is_user_active: nil, is_screen_unlocked: nil) ⇒ Object
892
893
894
895
896
897
898
899
900
901
902
903
|
# File 'lib/puppeteer/page.rb', line 892
def emulate_idle_state(is_user_active: nil, is_screen_unlocked: nil)
overrides = {
isUserActive: is_user_active,
isScreenUnlocked: is_screen_unlocked,
}.compact
if overrides.empty?
@client.send_message('Emulation.clearIdleOverride')
else
@client.send_message('Emulation.setIdleOverride', overrides)
end
end
|
848
849
850
851
852
853
854
855
856
857
858
859
860
|
# File 'lib/puppeteer/page.rb', line 848
def emulate_media_features(features)
if features.nil?
@client.send_message('Emulation.setEmulatedMedia', features: nil)
elsif features.is_a?(Array)
features.each do |media_feature|
name = media_feature[:name]
unless /^(?:prefers-(?:color-scheme|reduced-motion)|color-gamut)$/.match?(name)
raise ArgumentError.new("Unsupported media feature: #{name}")
end
end
@client.send_message('Emulation.setEmulatedMedia', features: features)
end
end
|
830
831
832
833
834
835
836
|
# File 'lib/puppeteer/page.rb', line 830
def emulate_media_type(media_type)
media_type_str = media_type.to_s
unless ['screen', 'print', ''].include?(media_type_str)
raise ArgumentError.new("Unsupported media type: #{media_type}")
end
@client.send_message('Emulation.setEmulatedMedia', media: media_type_str)
end
|
#emulate_network_conditions(network_condition) ⇒ Object
292
293
294
|
# File 'lib/puppeteer/page.rb', line 292
def emulate_network_conditions(network_condition)
@frame_manager.network_manager.emulate_network_conditions(network_condition)
end
|
#emulate_timezone(timezone_id) ⇒ Object
863
864
865
866
867
868
869
870
871
|
# File 'lib/puppeteer/page.rb', line 863
def emulate_timezone(timezone_id)
@client.send_message('Emulation.setTimezoneOverride', timezoneId: timezone_id || '')
rescue => err
if err.message.include?('Invalid timezone')
raise ArgumentError.new("Invalid timezone ID: #{timezone_id}")
else
raise err
end
end
|
#emulate_vision_deficiency(vision_deficiency_type) ⇒ Object
882
883
884
885
886
887
888
|
# File 'lib/puppeteer/page.rb', line 882
def emulate_vision_deficiency(vision_deficiency_type)
value = vision_deficiency_type || 'none'
unless VISION_DEFICIENCY_TYPES.include?(value)
raise ArgumentError.new("Unsupported vision deficiency: #{vision_deficiency_type}")
end
@client.send_message('Emulation.setEmulatedVisionDeficiency', type: value)
end
|
#eval_on_selector(selector, page_function, *args) ⇒ Object
Also known as:
Seval
347
348
349
|
# File 'lib/puppeteer/page.rb', line 347
def eval_on_selector(selector, page_function, *args)
main_frame.eval_on_selector(selector, page_function, *args)
end
|
#eval_on_selector_all(selector, page_function, *args) ⇒ Object
Also known as:
SSeval
‘$$eval()` in JavaScript.
358
359
360
|
# File 'lib/puppeteer/page.rb', line 358
def eval_on_selector_all(selector, page_function, *args)
main_frame.eval_on_selector_all(selector, page_function, *args)
end
|
#evaluate(page_function, *args) ⇒ !Promise<*>
917
918
919
|
# File 'lib/puppeteer/page.rb', line 917
def evaluate(page_function, *args)
main_frame.evaluate(page_function, *args)
end
|
#evaluate_handle(page_function, *args) ⇒ !Promise<!Puppeteer.JSHandle>
329
330
331
332
|
# File 'lib/puppeteer/page.rb', line 329
def evaluate_handle(page_function, *args)
context = main_frame.execution_context
context.evaluate_handle(page_function, *args)
end
|
#evaluate_on_new_document(page_function, *args) ⇒ Object
948
949
950
951
952
953
954
955
956
957
|
# File 'lib/puppeteer/page.rb', line 948
def evaluate_on_new_document(page_function, *args)
source =
if ['=>', 'async', 'function'].any? { |keyword| page_function.include?(keyword) }
JavaScriptFunction.new(page_function, args).source
else
JavaScriptExpression.new(page_function).source
end
@client.send_message('Page.addScriptToEvaluateOnNewDocument', source: source)
end
|
#expose_function(name, puppeteer_function) ⇒ Object
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
|
# File 'lib/puppeteer/page.rb', line 421
def expose_function(name, puppeteer_function)
if @page_bindings[name]
raise ArgumentError.new("Failed to add page binding with name `#{name}` already exists!")
end
@page_bindings[name] = puppeteer_function
add_page_binding = " function (type, bindingName) {\n /* Cast window to any here as we're about to add properties to it\n * via win[bindingName] which TypeScript doesn't like.\n */\n const win = window;\n const binding = win[bindingName];\n\n win[bindingName] = (...args) => {\n const me = window[bindingName];\n let callbacks = me.callbacks;\n if (!callbacks) {\n callbacks = new Map();\n me.callbacks = callbacks;\n }\n const seq = (me.lastSeq || 0) + 1;\n me.lastSeq = seq;\n const promise = new Promise((resolve, reject) =>\n callbacks.set(seq, { resolve, reject })\n );\n binding(JSON.stringify({ type, name: bindingName, seq, args }));\n return promise;\n };\n }\n JAVASCRIPT\n\n source = JavaScriptFunction.new(add_page_binding, ['exposedFun', name]).source\n @client.send_message('Runtime.addBinding', name: name)\n @client.send_message('Page.addScriptToEvaluateOnNewDocument', source: source)\n\n promises = @frame_manager.frames.map do |frame|\n frame.async_evaluate(\"() => \#{source}\")\n end\n await_all(*promises)\n\n nil\nend\n"
|
503
504
505
|
# File 'lib/puppeteer/page.rb', line 503
def ()
@frame_manager.network_manager. =
end
|
#focus(selector) ⇒ Object
1150
1151
1152
|
# File 'lib/puppeteer/page.rb', line 1150
def focus(selector)
main_frame.focus(selector)
end
|
#frames ⇒ Object
269
270
271
|
# File 'lib/puppeteer/page.rb', line 269
def frames
@frame_manager.frames
end
|
#geolocation=(geolocation) ⇒ Object
213
214
215
|
# File 'lib/puppeteer/page.rb', line 213
def geolocation=(geolocation)
@client.send_message('Emulation.setGeolocationOverride', geolocation.to_h)
end
|
#go_back(timeout: nil, wait_until: nil) ⇒ Object
785
786
787
|
# File 'lib/puppeteer/page.rb', line 785
def go_back(timeout: nil, wait_until: nil)
go(-1, timeout: timeout, wait_until: wait_until)
end
|
#go_forward(timeout: nil, wait_until: nil) ⇒ Object
791
792
793
|
# File 'lib/puppeteer/page.rb', line 791
def go_forward(timeout: nil, wait_until: nil)
go(+1, timeout: timeout, wait_until: wait_until)
end
|
#goto(url, referer: nil, timeout: nil, wait_until: nil) ⇒ Object
664
665
666
|
# File 'lib/puppeteer/page.rb', line 664
def goto(url, referer: nil, timeout: nil, wait_until: nil)
main_frame.goto(url, referer: referer, timeout: timeout, wait_until: wait_until)
end
|
#handle_binding_called(event) ⇒ Object
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
|
# File 'lib/puppeteer/page.rb', line 552
def handle_binding_called(event)
execution_context_id = event['executionContextId']
payload =
begin
JSON.parse(event['payload'])
rescue
return
end
name = payload['name']
seq = payload['seq']
args = payload['args']
if payload['type'] != 'exposedFun' || !@page_bindings[name]
return
end
expression =
begin
result = @page_bindings[name].call(*args)
deliver_result = " function (name, seq, result) {\n window[name].callbacks.get(seq).resolve(result);\n window[name].callbacks.delete(seq);\n }\n JAVASCRIPT\n\n JavaScriptFunction.new(deliver_result, [name, seq, result]).source\n rescue => err\n deliver_error = <<~JAVASCRIPT\n function (name, seq, message) {\n const error = new Error(message);\n window[name].callbacks.get(seq).reject(error);\n window[name].callbacks.delete(seq);\n }\n JAVASCRIPT\n JavaScriptFunction.new(deliver_error, [name, seq, err.message]).source\n end\n\n @client.async_send_message('Runtime.evaluate', expression: expression, contextId: execution_context_id).rescue do |error|\n debug_puts(error)\n end\nend\n"
|
#handle_file_chooser(event) ⇒ Object
168
169
170
171
172
173
174
175
176
177
178
179
180
|
# File 'lib/puppeteer/page.rb', line 168
def handle_file_chooser(event)
return if @file_chooser_interceptors.empty?
frame = @frame_manager.frame(event['frameId'])
context = frame.execution_context
element = context.adopt_backend_node_id(event['backendNodeId'])
interceptors = @file_chooser_interceptors.to_a
@file_chooser_interceptors.clear
file_chooser = Puppeteer::FileChooser.new(element, event)
interceptors.each do |promise|
promise.fulfill(file_chooser)
end
end
|
#hover(selector) ⇒ Object
1157
1158
1159
|
# File 'lib/puppeteer/page.rb', line 1157
def hover(selector)
main_frame.hover(selector)
end
|
#init ⇒ Object
136
137
138
139
140
141
142
143
|
# File 'lib/puppeteer/page.rb', line 136
def init
await_all(
@frame_manager.async_init,
@client.async_send_message('Target.setAutoAttach', autoAttach: true, waitForDebuggerOnStart: false, flatten: true),
@client.async_send_message('Performance.enable'),
@client.async_send_message('Log.enable'),
)
end
|
#keyboard(&block) ⇒ Object
263
264
265
266
267
|
# File 'lib/puppeteer/page.rb', line 263
def keyboard(&block)
@keyboard.instance_eval(&block) unless block.nil?
@keyboard
end
|
#main_frame ⇒ Object
257
258
259
|
# File 'lib/puppeteer/page.rb', line 257
def main_frame
@frame_manager.main_frame
end
|
#metrics ⇒ Object
512
513
514
515
|
# File 'lib/puppeteer/page.rb', line 512
def metrics
response = @client.send_message('Performance.getMetrics')
Metrics.new(response['metrics'])
end
|
#offline_mode=(enabled) ⇒ Object
287
288
289
|
# File 'lib/puppeteer/page.rb', line 287
def offline_mode=(enabled)
@frame_manager.network_manager.offline_mode = enabled
end
|
#on(event_name, &block) ⇒ Object
151
152
153
154
155
156
157
|
# File 'lib/puppeteer/page.rb', line 151
def on(event_name, &block)
unless PageEmittedEvents.values.include?(event_name.to_s)
raise ArgumentError.new("Unknown event name: #{event_name}. Known events are #{PageEmittedEvents.values.to_a.join(", ")}")
end
super(event_name.to_s, &block)
end
|
#once(event_name, &block) ⇒ Object
160
161
162
163
164
165
166
|
# File 'lib/puppeteer/page.rb', line 160
def once(event_name, &block)
unless PageEmittedEvents.values.include?(event_name.to_s)
raise ArgumentError.new("Unknown event name: #{event_name}. Known events are #{PageEmittedEvents.values.to_a.join(", ")}")
end
super(event_name.to_s, &block)
end
|
#pdf(options = {}) ⇒ String
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
|
# File 'lib/puppeteer/page.rb', line 1085
def pdf(options = {})
chunks = create_pdf_stream(options)
StringIO.open do |stringio|
if options[:path]
File.open(options[:path], 'wb') do |f|
chunks.each do |chunk|
f.write(chunk)
stringio.write(chunk)
end
end
else
chunks.each do |chunk|
stringio.write(chunk)
end
end
stringio.string
end
rescue => err
if err.message.include?('PrintToPDF is not implemented')
raise PrintToPdfIsNotImplementedError.new
else
raise
end
end
|
#query_objects(prototype_handle) ⇒ !Promise<!Puppeteer.JSHandle>
338
339
340
341
|
# File 'lib/puppeteer/page.rb', line 338
def query_objects(prototype_handle)
context = main_frame.execution_context
context.query_objects(prototype_handle)
end
|
#query_selector(selector) ⇒ !Promise<?Puppeteer.ElementHandle>
Also known as:
S
309
310
311
|
# File 'lib/puppeteer/page.rb', line 309
def query_selector(selector)
main_frame.query_selector(selector)
end
|
#query_selector_all(selector) ⇒ !Promise<!Array<!Puppeteer.ElementHandle>>
Also known as:
SS
319
320
321
|
# File 'lib/puppeteer/page.rb', line 319
def query_selector_all(selector)
main_frame.query_selector_all(selector)
end
|
#reload(timeout: nil, wait_until: nil) ⇒ Puppeteer::Response
671
672
673
674
675
|
# File 'lib/puppeteer/page.rb', line 671
def reload(timeout: nil, wait_until: nil)
wait_for_navigation(timeout: timeout, wait_until: wait_until) do
@client.send_message('Page.reload')
end
end
|
#request_interception=(value) ⇒ Object
278
279
280
|
# File 'lib/puppeteer/page.rb', line 278
def request_interception=(value)
@frame_manager.network_manager.request_interception = value
end
|
#screenshot(type: nil, path: nil, full_page: nil, clip: nil, quality: nil, omit_background: nil, encoding: nil) ⇒ Object
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
|
# File 'lib/puppeteer/page.rb', line 976
def screenshot(type: nil, path: nil, full_page: nil, clip: nil, quality: nil, omit_background: nil, encoding: nil)
options = {
type: type,
path: path,
full_page: full_page,
clip: clip,
quality: quality,
omit_background: omit_background,
encoding: encoding,
}.compact
screenshot_options = ScreenshotOptions.new(options)
@screenshot_task_queue.post_task do
screenshot_task(screenshot_options.type, screenshot_options)
end
end
|
#select(selector, *values) ⇒ !Promise<!Array<string>>
1164
1165
1166
|
# File 'lib/puppeteer/page.rb', line 1164
def select(selector, *values)
main_frame.select(selector, *values)
end
|
#set_content(html, timeout: nil, wait_until: nil) ⇒ Object
651
652
653
|
# File 'lib/puppeteer/page.rb', line 651
def set_content(html, timeout: nil, wait_until: nil)
main_frame.set_content(html, timeout: timeout, wait_until: wait_until)
end
|
#set_cookie(*cookies) ⇒ Object
388
389
390
391
392
393
394
395
396
397
398
399
400
401
|
# File 'lib/puppeteer/page.rb', line 388
def set_cookie(*cookies)
page_url = url
starts_with_http = page_url.start_with?("http")
items = cookies.map do |cookie|
(starts_with_http ? { url: page_url } : {}).merge(cookie).tap do |item|
raise ArgumentError.new("Blank page can not have cookie \"#{item[:name]}\"") if item[:url] == "about:blank"
raise ArgumetnError.new("Data URL page can not have cookie \"#{item[:name]}\"") if item[:url]&.start_with?("data:")
end
end
delete_cookie(*items)
unless items.empty?
@client.send_message("Network.setCookies", cookies: items)
end
end
|
‘$x()` in JavaScript. $ is not allowed to use as a method name in Ruby.
368
369
370
|
# File 'lib/puppeteer/page.rb', line 368
def Sx(expression)
main_frame.Sx(expression)
end
|
#tap(selector: nil, &block) ⇒ Object
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
|
# File 'lib/puppeteer/page.rb', line 1171
def tap(selector: nil, &block)
if selector.nil? && block
super(&block)
else
main_frame.tap(selector)
end
end
|
#title ⇒ String
965
966
967
|
# File 'lib/puppeteer/page.rb', line 965
def title
main_frame.title
end
|
#type_text(selector, text, delay: nil) ⇒ Object
1191
1192
1193
|
# File 'lib/puppeteer/page.rb', line 1191
def type_text(selector, text, delay: nil)
main_frame.type_text(selector, text, delay: delay)
end
|
#url ⇒ String
639
640
641
|
# File 'lib/puppeteer/page.rb', line 639
def url
main_frame.url
end
|
#user_agent=(user_agent) ⇒ Object
508
509
510
|
# File 'lib/puppeteer/page.rb', line 508
def user_agent=(user_agent)
@frame_manager.network_manager.user_agent = user_agent
end
|
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
|
# File 'lib/puppeteer/page.rb', line 190
def wait_for_file_chooser(timeout: nil)
if @file_chooser_interceptors.empty?
@client.send_message('Page.setInterceptFileChooserDialog', enabled: true)
end
option_timeout = timeout || @timeout_settings.timeout
promise = resolvable_future
@file_chooser_interceptors << promise
begin
Timeout.timeout(option_timeout / 1000.0) do
promise.value!
end
rescue Timeout::Error
raise FileChooserTimeoutError.new(timeout: option_timeout)
ensure
@file_chooser_interceptors.delete(promise)
end
end
|
#wait_for_function(page_function, args: [], polling: nil, timeout: nil) ⇒ Puppeteer::JSHandle
1227
1228
1229
|
# File 'lib/puppeteer/page.rb', line 1227
def wait_for_function(page_function, args: [], polling: nil, timeout: nil)
main_frame.wait_for_function(page_function, args: args, polling: polling, timeout: timeout)
end
|
#wait_for_navigation(timeout: nil, wait_until: nil) ⇒ Object
677
678
679
|
# File 'lib/puppeteer/page.rb', line 677
def wait_for_navigation(timeout: nil, wait_until: nil)
main_frame.send(:wait_for_navigation, timeout: timeout, wait_until: wait_until)
end
|
#wait_for_request(url: nil, predicate: nil, timeout: nil) ⇒ Object
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
|
# File 'lib/puppeteer/page.rb', line 723
def wait_for_request(url: nil, predicate: nil, timeout: nil)
if !url && !predicate
raise ArgumentError.new('url or predicate must be specified')
end
if predicate && !predicate.is_a?(Proc)
raise ArgumentError.new('predicate must be a proc.')
end
request_predicate =
if url
-> (request) { request.url == url }
else
-> (request) { predicate.call(request) }
end
wait_for_network_manager_event(NetworkManagerEmittedEvents::Request,
predicate: request_predicate,
timeout: timeout,
)
end
|
#wait_for_response(url: nil, predicate: nil, timeout: nil) ⇒ Object
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
|
# File 'lib/puppeteer/page.rb', line 757
def wait_for_response(url: nil, predicate: nil, timeout: nil)
if !url && !predicate
raise ArgumentError.new('url or predicate must be specified')
end
if predicate && !predicate.is_a?(Proc)
raise ArgumentError.new('predicate must be a proc.')
end
response_predicate =
if url
-> (response) { response.url == url }
else
-> (response) { predicate.call(response) }
end
wait_for_network_manager_event(NetworkManagerEmittedEvents::Response,
predicate: response_predicate,
timeout: timeout,
)
end
|
#wait_for_selector(selector, visible: nil, hidden: nil, timeout: nil) ⇒ Object
1201
1202
1203
|
# File 'lib/puppeteer/page.rb', line 1201
def wait_for_selector(selector, visible: nil, hidden: nil, timeout: nil)
main_frame.wait_for_selector(selector, visible: visible, hidden: hidden, timeout: timeout)
end
|
#wait_for_timeout(milliseconds) ⇒ Object
1208
1209
1210
|
# File 'lib/puppeteer/page.rb', line 1208
def wait_for_timeout(milliseconds)
main_frame.wait_for_timeout(milliseconds)
end
|
#wait_for_xpath(xpath, visible: nil, hidden: nil, timeout: nil) ⇒ Object
1216
1217
1218
|
# File 'lib/puppeteer/page.rb', line 1216
def wait_for_xpath(xpath, visible: nil, hidden: nil, timeout: nil)
main_frame.wait_for_xpath(xpath, visible: visible, hidden: hidden, timeout: timeout)
end
|
#workers ⇒ Object
273
274
275
|
# File 'lib/puppeteer/page.rb', line 273
def workers
@workers.values
end
|