puppeteer-ruby 0.0.14 → 0.0.19
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/.circleci/config.yml +25 -2
- data/.github/workflows/reviewdog.yml +1 -1
- data/.rubocop.yml +49 -3
- data/Dockerfile +9 -0
- data/README.md +3 -1
- data/docker-compose.yml +34 -0
- data/lib/puppeteer.rb +16 -12
- data/lib/puppeteer/browser.rb +36 -9
- data/lib/puppeteer/browser_context.rb +35 -5
- data/lib/puppeteer/browser_runner.rb +1 -1
- data/lib/puppeteer/connection.rb +6 -1
- data/lib/puppeteer/debug_print.rb +2 -2
- data/lib/puppeteer/define_async_method.rb +1 -1
- data/lib/puppeteer/dom_world.rb +78 -52
- data/lib/puppeteer/element_handle.rb +49 -20
- data/lib/puppeteer/env.rb +23 -0
- data/lib/puppeteer/frame.rb +17 -31
- data/lib/puppeteer/js_handle.rb +37 -27
- data/lib/puppeteer/keyboard.rb +3 -2
- data/lib/puppeteer/launcher.rb +11 -1
- data/lib/puppeteer/launcher/base.rb +14 -4
- data/lib/puppeteer/launcher/chrome.rb +1 -1
- data/lib/puppeteer/launcher/firefox.rb +392 -0
- data/lib/puppeteer/mouse.rb +16 -0
- data/lib/puppeteer/network_manager.rb +163 -5
- data/lib/puppeteer/page.rb +195 -125
- data/lib/puppeteer/page/pdf_options.rb +166 -0
- data/lib/puppeteer/remote_object.rb +28 -1
- data/lib/puppeteer/request.rb +330 -0
- data/lib/puppeteer/response.rb +113 -0
- data/lib/puppeteer/version.rb +1 -1
- data/lib/puppeteer/wait_task.rb +1 -1
- data/lib/puppeteer/web_socket.rb +7 -0
- data/puppeteer-ruby.gemspec +2 -1
- metadata +25 -4
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
class Puppeteer::Response
|
4
|
+
include Puppeteer::IfPresent
|
5
|
+
|
6
|
+
class Redirected < StandardError
|
7
|
+
def initialize
|
8
|
+
super('Response body is unavailable for redirect responses')
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# defines methods used only in NetworkManager
|
13
|
+
class InternalAccessor
|
14
|
+
def initialize(response)
|
15
|
+
@response = response
|
16
|
+
end
|
17
|
+
|
18
|
+
def body_loaded_promise
|
19
|
+
@response.instance_variable_get(:@body_loaded_promise)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class RemoteAddress
|
24
|
+
def initialize(ip:, port:)
|
25
|
+
@ip = ip
|
26
|
+
@port = port
|
27
|
+
end
|
28
|
+
attr_reader :ip, :port
|
29
|
+
end
|
30
|
+
|
31
|
+
# @param client [Puppeteer::CDPSession]
|
32
|
+
# @param request [Puppeteer::Request]
|
33
|
+
# @param response_payload [Hash]
|
34
|
+
def initialize(client, request, response_payload)
|
35
|
+
@client = client
|
36
|
+
@request = request
|
37
|
+
|
38
|
+
@body_loaded_promise = resolvable_future
|
39
|
+
@remote_address = RemoteAddress.new(
|
40
|
+
ip: response_payload['remoteIPAddress'],
|
41
|
+
port: response_payload['remotePort'],
|
42
|
+
)
|
43
|
+
|
44
|
+
@status = response_payload['status']
|
45
|
+
@status_text = response_payload['statusText']
|
46
|
+
@url = request.url
|
47
|
+
@from_disk_cache = !!response_payload['fromDiskCache']
|
48
|
+
@from_service_worker = !!response_payload['fromServiceWorker']
|
49
|
+
|
50
|
+
@headers = {}
|
51
|
+
response_payload['headers'].each do |key, value|
|
52
|
+
@headers[key.downcase] = value
|
53
|
+
end
|
54
|
+
@security_details = if_present(response_payload['securityDetails']) do |security_payload|
|
55
|
+
SecurityDetails.new(security_payload)
|
56
|
+
end
|
57
|
+
|
58
|
+
@internal = InternalAccessor.new(self)
|
59
|
+
end
|
60
|
+
|
61
|
+
attr_reader :internal
|
62
|
+
|
63
|
+
attr_reader :remote_address, :url, :status, :status_text, :headers, :security_details, :request
|
64
|
+
|
65
|
+
# @return [Boolean]
|
66
|
+
def ok?
|
67
|
+
@status == 0 || (@status >= 200 && @status <= 299)
|
68
|
+
end
|
69
|
+
|
70
|
+
def buffer
|
71
|
+
await @body_loaded_promise
|
72
|
+
response = @client.send_message('Network.getResponseBody', requestId: @request.internal.request_id)
|
73
|
+
if response['base64Encoded']
|
74
|
+
Base64.decode64(response['body'])
|
75
|
+
else
|
76
|
+
response['body']
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# @param text [String]
|
81
|
+
def text
|
82
|
+
buffer
|
83
|
+
end
|
84
|
+
|
85
|
+
# @param json [Hash]
|
86
|
+
def json
|
87
|
+
JSON.parse(text)
|
88
|
+
end
|
89
|
+
|
90
|
+
def from_cache?
|
91
|
+
@from_disk_cache || @request.internal.from_memory_cache?
|
92
|
+
end
|
93
|
+
|
94
|
+
def from_service_worker?
|
95
|
+
@from_service_worker
|
96
|
+
end
|
97
|
+
|
98
|
+
def frame
|
99
|
+
@request.frame
|
100
|
+
end
|
101
|
+
|
102
|
+
class SecurityDetails
|
103
|
+
def initialize(security_payload)
|
104
|
+
@subject_name = security_payload['subjectName']
|
105
|
+
@issuer = security_payload['issuer']
|
106
|
+
@valid_from = security_payload['validFrom']
|
107
|
+
@valid_to = security_payload['validTo']
|
108
|
+
@protocol = security_payload['protocol']
|
109
|
+
end
|
110
|
+
|
111
|
+
attr_reader :subject_name, :issuer, :valid_from, :valid_to, :protocol
|
112
|
+
end
|
113
|
+
end
|
data/lib/puppeteer/version.rb
CHANGED
data/lib/puppeteer/wait_task.rb
CHANGED
@@ -25,7 +25,7 @@ class Puppeteer::WaitTask
|
|
25
25
|
@dom_world = dom_world
|
26
26
|
@polling = polling
|
27
27
|
@timeout = timeout
|
28
|
-
@predicate_body = predicate_body
|
28
|
+
@predicate_body = "return (#{predicate_body})(...args);"
|
29
29
|
@args = args
|
30
30
|
@run_count = 0
|
31
31
|
@dom_world._wait_tasks.add(self)
|
data/lib/puppeteer/web_socket.rb
CHANGED
@@ -16,10 +16,14 @@ class Puppeteer::WebSocket
|
|
16
16
|
|
17
17
|
def write(data)
|
18
18
|
@socket.write(data)
|
19
|
+
rescue Errno::EPIPE
|
20
|
+
raise EOFError.new('already closed')
|
19
21
|
end
|
20
22
|
|
21
23
|
def readpartial(maxlen = 1024)
|
22
24
|
@socket.readpartial(maxlen)
|
25
|
+
rescue Errno::ECONNRESET
|
26
|
+
raise EOFError.new('closed by remote')
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
@@ -40,6 +44,9 @@ class Puppeteer::WebSocket
|
|
40
44
|
rescue EOFError
|
41
45
|
# Google Chrome was gone.
|
42
46
|
# We have nothing todo. Just finish polling.
|
47
|
+
if @ready_state < STATE_CLOSING
|
48
|
+
handle_on_close(reason: 'Going Away', code: 1001)
|
49
|
+
end
|
43
50
|
end
|
44
51
|
end
|
45
52
|
|
data/puppeteer-ruby.gemspec
CHANGED
@@ -26,7 +26,8 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_development_dependency 'rake', '~> 10.0'
|
27
27
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
28
28
|
spec.add_development_dependency 'rspec_junit_formatter' # for CircleCI.
|
29
|
-
spec.add_development_dependency 'rubocop', '~> 0.
|
29
|
+
spec.add_development_dependency 'rubocop', '~> 0.90.0'
|
30
30
|
spec.add_development_dependency 'rubocop-rspec'
|
31
|
+
spec.add_development_dependency 'sinatra'
|
31
32
|
spec.add_development_dependency 'yard'
|
32
33
|
end
|
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.19
|
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-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -128,14 +128,14 @@ dependencies:
|
|
128
128
|
requirements:
|
129
129
|
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 0.
|
131
|
+
version: 0.90.0
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: 0.
|
138
|
+
version: 0.90.0
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: rubocop-rspec
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +150,20 @@ dependencies:
|
|
150
150
|
- - ">="
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: sinatra
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
168
|
name: yard
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -179,11 +193,13 @@ files:
|
|
179
193
|
- ".rspec"
|
180
194
|
- ".rubocop.yml"
|
181
195
|
- ".travis.yml"
|
196
|
+
- Dockerfile
|
182
197
|
- Gemfile
|
183
198
|
- README.md
|
184
199
|
- Rakefile
|
185
200
|
- bin/console
|
186
201
|
- bin/setup
|
202
|
+
- docker-compose.yml
|
187
203
|
- lib/puppeteer.rb
|
188
204
|
- lib/puppeteer/browser.rb
|
189
205
|
- lib/puppeteer/browser_context.rb
|
@@ -203,6 +219,7 @@ files:
|
|
203
219
|
- lib/puppeteer/element_handle/box_model.rb
|
204
220
|
- lib/puppeteer/element_handle/point.rb
|
205
221
|
- lib/puppeteer/emulation_manager.rb
|
222
|
+
- lib/puppeteer/env.rb
|
206
223
|
- lib/puppeteer/errors.rb
|
207
224
|
- lib/puppeteer/event_callbackable.rb
|
208
225
|
- lib/puppeteer/execution_context.rb
|
@@ -219,13 +236,17 @@ files:
|
|
219
236
|
- lib/puppeteer/launcher/browser_options.rb
|
220
237
|
- lib/puppeteer/launcher/chrome.rb
|
221
238
|
- lib/puppeteer/launcher/chrome_arg_options.rb
|
239
|
+
- lib/puppeteer/launcher/firefox.rb
|
222
240
|
- lib/puppeteer/launcher/launch_options.rb
|
223
241
|
- lib/puppeteer/lifecycle_watcher.rb
|
224
242
|
- lib/puppeteer/mouse.rb
|
225
243
|
- lib/puppeteer/network_manager.rb
|
226
244
|
- lib/puppeteer/page.rb
|
245
|
+
- lib/puppeteer/page/pdf_options.rb
|
227
246
|
- lib/puppeteer/page/screenshot_options.rb
|
228
247
|
- lib/puppeteer/remote_object.rb
|
248
|
+
- lib/puppeteer/request.rb
|
249
|
+
- lib/puppeteer/response.rb
|
229
250
|
- lib/puppeteer/target.rb
|
230
251
|
- lib/puppeteer/timeout_settings.rb
|
231
252
|
- lib/puppeteer/touch_screen.rb
|