capybara 2.14.0 → 2.14.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +12 -0
  3. data/README.md +1 -1
  4. data/lib/capybara.rb +16 -15
  5. data/lib/capybara/minitest.rb +92 -113
  6. data/lib/capybara/minitest/spec.rb +12 -37
  7. data/lib/capybara/node/matchers.rb +6 -5
  8. data/lib/capybara/queries/base_query.rb +4 -0
  9. data/lib/capybara/queries/current_path_query.rb +1 -0
  10. data/lib/capybara/queries/selector_query.rb +39 -12
  11. data/lib/capybara/queries/text_query.rb +1 -1
  12. data/lib/capybara/queries/title_query.rb +1 -0
  13. data/lib/capybara/rack_test/driver.rb +1 -0
  14. data/lib/capybara/rspec/matcher_proxies.rb +10 -6
  15. data/lib/capybara/rspec/matchers.rb +29 -0
  16. data/lib/capybara/selector.rb +61 -50
  17. data/lib/capybara/selector/expression_filter.rb +40 -0
  18. data/lib/capybara/selector/filter_set.rb +22 -3
  19. data/lib/capybara/selector/selector.rb +33 -12
  20. data/lib/capybara/selenium/driver.rb +130 -25
  21. data/lib/capybara/selenium/node.rb +3 -3
  22. data/lib/capybara/session/config.rb +29 -23
  23. data/lib/capybara/session/matchers.rb +3 -0
  24. data/lib/capybara/spec/session/accept_alert_spec.rb +1 -1
  25. data/lib/capybara/spec/session/all_spec.rb +2 -1
  26. data/lib/capybara/spec/session/assert_selector.rb +1 -1
  27. data/lib/capybara/spec/session/assert_title.rb +22 -9
  28. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  29. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -1
  30. data/lib/capybara/spec/session/find_spec.rb +3 -2
  31. data/lib/capybara/spec/session/first_spec.rb +10 -5
  32. data/lib/capybara/spec/session/has_css_spec.rb +11 -0
  33. data/lib/capybara/spec/session/has_current_path_spec.rb +5 -3
  34. data/lib/capybara/spec/session/has_select_spec.rb +62 -4
  35. data/lib/capybara/spec/session/has_text_spec.rb +5 -3
  36. data/lib/capybara/spec/session/has_title_spec.rb +4 -2
  37. data/lib/capybara/spec/session/has_xpath_spec.rb +5 -3
  38. data/lib/capybara/spec/session/node_spec.rb +8 -4
  39. data/lib/capybara/spec/session/window/become_closed_spec.rb +4 -4
  40. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +4 -4
  41. data/lib/capybara/spec/spec_helper.rb +1 -1
  42. data/lib/capybara/spec/views/form.erb +22 -1
  43. data/lib/capybara/spec/views/with_html.erb +1 -1
  44. data/lib/capybara/version.rb +1 -1
  45. data/spec/capybara_spec.rb +16 -0
  46. data/spec/filter_set_spec.rb +28 -0
  47. data/spec/minitest_spec_spec.rb +4 -4
  48. data/spec/per_session_config_spec.rb +4 -4
  49. data/spec/result_spec.rb +20 -0
  50. data/spec/selector_spec.rb +2 -1
  51. data/spec/selenium_spec_chrome.rb +12 -1
  52. data/spec/selenium_spec_firefox.rb +2 -1
  53. data/spec/selenium_spec_marionette.rb +4 -3
  54. data/spec/shared_selenium_session.rb +14 -7
  55. metadata +18 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 95059b9953d4a957739d739dadd55c294e39046b
4
- data.tar.gz: fd4c944ff4a42c21661a1b6d39a243032b4ea7a8
3
+ metadata.gz: f26eecbab15830d1234ded90963559b1bcc5a189
4
+ data.tar.gz: 1c53aa8f1da2909f235f41c778b48c0633749025
5
5
  SHA512:
