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.



1137
1138
1139
# File 'lib/puppeteer/page.rb', line 1137

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.



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>

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, id: nil) ⇒ Object

Parameters:

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


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

Parameters:

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


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

Parameters:

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

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



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

Parameters:

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

    ]



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

Parameters:

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

    ]



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

define_async_method :async_wait_for_response

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

Parameters:

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


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_frontObject

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

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


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

Parameters:

  • enabled (boolean)


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

Parameters:

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

    “left”|“right”|“middle”

  • click_count (Number) (defaults to: nil)


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

Parameters:

  • run_before_unload (Boolean) (defaults to: false)


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

    # @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)


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

def closed?
  @closed
end

#contentString

Returns:

  • (String)


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

def content
  main_frame.content
end

#content=(html) ⇒ Object

Parameters:

  • html (String)


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

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


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

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:



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

Parameters:

  • factor (Number|nil)

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



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

Parameters:

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


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

#emulate_media_features(features) ⇒ Object

Parameters:

  • features (Array)


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

#emulate_media_type(media_type) ⇒ Object

Parameters:

  • media_type (String|Symbol|nil)

    either of (media, print, nil)



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

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


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

‘$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<*>)


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>

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



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

Parameters:

  • name (String)
  • puppeteer_function (Proc)


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"

#extra_http_headers=(headers) ⇒ Object

Parameters:

  • headers (Hash)


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

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

#focus(selector) ⇒ Object

Parameters:

  • selector (string)


1150
1151
1152
# File 'lib/puppeteer/page.rb', line 1150

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’



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

Parameters:

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

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



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

Parameters:

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

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



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


1157
1158
1159
# File 'lib/puppeteer/page.rb', line 1157

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



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

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)


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>

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:



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

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”|“webp”

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


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

Parameters:

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

Returns:

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

Parameters:

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


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


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)


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


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

def title
  main_frame.title
end

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

Parameters:

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


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

#urlString

Returns:

  • (String)


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

def url
  main_frame.url
end

#user_agent=(user_agent) ⇒ Object

Parameters:

  • user_agent (String)


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

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:



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

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)


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

Parameters:

  • milliseconds (Integer)

    the number of milliseconds to wait.



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

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)


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

#workersObject



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

def workers
  @workers.values
end