ferrum 0.11 → 0.13
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/LICENSE +1 -1
- data/README.md +174 -30
- data/lib/ferrum/browser/binary.rb +46 -0
- data/lib/ferrum/browser/client.rb +17 -16
- data/lib/ferrum/browser/command.rb +10 -12
- data/lib/ferrum/browser/options/base.rb +2 -11
- data/lib/ferrum/browser/options/chrome.rb +29 -18
- data/lib/ferrum/browser/options/firefox.rb +13 -9
- data/lib/ferrum/browser/options.rb +84 -0
- data/lib/ferrum/browser/process.rb +45 -40
- data/lib/ferrum/browser/subscriber.rb +1 -3
- data/lib/ferrum/browser/version_info.rb +71 -0
- data/lib/ferrum/browser/web_socket.rb +9 -12
- data/lib/ferrum/browser/xvfb.rb +4 -8
- data/lib/ferrum/browser.rb +193 -47
- data/lib/ferrum/context.rb +9 -4
- data/lib/ferrum/contexts.rb +12 -10
- data/lib/ferrum/cookies/cookie.rb +126 -0
- data/lib/ferrum/cookies.rb +93 -55
- data/lib/ferrum/dialog.rb +30 -0
- data/lib/ferrum/errors.rb +115 -0
- data/lib/ferrum/frame/dom.rb +177 -0
- data/lib/ferrum/frame/runtime.rb +58 -75
- data/lib/ferrum/frame.rb +118 -23
- data/lib/ferrum/headers.rb +30 -2
- data/lib/ferrum/keyboard.rb +56 -13
- data/lib/ferrum/mouse.rb +92 -7
- data/lib/ferrum/network/auth_request.rb +7 -2
- data/lib/ferrum/network/exchange.rb +97 -12
- data/lib/ferrum/network/intercepted_request.rb +10 -8
- data/lib/ferrum/network/request.rb +69 -0
- data/lib/ferrum/network/response.rb +85 -3
- data/lib/ferrum/network.rb +285 -36
- data/lib/ferrum/node.rb +69 -23
- data/lib/ferrum/page/animation.rb +16 -1
- data/lib/ferrum/page/frames.rb +111 -30
- data/lib/ferrum/page/screenshot.rb +142 -65
- data/lib/ferrum/page/stream.rb +38 -0
- data/lib/ferrum/page/tracing.rb +97 -0
- data/lib/ferrum/page.rb +224 -60
- data/lib/ferrum/proxy.rb +147 -0
- data/lib/ferrum/{rbga.rb → rgba.rb} +4 -2
- data/lib/ferrum/target.rb +7 -4
- data/lib/ferrum/utils/attempt.rb +20 -0
- data/lib/ferrum/utils/elapsed_time.rb +27 -0
- data/lib/ferrum/utils/platform.rb +28 -0
- data/lib/ferrum/version.rb +1 -1
- data/lib/ferrum.rb +4 -146
- metadata +63 -51
data/lib/ferrum/version.rb
CHANGED
data/lib/ferrum.rb
CHANGED
@@ -1,153 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "ferrum/utils/platform"
|
4
|
+
require "ferrum/utils/elapsed_time"
|
5
|
+
require "ferrum/utils/attempt"
|
6
|
+
require "ferrum/errors"
|
3
7
|
require "ferrum/browser"
|
4
8
|
require "ferrum/node"
|
5
9
|
|
6
10
|
module Ferrum
|
7
|
-
class Error < StandardError; end
|
8
|
-
class NoSuchPageError < Error; end
|
9
|
-
class NoSuchTargetError < Error; end
|
10
|
-
class NotImplementedError < Error; end
|
11
|
-
|
12
|
-
class StatusError < Error
|
13
|
-
def initialize(url, message = nil)
|
14
|
-
super(message || "Request to #{url} failed to reach server, check DNS and server status")
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
class PendingConnectionsError < StatusError
|
19
|
-
attr_reader :pendings
|
20
|
-
|
21
|
-
def initialize(url, pendings = [])
|
22
|
-
@pendings = pendings
|
23
|
-
|
24
|
-
message = "Request to #{url} reached server, but there are still pending connections: #{pendings.join(', ')}"
|
25
|
-
|
26
|
-
super(url, message)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
class TimeoutError < Error
|
31
|
-
def message
|
32
|
-
"Timed out waiting for response. It's possible that this happened " \
|
33
|
-
"because something took a very long time (for example a page load " \
|
34
|
-
"was slow). If so, setting the :timeout option to a higher value might " \
|
35
|
-
"help."
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
class ScriptTimeoutError < Error
|
40
|
-
def message
|
41
|
-
"Timed out waiting for evaluated script to return a value"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
class ProcessTimeoutError < Error
|
46
|
-
attr_reader :output
|
47
|
-
|
48
|
-
def initialize(timeout, output)
|
49
|
-
@output = output
|
50
|
-
super("Browser did not produce websocket url within #{timeout} seconds, try to increase `:process_timeout`. See https://github.com/rubycdp/ferrum#customization")
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
class DeadBrowserError < Error
|
55
|
-
def initialize(message = "Browser is dead or given window is closed")
|
56
|
-
super
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
class NodeMovingError < Error
|
61
|
-
def initialize(node, prev, current)
|
62
|
-
@node, @prev, @current = node, prev, current
|
63
|
-
super(message)
|
64
|
-
end
|
65
|
-
|
66
|
-
def message
|
67
|
-
"#{@node.inspect} that you're trying to click is moving, hence " \
|
68
|
-
"we cannot. Previosuly it was at #{@prev.inspect} but now at " \
|
69
|
-
"#{@current.inspect}."
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
class CoordinatesNotFoundError < Error
|
74
|
-
def initialize(message = "Could not compute content quads")
|
75
|
-
super
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
class BrowserError < Error
|
80
|
-
attr_reader :response
|
81
|
-
|
82
|
-
def initialize(response)
|
83
|
-
@response = response
|
84
|
-
super(response["message"])
|
85
|
-
end
|
86
|
-
|
87
|
-
def code
|
88
|
-
response["code"]
|
89
|
-
end
|
90
|
-
|
91
|
-
def data
|
92
|
-
response["data"]
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
class NodeNotFoundError < BrowserError; end
|
97
|
-
|
98
|
-
class NoExecutionContextError < BrowserError
|
99
|
-
def initialize(response = nil)
|
100
|
-
response ||= { "message" => "There's no context available" }
|
101
|
-
super(response)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
class JavaScriptError < BrowserError
|
106
|
-
attr_reader :class_name, :message
|
107
|
-
|
108
|
-
def initialize(response)
|
109
|
-
@class_name, @message = response.values_at("className", "description")
|
110
|
-
super(response.merge("message" => @message))
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
class << self
|
115
|
-
def windows?
|
116
|
-
RbConfig::CONFIG["host_os"] =~ /mingw|mswin|cygwin/
|
117
|
-
end
|
118
|
-
|
119
|
-
def mac?
|
120
|
-
RbConfig::CONFIG["host_os"] =~ /darwin/
|
121
|
-
end
|
122
|
-
|
123
|
-
def mri?
|
124
|
-
defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby"
|
125
|
-
end
|
126
|
-
|
127
|
-
def started
|
128
|
-
@@started ||= monotonic_time
|
129
|
-
end
|
130
|
-
|
131
|
-
def elapsed_time(start = nil)
|
132
|
-
monotonic_time - (start || @@started)
|
133
|
-
end
|
134
|
-
|
135
|
-
def monotonic_time
|
136
|
-
Concurrent.monotonic_time
|
137
|
-
end
|
138
|
-
|
139
|
-
def timeout?(start, timeout)
|
140
|
-
elapsed_time(start) > timeout
|
141
|
-
end
|
142
|
-
|
143
|
-
def with_attempts(errors:, max:, wait:)
|
144
|
-
attempts ||= 1
|
145
|
-
yield
|
146
|
-
rescue *Array(errors)
|
147
|
-
raise if attempts >= max
|
148
|
-
attempts += 1
|
149
|
-
sleep(wait)
|
150
|
-
retry
|
151
|
-
end
|
152
|
-
end
|
153
11
|
end
|
metadata
CHANGED
@@ -1,119 +1,119 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ferrum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.13'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dmitry Vorotilin
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: addressable
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0.6'
|
20
|
-
- - "<"
|
17
|
+
- - "~>"
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
19
|
+
version: '2.5'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0.6'
|
30
|
-
- - "<"
|
24
|
+
- - "~>"
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
26
|
+
version: '2.5'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
28
|
+
name: concurrent-ruby
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
36
30
|
requirements:
|
37
31
|
- - "~>"
|
38
32
|
- !ruby/object:Gem::Version
|
39
|
-
version: '
|
33
|
+
version: '1.1'
|
40
34
|
type: :runtime
|
41
35
|
prerelease: false
|
42
36
|
version_requirements: !ruby/object:Gem::Requirement
|
43
37
|
requirements:
|
44
38
|
- - "~>"
|
45
39
|
- !ruby/object:Gem::Version
|
46
|
-
version: '
|
40
|
+
version: '1.1'
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
42
|
+
name: webrick
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
50
44
|
requirements:
|
51
45
|
- - "~>"
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version: '1.
|
47
|
+
version: '1.7'
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
51
|
requirements:
|
58
52
|
- - "~>"
|
59
53
|
- !ruby/object:Gem::Version
|
60
|
-
version: '1.
|
54
|
+
version: '1.7'
|
61
55
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
56
|
+
name: websocket-driver
|
63
57
|
requirement: !ruby/object:Gem::Requirement
|
64
58
|
requirements:
|
65
|
-
- - "
|
59
|
+
- - ">="
|
66
60
|
- !ruby/object:Gem::Version
|
67
|
-
version: '
|
61
|
+
version: '0.6'
|
62
|
+
- - "<"
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0.8'
|
68
65
|
type: :runtime
|
69
66
|
prerelease: false
|
70
67
|
version_requirements: !ruby/object:Gem::Requirement
|
71
68
|
requirements:
|
72
|
-
- - "
|
69
|
+
- - ">="
|
73
70
|
- !ruby/object:Gem::Version
|
74
|
-
version: '
|
71
|
+
version: '0.6'
|
72
|
+
- - "<"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0.8'
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
|
-
name:
|
76
|
+
name: chunky_png
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
79
|
- - "~>"
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: '
|
81
|
+
version: '1.3'
|
82
82
|
type: :development
|
83
83
|
prerelease: false
|
84
84
|
version_requirements: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: '
|
88
|
+
version: '1.3'
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
|
-
name:
|
90
|
+
name: image_size
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
92
92
|
requirements:
|
93
93
|
- - "~>"
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version: '
|
95
|
+
version: '2.0'
|
96
96
|
type: :development
|
97
97
|
prerelease: false
|
98
98
|
version_requirements: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version: '
|
102
|
+
version: '2.0'
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
104
|
+
name: pdf-reader
|
105
105
|
requirement: !ruby/object:Gem::Requirement
|
106
106
|
requirements:
|
107
107
|
- - "~>"
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version: '2.
|
109
|
+
version: '2.2'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
112
|
version_requirements: !ruby/object:Gem::Requirement
|
113
113
|
requirements:
|
114
114
|
- - "~>"
|
115
115
|
- !ruby/object:Gem::Version
|
116
|
-
version: '2.
|
116
|
+
version: '2.2'
|
117
117
|
- !ruby/object:Gem::Dependency
|
118
118
|
name: puma
|
119
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,47 +129,47 @@ dependencies:
|
|
129
129
|
- !ruby/object:Gem::Version
|
130
130
|
version: '4.1'
|
131
131
|
- !ruby/object:Gem::Dependency
|
132
|
-
name:
|
132
|
+
name: rake
|
133
133
|
requirement: !ruby/object:Gem::Requirement
|
134
134
|
requirements:
|
135
135
|
- - "~>"
|
136
136
|
- !ruby/object:Gem::Version
|
137
|
-
version: '
|
137
|
+
version: '13.0'
|
138
138
|
type: :development
|
139
139
|
prerelease: false
|
140
140
|
version_requirements: !ruby/object:Gem::Requirement
|
141
141
|
requirements:
|
142
142
|
- - "~>"
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
version: '
|
144
|
+
version: '13.0'
|
145
145
|
- !ruby/object:Gem::Dependency
|
146
|
-
name:
|
146
|
+
name: rspec
|
147
147
|
requirement: !ruby/object:Gem::Requirement
|
148
148
|
requirements:
|
149
149
|
- - "~>"
|
150
150
|
- !ruby/object:Gem::Version
|
151
|
-
version: '
|
151
|
+
version: '3.8'
|
152
152
|
type: :development
|
153
153
|
prerelease: false
|
154
154
|
version_requirements: !ruby/object:Gem::Requirement
|
155
155
|
requirements:
|
156
156
|
- - "~>"
|
157
157
|
- !ruby/object:Gem::Version
|
158
|
-
version: '
|
158
|
+
version: '3.8'
|
159
159
|
- !ruby/object:Gem::Dependency
|
160
|
-
name:
|
160
|
+
name: sinatra
|
161
161
|
requirement: !ruby/object:Gem::Requirement
|
162
162
|
requirements:
|
163
163
|
- - "~>"
|
164
164
|
- !ruby/object:Gem::Version
|
165
|
-
version: '
|
165
|
+
version: '2.0'
|
166
166
|
type: :development
|
167
167
|
prerelease: false
|
168
168
|
version_requirements: !ruby/object:Gem::Requirement
|
169
169
|
requirements:
|
170
170
|
- - "~>"
|
171
171
|
- !ruby/object:Gem::Version
|
172
|
-
version: '
|
172
|
+
version: '2.0'
|
173
173
|
description: Ferrum allows you to control headless Chrome browser
|
174
174
|
email:
|
175
175
|
- d.vorotilin@gmail.com
|
@@ -181,19 +181,24 @@ files:
|
|
181
181
|
- README.md
|
182
182
|
- lib/ferrum.rb
|
183
183
|
- lib/ferrum/browser.rb
|
184
|
+
- lib/ferrum/browser/binary.rb
|
184
185
|
- lib/ferrum/browser/client.rb
|
185
186
|
- lib/ferrum/browser/command.rb
|
187
|
+
- lib/ferrum/browser/options.rb
|
186
188
|
- lib/ferrum/browser/options/base.rb
|
187
189
|
- lib/ferrum/browser/options/chrome.rb
|
188
190
|
- lib/ferrum/browser/options/firefox.rb
|
189
191
|
- lib/ferrum/browser/process.rb
|
190
192
|
- lib/ferrum/browser/subscriber.rb
|
193
|
+
- lib/ferrum/browser/version_info.rb
|
191
194
|
- lib/ferrum/browser/web_socket.rb
|
192
195
|
- lib/ferrum/browser/xvfb.rb
|
193
196
|
- lib/ferrum/context.rb
|
194
197
|
- lib/ferrum/contexts.rb
|
195
198
|
- lib/ferrum/cookies.rb
|
199
|
+
- lib/ferrum/cookies/cookie.rb
|
196
200
|
- lib/ferrum/dialog.rb
|
201
|
+
- lib/ferrum/errors.rb
|
197
202
|
- lib/ferrum/frame.rb
|
198
203
|
- lib/ferrum/frame/dom.rb
|
199
204
|
- lib/ferrum/frame/runtime.rb
|
@@ -213,19 +218,26 @@ files:
|
|
213
218
|
- lib/ferrum/page/animation.rb
|
214
219
|
- lib/ferrum/page/frames.rb
|
215
220
|
- lib/ferrum/page/screenshot.rb
|
216
|
-
- lib/ferrum/
|
221
|
+
- lib/ferrum/page/stream.rb
|
222
|
+
- lib/ferrum/page/tracing.rb
|
223
|
+
- lib/ferrum/proxy.rb
|
224
|
+
- lib/ferrum/rgba.rb
|
217
225
|
- lib/ferrum/target.rb
|
226
|
+
- lib/ferrum/utils/attempt.rb
|
227
|
+
- lib/ferrum/utils/elapsed_time.rb
|
228
|
+
- lib/ferrum/utils/platform.rb
|
218
229
|
- lib/ferrum/version.rb
|
219
|
-
homepage: https://github.com/
|
230
|
+
homepage: https://github.com/rubycdp/ferrum
|
220
231
|
licenses:
|
221
232
|
- MIT
|
222
233
|
metadata:
|
223
234
|
homepage_uri: https://ferrum.rubycdp.com/
|
224
235
|
bug_tracker_uri: https://github.com/rubycdp/ferrum/issues
|
225
|
-
documentation_uri: https://github.com/rubycdp/ferrum/blob/
|
226
|
-
changelog_uri: https://github.com/rubycdp/ferrum/blob/
|
236
|
+
documentation_uri: https://github.com/rubycdp/ferrum/blob/main/README.md
|
237
|
+
changelog_uri: https://github.com/rubycdp/ferrum/blob/main/CHANGELOG.md
|
227
238
|
source_code_uri: https://github.com/rubycdp/ferrum
|
228
|
-
|
239
|
+
rubygems_mfa_required: 'true'
|
240
|
+
post_install_message:
|
229
241
|
rdoc_options: []
|
230
242
|
require_paths:
|
231
243
|
- lib
|
@@ -233,15 +245,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
233
245
|
requirements:
|
234
246
|
- - ">="
|
235
247
|
- !ruby/object:Gem::Version
|
236
|
-
version: 2.
|
248
|
+
version: 2.6.0
|
237
249
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
238
250
|
requirements:
|
239
251
|
- - ">="
|
240
252
|
- !ruby/object:Gem::Version
|
241
253
|
version: '0'
|
242
254
|
requirements: []
|
243
|
-
rubygems_version: 3.
|
244
|
-
signing_key:
|
255
|
+
rubygems_version: 3.3.7
|
256
|
+
signing_key:
|
245
257
|
specification_version: 4
|
246
258
|
summary: Ruby headless Chrome driver
|
247
259
|
test_files: []
|