apparition 0.0.1 → 0.0.2

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: 9aa4f4946fd5bbdd57c5547b6dd179c2c9f91737e4810bc331ac7155b9efb542
4
- data.tar.gz: 8bdbca6fc6c5598a8827627f10b4dc9dfbbe94df5b57ea006a80d13a8bf4402a
3
+ metadata.gz: 9e8fee05c8a55aecbed96ec2f5f1c7d36ffdea00488281be36fe4e6ac85ab9a4
4
+ data.tar.gz: 781e519f382127f2dfd6be4bda8a0b674d185bfdc8d1072962c5136cae773a1c
5
5
  SHA512:
6
- metadata.gz: 47c7ddf86e36760c0d26c64e59a157d5e32871e106977dd166acceeca7cd3b07e27131d02e6ec1487d74cba6cdebad8831ea6b6a2e79fcf4d00dbe53fd02be70
7
- data.tar.gz: 50d6f7f64911974d0f17687500a2059efba3ccd3f609f5c96f7fb09ba37a193f77d537c13c50b3fbf7a27d033ea3c0b591ee33023a991870637f211db5705ed3
6
+ metadata.gz: 96e43542fe127e373cb1f5167c4023922e4a0428b11fa11c13797e1dec0f304fad8ae6422e1c887891317d064905a1a54174c4696d989ad2741a18e6c278e901
7
+ data.tar.gz: 2667120038d46b9fc874f8009c9820fc6fee86e6a02e753ffcbd16c60398928bb1f1b8ad2cdbf2640d883de94920e2d569e6e127b433866c39809cc712cb34bd
data/README.md CHANGED
@@ -172,6 +172,7 @@ end
172
172
  the browser. Useful for faking or mocking APIs.
173
173
  * `:url_blacklist` (Array) - Default session url blacklist - expressed as an array of strings to match against requested URLs.
174
174
  * `:url_whitelist` (Array) - Default session url whitelist - expressed as an array of strings to match against requested URLs.
175
+ * `:ignore_https_errors` (Boolean) - Ignore certificate errors when connecting to https URLs.
175
176
  * `:browser_options` (Hash) - Extra command line options to pass to Chrome when starting
176
177
 
177
178
  ### URL Blacklisting & Whitelisting ###
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'capybara/apparition/errors'
4
- require 'capybara/apparition/command'
5
4
  require 'capybara/apparition/dev_tools_protocol/target_manager'
6
5
  require 'capybara/apparition/page'
7
6
  require 'json'
@@ -9,7 +8,7 @@ require 'time'
9
8
 
10
9
  module Capybara::Apparition
11
10
  class Browser
12
- attr_reader :client, :logger, :paper_size
11
+ attr_reader :client, :logger, :paper_size, :zoom_factor
13
12
 
14
13
  def initialize(client, logger = nil)
15
14
  @client = client
@@ -18,6 +17,7 @@ module Capybara::Apparition
18
17
  @targets = Capybara::Apparition::DevToolsProtocol::TargetManager.new
19
18
  @context_id = nil
20
19
  @js_errors = true
20
+ @ignore_https_errors = false
21
21
 
22
22
  initialize_handlers
23
23
 
@@ -34,7 +34,9 @@ module Capybara::Apparition
34
34
 
35
35
  self.debug = @debug if defined?(@debug)
36
36
  self.js_errors = @js_errors if defined?(@js_errors)
37
+ self.zoom_factor = @zoom_factor if defined?(@zoom_factor)
37
38
  self.extensions = @extensions if @extensions
39
+ current_page.clear_network_traffic
38
40
  end
39
41
 
40
42
  def visit(url)
@@ -130,9 +132,8 @@ module Capybara::Apparition
130
132
  end
131
133
 
132
134
  def close_window(handle)
133
- @targets.delete(handle)
134
135
  @current_page_handle = nil if @current_page_handle == handle
135
- command('Target.closeTarget', targetId: handle)
136
+ @targets.delete(handle).close
136
137
  end
137
138
 
138
139
  def within_window(locator)
