Class: Puppeteer::Page

Inherits:
Object
  • 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

Methods included from IfPresent

#if_present

Methods included from EventCallbackable

#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.

Parameters:



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)
  # @accessibility = Accessibility.new(client)
  @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'
      # If we don't detach from service workers, they will never die.
      @client.async_send_message('Target.detachFromTarget', sessionId: event['sessionId'])
      next
    end

    session = Puppeteer::Connection.from_session(@client).session(event['sessionId']) # rubocop:disable Lint/UselessAssignment
    #   const worker = new Worker(session, event.targetInfo.url, this._addConsoleMessage.bind(this), this._handleException.bind(this));
    #   this._workers.set(event.sessionId, worker);
    #   this.emit(PageEmittedEvents::WorkerCreated, worker);
  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

#accessibilityObject (readonly)

Returns the value of attribute accessibility.



261
262
263
# File 'lib/puppeteer/page.rb', line 261

def accessibility
  @accessibility
end

#coverageObject (readonly)

Returns the value of attribute coverage.



261
262
263
# File 'lib/puppeteer/page.rb', line 261

def coverage
  @coverage
end

#javascript_enabledObject 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

#mouseObject (readonly)

Returns the value of attribute mouse.



1127
1128
1129
# File 'lib/puppeteer/page.rb', line 1127

def mouse
  @mouse
end

#targetObject (readonly)

Returns the value of attribute target.



217
218
219
# File 'lib/puppeteer/page.rb', line 217

def target
  @target
end

#touch_screenObject (readonly)

Returns the value of attribute touch_screen.



261
262
263
# File 'lib/puppeteer/page.rb', line 261

def touch_screen
  @touch_screen
end

#tracingObject (readonly)

Returns the value of attribute tracing.



261
262
263
# File 'lib/puppeteer/page.rb', line 261

def tracing
  @tracing
end

#viewportObject

Returns the value of attribute viewport.



911
912
913
# File 'lib/puppeteer/page.rb', line 911

def viewport
  @viewport
end

Class Method Details

.create(client, target, ignore_https_errors, default_viewport) ⇒ !Promise<!Page>

Parameters:

Returns:



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) ⇒ Object

Parameters:

  • url (String?) (defaults to: nil)
  • path (String?) (defaults to: nil)
  • content (String?) (defaults to: nil)
  • type (String?) (defaults to: nil)


407
408
409
# File 'lib/puppeteer/page.rb', line 407

def add_script_tag(url: nil, path: nil, content: nil, type: nil)
  main_frame.add_script_tag(url: url, path: path, content: content, type: type)
end

#add_style_tag(url: nil, path: nil, content: nil) ⇒ Object

Parameters:

  • url (String?) (defaults to: nil)
  • path (String?) (defaults to: nil)
  • content (String?) (defaults to: nil)


414
415
416
# File 'lib/puppeteer/page.rb', line 414

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

Parameters:

  • timeout (number|nil) (defaults to: nil)
  • wait_until (string|nil) (defaults to: nil)

    ‘load’ | ‘domcontentloaded’ | ‘networkidle0’ | ‘networkidle2’



684
# File 'lib/puppeteer/page.rb', line 684

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') })

Parameters:

  • url (String) (defaults to: nil)
  • predicate (Proc(Puppeteer::Request -> Boolean) (defaults to: nil)

    ]



754
# File 'lib/puppeteer/page.rb', line 754

define_async_method :async_wait_for_request

#async_wait_for_response(url: nil, predicate: nil, timeout: nil) ⇒ Object

Parameters:

  • url (String) (defaults to: nil)
  • predicate (Proc(Puppeteer::Request -> Boolean) (defaults to: nil)

    ]



780
# File 'lib/puppeteer/page.rb', line 780

define_async_method :async_wait_for_response

#authenticate(username: nil, password: nil) ⇒ Object

Parameters:

  • username (String?) (defaults to: nil)
  • password (String?) (defaults to: nil)


497
498
499
# File 'lib/puppeteer/page.rb', line 497

def authenticate(username: nil, password: nil)
  @frame_manager.network_manager.authenticate(username: username, password: password)
end

#bring_to_frontObject

Brings page to front (activates tab).



806
807
808
# File 'lib/puppeteer/page.rb', line 806

def bring_to_front
  @client.send_message('Page.bringToFront')
end

#browserObject



220
221
222
# File 'lib/puppeteer/page.rb', line 220

def browser
  @target.browser
end

#browser_contextObject



224
225
226
# File 'lib/puppeteer/page.rb', line 224