6
- metadata.gz: b3bfd9f5c365c483b058461d58abe63e58f162b051e739794d30f69ea84e93ed7993245dfffc9ca48f96270022aa40df5e32a60bb6df29bbc93d85c0a7f714d3
7
- data.tar.gz: bdb337934a2477819f03e9cfbbd683832a4d69775f6a688e5098079b48fc0ef630de10a8a5e7e78198ac9144cc2afe063dfeb9b73a15d73204688b789358d4a8
6
+ metadata.gz: 5d610898b0ab9dd9d8cdddc43de6e4933d041bc48bf38882865537986d5851e1ee24de44bbc172ea825a69dfe1ae4e98acc42269c0f86869cf54cc213da825b7
7
+ data.tar.gz: 6c7cc0c84a10b0b10f3990ab570cd065cdb329ec0ef3f55304d4fb6f66fa53e6e4498239e4c364fb80d9fedcf3c52bf5712f7d4131169c74e95b586c02c569f7
data/History.md CHANGED
@@ -1,3 +1,15 @@
1
+ # Version 2.14.1
2
+
3
+ Release date: 2017-06-07
4
+
5
+ ### Fixed
6
+
7
+ * Catch correct error when unexpected system modals are discovered in latest selenium [Thomas Walpole]
8
+ * Update default `puma` server registration to encourage it to run in single mode [Thomas Walpole]
9
+ * Suppress invalid element errors raised while lazily evaluating the results of `all` [Thomas Walpole]
10
+ * Added missing `with_selected` option to the :select selector to match `options`/`with_options` options - Issue #1865 [Bartosz Nowak]
11
+ * Workaround broken system modals when using selenium with headless Chrome
12
+
1
13
  # Version 2.14.0
2
14
 
3
15
  Release date: 2017-05-01
data/README.md CHANGED
@@ -1071,7 +1071,7 @@ behaviors of Capybara change
1071
1071
  my_session.config.default_max_wait_time = 10 # only set for my_session
1072
1072
  Capybara.default_max_wait_time = 2 # will not change the default_max_wait in my_session
1073
1073
 
