capybara 2.13.0 → 2.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. checksums.yaml +5 -5
  2. data/History.md +218 -18
  3. data/README.md +54 -23
  4. data/lib/capybara/config.rb +132 -0
  5. data/lib/capybara/cucumber.rb +1 -0
  6. data/lib/capybara/driver/base.rb +14 -0
  7. data/lib/capybara/dsl.rb +1 -3
  8. data/lib/capybara/helpers.rb +3 -3
  9. data/lib/capybara/minitest/spec.rb +14 -37
  10. data/lib/capybara/minitest.rb +95 -114
  11. data/lib/capybara/node/actions.rb +10 -10
  12. data/lib/capybara/node/base.rb +7 -2
  13. data/lib/capybara/node/element.rb +9 -3
  14. data/lib/capybara/node/finders.rb +92 -18
  15. data/lib/capybara/node/matchers.rb +21 -9
  16. data/lib/capybara/node/simple.rb +5 -0
  17. data/lib/capybara/queries/ancestor_query.rb +25 -0
  18. data/lib/capybara/queries/base_query.rb +12 -3
  19. data/lib/capybara/queries/current_path_query.rb +13 -9
  20. data/lib/capybara/queries/selector_query.rb +62 -23
  21. data/lib/capybara/queries/sibling_query.rb +25 -0
  22. data/lib/capybara/queries/text_query.rb +10 -5
  23. data/lib/capybara/queries/title_query.rb +1 -0
  24. data/lib/capybara/rack_test/browser.rb +13 -5
  25. data/lib/capybara/rack_test/driver.rb +6 -1
  26. data/lib/capybara/rack_test/form.rb +4 -3
  27. data/lib/capybara/rack_test/node.rb +1 -1
  28. data/lib/capybara/rspec/compound.rb +95 -0
  29. data/lib/capybara/rspec/matcher_proxies.rb +45 -0
  30. data/lib/capybara/rspec/matchers.rb +108 -7
  31. data/lib/capybara/rspec.rb +3 -1
  32. data/lib/capybara/selector/filter.rb +13 -41
  33. data/lib/capybara/selector/filter_set.rb +30 -4
  34. data/lib/capybara/selector/filters/base.rb +33 -0
  35. data/lib/capybara/selector/filters/expression_filter.rb +40 -0
  36. data/lib/capybara/selector/filters/node_filter.rb +27 -0
  37. data/lib/capybara/selector/selector.rb +36 -15
  38. data/lib/capybara/selector.rb +63 -42
  39. data/lib/capybara/selenium/driver.rb +177 -33
  40. data/lib/capybara/selenium/node.rb +106 -55
  41. data/lib/capybara/server.rb +6 -5
  42. data/lib/capybara/session/config.rb +114 -0
  43. data/lib/capybara/session/matchers.rb +15 -4
  44. data/lib/capybara/session.rb +178 -65
  45. data/lib/capybara/spec/fixtures/no_extension +1 -0
  46. data/lib/capybara/spec/public/test.js +18 -3
  47. data/lib/capybara/spec/session/accept_alert_spec.rb +9 -1
  48. data/lib/capybara/spec/session/accept_prompt_spec.rb +29 -1
  49. data/lib/capybara/spec/session/all_spec.rb +13 -1
  50. data/lib/capybara/spec/session/ancestor_spec.rb +85 -0
  51. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +24 -8
  52. data/lib/capybara/spec/session/assert_selector.rb +1 -1
  53. data/lib/capybara/spec/session/assert_text.rb +8 -0
  54. data/lib/capybara/spec/session/assert_title.rb +22 -9
  55. data/lib/capybara/spec/session/attach_file_spec.rb +8 -1
  56. data/lib/capybara/spec/session/check_spec.rb +4 -4
  57. data/lib/capybara/spec/session/choose_spec.rb +2 -2
  58. data/lib/capybara/spec/session/click_button_spec.rb +1 -1
  59. data/lib/capybara/spec/session/click_link_or_button_spec.rb +3 -3
  60. data/lib/capybara/spec/session/click_link_spec.rb +1 -1
  61. data/lib/capybara/spec/session/current_url_spec.rb +3 -3
  62. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  63. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -1
  64. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +22 -0
  65. data/lib/capybara/spec/session/evaluate_script_spec.rb +1 -1
  66. data/lib/capybara/spec/session/fill_in_spec.rb +8 -2
  67. data/lib/capybara/spec/session/find_field_spec.rb +1 -0
  68. data/lib/capybara/spec/session/find_spec.rb +8 -6
  69. data/lib/capybara/spec/session/first_spec.rb +10 -5
  70. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  71. data/lib/capybara/spec/session/has_css_spec.rb +11 -0
  72. data/lib/capybara/spec/session/has_current_path_spec.rb +52 -7
  73. data/lib/capybara/spec/session/has_link_spec.rb +4 -4
  74. data/lib/capybara/spec/session/has_none_selectors_spec.rb +76 -0
  75. data/lib/capybara/spec/session/has_select_spec.rb +64 -6
  76. data/lib/capybara/spec/session/has_selector_spec.rb +1 -3
  77. data/lib/capybara/spec/session/has_text_spec.rb +5 -3
  78. data/lib/capybara/spec/session/has_title_spec.rb +4 -2
  79. data/lib/capybara/spec/session/has_xpath_spec.rb +5 -3
  80. data/lib/capybara/spec/session/node_spec.rb +50 -26
  81. data/lib/capybara/spec/session/refresh_spec.rb +28 -0
  82. data/lib/capybara/spec/session/reset_session_spec.rb +3 -3
  83. data/lib/capybara/spec/session/select_spec.rb +3 -2
  84. data/lib/capybara/spec/session/sibling_spec.rb +52 -0
  85. data/lib/capybara/spec/session/uncheck_spec.rb +2 -2
  86. data/lib/capybara/spec/session/unselect_spec.rb +2 -2
  87. data/lib/capybara/spec/session/visit_spec.rb +56 -1
  88. data/lib/capybara/spec/session/window/become_closed_spec.rb +11 -11
  89. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +11 -9
  90. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +4 -4
  91. data/lib/capybara/spec/session/window/within_window_spec.rb +27 -2
  92. data/lib/capybara/spec/spec_helper.rb +28 -4
  93. data/lib/capybara/spec/test_app.rb +3 -1
  94. data/lib/capybara/spec/views/form.erb +27 -1
  95. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  96. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  97. data/lib/capybara/spec/views/with_hover.erb +5 -0
  98. data/lib/capybara/spec/views/with_html.erb +33 -2
  99. data/lib/capybara/spec/views/with_js.erb +12 -0
  100. data/lib/capybara/spec/views/with_windows.erb +4 -0
  101. data/lib/capybara/version.rb +1 -1
  102. data/lib/capybara/window.rb +1 -1
  103. data/lib/capybara.rb +102 -124
  104. data/spec/capybara_spec.rb +43 -21
  105. data/spec/dsl_spec.rb +1 -0
  106. data/spec/filter_set_spec.rb +28 -0
  107. data/spec/minitest_spec.rb +9 -1
  108. data/spec/minitest_spec_spec.rb +19 -5
  109. data/spec/per_session_config_spec.rb +67 -0
  110. data/spec/result_spec.rb +20 -0
  111. data/spec/rspec/shared_spec_matchers.rb +148 -44
  112. data/spec/rspec/views_spec.rb +4 -0
  113. data/spec/rspec_matchers_spec.rb +46 -0
  114. data/spec/rspec_spec.rb +77 -0
  115. data/spec/selector_spec.rb +2 -1
  116. data/spec/selenium_spec_chrome.rb +25 -17
  117. data/spec/selenium_spec_firefox.rb +2 -1
  118. data/spec/selenium_spec_marionette.rb +18 -5
  119. data/spec/session_spec.rb +44 -0
  120. data/spec/shared_selenium_session.rb +72 -8
  121. data/spec/spec_helper.rb +4 -0
  122. metadata +55 -8
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+ require 'forwardable'
3
+ require 'capybara/session/config'
4
+
5
+ module Capybara
6
+ class Config
7
+ extend Forwardable
8
+
9
+ OPTIONS = [:app, :reuse_server, :threadsafe, :default_wait_time, :server, :default_driver, :javascript_driver]
10
+
11
+ attr_accessor :app
12
+ attr_reader :reuse_server, :threadsafe
13
+ attr_reader :session_options
14
+ attr_writer :default_driver, :javascript_driver
15
+
16
+ SessionConfig::OPTIONS.each do |method|
17
+ def_delegators :session_options, method, "#{method}="
18
+ end
19
+
20
+ def initialize
21
+ @session_options = Capybara::SessionConfig.new
22
+ end
23
+
24
+ def reuse_server=(bool)
25
+ @reuse_server = bool
26
+ end
27
+
28
+ def threadsafe=(bool)
29
+ warn "Capybara.threadsafe == true is a BETA feature and may change in future minor versions" if bool
30
+ raise "Threadsafe setting cannot be changed once a session is created" if (bool != threadsafe) && Session.instance_created?
31
+ @threadsafe = bool
32
+ end
33
+
34
+ ##
35
+ #
36
+ # Return the proc that Capybara will call to run the Rack application.
37
+ # The block returned receives a rack app, port, and host/ip and should run a Rack handler
38
+ # By default, Capybara will try to run webrick.
39
+ #
40
+ def server(&block)
41
+ if block_given?
42
+ warn "DEPRECATED: Passing a block to Capybara::server is deprecated, please use Capybara::register_server instead"
43
+ @server = block
44
+ else
45
+ @server
46
+ end
47
+ end
48
+
49
+ ##
50
+ #
51
+ # Set the server to use.
52
+ #
53
+ # Capybara.server = :webrick
54
+ # Capybara.server = :puma, { Silent: true }
55
+ #
56
+ # @overload server=(name)
57
+ # @param [Symbol] name Name of the server type to use
58
+ # @overload server=([name, options])
59
+ # @param [Symbol] name Name of the server type to use
60
+ # @param [Hash] options Options to pass to the server block
61
+ # @see register_server
62
+ #
63
+ def server=(name)
64
+ name, options = *name if name.is_a? Array
65
+ @server = if name.respond_to? :call
66
+ name
67
+ else
68
+ if options
69
+ Proc.new { |app, port, host| Capybara.servers[name.to_sym].call(app,port,host,options) }
70
+ else
71
+ Capybara.servers[name.to_sym]
72
+ end
73
+ end
74
+ end
75
+
76
+ ##
77
+ #
78
+ # @return [Symbol] The name of the driver to use by default
79
+ #
80
+ def default_driver
81
+ @default_driver || :rack_test
82
+ end
83
+
84
+ ##
85
+ #
86
+ # @return [Symbol] The name of the driver used when JavaScript is needed
87
+ #
88
+ def javascript_driver
89
+ @javascript_driver || :selenium
90
+ end
91
+
92
+ # @deprecated Use default_max_wait_time instead
93
+ def default_wait_time
94
+ deprecate('default_wait_time', 'default_max_wait_time', true)
95
+ default_max_wait_time
96
+ end
97
+
98
+ # @deprecated Use default_max_wait_time= instead
99
+ def default_wait_time=(t)
100
+ deprecate('default_wait_time=', 'default_max_wait_time=')
101
+ self.default_max_wait_time = t
102
+ end
103
+
104
+ def deprecate(method, alternate_method, once=false)
105
+ @deprecation_notified ||= {}
106
+ warn "DEPRECATED: ##{method} is deprecated, please use ##{alternate_method} instead" unless once and @deprecation_notified[method]
107
+ @deprecation_notified[method]=true
108
+ end
109
+ end
110
+
111
+ # @api private
112
+ class ConfigureDeprecator
113
+ def initialize(config)
114
+ @config = config
115
+ end
116
+
117
+ def method_missing(m, *args, &block)
118
+ if @config.respond_to?(m)
119
+ @config.public_send(m, *args, &block)
120
+ elsif Capybara.respond_to?(m)
121
+ warn "Calling #{m} from Capybara.configure is deprecated - please call it on Capybara directly ( Capybara.#{m}(...) )"
122
+ Capybara.public_send(m, *args, &block)
123
+ else
124
+ super
125
+ end
126
+ end
127
+
128
+ def respond_to_missing?(m, include_private = false)
129
+ @config.respond_to?(m) || Capybara.respond_to?(m) || super
130
+ end
131
+ end
132
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require 'capybara/dsl'
3
3
  require 'capybara/rspec/matchers'
