cuprite 0.5.0 → 0.6.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f883874c9b6d85c217809bb7423c5dc7b31db4932b9bf8ad8e8c469eb0820973
4
- data.tar.gz: c29bbb53cd0a8153988e4d26dc709a3aa49ad94114a7c175d636705f94eb263c
3
+ metadata.gz: 117f25092d57e0e61feeec4d161d3b9da6cdde4ea6963e624dca22af48de75fa
4
+ data.tar.gz: aae39fa9139563a5870e66be1d564c69136df2e7d73c72ff744edf4bb5cccc8a
5
5
  SHA512:
6
- metadata.gz: b0f9a932c1e3640eac45e9b1f3af0964f0f8e9c24037d961f6d10825bcbc97f323b324ae58595de0c84c73d900add6ef96357c6555796938fc3e8d2c261217b1
7
- data.tar.gz: 4de0397ab55e6863d64a2faa20a63bc6b97b585308b6f8d5694c75dbc10b90b18b1b202a7501b51a409bd59eaa2fa415d637816060550927751d42047bf4a530
6
+ metadata.gz: f77ad45ba3abe3a1a4dec994566cbf1d0ab0c7364fbc879bf89583e1602a5a5c16da3cc1d6e1d6b8c2b5eee601409d1c8cf31f291f01cc83217f495ae313e56a
7
+ data.tar.gz: 2a976e8a5ece9441ba281b2521c43cf8ed209258bbb386254539341157dad7245933292458c7ccb7a1f019119b2334d15f3c68fb0d9af9df0061f74879d62cfb
data/README.md CHANGED
@@ -13,25 +13,6 @@ have consistent design with other browsers. The design of the driver will be as
13
13
  close to [Poltergeist](https://github.com/teampoltergeist/poltergeist) as
14
14
  possible but it's not a goal.
15
15
 
16
- ## Speed comparison and missing features ##
17
-
18
- Almost all capybara tests are passing with quite good speed in comparison with
19
- Poltergest/PhantomJS:
20
-
21
- ```
22
- cuprite:
23
- Finished in 8 minutes 58 seconds (files took 0.89959 seconds to load)
24
- 1555 examples, 0 failures, 27 pending
25
-
26
- selenium headless chrome:
27
- Finished in 9 minutes 13 seconds (files took 0.97749 seconds to load)
28
- 1445 examples, 0 failures, 3 pending
29
-
30
- poltergeist:
31
- Finished in 11 minutes 49 seconds (files took 0.54019 seconds to load)
32
- 1560 examples, 0 failures, 6 pending
33
- ```
34
-
35
16
  ## Installation ##
36
17
 
37
18
  ``` ruby
@@ -47,10 +28,6 @@ require "capybara/cuprite"
47
28
  Capybara.javascript_driver = :cuprite
48
29
  ```
49
30
 
50
- If you were previously using the `:rack_test` driver, be aware that
51
- your app will now run in a separate thread and this can have
52
- consequences for transactional tests. [See the Capybara README for more detail](https://github.com/jnicklas/capybara/blob/master/README.md#transactions-and-database-setup).
53
-
54
31
  ## Installing Chromium ##
55
32
 
56
33
  As Chromium is stopped being built as a package for Linux don't even try to
@@ -155,6 +132,7 @@ end
155
132
  * `:host` (String) - Remote debugging address for headless Chrome
156
133
  * `:url_blacklist` (Array) - array of strings to match against requested URLs
157
134
  * `:url_whitelist` (Array) - array of strings to match against requested URLs
135
+ * `:process_timeout` (Integer) - How long to wait for the Chrome process to respond on startup
158
136
 
159
137
 
160
138
  ### URL Blacklisting & Whitelisting ###
@@ -154,7 +154,7 @@ module Capybara::Cuprite
154
154
  end
155
155
 
156
156
  def find_modal(options)
157
- start_time = Time.now
157
+ start_time = Capybara::Helpers.monotonic_time
158
158
  timeout_sec = options.fetch(:wait) { session_wait_time }
159
159
  expect_text = options[:text]
160
160
  expect_regexp = expect_text.is_a?(Regexp) ? expect_text : Regexp.escape(expect_text.to_s)
@@ -165,7 +165,7 @@ module Capybara::Cuprite
165
165
  modal_text = @modal_messages.shift
166
166
  raise Capybara::ModalNotFound if modal_text.nil? || (expect_text && !modal_text.match(expect_regexp))
167
167
  rescue Capybara::ModalNotFound => e
168
- raise e, not_found_msg if (Time.now - start_time) >= timeout_sec
168
+ raise e, not_found_msg if (Capybara::Helpers.monotonic_time - start_time) >= timeout_sec
169
169
  sleep(0.05)
170
170
  retry
171
171
  end
@@ -184,9 +184,9 @@ module Capybara::Cuprite
184
184
 
185
185
  @mutex.synchronize do
186
186
  id = @client.command(*args)
187
- stop_at = Time.now.to_f + @wait
187
+ stop_at = Capybara::Helpers.monotonic_time + @wait
188
188
 
189
- while @wait > 0 && (remain = stop_at - Time.now.to_f) > 0
189
+ while @wait > 0 && (remain = stop_at - Capybara::Helpers.monotonic_time) > 0
190
190
  @resource.wait(@mutex, remain)
191
191
  end
192
192
 
@@ -279,6 +279,19 @@ module Capybara::Cuprite
279
279
  end
280
280
  end
281
281
 
282
+ @client.subscribe("Network.loadingFinished") do |params|
283
+ if request = @network_traffic.find { |r| r.id == params["requestId"] }
284
+ # Sometimes we never get the Network.responseReceived event.
285
+ # See https://crbug.com/883475
286
+ #
287
+ # Network.loadingFinished's encodedDataLength contains both body and headers
288
+ # sizes received by wire. See https://crbug.com/764946
289
+ if response = request.response
290
+ response.body_size = params["encodedDataLength"] - response.headers_size
291
+ end
292
+ end
293
+ end
294
+
282
295
  @client.subscribe("Log.entryAdded") do |params|
283
296
  source = params.dig("entry", "source")
284
297
  level = params.dig("entry", "level")
@@ -6,6 +6,7 @@ module Capybara::Cuprite
6
6
  class Browser
7
7
  class Process
8
8
  KILL_TIMEOUT = 2
9
+ PROCESS_TIMEOUT = 1
9
10
  BROWSER_PATH = ENV["BROWSER_PATH"]
10
11
  BROWSER_HOST = "127.0.0.1"
11
12
  BROWSER_PORT = "0"
@@ -59,10 +60,10 @@ module Capybara::Cuprite
59
60
  ::Process.kill("KILL", pid)
60
61
  else
61
62
  ::Process.kill("USR1", pid)
62
- start = Time.now
63
+ start = Capybara::Helpers.monotonic_time
63
64
  while ::Process.wait(pid, ::Process::WNOHANG).nil?
64
65
  sleep 0.05
65
- next unless (Time.now - start) > KILL_TIMEOUT
66
+ next unless (Capybara::Helpers.monotonic_time - start) > KILL_TIMEOUT
66
67
  ::Process.kill("KILL", pid)
67
68
  ::Process.wait(pid)
68
69
  break
@@ -96,6 +97,8 @@ module Capybara::Cuprite
96
97
  @options.delete("disable-gpu")
97
98
  end
98
99
 
100
+ @process_timeout = options.fetch(:process_timeout, PROCESS_TIMEOUT)
101
+
99
102
  @options.merge!(options.fetch(:browser_options, {}))
100
103
 
101
104
  @logger = options.fetch(:logger, nil)
@@ -115,7 +118,7 @@ module Capybara::Cuprite
115
118
  ObjectSpace.define_finalizer(self, self.class.process_killer(@pid))
116
119
  end
117
120
 
118
- parse_ws_url(read_io)
121
+ parse_ws_url(read_io, @process_timeout)
119
122
  ensure
120
123
  close_io(read_io, write_io)
121
124
  end
@@ -143,7 +146,7 @@ module Capybara::Cuprite
143
146
  "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
144
147
  ].find { |path| File.exist?(path) }
145
148
  else
146
- %w[chromium google-chrome-unstable google-chrome-beta google-chrome chrome chromium-browser].reduce(nil) do |path, exe|
149
+ %w[chromium google-chrome-unstable google-chrome-beta google-chrome chrome chromium-browser google-chrome-stable].reduce(nil) do |path, exe|
147
150
  path = Cliver.detect(exe)
148
151
  break path if path
149
152
  end
@@ -180,7 +183,7 @@ module Capybara::Cuprite
180
183
  @pid = nil
181
184
  end
182
185
 
183
- def parse_ws_url(read_io, timeout = 1)
186
+ def parse_ws_url(read_io, timeout = PROCESS_TIMEOUT)
184
187
  output = ""
185
188
  start = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
186
189
  max_time = start + timeout
@@ -190,9 +190,10 @@ module Capybara::Cuprite
190
190
  browser.clear_network_traffic
191
191
  end
192
192
 
193
- def set_proxy(ip, port, type = "http", user = nil, password = nil, bypass = nil)
193
+ def set_proxy(ip, port, type = nil, user = nil, password = nil, bypass = nil)
194
194
  @options[:browser_options] ||= {}
195
- @options[:browser_options].merge!("proxy-server" => "#{type}=#{ip}:#{port}")
195
+ server = type ? "#{type}=#{ip}:#{port}" : "#{ip}:#{port}"
196
+ @options[:browser_options].merge!("proxy-server" => server)
196
197
  @options[:browser_options].merge!("proxy-bypass-list" => bypass) if bypass
197
198
  browser.proxy_authorize(user, password)
198
199
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Capybara::Cuprite::Network
4
4
  class Response
5
+ attr_accessor :body_size
6
+
5
7
  def initialize(data)
6
8
  @data = data
7
9
  end
@@ -26,15 +28,15 @@ module Capybara::Cuprite::Network
26
28
  @data["headers"]
27
29
  end
28
30
 
31
+ def headers_size
32
+ @data["encodedDataLength"]
33
+ end
34
+
29
35
  # FIXME: didn't check if we have it on redirect response
30
36
  def redirect_url
31
37
  @data["redirectURL"]
32
38
  end
33
39
 
34
- def body_size
35
- @body_size ||= @data.dig("headers", "Content-Length").to_i
36
- end
37
-
38
40
  def content_type
39
41
  @content_type ||= @data.dig("headers", "contentType").sub(/;.*\z/, "")
40
42
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Capybara
4
4
  module Cuprite
5
- VERSION = "0.5.0"
5
+ VERSION = "0.6.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cuprite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Vorotilin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-14 00:00:00.000000000 Z
11
+ date: 2019-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capybara