capybara 2.13.0 → 2.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/History.md +218 -18
- data/README.md +54 -23
- data/lib/capybara/config.rb +132 -0
- data/lib/capybara/cucumber.rb +1 -0
- data/lib/capybara/driver/base.rb +14 -0
- data/lib/capybara/dsl.rb +1 -3
- data/lib/capybara/helpers.rb +3 -3
- data/lib/capybara/minitest/spec.rb +14 -37
- data/lib/capybara/minitest.rb +95 -114
- data/lib/capybara/node/actions.rb +10 -10
- data/lib/capybara/node/base.rb +7 -2
- data/lib/capybara/node/element.rb +9 -3
- data/lib/capybara/node/finders.rb +92 -18
- data/lib/capybara/node/matchers.rb +21 -9
- data/lib/capybara/node/simple.rb +5 -0
- data/lib/capybara/queries/ancestor_query.rb +25 -0
- data/lib/capybara/queries/base_query.rb +12 -3
- data/lib/capybara/queries/current_path_query.rb +13 -9
- data/lib/capybara/queries/selector_query.rb +62 -23
- data/lib/capybara/queries/sibling_query.rb +25 -0
- data/lib/capybara/queries/text_query.rb +10 -5
- data/lib/capybara/queries/title_query.rb +1 -0
- data/lib/capybara/rack_test/browser.rb +13 -5
- data/lib/capybara/rack_test/driver.rb +6 -1
- data/lib/capybara/rack_test/form.rb +4 -3
- data/lib/capybara/rack_test/node.rb +1 -1
- data/lib/capybara/rspec/compound.rb +95 -0
- data/lib/capybara/rspec/matcher_proxies.rb +45 -0
- data/lib/capybara/rspec/matchers.rb +108 -7
- data/lib/capybara/rspec.rb +3 -1
- data/lib/capybara/selector/filter.rb +13 -41
- data/lib/capybara/selector/filter_set.rb +30 -4
- data/lib/capybara/selector/filters/base.rb +33 -0
- data/lib/capybara/selector/filters/expression_filter.rb +40 -0
- data/lib/capybara/selector/filters/node_filter.rb +27 -0
- data/lib/capybara/selector/selector.rb +36 -15
- data/lib/capybara/selector.rb +63 -42
- data/lib/capybara/selenium/driver.rb +177 -33
- data/lib/capybara/selenium/node.rb +106 -55
- data/lib/capybara/server.rb +6 -5
- data/lib/capybara/session/config.rb +114 -0
- data/lib/capybara/session/matchers.rb +15 -4
- data/lib/capybara/session.rb +178 -65
- data/lib/capybara/spec/fixtures/no_extension +1 -0
- data/lib/capybara/spec/public/test.js +18 -3
- data/lib/capybara/spec/session/accept_alert_spec.rb +9 -1
- data/lib/capybara/spec/session/accept_prompt_spec.rb +29 -1
- data/lib/capybara/spec/session/all_spec.rb +13 -1
- data/lib/capybara/spec/session/ancestor_spec.rb +85 -0
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +24 -8
- data/lib/capybara/spec/session/assert_selector.rb +1 -1
- data/lib/capybara/spec/session/assert_text.rb +8 -0
- data/lib/capybara/spec/session/assert_title.rb +22 -9
- data/lib/capybara/spec/session/attach_file_spec.rb +8 -1
- data/lib/capybara/spec/session/check_spec.rb +4 -4
- data/lib/capybara/spec/session/choose_spec.rb +2 -2
- data/lib/capybara/spec/session/click_button_spec.rb +1 -1
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +3 -3
- data/lib/capybara/spec/session/click_link_spec.rb +1 -1
- data/lib/capybara/spec/session/current_url_spec.rb +3 -3
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -1
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +22 -0
- data/lib/capybara/spec/session/evaluate_script_spec.rb +1 -1
- data/lib/capybara/spec/session/fill_in_spec.rb +8 -2
- data/lib/capybara/spec/session/find_field_spec.rb +1 -0
- data/lib/capybara/spec/session/find_spec.rb +8 -6
- data/lib/capybara/spec/session/first_spec.rb +10 -5
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
- data/lib/capybara/spec/session/has_css_spec.rb +11 -0
- data/lib/capybara/spec/session/has_current_path_spec.rb +52 -7
- data/lib/capybara/spec/session/has_link_spec.rb +4 -4
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +76 -0
- data/lib/capybara/spec/session/has_select_spec.rb +64 -6
- data/lib/capybara/spec/session/has_selector_spec.rb +1 -3
- data/lib/capybara/spec/session/has_text_spec.rb +5 -3
- data/lib/capybara/spec/session/has_title_spec.rb +4 -2
- data/lib/capybara/spec/session/has_xpath_spec.rb +5 -3
- data/lib/capybara/spec/session/node_spec.rb +50 -26
- data/lib/capybara/spec/session/refresh_spec.rb +28 -0
- data/lib/capybara/spec/session/reset_session_spec.rb +3 -3
- data/lib/capybara/spec/session/select_spec.rb +3 -2
- data/lib/capybara/spec/session/sibling_spec.rb +52 -0
- data/lib/capybara/spec/session/uncheck_spec.rb +2 -2
- data/lib/capybara/spec/session/unselect_spec.rb +2 -2
- data/lib/capybara/spec/session/visit_spec.rb +56 -1
- data/lib/capybara/spec/session/window/become_closed_spec.rb +11 -11
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +11 -9
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +4 -4
- data/lib/capybara/spec/session/window/within_window_spec.rb +27 -2
- data/lib/capybara/spec/spec_helper.rb +28 -4
- data/lib/capybara/spec/test_app.rb +3 -1
- data/lib/capybara/spec/views/form.erb +27 -1
- data/lib/capybara/spec/views/initial_alert.erb +10 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
- data/lib/capybara/spec/views/with_hover.erb +5 -0
- data/lib/capybara/spec/views/with_html.erb +33 -2
- data/lib/capybara/spec/views/with_js.erb +12 -0
- data/lib/capybara/spec/views/with_windows.erb +4 -0
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +1 -1
- data/lib/capybara.rb +102 -124
- data/spec/capybara_spec.rb +43 -21
- data/spec/dsl_spec.rb +1 -0
- data/spec/filter_set_spec.rb +28 -0
- data/spec/minitest_spec.rb +9 -1
- data/spec/minitest_spec_spec.rb +19 -5
- data/spec/per_session_config_spec.rb +67 -0
- data/spec/result_spec.rb +20 -0
- data/spec/rspec/shared_spec_matchers.rb +148 -44
- data/spec/rspec/views_spec.rb +4 -0
- data/spec/rspec_matchers_spec.rb +46 -0
- data/spec/rspec_spec.rb +77 -0
- data/spec/selector_spec.rb +2 -1
- data/spec/selenium_spec_chrome.rb +25 -17
- data/spec/selenium_spec_firefox.rb +2 -1
- data/spec/selenium_spec_marionette.rb +18 -5
- data/spec/session_spec.rb +44 -0
- data/spec/shared_selenium_session.rb +72 -8
- data/spec/spec_helper.rb +4 -0
- metadata +55 -8
@@ -76,6 +76,7 @@
|
|
76
76
|
|
77
77
|
<p>
|
78
78
|
<a href="#" id="open-alert">Open alert</a>
|
79
|
+
<a href="/with_html" id="alert-page-change">Alert page change</a>
|
79
80
|
</p>
|
80
81
|
|
81
82
|
<p>
|
@@ -95,6 +96,10 @@
|
|
95
96
|
<a href="#" id="open-prompt">Open prompt</a>
|
96
97
|
</p>
|
97
98
|
|
99
|
+
<p>
|
100
|
+
<a href="#" id="open-prompt-with-default">Open defaulted prompt</a>
|
101
|
+
</p>
|
102
|
+
|
98
103
|
<p>
|
99
104
|
<input id="disable-on-click"/>
|
100
105
|
</p>
|
@@ -116,6 +121,13 @@
|
|
116
121
|
<input type="file" id="hidden_file" style="opacity:0; display: none;">
|
117
122
|
</p>
|
118
123
|
|
124
|
+
<div id="drag_scroll">
|
125
|
+
<p>This is a draggable element.</p>
|
126
|
+
</div>
|
127
|
+
<div id="drop_scroll">
|
128
|
+
<p>It should be dropped here.</p>
|
129
|
+
</div>
|
130
|
+
|
119
131
|
<script type="text/javascript">
|
120
132
|
// a javascript comment
|
121
133
|
var aVar = 123;
|
data/lib/capybara/version.rb
CHANGED
data/lib/capybara/window.rb
CHANGED
@@ -115,7 +115,7 @@ module Capybara
|
|
115
115
|
|
116
116
|
private
|
117
117
|
|
118
|
-
def wait_for_stable_size(seconds=
|
118
|
+
def wait_for_stable_size(seconds=session.config.default_max_wait_time)
|
119
119
|
res = yield if block_given?
|
120
120
|
prev_size = size
|
121
121
|
start_time = Capybara::Helpers.monotonic_time
|
data/lib/capybara.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
require 'timeout'
|
3
3
|
require 'nokogiri'
|
4
4
|
require 'xpath'
|
5
|
+
require 'forwardable'
|
6
|
+
require 'capybara/config'
|
5
7
|
|
6
8
|
module Capybara
|
7
9
|
class CapybaraError < StandardError; end
|
@@ -19,18 +21,41 @@ module Capybara
|
|
19
21
|
class WindowError < CapybaraError; end
|
20
22
|
class ReadOnlyElementError < CapybaraError; end
|
21
23
|
|
24
|
+
|
22
25
|
class << self
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
26
|
+
extend Forwardable
|
27
|
+
|
28
|
+
# DelegateCapybara global configurations
|
29
|
+
# @!method app
|
30
|
+
# See {Capybara.configure}
|
31
|
+
# @!method reuse_server
|
32
|
+
# See {Capybara.configure}
|
33
|
+
# @!method threadsafe
|
34
|
+
# See {Capybara.configure}
|
35
|
+
# @!method server
|
36
|
+
# See {Capybara.configure}
|
37
|
+
# @!method default_driver
|
38
|
+
# See {Capybara.configure}
|
39
|
+
# @!method javascript_driver
|
40
|
+
# See {Capybara.configure}
|
41
|
+
Config::OPTIONS.each do |method|
|
42
|
+
def_delegators :config, method, "#{method}="
|
43
|
+
end
|
44
|
+
|
45
|
+
# Delegate Capybara global configurations
|
46
|
+
# @!method default_selector
|
47
|
+
# See {Capybara.configure}
|
48
|
+
# @!method default_max_wait_time
|
49
|
+
# See {Capybara.configure}
|
50
|
+
# @!method app_host
|
51
|
+
# See {Capybara.configure}
|
52
|
+
# @!method always_include_port
|
53
|
+
# See {Capybara.configure}
|
54
|
+
# @!method wait_on_first_by_default
|
55
|
+
# See {Capybara.configure}
|
56
|
+
SessionConfig::OPTIONS.each do |method|
|
57
|
+
def_delegators :config, method, "#{method}="
|
58
|
+
end
|
34
59
|
|
35
60
|
##
|
36
61
|
#
|
@@ -44,7 +69,7 @@ module Capybara
|
|
44
69
|
# === Configurable options
|
45
70
|
#
|
46
71
|
# [app_host = String/nil] The default host to use when giving a relative URL to visit, must be a valid URL e.g. http://www.example.com
|
47
|
-
# [always_include_port = Boolean] Whether the Rack server's port should automatically be inserted into every visited URL (Default: false)
|
72
|
+
# [always_include_port = Boolean] Whether the Rack server's port should automatically be inserted into every visited URL unless another port is explicitly specified (Default: false)
|
48
73
|
# [asset_host = String] Where dynamic assets are hosted - will be prepended to relative asset locations if present (Default: nil)
|
49
74
|
# [run_server = Boolean] Whether to start a Rack server for the given Rack app (Default: true)
|
50
75
|
# [raise_server_errors = Boolean] Should errors raised in the server be raised in the tests? (Default: true)
|
@@ -58,6 +83,9 @@ module Capybara
|
|
58
83
|
# [automatic_label_click = Boolean] Whether Node#choose, Node#check, Node#uncheck will attempt to click the associated label element if the checkbox/radio button are non-visible (Default: false)
|
59
84
|
# [enable_aria_label = Boolean] Whether fields, links, and buttons will match against aria-label attribute (Default: false)
|
60
85
|
# [reuse_server = Boolean] Reuse the server thread between multiple sessions using the same app object (Default: true)
|
86
|
+
# [threadsafe = Boolean] Whether sessions can be configured individually (Default: false)
|
87
|
+
# [server = Symbol] The name of the registered server to use when running the app under test (Default: :webrick)
|
88
|
+
#
|
61
89
|
# === DSL Options
|
62
90
|
#
|
63
91
|
# when using capybara/dsl, the following options are also available:
|
@@ -66,7 +94,7 @@ module Capybara
|
|
66
94
|
# [javascript_driver = Symbol] The name of a driver to use for JavaScript enabled tests. (Default: :selenium)
|
67
95
|
#
|
68
96
|
def configure
|
69
|
-
yield
|
97
|
+
yield ConfigureDeprecator.new(config)
|
70
98
|
end
|
71
99
|
|
72
100
|
##
|
@@ -141,13 +169,14 @@ module Capybara
|
|
141
169
|
##
|
142
170
|
#
|
143
171
|
# Modify a selector previously created by {Capybara.add_selector}.
|
144
|
-
# For example
|
145
|
-
#
|
172
|
+
# For example, adding a new filter to the :button selector to filter based on
|
173
|
+
# button style (a class) might look like this
|
146
174
|
#
|
147
175
|
# Capybara.modify_selector(:button) do
|
148
|
-
#
|
176
|
+
# filter (:style, valid_values: [:primary, :secondary]) { |node, style| node[:class].split.include? "btn-#{style}" }
|
149
177
|
# end
|
150
178
|
#
|
179
|
+
#
|
151
180
|
# @param [Symbol] name The name of the selector to modify
|
152
181
|
# @yield A block executed in the context of the existing {Capybara::Selector}
|
153
182
|
#
|
@@ -163,45 +192,6 @@ module Capybara
|
|
163
192
|
@servers ||= {}
|
164
193
|
end
|
165
194
|
|
166
|
-
##
|
167
|
-
#
|
168
|
-
# Register a proc that Capybara will call to run the Rack application.
|
169
|
-
#
|
170
|
-
# Capybara.server do |app, port, host|
|
171
|
-
# require 'rack/handler/mongrel'
|
172
|
-
# Rack::Handler::Mongrel.run(app, :Port => port)
|
173
|
-
# end
|
174
|
-
#
|
175
|
-
# By default, Capybara will try to run webrick.
|
176
|
-
#
|
177
|
-
# @yield [app, port, host] This block receives a rack app, port, and host/ip and should run a Rack handler
|
178
|
-
#
|
179
|
-
def server(&block)
|
180
|
-
if block_given?
|
181
|
-
warn "DEPRECATED: Passing a block to Capybara::server is deprecated, please use Capybara::register_server instead"
|
182
|
-
@server = block
|
183
|
-
else
|
184
|
-
@server
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
##
|
189
|
-
#
|
190
|
-
# Set the server to use.
|
191
|
-
#
|
192
|
-
# Capybara.server = :webrick
|
193
|
-
#
|
194
|
-
# @param [Symbol] name Name of the server type to use
|
195
|
-
# @see register_server
|
196
|
-
#
|
197
|
-
def server=(name)
|
198
|
-
@server = if name.respond_to? :call
|
199
|
-
name
|
200
|
-
else
|
201
|
-
servers[name.to_sym]
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
195
|
##
|
206
196
|
#
|
207
197
|
# Wraps the given string, which should contain an HTML document or fragment
|
@@ -251,29 +241,25 @@ module Capybara
|
|
251
241
|
servers[:webrick].call(app, port, server_host)
|
252
242
|
end
|
253
243
|
|
254
|
-
##
|
255
|
-
#
|
256
|
-
# @return [Symbol] The name of the driver to use by default
|
257
|
-
#
|
258
|
-
def default_driver
|
259
|
-
@default_driver || :rack_test
|
260
|
-
end
|
261
|
-
|
262
244
|
##
|
263
245
|
#
|
264
246
|
# @return [Symbol] The name of the driver currently in use
|
265
247
|
#
|
266
248
|
def current_driver
|
267
|
-
|
249
|
+
if threadsafe
|
250
|
+
Thread.current['capybara_current_driver']
|
251
|
+
else
|
252
|
+
@current_driver
|
253
|
+
end || default_driver
|
268
254
|
end
|
269
255
|
alias_method :mode, :current_driver
|
270
256
|
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
257
|
+
def current_driver=(name)
|
258
|
+
if threadsafe
|
259
|
+
Thread.current['capybara_current_driver'] = name
|
260
|
+
else
|
261
|
+
@current_driver = name
|
262
|
+
end
|
277
263
|
end
|
278
264
|
|
279
265
|
##
|
@@ -281,7 +267,7 @@ module Capybara
|
|
281
267
|
# Use the default driver as the current driver
|
282
268
|
#
|
283
269
|
def use_default_driver
|
284
|
-
|
270
|
+
self.current_driver = nil
|
285
271
|
end
|
286
272
|
|
287
273
|
##
|
@@ -293,15 +279,7 @@ module Capybara
|
|
293
279
|
Capybara.current_driver = driver
|
294
280
|
yield
|
295
281
|
ensure
|
296
|
-
|
297
|
-
end
|
298
|
-
|
299
|
-
##
|
300
|
-
#
|
301
|
-
# @return [String] The IP address bound by default server
|
302
|
-
#
|
303
|
-
def server_host
|
304
|
-
@server_host || '127.0.0.1'
|
282
|
+
self.current_driver = previous_driver
|
305
283
|
end
|
306
284
|
|
307
285
|
##
|
@@ -344,7 +322,19 @@ module Capybara
|
|
344
322
|
# @return [Symbol] The name of the currently used session.
|
345
323
|
#
|
346
324
|
def session_name
|
347
|
-
|
325
|
+
if threadsafe
|
326
|
+
Thread.current['capybara_session_name'] ||= :default
|
327
|
+
else
|
328
|
+
@session_name ||= :default
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
def session_name=(name)
|
333
|
+
if threadsafe
|
334
|
+
Thread.current['capybara_session_name'] = name
|
335
|
+
else
|
336
|
+
@session_name = name
|
337
|
+
end
|
348
338
|
end
|
349
339
|
|
350
340
|
##
|
@@ -352,11 +342,19 @@ module Capybara
|
|
352
342
|
# Yield a block using a specific session name.
|
353
343
|
#
|
354
344
|
def using_session(name)
|
355
|
-
|
345
|
+
previous_session_info = {
|
346
|
+
session_name: session_name,
|
347
|
+
current_driver: current_driver,
|
348
|
+
app: app
|
349
|
+
}
|
356
350
|
self.session_name = name
|
357
351
|
yield
|
358
352
|
ensure
|
359
|
-
self.session_name =
|
353
|
+
self.session_name = previous_session_info[:session_name]
|
354
|
+
if threadsafe
|
355
|
+
self.current_driver = previous_session_info[:current_driver]
|
356
|
+
self.app = previous_session_info[:app]
|
357
|
+
end
|
360
358
|
end
|
361
359
|
|
362
360
|
##
|
@@ -374,32 +372,8 @@ module Capybara
|
|
374
372
|
end
|
375
373
|
end
|
376
374
|
|
377
|
-
|
378
|
-
|
379
|
-
deprecate('default_wait_time', 'default_max_wait_time', true)
|
380
|
-
default_max_wait_time
|
381
|
-
end
|
382
|
-
|
383
|
-
# @deprecated Use default_max_wait_time= instead
|
384
|
-
def default_wait_time=(t)
|
385
|
-
deprecate('default_wait_time=', 'default_max_wait_time=')
|
386
|
-
self.default_max_wait_time = t
|
387
|
-
end
|
388
|
-
|
389
|
-
def save_and_open_page_path=(path)
|
390
|
-
warn "DEPRECATED: #save_and_open_page_path is deprecated, please use #save_path instead. \n"\
|
391
|
-
"Note: Behavior is slightly different with relative paths - see documentation" unless path.nil?
|
392
|
-
@save_and_open_page_path = path
|
393
|
-
end
|
394
|
-
|
395
|
-
def app_host=(url)
|
396
|
-
raise ArgumentError.new("Capybara.app_host should be set to a url (http://www.example.com)") unless url.nil? || (url =~ URI::Parser.new.make_regexp)
|
397
|
-
@app_host = url
|
398
|
-
end
|
399
|
-
|
400
|
-
def default_host=(url)
|
401
|
-
raise ArgumentError.new("Capybara.default_host should be set to a url (http://www.example.com)") unless url.nil? || (url =~ URI::Parser.new.make_regexp)
|
402
|
-
@default_host = url
|
375
|
+
def session_options
|
376
|
+
config.session_options
|
403
377
|
end
|
404
378
|
|
405
379
|
def included(base)
|
@@ -407,18 +381,10 @@ module Capybara
|
|
407
381
|
warn "`include Capybara` is deprecated. Please use `include Capybara::DSL` instead."
|
408
382
|
end
|
409
383
|
|
410
|
-
def reuse_server=(bool)
|
411
|
-
warn "Capybara.reuse_server == false is a BETA feature and may change in a future version" unless bool
|
412
|
-
@reuse_server = bool
|
413
|
-
end
|
414
|
-
|
415
|
-
def deprecate(method, alternate_method, once=false)
|
416
|
-
@deprecation_notified ||= {}
|
417
|
-
warn "DEPRECATED: ##{method} is deprecated, please use ##{alternate_method} instead" unless once and @deprecation_notified[method]
|
418
|
-
@deprecation_notified[method]=true
|
419
|
-
end
|
420
|
-
|
421
384
|
private
|
385
|
+
def config
|
386
|
+
@config ||= Capybara::Config.new
|
387
|
+
end
|
422
388
|
|
423
389
|
def session_pool
|
424
390
|
@session_pool ||= {}
|
@@ -447,6 +413,8 @@ module Capybara
|
|
447
413
|
require 'capybara/queries/title_query'
|
448
414
|
require 'capybara/queries/current_path_query'
|
449
415
|
require 'capybara/queries/match_query'
|
416
|
+
require 'capybara/queries/ancestor_query'
|
417
|
+
require 'capybara/queries/sibling_query'
|
450
418
|
require 'capybara/query'
|
451
419
|
|
452
420
|
require 'capybara/node/finders'
|
@@ -475,14 +443,14 @@ Capybara.register_server :default do |app, port, _host|
|
|
475
443
|
Capybara.run_default_server(app, port)
|
476
444
|
end
|
477
445
|
|
478
|
-
Capybara.register_server :webrick do |app, port, host|
|
446
|
+
Capybara.register_server :webrick do |app, port, host, options={}|
|
479
447
|
require 'rack/handler/webrick'
|
480
|
-
Rack::Handler::WEBrick.run(app, Host: host, Port: port, AccessLog: [], Logger: WEBrick::Log::new(nil, 0))
|
448
|
+
Rack::Handler::WEBrick.run(app, {Host: host, Port: port, AccessLog: [], Logger: WEBrick::Log::new(nil, 0)}.merge(options))
|
481
449
|
end
|
482
450
|
|
483
|
-
Capybara.register_server :puma do |app, port, host|
|
451
|
+
Capybara.register_server :puma do |app, port, host, options={}|
|
484
452
|
require 'rack/handler/puma'
|
485
|
-
Rack::Handler::Puma.run(app, Host: host, Port: port, Threads: "0:4")
|
453
|
+
Rack::Handler::Puma.run(app, {Host: host, Port: port, Threads: "0:4", workers: 0, daemon: false}.merge(options))
|
486
454
|
end
|
487
455
|
|
488
456
|
Capybara.configure do |config|
|
@@ -514,3 +482,13 @@ Capybara.register_driver :selenium do |app|
|
|
514
482
|
Capybara::Selenium::Driver.new(app)
|
515
483
|
end
|
516
484
|
|
485
|
+
Capybara.register_driver :selenium_chrome do |app|
|
486
|
+
Capybara::Selenium::Driver.new(app, :browser => :chrome)
|
487
|
+
end
|
488
|
+
|
489
|
+
Capybara.register_driver :selenium_chrome_headless do |app|
|
490
|
+
browser_options = ::Selenium::WebDriver::Chrome::Options.new()
|
491
|
+
browser_options.args << '--headless'
|
492
|
+
browser_options.args << '--disable-gpu'
|
493
|
+
Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
|
494
|
+
end
|
data/spec/capybara_spec.rb
CHANGED
@@ -14,8 +14,8 @@ RSpec.describe Capybara do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should be accesible as the deprecated default_wait_time" do
|
17
|
-
expect(Capybara).to receive(:warn).ordered.with('DEPRECATED: #default_wait_time= is deprecated, please use #default_max_wait_time= instead')
|
18
|
-
expect(Capybara).to receive(:warn).ordered.with('DEPRECATED: #default_wait_time is deprecated, please use #default_max_wait_time instead')
|
17
|
+
expect(Capybara.send(:config)).to receive(:warn).ordered.with('DEPRECATED: #default_wait_time= is deprecated, please use #default_max_wait_time= instead')
|
18
|
+
expect(Capybara.send(:config)).to receive(:warn).ordered.with('DEPRECATED: #default_wait_time is deprecated, please use #default_max_wait_time instead')
|
19
19
|
@previous_default_time = Capybara.default_max_wait_time
|
20
20
|
Capybara.default_wait_time = 5
|
21
21
|
expect(Capybara.default_wait_time).to eq(5)
|
@@ -35,27 +35,13 @@ RSpec.describe Capybara do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
describe '.register_server' do
|
38
|
-
before do
|
39
|
-
Capybara.reuse_server = false
|
40
|
-
@old_server = Capybara.server
|
41
|
-
end
|
42
|
-
|
43
|
-
after do
|
44
|
-
Capybara.server(&@old_server)
|
45
|
-
Capybara.reuse_server = true
|
46
|
-
end
|
47
|
-
|
48
38
|
it "should add a new server" do
|
49
|
-
|
50
|
-
|
51
|
-
require 'rack/handler/webrick'
|
39
|
+
handler = double("handler")
|
52
40
|
Capybara.register_server :blob do |app, port, host|
|
53
|
-
|
41
|
+
handler.run
|
54
42
|
end
|
55
|
-
|
56
|
-
|
57
|
-
session.visit('/')
|
58
|
-
expect(session.body).to include("Hello world!")
|
43
|
+
|
44
|
+
expect(Capybara.servers).to have_key(:blob)
|
59
45
|
end
|
60
46
|
end
|
61
47
|
|
@@ -79,6 +65,30 @@ RSpec.describe Capybara do
|
|
79
65
|
Capybara.server(&server)
|
80
66
|
expect(Capybara.server).to eq(server)
|
81
67
|
end
|
68
|
+
|
69
|
+
it "should have :webrick registered" do
|
70
|
+
require 'rack/handler/webrick'
|
71
|
+
mock_app = double('app')
|
72
|
+
Capybara.server = :webrick
|
73
|
+
expect(Rack::Handler::WEBrick).to receive(:run)
|
74
|
+
Capybara.server.call(mock_app, 8000)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should have :puma registered" do
|
78
|
+
require 'rack/handler/puma'
|
79
|
+
mock_app = double('app')
|
80
|
+
Capybara.server = :puma
|
81
|
+
expect(Rack::Handler::Puma).to receive(:run).with(mock_app, hash_including(Host: nil, Port: 8000))
|
82
|
+
Capybara.server.call(mock_app, 8000)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should pass options to server" do
|
86
|
+
require 'rack/handler/puma'
|
87
|
+
mock_app = double('app')
|
88
|
+
Capybara.server = :puma, { Silent: true }
|
89
|
+
expect(Rack::Handler::Puma).to receive(:run).with(mock_app, hash_including(Host: nil, Port: 9000, Silent: true))
|
90
|
+
Capybara.server.call(mock_app, 9000)
|
91
|
+
end
|
82
92
|
end
|
83
93
|
|
84
94
|
describe 'app_host' do
|
@@ -114,10 +124,22 @@ RSpec.describe Capybara do
|
|
114
124
|
expect { Capybara.default_host = "http://www.example.com" }.not_to raise_error
|
115
125
|
end
|
116
126
|
end
|
127
|
+
|
128
|
+
describe "configure" do
|
129
|
+
it 'deprecates calling non configuration option methods in configure' do
|
130
|
+
expect_any_instance_of(Kernel).to receive(:warn).
|
131
|
+
with('Calling register_driver from Capybara.configure is deprecated - please call it on Capybara directly ( Capybara.register_driver(...) )')
|
132
|
+
Capybara.configure do |config|
|
133
|
+
config.register_driver(:random_name) do
|
134
|
+
#just a random block
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
117
139
|
end
|
118
140
|
|
119
141
|
RSpec.describe Capybara::Session do
|
120
|
-
context 'with
|
142
|
+
context 'with nonexistent driver' do
|
121
143
|
it "should raise an error" do
|
122
144
|
expect {
|
123
145
|
Capybara::Session.new(:quox, TestApp).driver
|
data/spec/dsl_spec.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
RSpec.describe Capybara::Selector::FilterSet do
|
5
|
+
after do
|
6
|
+
Capybara::Selector::FilterSet.remove(:test)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "allows node filters" do
|
10
|
+
fs = Capybara::Selector::FilterSet.add(:test) do
|
11
|
+
filter(:node_test, :boolean) { |node, value| true }
|
12
|
+
expression_filter(:expression_test, :boolean) { |expr, value| true }
|
13
|
+
end
|
14
|
+
|
15
|
+
expect(fs.node_filters.keys).to include(:node_test)
|
16
|
+
expect(fs.node_filters.keys).not_to include(:expression_test)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "allows expression filters" do
|
20
|
+
fs = Capybara::Selector::FilterSet.add(:test) do
|
21
|
+
filter(:node_test, :boolean) { |node, value| true }
|
22
|
+
expression_filter(:expression_test, :boolean) { |expr, value| true }
|
23
|
+
end
|
24
|
+
|
25
|
+
expect(fs.expression_filters.keys).to include(:expression_test)
|
26
|
+
expect(fs.expression_filters.keys).not_to include(:node_test)
|
27
|
+
end
|
28
|
+
end
|
data/spec/minitest_spec.rb
CHANGED
@@ -88,6 +88,14 @@ class MinitestTest < Minitest::Test
|
|
88
88
|
refute_table('not_on_form')
|
89
89
|
end
|
90
90
|
|
91
|
+
def test_assert_all_of_selectors
|
92
|
+
assert_all_of_selectors(:css, 'select#form_other_title', 'input#form_last_name')
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_assert_none_of_selectors
|
96
|
+
assert_none_of_selectors(:css, 'input#not_on_page', 'input#also_not_on_page')
|
97
|
+
end
|
98
|
+
|
91
99
|
def test_assert_matches_selector
|
92
100
|
assert_matches_selector(find(:field, 'customer_email'), :field, 'customer_email')
|
93
101
|
assert_not_matches_selector(find(:select, 'form_title'), :field, 'customer_email')
|
@@ -117,6 +125,6 @@ RSpec.describe 'capybara/minitest' do
|
|
117
125
|
reporter.start
|
118
126
|
MinitestTest.run reporter, {}
|
119
127
|
reporter.report
|
120
|
-
expect(output.string).to include("
|
128
|
+
expect(output.string).to include("17 runs, 44 assertions, 0 failures, 0 errors, 0 skips")
|
121
129
|
end
|
122
130
|
end
|
data/spec/minitest_spec_spec.rb
CHANGED
@@ -37,10 +37,10 @@ class MinitestSpecTest < Minitest::Spec
|
|
37
37
|
page.must_have_xpath('.//input[@id="customer_email"]')
|
38
38
|
page.wont_have_xpath('.//select[@id="not_form_title"]')
|
39
39
|
page.wont_have_xpath('.//input[@id="customer_email"]') { |el| el[:id] == "not_customer_email" }
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
40
|
+
select = find(:select, 'form_title')
|
41
|
+
select.must_have_xpath('.//option[@class="title"]')
|
42
|
+
select.must_have_xpath('.//option', count: 1) { |option| option[:class] != 'title' && !option.disabled?}
|
43
|
+
select.wont_have_xpath('.//input[@id="customer_email"]')
|
44
44
|
end
|
45
45
|
|
46
46
|
it "support css expectations" do
|
@@ -88,6 +88,14 @@ class MinitestSpecTest < Minitest::Spec
|
|
88
88
|
page.wont_have_table('not_on_form')
|
89
89
|
end
|
90
90
|
|
91
|
+
it "supports all_of_selectors expectations" do
|
92
|
+
page.must_have_all_of_selectors(:css, 'select#form_other_title', 'input#form_last_name')
|
93
|
+
end
|
94
|
+
|
95
|
+
it "supports none_of_selectors expectations" do
|
96
|
+
page.must_have_none_of_selectors(:css, 'input#not_on_page', 'input#also_not_on_page')
|
97
|
+
end
|
98
|
+
|
91
99
|
it "supports match_selector expectations" do
|
92
100
|
find(:field, 'customer_email').must_match_selector(:field, 'customer_email')
|
93
101
|
find(:select, 'form_title').wont_match_selector(:field, 'customer_email')
|
@@ -102,6 +110,10 @@ class MinitestSpecTest < Minitest::Spec
|
|
102
110
|
find(:select, 'form_title').must_match_xpath('.//select[@id="form_title"]')
|
103
111
|
find(:select, 'form_title').wont_match_xpath('.//select[@id="not_on_page"]')
|
104
112
|
end
|
113
|
+
|
114
|
+
it "handles failures" do
|
115
|
+
page.must_have_select('non_existing_form_title')
|
116
|
+
end
|
105
117
|
end
|
106
118
|
|
107
119
|
RSpec.describe 'capybara/minitest/spec' do
|
@@ -116,6 +128,8 @@ RSpec.describe 'capybara/minitest/spec' do
|
|
116
128
|
reporter.start
|
117
129
|
MinitestSpecTest.run reporter, {}
|
118
130
|
reporter.report
|
119
|
-
expect(output.string).to include("
|
131
|
+
expect(output.string).to include("18 runs, 41 assertions, 1 failures, 0 errors, 0 skips")
|
132
|
+
#Make sure error messages are displayed
|
133
|
+
expect(output.string).to include('expected to find visible select box "non_existing_form_title" that is not disabled but there were no matches')
|
120
134
|
end
|
121
135
|
end
|