4
+ require 'capybara/rspec/matcher_proxies'
4
5
 
5
6
  World(Capybara::DSL)
6
7
  World(Capybara::RSpecMatchers)
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  class Capybara::Driver::Base
3
+ attr_writer :session
4
+
3
5
  def current_url
4
6
  raise NotImplementedError
5
7
  end
@@ -8,6 +10,10 @@ class Capybara::Driver::Base
8
10
  raise NotImplementedError
9
11
  end
10
12
 
13
+ def refresh
14
+ raise NotImplementedError
15
+ end
16
+
11
17
  def find_xpath(query)
12
18
  raise NotImplementedError
13
19
  end
@@ -36,6 +42,10 @@ class Capybara::Driver::Base
36
42
  raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#evaluate_script'
37
43
  end
38
44
 
45
+ def evaluate_async_script(script, *args)
46
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#evaluate_script_asnyc'
47
+ end
48
+
39
49
  def save_screenshot(path, options={})
40
50
  raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#save_screenshot'
41
51
  end
@@ -139,6 +149,10 @@ class Capybara::Driver::Base
139
149
  false
140
150
  end
141
151
 
152
+ def session_options
153
+ (@session && @session.config) || Capybara.session_options
154
+ end
155
+
142
156
  # @deprecated This method is being removed