def browser_context
  @target.browser_context
end

#bypass_csp=(enabled) ⇒ Object

Parameters:

  • enabled (Boolean)


824
825
826
# File 'lib/puppeteer/page.rb', line 824

def bypass_csp=(enabled)
  @client.send_message('Page.setBypassCSP', enabled: enabled)
end

#cache_enabled=(enabled) ⇒ Object

Parameters:

  • enabled (boolean)


959
960
961
# File 'lib/puppeteer/page.rb', line 959

def cache_enabled=(enabled)
  @frame_manager.network_manager.cache_enabled = enabled
end

#click(selector, delay: nil, button: nil, click_count: nil) ⇒ Object

Parameters:

  • selector (String)
  • delay (Number) (defaults to: nil)
  • button (String) (defaults to: nil)

    “left”|“right”|“middle”

  • click_count (Number) (defaults to: nil)


1133
1134
1135
# File 'lib/puppeteer/page.rb', line 1133

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

Parameters:

  • run_before_unload (Boolean) (defaults to: false)


1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
# File 'lib/puppeteer/page.rb', line 1103

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

    # @closed sometimes remains false, so wait for @closed = true with 100ms timeout.
    25.times do
      break if @closed
      sleep 0.004
    end
  end
end

#closed?boolean

Returns:

  • (boolean)


1123
1124
1125
# File 'lib/puppeteer/page.rb', line 1123

def closed?
  @closed
end

#contentString

Returns:

  • (String)


643
644
645
# File 'lib/puppeteer/page.rb', line 643

def content
  main_frame.content
end

#content=(html) ⇒ Object

Parameters:

  • html (String)


655
656
657
# File 'lib/puppeteer/page.rb', line 655

def content=(html)
  main_frame.set_content(html)
end

#cookies(*urls) ⇒ Array<Hash>

