capybara 2.14.0 → 2.14.1

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.
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