143
157
  def browser_initialized?
144
158
  warn "DEPRECATED: #browser_initialized? is deprecated and will be removed in the next version of Capybara"
data/lib/capybara/dsl.rb CHANGED
@@ -21,12 +21,10 @@ module Capybara
21
21
  Capybara.using_session(name, &block)
22
22
  end
23
23
 
24
- ##
25
- #
26
24
  # Shortcut to using a different wait time.
27
25
  #
28
26
  def using_wait_time(seconds, &block)
29
- Capybara.using_wait_time(seconds, &block)
27
+ page.using_wait_time(seconds, &block)
30
28
  end
31
29
 
32
30
  ##
@@ -46,11 +46,11 @@ module Capybara
46
46
  # @param [String] html HTML code to inject into
47
47
  # @return [String] The modified HTML code
48
48
  #
49
- def inject_asset_host(html)
50
- if Capybara.asset_host && Nokogiri::HTML(html).css("base").empty?
49
+ def inject_asset_host(html, asset_host = Capybara.asset_host)
50
+ if asset_host && Nokogiri::HTML(html).css("base").empty?
51
51
  match = html.match(/<head[^<]*?>/)
52
52
  if match
53
- return html.clone.insert match.end(0), "<base href='#{Capybara.asset_host}' />"
53
+ return html.clone.insert match.end(0), "<base href='#{asset_host}' />"
54
54
  end
