puppeteer-ruby 0.0.22 → 0.0.23
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/.rubocop.yml +37 -0
- data/README.md +15 -0
- data/lib/puppeteer.rb +3 -0
- data/lib/puppeteer/browser.rb +19 -26
- data/lib/puppeteer/browser_context.rb +48 -49
- data/lib/puppeteer/browser_runner.rb +0 -1
- data/lib/puppeteer/cdp_session.rb +11 -7
- data/lib/puppeteer/connection.rb +30 -11
- data/lib/puppeteer/dom_world.rb +2 -2
- data/lib/puppeteer/event_callbackable.rb +4 -0
- data/lib/puppeteer/events.rb +184 -0
- data/lib/puppeteer/exception_details.rb +38 -0
- data/lib/puppeteer/frame_manager.rb +20 -16
- data/lib/puppeteer/geolocation.rb +24 -0
- data/lib/puppeteer/lifecycle_watcher.rb +6 -6
- data/lib/puppeteer/network_manager.rb +6 -6
- data/lib/puppeteer/page.rb +65 -86
- data/lib/puppeteer/target.rb +2 -2
- data/lib/puppeteer/version.rb +1 -1
- metadata +5 -2
data/lib/puppeteer/page.rb
CHANGED
@@ -46,7 +46,7 @@ class Puppeteer::Page
|
|
46
46
|
@screenshot_task_queue = screenshot_task_queue
|
47
47
|
|
48
48
|
@workers = {}
|
49
|
-
@client.on_event
|
49
|
+
@client.on_event('Target.attachedToTarget') do |event|
|
50
50
|
if event['targetInfo']['type'] != 'worker'
|
51
51
|
# If we don't detach from service workers, they will never die.
|
52
52
|
await @client.send_message('Target.detachFromTarget', sessionId: event['sessionId'])
|
@@ -56,65 +56,69 @@ class Puppeteer::Page
|
|
56
56
|
session = Puppeteer::Connection.from_session(@client).session(event['sessionId']) # rubocop:disable Lint/UselessAssignment
|
57
57
|
# const worker = new Worker(session, event.targetInfo.url, this._addConsoleMessage.bind(this), this._handleException.bind(this));
|
58
58
|
# this._workers.set(event.sessionId, worker);
|
59
|
-
# this.emit(
|
59
|
+
# this.emit(PageEmittedEvents::WorkerCreated, worker);
|
60
60
|
end
|
61
|
-
@client.on_event
|
61
|
+
@client.on_event('Target.detachedFromTarget') do |event|
|
62
62
|
session_id = event['sessionId']
|
63
63
|
worker = @workers[session_id]
|
64
64
|
next unless worker
|
65
65
|
|
66
|
-
emit_event(
|
66
|
+
emit_event(PageEmittedEvents::WorkerDestroyed, worker)
|
67
67
|
@workers.delete(session_id)
|
68
68
|
end
|
69
69
|
|
70
|
-
@frame_manager.on_event
|
71
|
-
emit_event
|
70
|
+
@frame_manager.on_event(FrameManagerEmittedEvents::FrameAttached) do |event|
|
71
|
+
emit_event(PageEmittedEvents::FrameAttached, event)
|
72
72
|
end
|
73
|
-
@frame_manager.on_event
|
74
|
-
emit_event
|
73
|
+
@frame_manager.on_event(FrameManagerEmittedEvents::FrameDetached) do |event|
|
74
|
+
emit_event(PageEmittedEvents::FrameDetached, event)
|
75
75
|
end
|
76
|
-
@frame_manager.on_event
|
77
|
-
emit_event
|
76
|
+
@frame_manager.on_event(FrameManagerEmittedEvents::FrameNavigated) do |event|
|
77
|
+
emit_event(PageEmittedEvents::FrameNavigated, event)
|
78
78
|
end
|
79
79
|
|
80
80
|
network_manager = @frame_manager.network_manager
|
81
|
-
network_manager.on_event
|
82
|
-
emit_event
|
81
|
+
network_manager.on_event(NetworkManagerEmittedEvents::Request) do |event|
|
82
|
+
emit_event(PageEmittedEvents::Request, event)
|
83
83
|
end
|
84
|
-
network_manager.on_event
|
85
|
-
emit_event
|
84
|
+
network_manager.on_event(NetworkManagerEmittedEvents::Response) do |event|
|
85
|
+
emit_event(PageEmittedEvents::Response, event)
|
86
86
|
end
|
87
|
-
network_manager.on_event
|
88
|
-
emit_event
|
87
|
+
network_manager.on_event(NetworkManagerEmittedEvents::RequestFailed) do |event|
|
88
|
+
emit_event(PageEmittedEvents::RequestFailed, event)
|
89
89
|
end
|
90
|
-
network_manager.on_event
|
91
|
-
emit_event
|
90
|
+
network_manager.on_event(NetworkManagerEmittedEvents::RequestFinished) do |event|
|
91
|
+
emit_event(PageEmittedEvents::RequestFinished, event)
|
92
92
|
end
|
93
93
|
@file_chooser_interception_is_disabled = false
|
94
94
|
@file_chooser_interceptors = Set.new
|
95
95
|
|
96
|
-
@client.on_event
|
97
|
-
emit_event
|
96
|
+
@client.on_event('Page.domContentEventFired') do |event|
|
97
|
+
emit_event(PageEmittedEvents::DOMContentLoaded)
|
98
98
|
end
|
99
|
-
@client.on_event
|
100
|
-
emit_event
|
99
|
+
@client.on_event('Page.loadEventFired') do |event|
|
100
|
+
emit_event(PageEmittedEvents::Load)
|
101
101
|
end
|
102
102
|
# client.on('Runtime.consoleAPICalled', event => this._onConsoleAPI(event));
|
103
103
|
# client.on('Runtime.bindingCalled', event => this._onBindingCalled(event));
|
104
|
-
@client.on_event
|
104
|
+
@client.on_event('Page.javascriptDialogOpening') do |event|
|
105
105
|
handle_dialog_opening(event)
|
106
106
|
end
|
107
|
-
|
108
|
-
|
107
|
+
@client.on_event('Runtime.exceptionThrown') do |exception|
|
108
|
+
handle_exception(exception['exceptionDetails'])
|
109
|
+
end
|
110
|
+
@client.on_event('Inspector.targetCrashed') do |event|
|
111
|
+
handle_target_crashed
|
112
|
+
end
|
109
113
|
# client.on('Performance.metrics', event => this._emitMetrics(event));
|
110
|
-
@client.on_event
|
114
|
+
@client.on_event('Log.entryAdded') do |event|
|
111
115
|
handle_log_entry_added(event)
|
112
116
|
end
|
113
|
-
@client.on_event
|
117
|
+
@client.on_event('Page.fileChooserOpened') do |event|
|
114
118
|
handle_file_chooser(event)
|
115
119
|
end
|
116
120
|
@target.is_closed_promise.then do
|
117
|
-
emit_event
|
121
|
+
emit_event(PageEmittedEvents::Close)
|
118
122
|
@closed = true
|
119
123
|
end
|
120
124
|
end
|
@@ -128,43 +132,22 @@ class Puppeteer::Page
|
|
128
132
|
)
|
129
133
|
end
|
130
134
|
|
131
|
-
EVENT_MAPPINGS = {
|
132
|
-
close: 'Events.Page.Close',
|
133
|
-
# console: 'Events.Page.Console',
|
134
|
-
dialog: 'Events.Page.Dialog',
|
135
|
-
domcontentloaded: 'Events.Page.DOMContentLoaded',
|
136
|
-
# error:
|
137
|
-
frameattached: 'Events.Page.FrameAttached',
|
138
|
-
framedetached: 'Events.Page.FrameDetached',
|
139
|
-
framenavigated: 'Events.Page.FrameNavigated',
|
140
|
-
load: 'Events.Page.Load',
|
141
|
-
# metrics: 'Events.Page.Metrics',
|
142
|
-
# pageerror: 'Events.Page.PageError',
|
143
|
-
popup: 'Events.Page.Popup',
|
144
|
-
request: 'Events.Page.Request',
|
145
|
-
requestfailed: 'Events.Page.RequestFailed',
|
146
|
-
requestfinished: 'Events.Page.RequestFinished',
|
147
|
-
response: 'Events.Page.Response',
|
148
|
-
# workercreated: 'Events.Page.WorkerCreated',
|
149
|
-
# workerdestroyed: 'Events.Page.WorkerDestroyed',
|
150
|
-
}
|
151
|
-
|
152
135
|
# @param event_name [Symbol]
|
153
136
|
def on(event_name, &block)
|
154
|
-
unless
|
155
|
-
raise ArgumentError.new("Unknown event name: #{event_name}. Known events are #{
|
137
|
+
unless PageEmittedEvents.values.include?(event_name.to_s)
|
138
|
+
raise ArgumentError.new("Unknown event name: #{event_name}. Known events are #{PageEmittedEvents.values.to_a.join(", ")}")
|
156
139
|
end
|
157
140
|
|
158
|
-
|
141
|
+
super(event_name.to_s, &block)
|
159
142
|
end
|
160
143
|
|
161
144
|
# @param event_name [Symbol]
|
162
145
|
def once(event_name, &block)
|
163
|
-
unless
|
164
|
-
raise ArgumentError.new("Unknown event name: #{event_name}. Known events are #{
|
146
|
+
unless PageEmittedEvents.values.include?(event_name.to_s)
|
147
|
+
raise ArgumentError.new("Unknown event name: #{event_name}. Known events are #{PageEmittedEvents.values.to_a.join(", ")}")
|
165
148
|
end
|
166
149
|
|
167
|
-
|
150
|
+
super(event_name.to_s, &block)
|
168
151
|
end
|
169
152
|
|
170
153
|
def handle_file_chooser(event)
|
@@ -211,19 +194,10 @@ class Puppeteer::Page
|
|
211
194
|
|
212
195
|
define_async_method :async_wait_for_file_chooser
|
213
196
|
|
214
|
-
#
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
# const { longitude, latitude, accuracy = 0} = options;
|
219
|
-
# if (longitude < -180 || longitude > 180)
|
220
|
-
# throw new Error(`Invalid longitude "${longitude}": precondition -180 <= LONGITUDE <= 180 failed.`);
|
221
|
-
# if (latitude < -90 || latitude > 90)
|
222
|
-
# throw new Error(`Invalid latitude "${latitude}": precondition -90 <= LATITUDE <= 90 failed.`);
|
223
|
-
# if (accuracy < 0)
|
224
|
-
# throw new Error(`Invalid accuracy "${accuracy}": precondition 0 <= ACCURACY failed.`);
|
225
|
-
# await this._client.send('Emulation.setGeolocationOverride', {longitude, latitude, accuracy});
|
226
|
-
# }
|
197
|
+
# @param [Puppeteer::Geolocation]
|
198
|
+
def geolocation=(geolocation)
|
199
|
+
@client.send_message('Emulation.setGeolocationOverride', geolocation.to_h)
|
200
|
+
end
|
227
201
|
|
228
202
|
attr_reader :javascript_enabled, :target
|
229
203
|
|
@@ -238,7 +212,7 @@ class Puppeteer::Page
|
|
238
212
|
class TargetCrashedError < StandardError; end
|
239
213
|
|
240
214
|
private def handle_target_crashed
|
241
|
-
emit_event
|
215
|
+
emit_event(PageEmittedEvents::Error, TargetCrashedError.new('Page crashed!'))
|
242
216
|
end
|
243
217
|
|
244
218
|
private def handle_log_entry_added(event)
|
@@ -259,7 +233,7 @@ class Puppeteer::Page
|
|
259
233
|
url: url,
|
260
234
|
line_number: line_number,
|
261
235
|
)
|
262
|
-
emit_event(
|
236
|
+
emit_event(PageEmittedEvents::Console,
|
263
237
|
Puppeteer::ConsoleMessage.new(level, text, [], console_message_location))
|
264
238
|
end
|
265
239
|
end
|
@@ -502,7 +476,7 @@ class Puppeteer::Page
|
|
502
476
|
# * @param {!Protocol.Performance.metricsPayload} event
|
503
477
|
# */
|
504
478
|
# _emitMetrics(event) {
|
505
|
-
# this.emit(
|
479
|
+
# this.emit(PageEmittedEvents::Metrics, {
|
506
480
|
# title: event.title,
|
507
481
|
# metrics: this._buildMetricsObject(event.metrics)
|
508
482
|
# });
|
@@ -521,15 +495,14 @@ class Puppeteer::Page
|
|
521
495
|
# return result;
|
522
496
|
# }
|
523
497
|
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
# }
|
498
|
+
class PageError < StandardError ; end
|
499
|
+
|
500
|
+
private def handle_exception(exception_details)
|
501
|
+
message = Puppeteer::ExceptionDetails.new(exception_details).message
|
502
|
+
err = PageError.new(message)
|
503
|
+
# err.stack = ''; // Don't report clientside error with a node stack attached
|
504
|
+
emit_event(PageEmittedEvents::PageError, err)
|
505
|
+
end
|
533
506
|
|
534
507
|
# /**
|
535
508
|
# * @param {!Protocol.Runtime.consoleAPICalledPayload} event
|
@@ -613,7 +586,7 @@ class Puppeteer::Page
|
|
613
586
|
# * @param {Protocol.Runtime.StackTrace=} stackTrace
|
614
587
|
# */
|
615
588
|
# _addConsoleMessage(type, args, stackTrace) {
|
616
|
-
# if (!this.listenerCount(
|
589
|
+
# if (!this.listenerCount(PageEmittedEvents::Console)) {
|
617
590
|
# args.forEach(arg => arg.dispose());
|
618
591
|
# return;
|
619
592
|
# }
|
@@ -631,7 +604,7 @@ class Puppeteer::Page
|
|
631
604
|
# columnNumber: stackTrace.callFrames[0].columnNumber,
|
632
605
|
# } : {};
|
633
606
|
# const message = new ConsoleMessage(type, textTokens.join(' '), args, location);
|
634
|
-
# this.emit(
|
607
|
+
# this.emit(PageEmittedEvents::Console, message);
|
635
608
|
# }
|
636
609
|
|
637
610
|
private def handle_dialog_opening(event)
|
@@ -643,7 +616,7 @@ class Puppeteer::Page
|
|
643
616
|
type: dialog_type,
|
644
617
|
message: event['message'],
|
645
618
|
default_value: event['defaultPrompt'])
|
646
|
-
emit_event(
|
619
|
+
emit_event(PageEmittedEvents::Dialog, dialog)
|
647
620
|
end
|
648
621
|
|
649
622
|
# @return [String]
|
@@ -726,7 +699,7 @@ class Puppeteer::Page
|
|
726
699
|
|
727
700
|
private def session_close_promise
|
728
701
|
@disconnect_promise ||= resolvable_future do |future|
|
729
|
-
@client.observe_first(
|
702
|
+
@client.observe_first(CDPSessionEmittedEvents::Disconnected) do
|
730
703
|
future.reject(Puppeteer::CDPSession::Error.new('Target Closed'))
|
731
704
|
end
|
732
705
|
end
|
@@ -746,7 +719,7 @@ class Puppeteer::Page
|
|
746
719
|
-> (request) { predicate.call(request) }
|
747
720
|
end
|
748
721
|
|
749
|
-
wait_for_network_manager_event(
|
722
|
+
wait_for_network_manager_event(NetworkManagerEmittedEvents::Request,
|
750
723
|
predicate: request_predicate,
|
751
724
|
timeout: timeout,
|
752
725
|
)
|
@@ -780,7 +753,7 @@ class Puppeteer::Page
|
|
780
753
|
-> (response) { predicate.call(response) }
|
781
754
|
end
|
782
755
|
|
783
|
-
wait_for_network_manager_event(
|
756
|
+
wait_for_network_manager_event(NetworkManagerEmittedEvents::Response,
|
784
757
|
predicate: response_predicate,
|
785
758
|
timeout: timeout,
|
786
759
|
)
|
@@ -1043,6 +1016,12 @@ class Puppeteer::Page
|
|
1043
1016
|
else
|
1044
1017
|
@client.connection.send_message('Target.closeTarget', targetId: @target.target_id)
|
1045
1018
|
await @target.is_closed_promise
|
1019
|
+
|
1020
|
+
# @closed sometimes remains false, so wait for @closed = true with 100ms timeout.
|
1021
|
+
25.times do
|
1022
|
+
break if @closed
|
1023
|
+
sleep 0.004
|
1024
|
+
end
|
1046
1025
|
end
|
1047
1026
|
end
|
1048
1027
|
|
data/lib/puppeteer/target.rb
CHANGED
@@ -68,10 +68,10 @@ class Puppeteer::Target
|
|
68
68
|
if opener_page.nil? || type != 'page'
|
69
69
|
return true
|
70
70
|
end
|
71
|
-
# if (!openerPage.listenerCount(
|
71
|
+
# if (!openerPage.listenerCount(PageEmittedEvents::Popup))
|
72
72
|
# return true;
|
73
73
|
popup_page = page
|
74
|
-
opener_page.emit_event(
|
74
|
+
opener_page.emit_event(PageEmittedEvents::Popup, popup_page)
|
75
75
|
|
76
76
|
true
|
77
77
|
end
|
data/lib/puppeteer/version.rb
CHANGED
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.0.
|
4
|
+
version: 0.0.23
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- YusukeIwaki
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -223,10 +223,13 @@ files:
|
|
223
223
|
- lib/puppeteer/env.rb
|
224
224
|
- lib/puppeteer/errors.rb
|
225
225
|
- lib/puppeteer/event_callbackable.rb
|
226
|
+
- lib/puppeteer/events.rb
|
227
|
+
- lib/puppeteer/exception_details.rb
|
226
228
|
- lib/puppeteer/execution_context.rb
|
227
229
|
- lib/puppeteer/file_chooser.rb
|
228
230
|
- lib/puppeteer/frame.rb
|
229
231
|
- lib/puppeteer/frame_manager.rb
|
232
|
+
- lib/puppeteer/geolocation.rb
|
230
233
|
- lib/puppeteer/if_present.rb
|
231
234
|
- lib/puppeteer/js_handle.rb
|
232
235
|
- lib/puppeteer/keyboard.rb
|