@@ -150,9 +151,9 @@ module Capybara::Apparition
150
151
  @context_id = command('Target.createBrowserContext')['browserContextId']
151
152
  target_id = command('Target.createTarget', url: 'about:blank', browserContextId: @context_id)['targetId']
152
153
 
153
- start = Time.now
154
+ timer = Capybara::Helpers.timer(expire_in: 5)
154
155
  until @targets.get(target_id)&.page&.usable?
155
- if Time.now - start > 5
156
+ if timer.expired?
156
157
  puts 'Timedout waiting for reset'
157
158
  # byebug
158
159
  raise TimeoutError.new('reset')
@@ -168,26 +169,26 @@ module Capybara::Apparition
168
169
  end
169
170
 
170
171
  def render(path, options = {})
171
- options[:format] ||= File.extname(path).downcase[1..-1]
172
- check_render_options!(options)
173
- options[:full] = !!options[:full]
172
+ check_render_options!(options, path)
174
173
  img_data = current_page.render(options)
175
174
  File.open(path, 'wb') { |f| f.write(Base64.decode64(img_data)) }
176
175
  end
177
176
 
178
- def render_base64(_format, options = {})
177
+ def render_base64(options = {})
179
178
  check_render_options!(options)
180
- options[:full] = !!options[:full]
181
179
  current_page.render(options)
182
180
  end
183
181
 
184
- # def set_zoom_factor(zoom_factor)
185
- # TODO: implement if needed
186
- # command 'set_zoom_factor', zoom_factor
187
- # end
182
+ attr_writer :zoom_factor
188
183
 
189
- def set_paper_size(size)
190
- @paper_size = size
184
+ def paper_size=(size)
185
+ @paper_size = if size.is_a? Hash
186
+ size
187
+ else
188
+ PAPER_SIZES.fetch(size) do
189
+ raise_errors ArgumentError, "Unknwon paper size: #{size}"
190
+ end
191
+ end
191
192
  end
192
193
 
193
194
  def resize(width, height, screen: nil)
@@ -223,18 +224,13 @@ module Capybara::Apparition
223
224
  # command('set_proxy', *args)
224
225
  end
225
226
 
226
- def equals(page_id, id, other_id)
227
- # TODO: Implement if still needed
228
- # command('equals', page_id, id, other_id)
229
- end
230
-
231
- def get_headers
227
+ def headers
232
228
  current_page.extra_headers
233
229
  end
234
230
 
235
- def set_headers(headers)
231
+ def headers=(headers)
236
232
  @targets.pages.each do |page|
237
- page.perm_headers = headers
233
+ page.perm_headers = headers.dup
238
234
  page.temp_headers = {}
239
235
  page.temp_no_redirect_headers = {}
240
236
  page.update_headers
@@ -301,7 +297,7 @@ module Capybara::Apparition
301
297
  end
302
298
  end
303
299
 
304
- attr_accessor :js_errors
300
+ attr_accessor :js_errors, :ignore_https_errors
305
301
 
306
302
  def extensions=(filenames)
307
303
  @extensions = filenames
@@ -329,26 +325,17 @@ module Capybara::Apparition
329
325
  end
330
326
 
331
327
  def command(name, params = {})
332
- cmd = Command.new(name, params)
333
- log cmd.message
334
-
335
- response = client.send_cmd(name, params, async: false)
336
- log response
328
+ result = client.send_cmd(name, params).result
329
+ log result
337
330
 
338
- response || raise(Capybara::Apparition::ObsoleteNode.new(nil, nil))
331
+ result || raise(Capybara::Apparition::ObsoleteNode.new(nil, nil))
339
332
  rescue DeadClient
340
333
  restart
341
334
  raise
342
335
  end
343
336
 
344
- def command_for_session(session_id, name, params, async: false)
345
- cmd = Command.new(name, params)
346
- log cmd.message
347
-
348
- response = client.send_cmd_to_session(session_id, name, params, async: async)
349
- log response
350
-
351
- response
337
+ def command_for_session(session_id, name, params)
338
+ client.send_cmd_to_session(session_id, name, params)
352
339
  rescue DeadClient