55
55
  end
56
56
 
@@ -8,47 +8,24 @@ module Capybara
8
8
  infect_an_assertion "refute_#{assertion}", "wont_have_#{assertion}", :reverse
9
9
  end
10
10
 
11
- # Unfortunately infect_an_assertion doesn't pass through the optional filter block so we can't use it for these
12
- %w(selector xpath css link button field select table checked_field unchecked_field).each do |assertion|
13
- self.class_eval <<-EOM
14
- def must_have_#{assertion} *args, &optional_filter_block
15
- ::Minitest::Expectation.new(self, ::Minitest::Spec.current).must_have_#{assertion}(*args, &optional_filter_block)
16
- end
17
-
18
- def wont_have_#{assertion} *args, &optional_filter_block
19
- ::Minitest::Expectation.new(self, ::Minitest::Spec.current).wont_have_#{assertion}(*args, &optional_filter_block)
20
- end
21
- EOM
22
-
23
- ::Minitest::Expectation.class_eval <<-EOM, __FILE__, __LINE__ + 1
24
- def must_have_#{assertion} *args, &optional_filter_block
25
- ctx.assert_#{assertion}(target, *args, &optional_filter_block)
26
- end
27
-
28
- def wont_have_#{assertion} *args, &optional_filter_block
29
- ctx.refute_#{assertion}(target, *args, &optional_filter_block)
30
- end
31
- EOM
32
- end
33
-
34
- %w(selector xpath css).each do |assertion|
35
- self.class_eval <<-EOM
36
- def must_match_#{assertion} *args, &optional_filter_block
37
- ::Minitest::Expectation.new(self, ::Minitest::Spec.current).must_match_#{assertion}(*args, &optional_filter_block)
38
- end
39
-
40
- def wont_match_#{assertion} *args, &optional_filter_block
41
- ::Minitest::Expectation.new(self, ::Minitest::Spec.current).wont_match_#{assertion}(*args, &optional_filter_block)
11
+ (%w(selector xpath css link button field select table checked_field unchecked_field).flat_map do |assertion|
12
+ [["assert_#{assertion}", "must_have_#{assertion}"],
13
+ ["refute_#{assertion}", "wont_have_#{assertion}"]]
14
+ end + [["assert_all_of_selectors", "must_have_all_of_selectors"],
15
+ ["assert_none_of_selectors", "must_have_none_of_selectors"]] +
16
+ %w(selector xpath css).flat_map do |assertion|
17
+ [["assert_matches_#{assertion}", "must_match_#{assertion}"],
18
+ ["refute_matches_#{assertion}", "wont_match_#{assertion}"]]
19
+ end).each do |(meth, new_name)|
20
+ self.class_eval <<-EOM, __FILE__, __LINE__ + 1
21
+ def #{new_name} *args, &block
22
+ ::Minitest::Expectation.new(self, ::Minitest::Spec.current).#{new_name}(*args, &block)
42
23
  end
43
24
  EOM
44
25
 
45
26
  ::Minitest::Expectation.class_eval <<-EOM, __FILE__, __LINE__ + 1
