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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +174 -30
  4. data/lib/ferrum/browser/binary.rb +46 -0
  5. data/lib/ferrum/browser/client.rb +17 -16
  6. data/lib/ferrum/browser/command.rb +10 -12
  7. data/lib/ferrum/browser/options/base.rb +2 -11
  8. data/lib/ferrum/browser/options/chrome.rb +29 -18
  9. data/lib/ferrum/browser/options/firefox.rb +13 -9
  10. data/lib/ferrum/browser/options.rb +84 -0
  11. data/lib/ferrum/browser/process.rb +45 -40
  12. data/lib/ferrum/browser/subscriber.rb +1 -3
  13. data/lib/ferrum/browser/version_info.rb +71 -0
  14. data/lib/ferrum/browser/web_socket.rb +9 -12
  15. data/lib/ferrum/browser/xvfb.rb +4 -8
  16. data/lib/ferrum/browser.rb +193 -47
  17. data/lib/ferrum/context.rb +9 -4
  18. data/lib/ferrum/contexts.rb +12 -10
  19. data/lib/ferrum/cookies/cookie.rb +126 -0
  20. data/lib/ferrum/cookies.rb +93 -55
  21. data/lib/ferrum/dialog.rb +30 -0
  22. data/lib/ferrum/errors.rb +115 -0
  23. data/lib/ferrum/frame/dom.rb +177 -0
  24. data/lib/ferrum/frame/runtime.rb +58 -75
  25. data/lib/ferrum/frame.rb +118 -23
  26. data/lib/ferrum/headers.rb +30 -2
  27. data/lib/ferrum/keyboard.rb +56 -13
  28. data/lib/ferrum/mouse.rb +92 -7
  29. data/lib/ferrum/network/auth_request.rb +7 -2
  30. data/lib/ferrum/network/exchange.rb +97 -12
  31. data/lib/ferrum/network/intercepted_request.rb +10 -8
  32. data/lib/ferrum/network/request.rb +69 -0
  33. data/lib/ferrum/network/response.rb +85 -3
  34. data/lib/ferrum/network.rb +285 -36
  35. data/lib/ferrum/node.rb +69 -23
  36. data/lib/ferrum/page/animation.rb +16 -1
  37. data/lib/ferrum/page/frames.rb +111 -30
  38. data/lib/ferrum/page/screenshot.rb +142 -65
  39. data/lib/ferrum/page/stream.rb +38 -0
  40. data/lib/ferrum/page/tracing.rb +97 -0
  41. data/lib/ferrum/page.rb +224 -60
  42. data/lib/ferrum/proxy.rb +147 -0
  43. data/lib/ferrum/{rbga.rb → rgba.rb} +4 -2
  44. data/lib/ferrum/target.rb +7 -4
  45. data/lib/ferrum/utils/attempt.rb +20 -0
  46. data/lib/ferrum/utils/elapsed_time.rb +27 -0
  47. data/lib/ferrum/utils/platform.rb +28 -0
  48. data/lib/ferrum/version.rb +1 -1
  49. data/lib/ferrum.rb +4 -146
  50. metadata +63 -51
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ferrum
4
- VERSION = "0.11"
4
+ VERSION = "0.13"
5
5
  end
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.11'
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: 2021-03-11 00:00:00.000000000 Z
11
+ date: 2022-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: websocket-driver
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: '0.8'
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: '0.8'
26
+ version: '2.5'
33
27
  - !ruby/object:Gem::Dependency
34
- name: cliver
28
+ name: concurrent-ruby
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
31
  - - "~>"
38
32
  - !ruby/object:Gem::Version
39
- version: '0.3'
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: '0.3'
40
+ version: '1.1'
47
41
  - !ruby/object:Gem::Dependency
48
- name: concurrent-ruby
42
+ name: webrick
49
43
  requirement: !ruby/object:Gem::Requirement
50
44
  requirements:
51
45
  - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: '1.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.1'
54
+ version: '1.7'
61
55
  - !ruby/object:Gem::Dependency
62
- name: addressable
56
+ name: websocket-driver
63
57
  requirement: !ruby/object:Gem::Requirement
64
58
  requirements:
65
- - - "~>"
59
+ - - ">="
66
60
  - !ruby/object:Gem::Version
67
- version: '2.5'
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: '2.5'
71
+ version: '0.6'
72
+ - - "<"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.8'
75
75
  - !ruby/object:Gem::Dependency
76
- name: rake
76
+ name: chunky_png
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '13.0'
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: '13.0'
88
+ version: '1.3'
89
89
  - !ruby/object:Gem::Dependency
90
- name: rspec
90
+ name: image_size
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '3.8'
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: '3.8'
102
+ version: '2.0'
103
103
  - !ruby/object:Gem::Dependency
104
- name: sinatra
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.0'
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.0'
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: image_size
132
+ name: rake
133
133
  requirement: !ruby/object:Gem::Requirement
134
134
  requirements:
135
135
  - - "~>"
136
136
  - !ruby/object:Gem::Version
137
- version: '2.0'
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: '2.0'
144
+ version: '13.0'
145
145
  - !ruby/object:Gem::Dependency
146
- name: pdf-reader
146
+ name: rspec
147
147
  requirement: !ruby/object:Gem::Requirement
148
148
  requirements:
149
149
  - - "~>"
150
150
  - !ruby/object:Gem::Version
151
- version: '2.2'
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: '2.2'
158
+ version: '3.8'
159
159
  - !ruby/object:Gem::Dependency
160
- name: chunky_png
160
+ name: sinatra
161
161
  requirement: !ruby/object:Gem::Requirement
162
162
  requirements:
163
163
  - - "~>"
164
164
  - !ruby/object:Gem::Version
165
- version: '1.3'
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: '1.3'
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/rbga.rb
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/route/ferrum
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/master/README.md
226
- changelog_uri: https://github.com/rubycdp/ferrum/blob/master/CHANGELOG.md
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
- post_install_message:
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.3.0
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.1.4
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: []