353
340
  restart
354
341
  raise
@@ -378,16 +365,10 @@ module Capybara::Apparition
378
365
  current_page.add_modal(confirm: false)
379
366
  end
380
367
 
381
- #
382
- # press "OK" with text (response) or default value
383
- #
384
368
  def accept_prompt(response)
385
369
  current_page.add_modal(prompt: response)
386
370
  end
387
371
 
388
- #
389
- # press "Cancel"
390
- #
391
372
  def dismiss_prompt
392
373
  current_page.add_modal(prompt: false)
393
374
  end
@@ -411,11 +392,13 @@ module Capybara::Apparition
411
392
  end
412
393
 
413
394
  def log(message)
414
- logger&.puts message
395
+ logger&.puts message if ENV['DEBUG']
415
396
  end
416
397
 
417
- def check_render_options!(options)
398
+ def check_render_options!(options, path = nil)
399
+ options[:format] ||= File.extname(path).downcase[1..-1] if path
418
400
  options[:format] = :jpeg if options[:format].to_s == 'jpg'
401
+ options[:full] = !!options[:full]
419
402
  return unless options[:full] && options.key?(:selector)
420
403
 
421
404
  warn "Ignoring :selector in #render since :full => true was given at #{caller(1..1)}"
@@ -528,5 +511,15 @@ module Capybara::Apparition
528
511
  end
529
512
  end
530
513
  end
514
+
515
+ PAPER_SIZES = {
516
+ 'A3' => { width: 11.69, height: 16.53 },
517
+ 'A4' => { width: 8.27, height: 11.69 },
518
+ 'A5' => { width: 5.83, height: 8.27 },
519
+ 'Legal' => { width: 8.5, height: 14 },
520
+ 'Letter' => { width: 8.5, height: 11 },
521
+ 'Tabloid' => { width: 11, height: 17 },
522
+ 'Ledger' => { width: 17, height: 11 }
523
+ }.freeze
531
524
  end
532
525
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'capybara/apparition/errors'
4
4
  require 'capybara/apparition/web_socket_client'
5
+ require 'capybara/apparition/response'
5
6
 
6
7
  module Capybara::Apparition
7
8
  class ChromeClient
@@ -58,68 +59,57 @@ module Capybara::Apparition
58
59
  @session_handlers[session_id][event_name] << block
59
60
  end
60
61
 
61
- def send_cmd(command, params, async:)
62
- msg_id, msg = generate_msg(command, params, async: async)
63
- @send_mutex.synchronize do
64
- puts "#{Time.now.to_i}: sending msg: #{msg}" if ENV['DEBUG']
65
- @ws.send_msg(msg)
66
- end
67
-
68
- return nil if async
69
-
70
- puts "waiting for session response for message #{msg_id}" if ENV['DEUG']
71
- response = wait_for_msg_response(msg_id)
72
-
73
- raise CDPError(response['error']) if response['error']
74
-
75
- response['result']
62
+ def send_cmd(command, params)
63
+ time = Time.now
64
+ msg_id = send_msg(command, params)
65
+ Response.new(self, msg_id, send_time: time)
76
66
  end
77
67
 
78
- def send_cmd_to_session(session_id, command, params, async:)
79
- msg_id, msg = generate_msg(command, params, async: async)
80
-
81
- send_cmd('Target.sendMessageToTarget', { sessionId: session_id, message: msg }, async: async)
82
-
83
- return nil if async
84
-
85
- puts "waiting for session response for message #{msg_id}" if ENV['DEBUG'] == 'V'
86
- response = wait_for_msg_response(msg_id)
68
+ def send_cmd_to_session(session_id, command, params)
69
+ time = Time.now
70
+ msg_id, msg = generate_msg(command, params)
71
+ wrapper_msg_id = send_msg('Target.sendMessageToTarget', sessionId: session_id, message: msg)
72
+ Response.new(self, wrapper_msg_id, msg_id, send_time: time)
73
+ end
87
74
 