46
- def must_match_#{assertion} *args, &optional_filter_block
47
- ctx.assert_matches_#{assertion}(target, *args, &optional_filter_block)
48
- end
49
-
50
- def wont_match_#{assertion} *args, &optional_filter_block
51
- ctx.refute_matches_#{assertion}(target, *args, &optional_filter_block)
27
+ def #{new_name} *args, &block
28
+ ctx.#{meth}(target, *args, &block)
52
29
  end
53
30
  EOM
54
31
  end
@@ -6,141 +6,142 @@ module Capybara
6
6
  module Minitest
7
7
  module Assertions
8
8
  ## Assert text exists
9
+ #
10
+ # @!method assert_text
9
11
  # see {Capybara::Node::Matchers#assert_text}
10
- def assert_text(*args)
11
- self.assertions += 1
12
- subject, *args = determine_subject(args)
13
- subject.assert_text(*args)
14
- rescue Capybara::ExpectationNotMet => e
15
- raise ::Minitest::Assertion, e.message
16
- end
17
- alias_method :assert_content, :assert_text
18
12
 
19
13
  ## Assert text does not exist
14
+ #
15
+ # @!method assert_no_text
20
16
  # see {Capybara::Node::Matchers#assert_no_text}
21
- def assert_no_text(*args)
22
- self.assertions += 1
23
- subject, *args = determine_subject(args)
24
- subject.assert_no_text(*args)
25
- rescue Capybara::ExpectationNotMet => e
26
- raise ::Minitest::Assertion, e.message
17
+
18
+ ##
19
+ # Assertion that page title does match
20
+ #
21
+ # @!method assert_title
22
+ # see {Capybara::Node::DocumentMatchers#assert_title}
23
+
24
+ ##
25
+ # Assertion that page title does not match
26
+ #
27
+ # @!method refute_title
28
+ # @!method assert_no_title
29
+ # see {Capybara::Node::DocumentMatchers#assert_no_title}
30
+
31
+ ##
32
+ # Assertion that current path matches
33
+ #
34
+ # @!method assert_current_path
35
+ # see {Capybara::SessionMatchers#assert_current_path}
36
+
37
+ ##
38
+ # Assertion that current page does not match
39
+ #
40
+ # @!method refute_current_path
41
+ # @!method assert_no_current_path
42
+ # see {Capybara::SessionMatchers#assert_no_current_path}
43
+
44
+
45
+ %w(assert_text assert_no_text assert_title assert_no_title assert_current_path assert_no_current_path).each do |assertion_name|
46
+ self.class_eval <<-EOM, __FILE__, __LINE__ + 1
47
+ def #{assertion_name} *args
48
+ self.assertions +=1
49
+ subject, *args = determine_subject(args)
50
+ subject.#{assertion_name}(*args)
51
+ rescue Capybara::ExpectationNotMet => e
52
+ raise ::Minitest::Assertion, e.message
53
+ end
54
+ EOM
27
55
  end
56
+
57
+ alias_method :refute_title, :assert_no_title
28
58
  alias_method :refute_text, :assert_no_text
29
59
  alias_method :refute_content, :refute_text
60
+ alias_method :refute_current_path, :assert_no_current_path
61
+ alias_method :assert_content, :assert_text
30
62
  alias_method :assert_no_content, :refute_text
31
63
 
32
64
  ## Assert selector exists on page
33
- # see {Capybara::Node::Matchers#assert_selector}
34
- def assert_selector(*args, &optional_filter_block)
35
- self.assertions +=1
36
- subject, *args = determine_subject(args)
37
- subject.assert_selector(*args, &optional_filter_block)
38
- rescue Capybara::ExpectationNotMet => e
39
- raise ::Minitest::Assertion, e.message
40
- end
65
+ #
66
+ # @!method assert_selector
67
+ # see {Capybara::Node::Matchers#assert_selector}
41
68
 
42
69
  ## Assert selector does not exist on page
43
- # see {Capybara::Node::Matchers#assert_no_selector}
44
- def assert_no_selector(*args, &optional_filter_block)
45
- self.assertions +=1
46
- subject, *args = determine_subject(args)
47
- subject.assert_no_selector(*args, &optional_filter_block)
48
- rescue Capybara::ExpectationNotMet => e
49
- raise ::Minitest::Assertion, e.message
50
- end
51
- alias_method :refute_selector, :assert_no_selector
70
+ #
71
+ # @!method assert_no_selector
72
+ # see {Capybara::Node::Matchers#assert_no_selector}
52
73
 
53
74
  ## Assert element matches selector
54
- # see {Capybara::Node::Matchers#assert_matches_selector}
55
- def assert_matches_selector(*args, &optional_filter_block)
56
- self.assertions += 1
57
- subject, *args = determine_subject(args)
58
- subject.assert_matches_selector(*args, &optional_filter_block)
59
- rescue Capybara::ExpectationNotMet => e
60
- raise ::Minitest::Assertion, e.message
61
- end
75
+ #
76
+ # @!method assert_matches_selector
77
+ # see {Capybara::Node::Matchers#assert_matches_selector}
62
78
 