Returns:

  • (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>

Returns:

  • (Enumerable<String>)


1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
# File 'lib/puppeteer/page.rb', line 1061

def create_pdf_stream(options = {})
  pdf_options = PDFOptions.new(options)
  omit_background = options[:omit_background]
  set_transparent_background_color if omit_background
  result = @client.send_message('Page.printToPDF', pdf_options.page_print_args)
  reset_default_background_color if omit_background

  Puppeteer::ProtocolStreamReader.new(
    client: @client,
    handle: result['stream'],
  ).read_as_chunks
end

#default_navigation_timeout=(timeout) ⇒ Object

Parameters:

  • timeout (number)


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

Parameters:

  • timeout (number)


302
303
304
# File 'lib/puppeteer/page.rb', line 302

def default_timeout=(timeout)
  @timeout_settings.default_timeout = timeout
end


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

Returns:

  • (Boolean)


145
146
147
# File 'lib/puppeteer/page.rb', line 145

def drag_interception_enabled?
  @user_drag_interception_enabled
end

#emulate(device) ⇒ Object

Parameters:



811
812
813
814
# File 'lib/puppeteer/page.rb', line 811

def emulate(device)
  self.viewport = device.viewport
  self.user_agent = device.user_agent
end

#emulate_cpu_throttling(factor) ⇒ Object

Parameters:

  • factor (Number|nil)

    Factor at which the CPU will be throttled (2x, 2.5x. 3x, …). Passing ‘nil` disables cpu throttling.



838
839
840
841
842
843
844
# File 'lib/puppeteer/page.rb', line 838

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

Parameters:

  • is_user_active (Boolean) (defaults to: nil)
  • is_screen_unlocked (Boolean) (defaults to: nil)


891
892
893
894
895
896
897
898
899
900
901
902
# File 'lib/puppeteer/page.rb', line 891

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

#emulate_media_features(features) ⇒ Object

Parameters:

  • features (Array)


847
848
849
850
851
852
853
854
855
856
857
858
859
# File 'lib/puppeteer/page.rb', line 847

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

#emulate_media_type(media_type) ⇒ Object

Parameters:

  • media_type (String|Symbol|nil)

    either of (media, print, nil)



829
830
831
832
833
834
835
# File 'lib/puppeteer/page.rb', line 829

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

Parameters:



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

Parameters:

  • timezone_id (String?)


862
863
864
865
866
867
868
869
870
# File 'lib/puppeteer/page.rb', line 862

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



881
882
883
884
885
886
887
# File 'lib/puppeteer/page.rb', line 881

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

‘$eval()` in JavaScript.

Parameters:

  • selector (String)
  • page_function (String)

Returns:

  • (Object)


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.

Parameters:

  • selector (String)
  • page_function (String)

Returns:

  • (Object)


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<*>

Parameters:

  • pageFunction (Function|string)
  • args (!Array<*>)

Returns:

  • (!Promise<*>)


916
917
918
# File 'lib/puppeteer/page.rb', line 916

def evaluate(page_function, *args)
  main_frame.evaluate(page_function, *args)
end

#evaluate_handle(page_function, *args) ⇒ !Promise<!Puppeteer.JSHandle>

Parameters:

  • pageFunction (Function|string)
  • args (!Array<*>)

Returns:



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



947
948
949
950
951
952
953
954
955
956
# File 'lib/puppeteer/page.rb', line 947

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

Parameters:

  • name (String)
  • puppeteer_function (Proc)


420
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
# File 'lib/puppeteer/page.rb', line 420

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"

#extra_http_headers=(headers) ⇒ Object

Parameters:

  • headers (Hash)


502
503
504
# File 'lib/puppeteer/page.rb', line 502

def extra_http_headers=(headers)
  @frame_manager.network_manager.extra_http_headers = headers
end

#focus(selector) ⇒ Object

Parameters:

  • selector (string)


1140
1141
1142
# File 'lib/puppeteer/page.rb', line 1140

def focus(selector)
  main_frame.focus(selector)
end

#framesObject



269
270
271
# File 'lib/puppeteer/page.rb', line 269

def frames
  @frame_manager.frames
end

#geolocation=(geolocation) ⇒ Object

Parameters:



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

Parameters:

  • timeout (number|nil) (defaults to: nil)
  • wait_until (string|nil) (defaults to: nil)

    ‘load’ | ‘domcontentloaded’ | ‘networkidle0’ | ‘networkidle2’



784
785
786
# File 'lib/puppeteer/page.rb', line 784

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

Parameters:

  • timeout (number|nil) (defaults to: nil)
  • wait_until (string|nil) (defaults to: nil)

    ‘load’ | ‘domcontentloaded’ | ‘networkidle0’ | ‘networkidle2’



790
791
792
# File 'lib/puppeteer/page.rb', line 790

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

Parameters:

  • url (String)
  • rederer (String)
  • timeout (number|nil) (defaults to: nil)
  • wait_until (string|nil) (defaults to: nil)

    ‘load’ | ‘domcontentloaded’ | ‘networkidle0’ | ‘networkidle2’



663
664
665
# File 'lib/puppeteer/page.rb', line 663

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



551
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
# File 'lib/puppeteer/page.rb', line 551

def handle_binding_called(event)
  execution_context_id = event['executionContextId']
  payload =
    begin
      JSON.parse(event['payload'])
    rescue
      # The binding was either called by something in the page or it was
      # called before our wrapper was initialized.
      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

Parameters:

  • selector (string)


1147
1148
1149
# File 'lib/puppeteer/page.rb', line 1147

def hover(selector)
  main_frame.hover(selector)
end

#initObject



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_frameObject



257
258
259
# File 'lib/puppeteer/page.rb', line 257

def main_frame
  @frame_manager.main_frame
end

#metricsObject



511
512
513
514
# File 'lib/puppeteer/page.rb', line 511

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

Parameters:

  • event_name (Symbol)


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

Parameters:

  • event_name (Symbol)


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

Returns:

  • (String)


1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
# File 'lib/puppeteer/page.rb', line 1075

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>

Parameters:

Returns:



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

‘$()` in JavaScript.

Parameters:

  • selector (string)

Returns:



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

‘$$()` in JavaScript.

Parameters:

  • selector (string)

Returns:



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

Parameters:

  • timeout (number|nil) (defaults to: nil)
  • wait_until (string|nil) (defaults to: nil)

    ‘load’ | ‘domcontentloaded’ | ‘networkidle0’ | ‘networkidle2’

Returns:



670
671
672
673
674
# File 'lib/puppeteer/page.rb', line 670

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

Parameters:

  • value (Bool)


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

Parameters:

  • type (String) (defaults to: nil)

    “png”|“jpeg”

  • path (String) (defaults to: nil)
  • full_page (Boolean) (defaults to: nil)
  • clip (Hash) (defaults to: nil)
  • quality (Integer) (defaults to: nil)
  • omit_background (Boolean) (defaults to: nil)
  • encoding (String) (defaults to: nil)


975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
# File 'lib/puppeteer/page.rb', line 975

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>>

Parameters:

  • selector (string)
  • values (!Array<string>)

Returns:

  • (!Promise<!Array<string>>)


1154
1155
1156
# File 'lib/puppeteer/page.rb', line 1154

def select(selector, *values)
  main_frame.select(selector, *values)
end

#set_content(html, timeout: nil, wait_until: nil) ⇒ Object

Parameters:

  • html (String)
  • timeout (Integer) (defaults to: nil)
  • wait_until (String|Array<String>) (defaults to: nil)


650
651
652
# File 'lib/puppeteer/page.rb', line 650

def set_content(html, timeout: nil, wait_until: nil)
  main_frame.set_content(html, timeout: timeout, wait_until: wait_until)
end


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

#Sx(expression) ⇒ !Promise<!Array<!Puppeteer.ElementHandle>>

‘$x()` in JavaScript. $ is not allowed to use as a method name in Ruby.

Parameters:

  • expression (string)

Returns:



368
369
370
# File 'lib/puppeteer/page.rb', line 368

def Sx(expression)
  main_frame.Sx(expression)
end

#tap(selector: nil, &block) ⇒ Object

Parameters:

  • selector (String) (defaults to: nil)


1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
# File 'lib/puppeteer/page.rb', line 1161

def tap(selector: nil, &block)
  # resolves double meaning of tap.
  if selector.nil? && block
    # Original usage of Object#tap.
    #
    # browser.new_page.tap do |page|
    #   ...
    # end
    super(&block)
  else
    # Puppeteer's Page#tap.
    main_frame.tap(selector)
  end
end

#titleString

Returns:

  • (String)


964
965
966
# File 'lib/puppeteer/page.rb', line 964

def title
  main_frame.title
end

#type_text(selector, text, delay: nil) ⇒ Object

Parameters:

  • selector (String)
  • text (String)
  • delay (Number) (defaults to: nil)


1181
1182
1183
# File 'lib/puppeteer/page.rb', line 1181

def type_text(selector, text, delay: nil)
  main_frame.type_text(selector, text, delay: delay)
end

#urlString

Returns:

  • (String)


638
639
640
# File 'lib/puppeteer/page.rb', line 638

def url
  main_frame.url
end

#user_agent=(user_agent) ⇒ Object

Parameters:

  • user_agent (String)


507
508
509
# File 'lib/puppeteer/page.rb', line 507

def user_agent=(user_agent)
  @frame_manager.network_manager.user_agent = user_agent
end

#wait_for_file_chooser(timeout: nil) ⇒ Puppeteer::FileChooser

Parameters:

  • timeout (Integer) (defaults to: nil)

Returns:



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

Parameters:

  • page_function (String)
  • args (Integer|Array) (defaults to: [])
  • polling (String) (defaults to: nil)
  • timeout (Integer) (defaults to: nil)

Returns:



1217
1218
1219
# File 'lib/puppeteer/page.rb', line 1217

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



676
677
678
# File 'lib/puppeteer/page.rb', line 676

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



722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
# File 'lib/puppeteer/page.rb', line 722

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



756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
# File 'lib/puppeteer/page.rb', line 756

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

Parameters:

  • selector (String)
  • visible (Boolean) (defaults to: nil)

    Wait for element visible (not ‘display: none’ nor ‘visibility: hidden’) on true. default to false.

  • hidden (Boolean) (defaults to: nil)

    Wait for element invisible (‘display: none’ nor ‘visibility: hidden’) on true. default to false.

  • timeout (Integer) (defaults to: nil)


1191
1192
1193
# File 'lib/puppeteer/page.rb', line 1191

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

Parameters:

  • milliseconds (Integer)

    the number of milliseconds to wait.



1198
1199
1200
# File 'lib/puppeteer/page.rb', line 1198

def wait_for_timeout(milliseconds)
  main_frame.wait_for_timeout(milliseconds)
end

#wait_for_xpath(xpath, visible: nil, hidden: nil, timeout: nil) ⇒ Object

Parameters:

  • xpath (String)
  • visible (Boolean) (defaults to: nil)

    Wait for element visible (not ‘display: none’ nor ‘visibility: hidden’) on true. default to false.

  • hidden (Boolean) (defaults to: nil)

    Wait for element invisible (‘display: none’ nor ‘visibility: hidden’) on true. default to false.

  • timeout (Integer) (defaults to: nil)


1206
1207
1208
# File 'lib/puppeteer/page.rb', line 1206

def wait_for_xpath(xpath, visible: nil, hidden: nil, timeout: nil)
  main_frame.wait_for_xpath(xpath, visible: visible, hidden: hidden, timeout: timeout)
end

#workersObject



273
274
275
# File 'lib/puppeteer/page.rb', line 273

def workers
  @workers.values
end