puppeteer-ruby 0.35.1 → 0.37.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +71 -45
- data/README.md +69 -0
- data/docs/api_coverage.md +55 -45
- data/lib/puppeteer/browser.rb +2 -8
- data/lib/puppeteer/browser_context.rb +1 -0
- data/lib/puppeteer/browser_runner.rb +1 -1
- data/lib/puppeteer/concurrent_ruby_utils.rb +2 -2
- data/lib/puppeteer/coverage.rb +11 -2
- data/lib/puppeteer/define_async_method.rb +1 -1
- data/lib/puppeteer/devices.rb +132 -0
- data/lib/puppeteer/dom_world.rb +10 -9
- data/lib/puppeteer/element_handle/offset.rb +28 -0
- data/lib/puppeteer/element_handle/point.rb +11 -0
- data/lib/puppeteer/element_handle.rb +68 -7
- data/lib/puppeteer/frame.rb +4 -3
- data/lib/puppeteer/frame_manager.rb +2 -2
- data/lib/puppeteer/{request.rb → http_request.rb} +150 -21
- data/lib/puppeteer/{response.rb → http_response.rb} +2 -2
- data/lib/puppeteer/js_coverage.rb +28 -7
- data/lib/puppeteer/launcher/launch_options.rb +3 -3
- data/lib/puppeteer/lifecycle_watcher.rb +2 -2
- data/lib/puppeteer/mouse.rb +54 -1
- data/lib/puppeteer/network_condition.rb +12 -0
- data/lib/puppeteer/network_conditions.rb +24 -0
- data/lib/puppeteer/network_manager.rb +64 -18
- data/lib/puppeteer/page/metrics.rb +49 -0
- data/lib/puppeteer/page/screenshot_options.rb +3 -1
- data/lib/puppeteer/page.rb +166 -134
- data/lib/puppeteer/puppeteer.rb +5 -0
- data/lib/puppeteer/timeout_helper.rb +22 -0
- data/lib/puppeteer/tracing.rb +6 -1
- data/lib/puppeteer/version.rb +1 -1
- data/lib/puppeteer/wait_task.rb +1 -1
- data/lib/puppeteer/web_socket.rb +1 -0
- data/lib/puppeteer.rb +17 -14
- data/puppeteer-ruby.gemspec +1 -1
- metadata +11 -6
data/lib/puppeteer/page.rb
CHANGED
@@ -2,11 +2,13 @@ require 'base64'
|
|
2
2
|
require 'json'
|
3
3
|
require "stringio"
|
4
4
|
|
5
|
+
require_relative './page/metrics'
|
5
6
|
require_relative './page/pdf_options'
|
6
7
|
require_relative './page/screenshot_options'
|
7
8
|
require_relative './page/screenshot_task_queue'
|
8
9
|
|
9
10
|
class Puppeteer::Page
|
11
|
+
include Puppeteer::DebugPrint
|
10
12
|
include Puppeteer::EventCallbackable
|
11
13
|
include Puppeteer::IfPresent
|
12
14
|
using Puppeteer::DefineAsyncMethod
|
@@ -46,6 +48,8 @@ class Puppeteer::Page
|
|
46
48
|
@screenshot_task_queue = ScreenshotTaskQueue.new
|
47
49
|
|
48
50
|
@workers = {}
|
51
|
+
@user_drag_interception_enabled = false
|
52
|
+
|
49
53
|
@client.on_event('Target.attachedToTarget') do |event|
|
50
54
|
if event['targetInfo']['type'] != 'worker'
|
51
55
|
# If we don't detach from service workers, they will never die.
|
@@ -102,7 +106,9 @@ class Puppeteer::Page
|
|
102
106
|
@client.on('Runtime.consoleAPICalled') do |event|
|
103
107
|
handle_console_api(event)
|
104
108
|
end
|
105
|
-
|
109
|
+
@client.on('Runtime.bindingCalled') do |event|
|
110
|
+
handle_binding_called(event)
|
111
|
+
end
|
106
112
|
@client.on_event('Page.javascriptDialogOpening') do |event|
|
107
113
|
handle_dialog_opening(event)
|
108
114
|
end
|
@@ -112,7 +118,9 @@ class Puppeteer::Page
|
|
112
118
|
@client.on_event('Inspector.targetCrashed') do |event|
|
113
119
|
handle_target_crashed
|
114
120
|
end
|
115
|
-
|
121
|
+
@client.on_event('Performance.metrics') do |event|
|
122
|
+
emit_event(PageEmittedEvents::Metrics, MetricsEvent.new(event))
|
123
|
+
end
|
116
124
|
@client.on_event('Log.entryAdded') do |event|
|
117
125
|
handle_log_entry_added(event)
|
118
126
|
end
|
@@ -134,12 +142,23 @@ class Puppeteer::Page
|
|
134
142
|
)
|
135
143
|
end
|
136
144
|
|
145
|
+
def drag_interception_enabled?
|
146
|
+
@user_drag_interception_enabled
|
147
|
+
end
|
148
|
+
alias_method :drag_interception_enabled, :drag_interception_enabled?
|
149
|
+
|
137
150
|
# @param event_name [Symbol]
|
138
151
|
def on(event_name, &block)
|
139
152
|
unless PageEmittedEvents.values.include?(event_name.to_s)
|
140
153
|
raise ArgumentError.new("Unknown event name: #{event_name}. Known events are #{PageEmittedEvents.values.to_a.join(", ")}")
|
141
154
|
end
|
142
155
|
|
156
|
+
if event_name.to_s == 'request'
|
157
|
+
super('request') do |req|
|
158
|
+
req.enqueue_intercept_action(-> { block.call(req) })
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
143
162
|
super(event_name.to_s, &block)
|
144
163
|
end
|
145
164
|
|
@@ -266,10 +285,20 @@ class Puppeteer::Page
|
|
266
285
|
@frame_manager.network_manager.request_interception = value
|
267
286
|
end
|
268
287
|
|
288
|
+
def drag_interception_enabled=(enabled)
|
289
|
+
@user_drag_interception_enabled = enabled
|
290
|
+
@client.send_message('Input.setInterceptDrags', enabled: enabled)
|
291
|
+
end
|
292
|
+
|
269
293
|
def offline_mode=(enabled)
|
270
294
|
@frame_manager.network_manager.offline_mode = enabled
|
271
295
|
end
|
272
296
|
|
297
|
+
# @param network_condition [Puppeteer::NetworkCondition|nil]
|
298
|
+
def emulate_network_conditions(network_condition)
|
299
|
+
@frame_manager.network_manager.emulate_network_conditions(network_condition)
|
300
|
+
end
|
301
|
+
|
273
302
|
# @param {number} timeout
|
274
303
|
def default_navigation_timeout=(timeout)
|
275
304
|
@timeout_settings.default_navigation_timeout = timeout
|
@@ -381,8 +410,9 @@ class Puppeteer::Page
|
|
381
410
|
# @param path [String?]
|
382
411
|
# @param content [String?]
|
383
412
|
# @param type [String?]
|
384
|
-
|
385
|
-
|
413
|
+
# @param id [String?]
|
414
|
+
def add_script_tag(url: nil, path: nil, content: nil, type: nil, id: nil)
|
415
|
+
main_frame.add_script_tag(url: url, path: path, content: content, type: type, id: id)
|
386
416
|
end
|
387
417
|
|
388
418
|
# @param url [String?]
|
@@ -392,37 +422,51 @@ class Puppeteer::Page
|
|
392
422
|
main_frame.add_style_tag(url: url, path: path, content: content)
|
393
423
|
end
|
394
424
|
|
395
|
-
#
|
396
|
-
#
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
425
|
+
# @param name [String]
|
426
|
+
# @param puppeteer_function [Proc]
|
427
|
+
def expose_function(name, puppeteer_function)
|
428
|
+
if @page_bindings[name]
|
429
|
+
raise ArgumentError.new("Failed to add page binding with name `#{name}` already exists!")
|
430
|
+
end
|
431
|
+
@page_bindings[name] = puppeteer_function
|
432
|
+
|
433
|
+
add_page_binding = <<~JAVASCRIPT
|
434
|
+
function (type, bindingName) {
|
435
|
+
/* Cast window to any here as we're about to add properties to it
|
436
|
+
* via win[bindingName] which TypeScript doesn't like.
|
437
|
+
*/
|
438
|
+
const win = window;
|
439
|
+
const binding = win[bindingName];
|
440
|
+
|
441
|
+
win[bindingName] = (...args) => {
|
442
|
+
const me = window[bindingName];
|
443
|
+
let callbacks = me.callbacks;
|
444
|
+
if (!callbacks) {
|
445
|
+
callbacks = new Map();
|
446
|
+
me.callbacks = callbacks;
|
447
|
+
}
|
448
|
+
const seq = (me.lastSeq || 0) + 1;
|
449
|
+
me.lastSeq = seq;
|
450
|
+
const promise = new Promise((resolve, reject) =>
|
451
|
+
callbacks.set(seq, { resolve, reject })
|
452
|
+
);
|
453
|
+
binding(JSON.stringify({ type, name: bindingName, seq, args }));
|
454
|
+
return promise;
|
455
|
+
};
|
456
|
+
}
|
457
|
+
JAVASCRIPT
|
458
|
+
|
459
|
+
source = JavaScriptFunction.new(add_page_binding, ['exposedFun', name]).source
|
460
|
+
@client.send_message('Runtime.addBinding', name: name)
|
461
|
+
@client.send_message('Page.addScriptToEvaluateOnNewDocument', source: source)
|
462
|
+
|
463
|
+
promises = @frame_manager.frames.map do |frame|
|
464
|
+
frame.async_evaluate("() => #{source}")
|
465
|
+
end
|
466
|
+
await_all(*promises)
|
467
|
+
|
468
|
+
nil
|
469
|
+
end
|
426
470
|
|
427
471
|
# @param username [String?]
|
428
472
|
# @param password [String?]
|
@@ -436,40 +480,16 @@ class Puppeteer::Page
|
|
436
480
|
end
|
437
481
|
|
438
482
|
# @param user_agent [String]
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
# }
|
450
|
-
|
451
|
-
# /**
|
452
|
-
# * @param {!Protocol.Performance.metricsPayload} event
|
453
|
-
# */
|
454
|
-
# _emitMetrics(event) {
|
455
|
-
# this.emit(PageEmittedEvents::Metrics, {
|
456
|
-
# title: event.title,
|
457
|
-
# metrics: this._buildMetricsObject(event.metrics)
|
458
|
-
# });
|
459
|
-
# }
|
460
|
-
|
461
|
-
# /**
|
462
|
-
# * @param {?Array<!Protocol.Performance.Metric>} metrics
|
463
|
-
# * @return {!Metrics}
|
464
|
-
# */
|
465
|
-
# _buildMetricsObject(metrics) {
|
466
|
-
# const result = {};
|
467
|
-
# for (const metric of metrics || []) {
|
468
|
-
# if (supportedMetrics.has(metric.name))
|
469
|
-
# result[metric.name] = metric.value;
|
470
|
-
# }
|
471
|
-
# return result;
|
472
|
-
# }
|
483
|
+
# @param user_agent_metadata [Hash]
|
484
|
+
def set_user_agent(user_agent, user_agent_metadata = nil)
|
485
|
+
@frame_manager.network_manager.set_user_agent(user_agent, user_agent_metadata)
|
486
|
+
end
|
487
|
+
alias_method :user_agent=, :set_user_agent
|
488
|
+
|
489
|
+
def metrics
|
490
|
+
response = @client.send_message('Performance.getMetrics')
|
491
|
+
Metrics.new(response['metrics'])
|
492
|
+
end
|
473
493
|
|
474
494
|
class PageError < StandardError ; end
|
475
495
|
|
@@ -506,56 +526,51 @@ class Puppeteer::Page
|
|
506
526
|
add_console_message(event['type'], values, event['stackTrace'])
|
507
527
|
end
|
508
528
|
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
# function deliverErrorValue(name, seq, value) {
|
555
|
-
# window[name]['callbacks'].get(seq).reject(value);
|
556
|
-
# window[name]['callbacks'].delete(seq);
|
557
|
-
# }
|
558
|
-
# }
|
529
|
+
def handle_binding_called(event)
|
530
|
+
execution_context_id = event['executionContextId']
|
531
|
+
payload =
|
532
|
+
begin
|
533
|
+
JSON.parse(event['payload'])
|
534
|
+
rescue
|
535
|
+
# The binding was either called by something in the page or it was
|
536
|
+
# called before our wrapper was initialized.
|
537
|
+
return
|
538
|
+
end
|
539
|
+
name = payload['name']
|
540
|
+
seq = payload['seq']
|
541
|
+
args = payload['args']
|
542
|
+
|
543
|
+
if payload['type'] != 'exposedFun' || !@page_bindings[name]
|
544
|
+
return
|
545
|
+
end
|
546
|
+
|
547
|
+
expression =
|
548
|
+
begin
|
549
|
+
result = @page_bindings[name].call(*args)
|
550
|
+
|
551
|
+
deliver_result = <<~JAVASCRIPT
|
552
|
+
function (name, seq, result) {
|
553
|
+
window[name].callbacks.get(seq).resolve(result);
|
554
|
+
window[name].callbacks.delete(seq);
|
555
|
+
}
|
556
|
+
JAVASCRIPT
|
557
|
+
|
558
|
+
JavaScriptFunction.new(deliver_result, [name, seq, result]).source
|
559
|
+
rescue => err
|
560
|
+
deliver_error = <<~JAVASCRIPT
|
561
|
+
function (name, seq, message) {
|
562
|
+
const error = new Error(message);
|
563
|
+
window[name].callbacks.get(seq).reject(error);
|
564
|
+
window[name].callbacks.delete(seq);
|
565
|
+
}
|
566
|
+
JAVASCRIPT
|
567
|
+
JavaScriptFunction.new(deliver_error, [name, seq, err.message]).source
|
568
|
+
end
|
569
|
+
|
570
|
+
@client.async_send_message('Runtime.evaluate', expression: expression, contextId: execution_context_id).rescue do |error|
|
571
|
+
debug_puts(error)
|
572
|
+
end
|
573
|
+
end
|
559
574
|
|
560
575
|
private def add_console_message(type, args, stack_trace)
|
561
576
|
text_tokens = args.map { |arg| arg.remote_object.value }
|
@@ -629,12 +644,11 @@ class Puppeteer::Page
|
|
629
644
|
|
630
645
|
# @param timeout [number|nil]
|
631
646
|
# @param wait_until [string|nil] 'load' | 'domcontentloaded' | 'networkidle0' | 'networkidle2'
|
632
|
-
# @return [Puppeteer::
|
647
|
+
# @return [Puppeteer::HTTPResponse]
|
633
648
|
def reload(timeout: nil, wait_until: nil)
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
).first
|
649
|
+
wait_for_navigation(timeout: timeout, wait_until: wait_until) do
|
650
|
+
@client.send_message('Page.reload')
|
651
|
+
end
|
638
652
|
end
|
639
653
|
|
640
654
|
def wait_for_navigation(timeout: nil, wait_until: nil)
|
@@ -660,11 +674,12 @@ class Puppeteer::Page
|
|
660
674
|
@wait_for_network_manager_event_listener_ids[event_name] =
|
661
675
|
@frame_manager.network_manager.add_event_listener(event_name) do |event_target|
|
662
676
|
if predicate.call(event_target)
|
663
|
-
promise.fulfill(
|
677
|
+
promise.fulfill(event_target)
|
664
678
|
end
|
665
679
|
end
|
666
680
|
|
667
681
|
begin
|
682
|
+
# Timeout.timeout(0) means "no limit" for timeout.
|
668
683
|
Timeout.timeout(option_timeout / 1000.0) do
|
669
684
|
await_any(promise, session_close_promise)
|
670
685
|
end
|
@@ -714,7 +729,7 @@ class Puppeteer::Page
|
|
714
729
|
# wait_for_request(predicate: -> (req){ req.url.start_with?('https://example.com/search') })
|
715
730
|
#
|
716
731
|
# @param url [String]
|
717
|
-
# @param predicate [Proc(Puppeteer::
|
732
|
+
# @param predicate [Proc(Puppeteer::HTTPRequest -> Boolean)]
|
718
733
|
define_async_method :async_wait_for_request
|
719
734
|
|
720
735
|
def wait_for_response(url: nil, predicate: nil, timeout: nil)
|
@@ -740,7 +755,7 @@ class Puppeteer::Page
|
|
740
755
|
# @!method async_wait_for_response(url: nil, predicate: nil, timeout: nil)
|
741
756
|
#
|
742
757
|
# @param url [String]
|
743
|
-
# @param predicate [Proc(Puppeteer::
|
758
|
+
# @param predicate [Proc(Puppeteer::HTTPRequest -> Boolean)]
|
744
759
|
define_async_method :async_wait_for_response
|
745
760
|
|
746
761
|
# @param timeout [number|nil]
|
@@ -760,10 +775,9 @@ class Puppeteer::Page
|
|
760
775
|
entries = history['entries']
|
761
776
|
index = history['currentIndex'] + delta
|
762
777
|
if_present(entries[index]) do |entry|
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
)
|
778
|
+
wait_for_navigation(timeout: timeout, wait_until: wait_until) do
|
779
|
+
@client.send_message('Page.navigateToHistoryEntry', entryId: entry['id'])
|
780
|
+
end
|
767
781
|
end
|
768
782
|
end
|
769
783
|
|
@@ -799,6 +813,15 @@ class Puppeteer::Page
|
|
799
813
|
@client.send_message('Emulation.setEmulatedMedia', media: media_type_str)
|
800
814
|
end
|
801
815
|
|
816
|
+
# @param factor [Number|nil] Factor at which the CPU will be throttled (2x, 2.5x. 3x, ...). Passing `nil` disables cpu throttling.
|
817
|
+
def emulate_cpu_throttling(factor)
|
818
|
+
if factor.nil? || factor >= 1
|
819
|
+
@client.send_message('Emulation.setCPUThrottlingRate', rate: factor || 1)
|
820
|
+
else
|
821
|
+
raise ArgumentError.new('Throttling rate should be greater or equal to 1')
|
822
|
+
end
|
823
|
+
end
|
824
|
+
|
802
825
|
# @param features [Array]
|
803
826
|
def emulate_media_features(features)
|
804
827
|
if features.nil?
|
@@ -921,7 +944,7 @@ class Puppeteer::Page
|
|
921
944
|
main_frame.title
|
922
945
|
end
|
923
946
|
|
924
|
-
# @param type [String] "png"|"jpeg"
|
947
|
+
# @param type [String] "png"|"jpeg"|"webp"
|
925
948
|
# @param path [String]
|
926
949
|
# @param full_page [Boolean]
|
927
950
|
# @param clip [Hash]
|
@@ -1015,11 +1038,20 @@ class Puppeteer::Page
|
|
1015
1038
|
|
1016
1039
|
# @return [Enumerable<String>]
|
1017
1040
|
def create_pdf_stream(options = {})
|
1041
|
+
timeout_helper = Puppeteer::TimeoutHelper.new('Page.printToPDF',
|
1042
|
+
timeout_ms: options[:timeout],
|
1043
|
+
default_timeout_ms: 30000)
|
1018
1044
|
pdf_options = PDFOptions.new(options)
|
1019
1045
|
omit_background = options[:omit_background]
|
1020
1046
|
set_transparent_background_color if omit_background
|
1021
|
-
result =
|
1022
|
-
|
1047
|
+
result =
|
1048
|
+
begin
|
1049
|
+
timeout_helper.with_timeout do
|
1050
|
+
@client.send_message('Page.printToPDF', pdf_options.page_print_args)
|
1051
|
+
end
|
1052
|
+
ensure
|
1053
|
+
reset_default_background_color if omit_background
|
1054
|
+
end
|
1023
1055
|
|
1024
1056
|
Puppeteer::ProtocolStreamReader.new(
|
1025
1057
|
client: @client,
|
data/lib/puppeteer/puppeteer.rb
CHANGED
@@ -149,6 +149,11 @@ class Puppeteer::Puppeteer
|
|
149
149
|
# # ???
|
150
150
|
# end
|
151
151
|
|
152
|
+
# @return [Puppeteer::NetworkConditions]
|
153
|
+
def network_conditions
|
154
|
+
Puppeteer::NetworkConditions
|
155
|
+
end
|
156
|
+
|
152
157
|
# @param args [Array<String>]
|
153
158
|
# @param user_data_dir [String]
|
154
159
|
# @param devtools [Boolean]
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'timeout'
|
2
|
+
|
3
|
+
class Puppeteer::TimeoutHelper
|
4
|
+
# @param timeout_ms [String|Integer|nil]
|
5
|
+
# @param default_timeout_ms [Integer]
|
6
|
+
def initialize(task_name, timeout_ms:, default_timeout_ms:)
|
7
|
+
@task_name = task_name
|
8
|
+
@timeout_ms = (timeout_ms || default_timeout_ms).to_i
|
9
|
+
end
|
10
|
+
|
11
|
+
def with_timeout(&block)
|
12
|
+
if @timeout_ms > 0
|
13
|
+
begin
|
14
|
+
Timeout.timeout(@timeout_ms / 1000.0, &block)
|
15
|
+
rescue Timeout::Error
|
16
|
+
raise Puppeteer::TimeoutError.new("waiting for #{@task_name} failed: timeout #{@timeout_ms}ms exceeded")
|
17
|
+
end
|
18
|
+
else
|
19
|
+
block.call
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/puppeteer/tracing.rb
CHANGED
@@ -27,11 +27,16 @@ class Puppeteer::Tracing
|
|
27
27
|
option_categories << 'disabled-by-default-devtools.screenshot'
|
28
28
|
end
|
29
29
|
|
30
|
+
ex_cat = option_categories.select { |cat| cat.start_with?('-') }.map { |cat| cat[1..-1] }
|
31
|
+
in_cat = option_categories.reject { |cat| cat.start_with?('-') }
|
30
32
|
@path = path
|
31
33
|
@recording = true
|
32
34
|
@client.send_message('Tracing.start',
|
33
35
|
transferMode: 'ReturnAsStream',
|
34
|
-
|
36
|
+
traceConfig: {
|
37
|
+
excludedCategories: ex_cat,
|
38
|
+
includedCategories: in_cat,
|
39
|
+
},
|
35
40
|
)
|
36
41
|
end
|
37
42
|
|
data/lib/puppeteer/version.rb
CHANGED
data/lib/puppeteer/wait_task.rb
CHANGED
@@ -37,7 +37,7 @@ class Puppeteer::WaitTask
|
|
37
37
|
|
38
38
|
# Since page navigation requires us to re-install the pageScript, we should track
|
39
39
|
# timeout on our end.
|
40
|
-
if timeout
|
40
|
+
if timeout && timeout > 0
|
41
41
|
timeout_error = TimeoutError.new(title: title, timeout: timeout)
|
42
42
|
Concurrent::Promises.schedule(timeout / 1000.0) { terminate(timeout_error) unless @timeout_cleared }
|
43
43
|
end
|
data/lib/puppeteer/web_socket.rb
CHANGED
@@ -55,6 +55,7 @@ class Puppeteer::WebSocket
|
|
55
55
|
def initialize(url:, max_payload_size:)
|
56
56
|
@impl = DriverImpl.new(url)
|
57
57
|
@driver = ::WebSocket::Driver.client(@impl, max_length: max_payload_size)
|
58
|
+
@driver.set_header('User-Agent', "Puppeteer #{Puppeteer::VERSION}")
|
58
59
|
|
59
60
|
setup
|
60
61
|
@driver.start
|
data/lib/puppeteer.rb
CHANGED
@@ -5,7 +5,6 @@ module Puppeteer; end
|
|
5
5
|
require 'puppeteer/env'
|
6
6
|
|
7
7
|
# Custom data types.
|
8
|
-
require 'puppeteer/device'
|
9
8
|
require 'puppeteer/events'
|
10
9
|
require 'puppeteer/errors'
|
11
10
|
require 'puppeteer/geolocation'
|
@@ -38,22 +37,24 @@ require 'puppeteer/execution_context'
|
|
38
37
|
require 'puppeteer/file_chooser'
|
39
38
|
require 'puppeteer/frame'
|
40
39
|
require 'puppeteer/frame_manager'
|
40
|
+
require 'puppeteer/http_request'
|
41
|
+
require 'puppeteer/http_response'
|
41
42
|
require 'puppeteer/js_coverage'
|
42
43
|
require 'puppeteer/js_handle'
|
43
44
|
require 'puppeteer/keyboard'
|
44
45
|
require 'puppeteer/launcher'
|
45
46
|
require 'puppeteer/lifecycle_watcher'
|
46
47
|
require 'puppeteer/mouse'
|
48
|
+
require 'puppeteer/network_conditions'
|
47
49
|
require 'puppeteer/network_manager'
|
48
50
|
require 'puppeteer/page'
|
49
51
|
require 'puppeteer/protocol_stream_reader'
|
50
52
|
require 'puppeteer/puppeteer'
|
51
53
|
require 'puppeteer/query_handler_manager'
|
52
54
|
require 'puppeteer/remote_object'
|
53
|
-
require 'puppeteer/request'
|
54
|
-
require 'puppeteer/response'
|
55
55
|
require 'puppeteer/target'
|
56
56
|
require 'puppeteer/tracing'
|
57
|
+
require 'puppeteer/timeout_helper'
|
57
58
|
require 'puppeteer/timeout_settings'
|
58
59
|
require 'puppeteer/touch_screen'
|
59
60
|
require 'puppeteer/version'
|
@@ -66,17 +67,19 @@ require 'puppeteer/element_handle'
|
|
66
67
|
|
67
68
|
# ref: https://github.com/puppeteer/puppeteer/blob/master/lib/Puppeteer.js
|
68
69
|
module Puppeteer
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
)
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
70
|
+
@puppeteer ||= ::Puppeteer::Puppeteer.new(
|
71
|
+
project_root: __dir__,
|
72
|
+
preferred_revision: '706915',
|
73
|
+
is_puppeteer_core: true,
|
74
|
+
).tap do |instance|
|
75
|
+
instance.public_methods(false).each do |method_name|
|
76
|
+
define_singleton_method(method_name) do |*args, **kwargs, &block|
|
77
|
+
if kwargs.empty? # for Ruby < 2.7
|
78
|
+
@puppeteer.public_send(method_name, *args, &block)
|
79
|
+
else
|
80
|
+
@puppeteer.public_send(method_name, *args, **kwargs, &block)
|
81
|
+
end
|
82
|
+
end
|
80
83
|
end
|
81
84
|
end
|
82
85
|
end
|
data/puppeteer-ruby.gemspec
CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.add_development_dependency 'rollbar'
|
33
33
|
spec.add_development_dependency 'rspec', '~> 3.10.0 '
|
34
34
|
spec.add_development_dependency 'rspec_junit_formatter' # for CircleCI.
|
35
|
-
spec.add_development_dependency 'rubocop', '~> 1.
|
35
|
+
spec.add_development_dependency 'rubocop', '~> 1.23.0'
|
36
36
|
spec.add_development_dependency 'rubocop-rspec'
|
37
37
|
spec.add_development_dependency 'sinatra'
|
38
38
|
spec.add_development_dependency 'webrick'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppeteer-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.37.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- YusukeIwaki
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -170,14 +170,14 @@ dependencies:
|
|
170
170
|
requirements:
|
171
171
|
- - "~>"
|
172
172
|
- !ruby/object:Gem::Version
|
173
|
-
version: 1.
|
173
|
+
version: 1.23.0
|
174
174
|
type: :development
|
175
175
|
prerelease: false
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
177
177
|
requirements:
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
|
-
version: 1.
|
180
|
+
version: 1.23.0
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
182
|
name: rubocop-rspec
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -274,6 +274,7 @@ files:
|
|
274
274
|
- lib/puppeteer/element_handle.rb
|
275
275
|
- lib/puppeteer/element_handle/bounding_box.rb
|
276
276
|
- lib/puppeteer/element_handle/box_model.rb
|
277
|
+
- lib/puppeteer/element_handle/offset.rb
|
277
278
|
- lib/puppeteer/element_handle/point.rb
|
278
279
|
- lib/puppeteer/emulation_manager.rb
|
279
280
|
- lib/puppeteer/env.rb
|
@@ -286,6 +287,8 @@ files:
|
|
286
287
|
- lib/puppeteer/frame.rb
|
287
288
|
- lib/puppeteer/frame_manager.rb
|
288
289
|
- lib/puppeteer/geolocation.rb
|
290
|
+
- lib/puppeteer/http_request.rb
|
291
|
+
- lib/puppeteer/http_response.rb
|
289
292
|
- lib/puppeteer/if_present.rb
|
290
293
|
- lib/puppeteer/js_coverage.rb
|
291
294
|
- lib/puppeteer/js_handle.rb
|
@@ -300,8 +303,11 @@ files:
|
|
300
303
|
- lib/puppeteer/launcher/launch_options.rb
|
301
304
|
- lib/puppeteer/lifecycle_watcher.rb
|
302
305
|
- lib/puppeteer/mouse.rb
|
306
|
+
- lib/puppeteer/network_condition.rb
|
307
|
+
- lib/puppeteer/network_conditions.rb
|
303
308
|
- lib/puppeteer/network_manager.rb
|
304
309
|
- lib/puppeteer/page.rb
|
310
|
+
- lib/puppeteer/page/metrics.rb
|
305
311
|
- lib/puppeteer/page/pdf_options.rb
|
306
312
|
- lib/puppeteer/page/screenshot_options.rb
|
307
313
|
- lib/puppeteer/page/screenshot_task_queue.rb
|
@@ -309,9 +315,8 @@ files:
|
|
309
315
|
- lib/puppeteer/puppeteer.rb
|
310
316
|
- lib/puppeteer/query_handler_manager.rb
|
311
317
|
- lib/puppeteer/remote_object.rb
|
312
|
-
- lib/puppeteer/request.rb
|
313
|
-
- lib/puppeteer/response.rb
|
314
318
|
- lib/puppeteer/target.rb
|
319
|
+
- lib/puppeteer/timeout_helper.rb
|
315
320
|
- lib/puppeteer/timeout_settings.rb
|
316
321
|
- lib/puppeteer/touch_screen.rb
|
317
322
|
- lib/puppeteer/tracing.rb
|