63
79
  ## Assert element does not match selector
64
- # see {Capybara::Node::Matchers#assert_not_matches_selector}
65
- def assert_not_matches_selector(*args, &optional_filter_block)
66
- self.assertions += 1
67
- subject, *args = determine_subject(args)
68
- subject.assert_not_matches_selector(*args, &optional_filter_block)
69
- rescue Capybara::ExpectationNotMet => e
70
- raise ::Minitest::Assertion, e.message
71
- end
72
- alias_method :refute_matches_selector, :assert_not_matches_selector
73
-
74
- %w(title current_path).each do |selector_type|
75
- define_method "assert_#{selector_type}" do |*args|
76
- begin
77
- self.assertions += 1
78
- subject, *args = determine_subject(args)
79
- subject.public_send("assert_#{selector_type}",*args)
80
- rescue Capybara::ExpectationNotMet => e
81
- raise ::Minitest::Assertion, e.message
82
- end
83
- end
84
-
85
- define_method "assert_no_#{selector_type}" do |*args|
86
- begin
87
- self.assertions += 1
80
+ #
81
+ # @!method assert_xpath
82
+ # see {Capybara::Node::Matchers#assert_not_matches_selector}
83
+
84
+ %w(assert_selector assert_no_selector
85
+ assert_all_of_selectors assert_none_of_selectors
86
+ assert_matches_selector assert_not_matches_selector).each do |assertion_name|
87
+ self.class_eval <<-EOM, __FILE__, __LINE__ + 1
88
+ def #{assertion_name} *args, &optional_filter_block
89
+ self.assertions +=1
88
90
  subject, *args = determine_subject(args)
89
- subject.public_send("assert_no_#{selector_type}",*args)
91
+ subject.#{assertion_name}(*args, &optional_filter_block)
90
92
  rescue Capybara::ExpectationNotMet => e
91
93
  raise ::Minitest::Assertion, e.message
92
94
  end
93
- end
94
- alias_method "refute_#{selector_type}", "assert_no_#{selector_type}"
95
+ EOM
95
96
  end
96
97
 
98
+ alias_method :refute_selector, :assert_no_selector
99
+ alias_method :refute_matches_selector, :assert_not_matches_selector
100
+
97
101
  %w(xpath css link button field select table).each do |selector_type|
98
102
  define_method "assert_#{selector_type}" do |*args, &optional_filter_block|
99
103
  subject, *args = determine_subject(args)
100
- locator, options = *args, {}
101
- locator, options = nil, locator if locator.is_a? Hash
104
+ locator, options = extract_locator(args)
102
105
  assert_selector(subject, selector_type.to_sym, locator, options, &optional_filter_block)
103
106
  end
104
107
 
105
108
  define_method "assert_no_#{selector_type}" do |*args, &optional_filter_block|
106
109
  subject, *args = determine_subject(args)
107
- locator, options = *args, {}
108
- locator, options = nil, locator if locator.is_a? Hash
110
+ locator, options = extract_locator(args)
109
111
  assert_no_selector(subject, selector_type.to_sym, locator, options, &optional_filter_block)
110
112
  end
111
113
  alias_method "refute_#{selector_type}", "assert_no_#{selector_type}"
112
114
  end
113
115
 
114
- %w(xpath css).each do |selector_type|
115
- define_method "assert_matches_#{selector_type}" do |*args, &optional_filter_block|
116
+ %w(checked unchecked).each do |field_type|
117
+ define_method "assert_#{field_type}_field" do |*args, &optional_filter_block|
116
118
  subject, *args = determine_subject(args)
117
- assert_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
119
+ locator, options = extract_locator(args)
120
+ assert_selector(subject, :field, locator, options.merge(field_type.to_sym => true), &optional_filter_block)
118
121
  end
119
122
 
120
- define_method "assert_not_matches_#{selector_type}" do |*args, &optional_filter_block|
123
+ define_method "assert_no_#{field_type}_field" do |*args, &optional_filter_block|
121
124
  subject, *args = determine_subject(args)
122
- assert_not_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
125
+ locator, options = extract_locator(args)
126
+ assert_no_selector(subject, :field, locator, options.merge(field_type.to_sym => true), &optional_filter_block)
123
127
  end
124
- alias_method "refute_matches_#{selector_type}", "assert_not_matches_#{selector_type}"
128
+ alias_method "refute_#{field_type}_field", "assert_no_#{field_type}_field"
125
129
  end
126
130
 