1074
- * `current_driver` and `session_name` are thread specific. This means that `using_session' and
1074
+ * `current_driver` and `session_name` are thread specific. This means that `using_session` and
1075
1075
  `using_driver` also only affect the current thread.
1076
1076
 
1077
1077
  ## <a name="development"></a>Development
@@ -27,32 +27,32 @@ module Capybara
27
27
 
28
28
  # DelegateCapybara global configurations
29
29
  # @!method app
30
- # See {Capybara#configure}
30
+ # See {Capybara.configure}
31
31
  # @!method reuse_server
32
- # See {Capybara#configure}
32
+ # See {Capybara.configure}
33
33
  # @!method threadsafe
34
- # See {Capybara#configure}
34
+ # See {Capybara.configure}
35
35
  # @!method server
36
- # See {Capybara#configure}
36
+ # See {Capybara.configure}
37
37
  # @!method default_driver
38
- # See {Capybara#configure}
38
+ # See {Capybara.configure}
39
39
  # @!method javascript_driver
40
- # See {Capybara#configure}
40
+ # See {Capybara.configure}
41
41
  Config::OPTIONS.each do |method|
42
42
  def_delegators :config, method, "#{method}="
43
43
  end
44
44
 
45
45
  # Delegate Capybara global configurations
46
46
  # @!method default_selector
47
- # See {Capybara#configure}
47
+ # See {Capybara.configure}
48
48
  # @!method default_max_wait_time
49
- # See {Capybara#configure}
49
+ # See {Capybara.configure}
50
50
  # @!method app_host
51
- # See {Capybara#configure}
51
+ # See {Capybara.configure}
52
52
  # @!method always_include_port
53
- # See {Capybara#configure}
53
+ # See {Capybara.configure}
54
54
  # @!method wait_on_first_by_default
55
- # See {Capybara#configure}
55
+ # See {Capybara.configure}
56
56
  SessionConfig::OPTIONS.each do |method|
57
57
  def_delegators :config, method, "#{method}="
58
58
  end
@@ -169,13 +169,14 @@ module Capybara
169
169
  ##
170
170
  #
171
171
  # Modify a selector previously created by {Capybara.add_selector}.
172
- # For example modifying the :button selector to also find divs styled
173
- # to look like buttons might look like this
172
+ # For example, adding a new filter to the :button selector to filter based on
173
+ # button style (a class) might look like this
174
174
  #
175
175
  # Capybara.modify_selector(:button) do
176
- # xpath { |locator| XPath::HTML.button(locator).or(XPath::css('div.btn')[XPath::string.n.is(locator)]) }
176
+ # filter (:style, valid_values: [:primary, :secondary]) { |node, style| node[:class].split.include? "btn-#{style}" }
177
177
  # end
178
178
  #
179
+ #
179
180
  # @param [Symbol] name The name of the selector to modify
180
181
  # @yield A block executed in the context of the existing {Capybara::Selector}
181
182
  #
@@ -447,7 +448,7 @@ end
447
448
 
448
449
  Capybara.register_server :puma do |app, port, host|
449
450
  require 'rack/handler/puma'
450
- Rack::Handler::Puma.run(app, Host: host, Port: port, Threads: "0:4")
451
+ Rack::Handler::Puma.run(app, Host: host, Port: port, Threads: "0:4", workers: 0, daemon: false)
451
452
  end
452
453
 
453
454
  Capybara.configure do |config|
@@ -6,141 +6,140 @@ 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::Assertions, 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
80
+ #
81
+ # @!method assert_xpath
82
+ # see {Capybara::Node::Matchers#assert_not_matches_selector}
84
83
 
85
- define_method "assert_no_#{selector_type}" do |*args|
86
- begin
87
- self.assertions += 1
84
+ %w(assert_selector assert_no_selector assert_matches_selector assert_not_matches_selector).each do |assertion_name|
85
+ self.class_eval <<-EOM, __FILE__, __LINE__ + 1
86
+ def #{assertion_name} *args, &optional_filter_block
87
+ self.assertions +=1
88
88
  subject, *args = determine_subject(args)
89
- subject.public_send("assert_no_#{selector_type}",*args)
89
+ subject.#{assertion_name}(*args, &optional_filter_block)
90
90
  rescue Capybara::ExpectationNotMet => e
91
- raise ::Minitest::Assertion, e.message
91
+ raise ::Minitest::Assertions, e.message
92
92
  end
93
- end
94
- alias_method "refute_#{selector_type}", "assert_no_#{selector_type}"
93
+ EOM
95
94
  end
96
95
 
96
+ alias_method :refute_selector, :assert_no_selector
97
+ alias_method :refute_matches_selector, :assert_not_matches_selector
98
+
97
99
  %w(xpath css link button field select table).each do |selector_type|
98
100
  define_method "assert_#{selector_type}" do |*args, &optional_filter_block|
99
101
  subject, *args = determine_subject(args)
100
- locator, options = *args, {}
101
- locator, options = nil, locator if locator.is_a? Hash
102
+ locator, options = extract_locator(args)
102
103
  assert_selector(subject, selector_type.to_sym, locator, options, &optional_filter_block)
103
104
  end
104
105
 
105
106
  define_method "assert_no_#{selector_type}" do |*args, &optional_filter_block|
106
107
  subject, *args = determine_subject(args)
107
- locator, options = *args, {}
108
- locator, options = nil, locator if locator.is_a? Hash
108
+ locator, options = extract_locator(args)
109
109
  assert_no_selector(subject, selector_type.to_sym, locator, options, &optional_filter_block)
110
110
  end
111
111
  alias_method "refute_#{selector_type}", "assert_no_#{selector_type}"
112
112
  end
113
113
 
114
- %w(xpath css).each do |selector_type|
115
- define_method "assert_matches_#{selector_type}" do |*args, &optional_filter_block|
114
+ %w(checked unchecked).each do |field_type|
115
+ define_method "assert_#{field_type}_field" do |*args, &optional_filter_block|
116
116
  subject, *args = determine_subject(args)
117
- assert_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
117
+ locator, options = extract_locator(args)
118
+ assert_selector(subject, :field, locator, options.merge(field_type.to_sym => true), &optional_filter_block)
118
119
  end
119
120
 
120
- define_method "assert_not_matches_#{selector_type}" do |*args, &optional_filter_block|
121
+ define_method "assert_no_#{field_type}_field" do |*args, &optional_filter_block|
121
122
  subject, *args = determine_subject(args)
122
- assert_not_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
123
+ locator, options = extract_locator(args)
124
+ assert_no_selector(subject, :field, locator, options.merge(field_type.to_sym => true), &optional_filter_block)
123
125
  end
124
- alias_method "refute_matches_#{selector_type}", "assert_not_matches_#{selector_type}"
126
+ alias_method "refute_#{field_type}_field", "assert_no_#{field_type}_field"
125
127
  end
126
128
 
127
- %w(checked unchecked).each do |field_type|
128
- define_method "assert_#{field_type}_field" do |*args, &optional_filter_block|
129
+ %w(xpath css).each do |selector_type|
130
+ define_method "assert_matches_#{selector_type}" do |*args, &optional_filter_block|
129
131
  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)
132
+ assert_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
133
133
  end
134
134
 
135
- define_method "assert_no_#{field_type}_field" do |*args, &optional_filter_block|
135
+ define_method "assert_not_matches_#{selector_type}" do |*args, &optional_filter_block|
136
136
  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)
137
+ assert_not_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
140
138
  end
141
- alias_method "refute_#{field_type}_field", "assert_no_#{field_type}_field"
139
+ alias_method "refute_matches_#{selector_type}", "assert_not_matches_#{selector_type}"
142
140
  end
143
141
 
142
+
144
143
  ##
145
144
  # Assertion that there is xpath
146
145
  #
@@ -228,7 +227,7 @@ module Capybara
228
227
  # Assertion that there is no unchecked_field
229
228
  #
230
229
  # @!method assert_no_unchecked_field
231
- # @!method refute_unchceked_field
230
+ # @!method refute_unchecked_field
232
231
 
233
232
  ##
234
233
  # Assertion that there is select
@@ -256,32 +255,6 @@ module Capybara
256
255
  # @!method assert_no_table
257
256
  # see {Capybara::Node::Matchers#has_no_table?}
258
257
 
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
258
  private
286
259
 
287
260
  def determine_subject(args)
@@ -292,6 +265,12 @@ module Capybara
292
265
  [page, *args]
293
266
  end
294
267
  end
268
+
269
+ def extract_locator(args)
270
+ locator, options = *args, {}
271
+ locator, options = nil, locator if locator.is_a? Hash
272
+ [locator, options]
273
+ end
295
274
  end
296
275
  end
297
276
  end
@@ -8,47 +8,22 @@ 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).map do |assertion|
12
+ [["assert_#{assertion}", "must_have_#{assertion}"],
13
+ ["refute_#{assertion}", "wont_have_#{assertion}"]]
14
+ end.flatten(1) + %w(selector xpath css).map do |assertion|
15
+ [["assert_matches_#{assertion}", "must_match_#{assertion}"],
16
+ ["refute_matches_#{assertion}", "wont_match_#{assertion}"]]
17
+ end.flatten(1)).each do |(meth, new_name)|
18
+ self.class_eval <<-EOM, __FILE__, __LINE__ + 1
19
+ def #{new_name} *args, &block
20
+ ::Minitest::Expectation.new(self, ::Minitest::Spec.current).#{new_name}(*args, &block)
42
21
  end
43
22
  EOM
44
23
 
45
24
  ::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)
25
+ def #{new_name} *args, &block
26
+ ctx.#{meth}(target, *args, &block)
52
27
  end
53
28
  EOM
54
29
  end
@@ -432,11 +432,12 @@ module Capybara
432
432
  #
433
433
  # page.has_select?('Language', with_options: ['English', 'German'])
434
434
  #
435
- # @param [String] locator The label, name or id of a select box
436
- # @option options [Array] :options Options which should be contained in this select box
437
- # @option options [Array] :with_options Partial set of options which should be contained in this select box
438
- # @option options [String, Array] :selected Options which should be selected
439
- # @return [Boolean] Whether it exists
435
+ # @param [String] locator The label, name or id of a select box
436
+ # @option options [Array] :options Options which should be contained in this select box
437
+ # @option options [Array] :with_options Partial set of options which should be contained in this select box
438
+ # @option options [String, Array] :selected Options which should be selected
439
+ # @option options [String, Array] :with_selected Partial set of options which should minimally be selected
440
+ # @return [Boolean] Whether it exists
440
441
  #
441
442
  def has_select?(locator=nil, options={}, &optional_filter_block)
442
443
  locator, options = nil, locator if locator.is_a? Hash