88
- if (error = response['error'])
89
- case error['code']
90
- when -32_000
91
- raise WrongWorld.new(nil, error)
92
- else
93
- raise CDPError.new(error)
94
- end
75
+ def add_async_id(msg_id)
76
+ @msg_mutex.synchronize do
77
+ @async_ids.push(msg_id)
95
78
  end
96
-
97
- response['result']
98
79
  end
99
80
 
100
- def listen_until
101
- read_until { yield }
102
- end
81
+ private
103
82
 
104
- def listen
105
- read_until { false }
83
+ def handle_error(error)
84
+ case error['code']
85
+ when -32_000
86
+ raise WrongWorld.new(nil, error)
87
+ else
88
+ raise CDPError.new(error)
89
+ end
106
90
  end
107
91
 
108
- private
92
+ def send_msg(command, params)
93
+ msg_id, msg = generate_msg(command, params)
94
+ @send_mutex.synchronize do
95
+ puts "#{Time.now.to_i}: sending msg: #{msg}" if ENV['DEBUG']
96
+ @ws.send_msg(msg)
97
+ end
98
+ msg_id
99
+ end
109
100
 
110
- def generate_msg(command, params, async:)
101
+ def generate_msg(command, params)
111
102
  @send_mutex.synchronize do
112
103
  msg_id = generate_unique_id
113
- @async_ids.push(msg_id) if async
114
104
  [msg_id, { method: command, params: params, id: msg_id }.to_json]
115
105
  end
116
106
  end
117
107
 
118
108
  def wait_for_msg_response(msg_id)
119
109
  @msg_mutex.synchronize do
120
- start_time = Time.now
110
+ timer = Capybara::Helpers.timer(expire_in: @timeout)
121
111
  while (response = @responses.delete(msg_id)).nil?
122
- if @timeout && ((Time.now - start_time) > @timeout)
112
+ if @timeout && timer.expired?
123
113
  puts "Timedout waiting for response for msg: #{msg_id}"
124
114
  raise TimeoutError.new(msg_id)
125
115
  end
@@ -141,6 +131,14 @@ module Capybara::Apparition
141
131
  end
142
132
  end
143
133
 
134
+ def listen_until
135
+ read_until { yield }
136
+ end
137
+
138
+ def listen
139
+ read_until { false }
140
+ end
141
+
144
142
  def read_msg
145
143
  msg = JSON.parse(@ws.read_msg)
146
144
  puts "#{Time.now.to_i}: got msg: #{msg}" if ENV['DEBUG']
@@ -179,24 +177,15 @@ module Capybara::Apparition
179
177
  next unless event
180
178
 
181
179
  event_name = event['method']
182
- puts "popped event #{event_name}" if ENV['DEBUG'] == 'V'
180
+ puts "Popped event #{event_name}" if ENV['DEBUG'] == 'V'
183
181
 
184
182
  if event_name == 'Target.receivedMessageFromTarget'
185
183
  session_id = event.dig('params', 'sessionId')
186
184
  event = JSON.parse(event.dig('params', 'message'))
187
- event_name = event['method']
188
- if event_name
189
- puts "calling session handler for #{event_name}" if ENV['DEBUG'] == 'V'
190
- @session_handlers[session_id][event_name].each do |handler|
191
- handler.call(event['params'])
192
- end
193
- end
185
+ process_handlers(@session_handlers[session_id], event)
194
186
  end
195
187
 
196
- @handlers[event_name].each do |handler|
197
- puts "calling handler for #{event_name}" if ENV['DEBUG'] == 'V'
198
- handler.call(event['params'])
199
- end
188
+ process_handlers(@handlers, event)
200
189
  end
201
190
  rescue CDPError => e
202
191
  if e.code == -32_602
@@ -213,6 +202,14 @@ module Capybara::Apparition
213
202
  retry
214
203
  end
215
204
 
205
+ def process_handlers(handlers, event)
206
+ event_name = event['method']
207
+ handlers[event_name].each do |handler|
208
+ puts "Calling handler for #{event_name}" if ENV['DEBUG'] == 'V'
209
+ handler.call(event['params'])
210
+ end
211
+ end
212
+
216
213
  def start_threads