127
- %w(checked unchecked).each do |field_type|
128
- define_method "assert_#{field_type}_field" do |*args, &optional_filter_block|
131
+ %w(xpath css).each do |selector_type|
132
+ define_method "assert_matches_#{selector_type}" do |*args, &optional_filter_block|
129
133
  subject, *args = determine_subject(args)
130
- locator, options = *args, {}
131
- locator, options = nil, locator if locator.is_a? Hash
132
- assert_selector(subject, :field, locator, options.merge(field_type.to_sym => true), &optional_filter_block)
134
+ assert_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
133
135
  end
134
136
 
135
- define_method "assert_no_#{field_type}_field" do |*args, &optional_filter_block|
137
+ define_method "assert_not_matches_#{selector_type}" do |*args, &optional_filter_block|
136
138
  subject, *args = determine_subject(args)
137
- locator, options = *args, {}
138
- locator, options = nil, locator if locator.is_a? Hash
139
- assert_no_selector(subject, :field, locator, options.merge(field_type.to_sym => true), &optional_filter_block)
139
+ assert_not_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
140
140
  end
141
- alias_method "refute_#{field_type}_field", "assert_no_#{field_type}_field"
141
+ alias_method "refute_matches_#{selector_type}", "assert_not_matches_#{selector_type}"
142
142
  end
143
143
 
144
+
144
145
  ##
145
146
  # Assertion that there is xpath
146
147
  #
@@ -216,7 +217,7 @@ module Capybara
216
217
  # Assertion that there is no checked_field
217
218
  #
218
219
  # @!method assert_no_checked_field
219
- # @!method refute_chceked_field
220
+ # @!method refute_checked_field
220
221
 
221
222
  ##
222
223
  # Assertion that there is unchecked_field
@@ -228,7 +229,7 @@ module Capybara
228
229
  # Assertion that there is no unchecked_field
229
230
  #
230
231
  # @!method assert_no_unchecked_field
231
- # @!method refute_unchceked_field
232
+ # @!method refute_unchecked_field
232
233
 
233
234
  ##
234
235
  # Assertion that there is select
@@ -256,32 +257,6 @@ module Capybara
256
257
  # @!method assert_no_table
257
258
  # see {Capybara::Node::Matchers#has_no_table?}
258
259
 
259
- ##
260
- # Assertion that page title does match
261
- #
262
- # @!method assert_title
263
- # see {Capybara::Node::DocumentMatchers#assert_title}
264
-
265
- ##
266
- # Assertion that page title does not match
267
- #
268
- # @!method refute_title
269
- # @!method assert_no_title
270
- # see {Capybara::Node::DocumentMatchers#assert_no_title}
271
-
272
- ##
273
- # Assertion that current path matches
274
- #
275
- # @!method assert_current_path
276
- # see {Capybara::SessionMatchers#assert_current_path}
277
-
278
- ##
279
- # Assertion that current page does not match
280
- #
281
- # @!method refute_current_path
282
- # @!method assert_no_current_path
283
- # see {Capybara::SessionMatchers#assert_no_current_path}
284
-
285
260
  private
286
261
 
287
262
  def determine_subject(args)
@@ -292,6 +267,12 @@ module Capybara
292
267
  [page, *args]
293
268
  end
294
269
  end
270
+
271
+ def extract_locator(args)
272
+ locator, options = *args, {}
273
+ locator, options = nil, locator if locator.is_a? Hash
274
+ [locator, options]
275
+ end
295
276
  end
296
277
  end
297
278
  end
@@ -5,8 +5,8 @@ module Capybara
5
5
 
6
6
  ##
7
7
  #
8
- # Finds a button or link by id, text or value and clicks it. Also looks at image
9
- # alt text inside the link.
8
+ # Finds a button or link and clicks it. See {Capybara::Node::Actions#click_button} and
9
+ # {Capybara::Node::Actions#click_link} for what locator will match against for each type of element
10
10
  # @!macro waiting_behavior
11
11
  # If the driver is capable of executing JavaScript, +$0+ will wait for a set amount of time
12
12
  # and continuously retry finding the element until either the element is found or the time
@@ -16,7 +16,7 @@ module Capybara
16
16
  #
17
17
  # @overload click_link_or_button([locator], options)
18
18
  #
19
- # @param [String] locator Text, id or value of link or button
19
+ # @param [String] locator See {Capybara::Node::Actions#click_button} and {Capybara::Node::Actions#click_link}
20
20
  #
21
21
  # @return [Capybara::Node::Element] The element clicked
22
22
  #
@@ -80,7 +80,7 @@ module Capybara
80
80
  # @option options [String] :id Match fields that match the id attribute
81
81
  # @option options [String] :name Match fields that match the name attribute
82
82
  # @option options [String] :placeholder Match fields that match the placeholder attribute
83
- # @option options [String, Array<String>] :class Match links that match the class(es) provided
83
+ # @option options [String, Array<String>] :class Match fields that match the class(es) provided
84
84
  #
85
85
  # @return [Capybara::Node::Element] The element filled_in
86
86
  def fill_in(locator, options={})
@@ -108,7 +108,7 @@ module Capybara
108
108
  # @option options [String] :option Value of the radio_button to choose
109
109
  # @option options [String] :id Match fields that match the id attribute
110
110
  # @option options [String] :name Match fields that match the name attribute
111
- # @option options [String, Array<String>] :class Match links that match the class(es) provided
111
+ # @option options [String, Array<String>] :class Match fields that match the class(es) provided
112
112
  # @macro waiting_behavior
113
113
  # @macro label_click
114
114
  #
@@ -131,7 +131,7 @@ module Capybara
131
131
  # @option options [String] :option Value of the checkbox to select
132
132
  # @option options [String] id Match fields that match the id attribute
133
133
  # @option options [String] name Match fields that match the name attribute
134
- # @option options [String, Array<String>] :class Match links that match the class(es) provided
134
+ # @option options [String, Array<String>] :class Match fields that match the class(es) provided
135
135
  # @macro label_click
136
136
  # @macro waiting_behavior
137
137
  #
@@ -154,7 +154,7 @@ module Capybara
154
154
  # @option options [String] :option Value of the checkbox to deselect
155
155
  # @option options [String] id Match fields that match the id attribute
156
156
  # @option options [String] name Match fields that match the name attribute
157
- # @option options [String, Array<String>] :class Match links that match the class(es) provided
157
+ # @option options [String, Array<String>] :class Match fields that match the class(es) provided
158
158
  # @macro label_click
159
159
  # @macro waiting_behavior
160
160
  #
@@ -229,7 +229,7 @@ module Capybara
229
229
  # @option options [Boolean] multiple Match field which allows multiple file selection
230
230
  # @option options [String] id Match fields that match the id attribute
231
231
  # @option options [String] name Match fields that match the name attribute
232
- # @option options [String, Array<String>] :class Match links that match the class(es) provided
232
+ # @option options [String, Array<String>] :class Match fields that match the class(es) provided
233
233
  # @option options [true, Hash] make_visible A Hash of CSS styles to change before attempting to attach the file, if `true` { opacity: 1, display: 'block', visibility: 'visible' } is used (may not be supported by all drivers)
234
234
  #
235
235
  # @return [Capybara::Node::Element] The file field element
@@ -293,9 +293,9 @@ module Capybara
293
293
 
294
294
  def _check_with_label(selector, checked, locator, options)
295
295
  locator, options = nil, locator if locator.is_a? Hash
296
- allow_label_click = options.delete(:allow_label_click) { Capybara.automatic_label_click }
296
+ allow_label_click = options.delete(:allow_label_click) { session_options.automatic_label_click }
297
297
 
298
- synchronize(Capybara::Queries::BaseQuery::wait(options)) do
298
+ synchronize(Capybara::Queries::BaseQuery.wait(options, session_options.default_max_wait_time)) do
299
299
  begin
300
300
  el = find(selector, locator, options)
301
301
  el.set(checked)
@@ -74,7 +74,7 @@ module Capybara
74
74
  # @return [Object] The result of the given block
75
75
  # @raise [Capybara::FrozenInTime] If the return value of `Time.now` appears stuck
76
76
  #
77
- def synchronize(seconds=Capybara.default_max_wait_time, options = {})
77
+ def synchronize(seconds=session_options.default_max_wait_time, options = {})
78
78
  start_time = Capybara::Helpers.monotonic_time
79
79
 
80
80
  if session.synchronized
@@ -90,7 +90,7 @@ module Capybara
90
90
  raise e if (Capybara::Helpers.monotonic_time - start_time) >= seconds
91
91
  sleep(0.05)
92
92
  raise Capybara::FrozenInTime, "time appears to be frozen, Capybara does not work with libraries which freeze time, consider using time travelling instead" if Capybara::Helpers.monotonic_time == start_time
93
- reload if Capybara.automatic_reload
93
+ reload if session_options.automatic_reload
94
94
  retry
95
95
  ensure
96
96
  session.synchronized = false
@@ -114,6 +114,11 @@ module Capybara
114
114
  query_scope
115
115
  end
116
116
 
117
+ # @api private
118
+ def session_options
119
+ session.config
120
+ end
121
+
117
122
  protected
118
123
 
119
124
  def catch_error?(error, errors = nil)