217
214
  @processor = Thread.new do
218
215
  process_messages
@@ -14,11 +14,11 @@ module Capybara::Apparition
14
14
  end
15
15
 
16
16
  def command(name, **params)
17
- @browser.command_for_session(@session_id, name, params, async: false)
17
+ @browser.command_for_session(@session_id, name, params).result
18
18
  end
19
19
 
20
20
  def async_command(name, **params)
21
- @browser.command_for_session(@session_id, name, params, async: true)
21
+ @browser.command_for_session(@session_id, name, params).discard_result
22
22
  end
23
23
 
24
24
  def on(event_name, &block)
@@ -29,7 +29,7 @@ module Capybara::Apparition
29
29
  @page ||= begin
30
30
  if info['type'] == 'page'
31
31
  Page.create(@browser, create_session, id,
32
- ignore_https_errors: true,
32
+ ignore_https_errors: @browser.ignore_https_errors,
33
33
  js_errors: @browser.js_errors).inherit(info.delete('inherit'))
34
34
  else
35
35
  nil
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'uri'
4
+ require 'forwardable'
4
5
  require 'capybara/apparition/chrome_client'
5
6
  require 'capybara/apparition/launcher'
6
7
 
@@ -8,8 +9,21 @@ module Capybara::Apparition
8
9
  class Driver < Capybara::Driver::Base
9
10
  DEFAULT_TIMEOUT = 30
10
11
 
12
+ extend Forwardable
13
+
11
14
  attr_reader :app, :options
12
15
 
16
+ delegate %i[restart current_url status_code body
17
+ title frame_title frame_url switch_to_frame
18
+ window_handles close_window open_new_window switch_to_window within_window
19
+ paper_size= zoom_factor=
20
+ scroll_to
21
+ network_traffic clear_network_traffic
22
+ headers headers= add_headers
23
+ cookies remove_cookie clear_cookies cookies_enabled=
24
+ clear_memory_cache
25
+ go_back go_forward refresh] => :browser
26
+
13
27
  def initialize(app, options = {})
14
28
  @app = app
15
29
  @options = options
@@ -30,7 +44,8 @@ module Capybara::Apparition
30
44
  def browser
31
45
  @browser ||= begin
32
46
  browser = Browser.new(client, browser_logger)
33
- browser.js_errors = options[:js_errors] if options.key?(:js_errors)
47
+ browser.js_errors = options[:js_errors] if options.key?(:js_errors)
48
+ browser.ignore_https_errors = options[:ignore_https_errors] if options.key?(:ignore_https_errors)
34
49
  browser.extensions = options.fetch(:extensions, [])
35
50
  browser.debug = true if options[:debug]
36
51
  browser.url_blacklist = options[:url_blacklist] || []
@@ -52,17 +67,14 @@ module Capybara::Apparition
52
67
  @launcher ||= Browser::Launcher.start(
53
68
  headless: options[:headless] != false,
54
69
  browser: browser_options
55
- )
70
+ )
56
71
  ws_url = @launcher.ws_url
57
- client = ::Capybara::Apparition::ChromeClient.client(ws_url.to_s)
58
- sleep 3
59
- client
72
+ ::Capybara::Apparition::ChromeClient.client(ws_url.to_s)
60
73
  end
61
74
  end
62
75
 
63
76
  def browser_options
64
77
  list = options[:browser_options] || []
65
-
66
78
  # TODO: configure SSL options
67
79
  # PhantomJS defaults to only using SSLv3, which since POODLE (Oct 2014)
68
80
  # many sites have dropped from their supported protocols (eg PayPal,
@@ -70,13 +82,10 @@ module Capybara::Apparition
70
82
  # list += ["--ignore-ssl-errors=yes"] unless list.grep(/ignore-ssl-errors/).any?
71
83
  # list += ["--ssl-protocol=TLSv1"] unless list.grep(/ssl-protocol/).any?
72
84
  # list += ["--remote-debugger-port=#{inspector.port}", "--remote-debugger-autorun=yes"] if inspector
85
+ # Note: Need to verify what Chrome command line options are valid for this
73
86
  list
74
87
  end
75
88
 
76
- def restart
77
- browser.restart
78
- end
79
-
80
89
  def quit
81
90
  @client&.stop
82
91
  @launcher&.stop
@@ -89,7 +98,7 @@ module Capybara::Apparition
89
98
 
90
99
  # logger should be an object that behaves like IO or nil
91
100
  def browser_logger
92
- options.fetch(:browser_logger, nil)
101
+ options.fetch(:browser_logger, $stdout)
93
102
  end
94
103
 
95
104
  def visit(url)
@@ -97,35 +106,12 @@ module Capybara::Apparition
97
106
  browser.visit(url)
98
107
  end
99
108
 
100
- def current_url
101
- browser.current_url
102
- end
103
-
104
- def status_code
105
- browser.status_code
106
- end
107
-
108
- def html
109
- browser.body
110
- end
111
- alias body html
109
+ alias html body
112
110
 
113
111
  def source
114
112
  browser.source.to_s
115
113
  end
116
114
 
117
- def title
118
- browser.title
119
- end
120
-
121
- def frame_title
122
- browser.frame_title
123
- end
124
-
125
- def frame_url
126
- browser.frame_url
127
- end
128
-
129
115
  def find(method, selector)
130
116
  browser.find(method, selector).map { |page_id, id| Capybara::Apparition::Node.new(self, page_id, id) }
131
117
  end
@@ -143,13 +129,11 @@ module Capybara::Apparition
143
129
  end
144
130
 
145
131
  def evaluate_script(script, *args)
146
- result = browser.evaluate(script, *native_args(args))
147
- unwrap_script_result(result)
132
+ unwrap_script_result(browser.evaluate(script, *native_args(args)))
148
133
  end
149
134
 
150
135
  def evaluate_async_script(script, *args)
151
- result = browser.evaluate_async(script, session_wait_time, *native_args(args))
152
- unwrap_script_result(result)
136
+ unwrap_script_result(browser.evaluate_async(script, session_wait_time, *native_args(args)))
153
137
  end
154
138
 
155
139
  def execute_script(script, *args)
@@ -157,43 +141,18 @@ module Capybara::Apparition
157
141
  nil
158
142
  end
159
143
 
160
- def switch_to_frame(frame)
161
- browser.switch_to_frame(frame)
162
- end
163
-
164
144
  def current_window_handle
165
145
  browser.window_handle
166
146
  end
167
147
 
168
- def window_handles
169
- browser.window_handles
170
- end
171
-
172
- def close_window(handle)
173
- browser.close_window(handle)
174
- end
175
-
176
- def open_new_window
177
- browser.open_new_window
178
- end
179
-
180
- def switch_to_window(handle)
181
- browser.switch_to_window(handle)
182
- end
183
-
184
- def within_window(name, &block)
185
- browser.within_window(name, &block)
186
- end
187
-
188
148
  def no_such_window_error
189
149
  NoSuchWindowError
190
150
  end
191
151
 
192
152
  def reset!
193
153
  browser.reset
194
- # TODO: reset the black/whitelists
195
- # browser.url_blacklist = options[:url_blacklist] || []
196
- # browser.url_whitelist = options[:url_whitelist] || []
154
+ browser.url_blacklist = options[:url_blacklist] || []
155
+ browser.url_whitelist = options[:url_whitelist] || []
197
156
  @started = false
198
157
  end
199
158
 
@@ -203,18 +162,9 @@ module Capybara::Apparition
203
162
  alias render save_screenshot
204
163
 
205
164
  def render_base64(format = :png, options = {})
206
- browser.render_base64(format, options)
207
- end
208
-
209
- def paper_size=(size = {})
210
- browser.set_paper_size(size)
165
+ browser.render_base64(options.merge(format: format))
211
166
  end
212
167
 
213
- # def zoom_factor=(zoom_factor)
214
- # TODO: Implement if still necessary
215
- # browser.set_zoom_factor(zoom_factor)
216
- # end
217
-
218
168
  def resize(width, height)
219
169
  browser.resize(width, height, screen: options[:screen_size])
220
170
  end
@@ -244,34 +194,10 @@ module Capybara::Apparition
244
194
  end
245
195
  end
246
196
 
247
- def scroll_to(left, top)
248
- browser.scroll_to(left, top)
249
- end
250
-
251
- def network_traffic(type = nil)
252
- browser.network_traffic(type)
253
- end
254
-
255
- def clear_network_traffic
256
- browser.clear_network_traffic
257
- end
258
-
259
197
  def set_proxy(ip, port, type = 'http', user = nil, password = nil)
260
198
  browser.set_proxy(ip, port, type, user, password)
261
199
  end
262
200
 
263
- def headers
264
- browser.get_headers
265
- end
266
-
267
- def headers=(headers)
268
- browser.set_headers(headers)
269
- end
270
-
271
- def add_headers(headers)
272
- browser.add_headers(headers)
273
- end
274
-
275
201
  def add_header(name, value, options = {})
276
202
  browser.add_header({ name => value }, { permanent: true }.merge(options))
277
203
  end
@@ -282,10 +208,6 @@ module Capybara::Apparition
282
208
  end
283
209
  end
284
210
 
285
- def cookies
286
- browser.cookies
287
- end
288
-
289
211
  def set_cookie(name, value, options = {})
290
212
  options[:name] ||= name
291
213
  options[:value] ||= value
@@ -300,22 +222,6 @@ module Capybara::Apparition
300
222
  browser.set_cookie(options)
301
223
  end
302
224
 
303
- def remove_cookie(name)
304
- browser.remove_cookie(name)
305
- end
306
-
307
- def clear_cookies
308
- browser.clear_cookies
309
- end
310
-
311
- def cookies_enabled=(flag)
312
- browser.cookies_enabled = flag
313
- end
314
-
315
- def clear_memory_cache
316
- browser.clear_memory_cache
317
- end
318
-
319
225
  def basic_authorize(user = nil, password = nil)
320
226
  browser.set_http_auth(user, password)
321
227
  # credentials = ["#{user}:#{password}"].pack('m*').strip
@@ -383,18 +289,6 @@ module Capybara::Apparition
383
289
  [Capybara::Apparition::ObsoleteNode, Capybara::Apparition::MouseEventFailed]
384
290
  end
385
291
 
386
- def go_back
387
- browser.go_back
388
- end
389
-
390
- def go_forward
391
- browser.go_forward
392
- end
393
-
394
- def refresh
395
- browser.refresh
396
- end
397
-
398
292
  def accept_modal(type, options = {})
399
293
  case type
400
294
  when :alert
@@ -437,21 +331,21 @@ module Capybara::Apparition
437
331
  end
438
332
 
439
333
  def find_modal(options)
440
- start_time = Time.now
441
334
  timeout_sec = options.fetch(:wait) { session_wait_time }
442
335
  expect_text = options[:text]
443
336
  expect_regexp = expect_text.is_a?(Regexp) ? expect_text : Regexp.escape(expect_text.to_s)
337
+ timer = Capybara::Helpers.timer(expire_in: timeout_sec)
444
338
  begin
445
339
  modal_text = browser.modal_message
446
340
  found_text ||= modal_text
447
341
  raise Capybara::ModalNotFound if modal_text.nil? || (expect_text && !modal_text.match(expect_regexp))
448
342
  rescue Capybara::ModalNotFound => e
449
- if (Time.now - start_time) >= timeout_sec
343
+ if timer.expired?
450
344
  raise e, 'Unable to find modal dialog'\
451
345
  "#{" with #{expect_text}" if expect_text}"\
452
346
  "#{", did find modal with #{found_text}" if found_text}"
453
347
  end
454
- sleep(0.5)
348
+ sleep(0.05)
455
349
  retry
456
350
  end
457
351
  modal_text