capybara 2.9.2 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/History.md +10 -1
- data/README.md +34 -27
- data/lib/capybara.rb +2 -2
- data/lib/capybara/node/actions.rb +3 -3
- data/lib/capybara/node/base.rb +2 -2
- data/lib/capybara/node/element.rb +1 -1
- data/lib/capybara/node/finders.rb +37 -32
- data/lib/capybara/node/matchers.rb +187 -171
- data/lib/capybara/queries/selector_query.rb +11 -14
- data/lib/capybara/rack_test/driver.rb +3 -3
- data/lib/capybara/rails.rb +1 -1
- data/lib/capybara/rspec/features.rb +1 -1
- data/lib/capybara/rspec/matchers.rb +31 -22
- data/lib/capybara/selector.rb +2 -2
- data/lib/capybara/selector/selector.rb +22 -0
- data/lib/capybara/session.rb +4 -4
- data/lib/capybara/spec/session/accept_alert_spec.rb +4 -4
- data/lib/capybara/spec/session/accept_confirm_spec.rb +1 -1
- data/lib/capybara/spec/session/accept_prompt_spec.rb +5 -5
- data/lib/capybara/spec/session/all_spec.rb +27 -27
- data/lib/capybara/spec/session/assert_current_path.rb +2 -2
- data/lib/capybara/spec/session/assert_selector.rb +28 -28
- data/lib/capybara/spec/session/assert_text.rb +20 -20
- data/lib/capybara/spec/session/assert_title.rb +2 -2
- data/lib/capybara/spec/session/attach_file_spec.rb +2 -2
- data/lib/capybara/spec/session/check_spec.rb +5 -5
- data/lib/capybara/spec/session/choose_spec.rb +4 -4
- data/lib/capybara/spec/session/click_button_spec.rb +18 -5
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +6 -6
- data/lib/capybara/spec/session/click_link_spec.rb +13 -13
- data/lib/capybara/spec/session/current_url_spec.rb +2 -2
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +1 -1
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -1
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +15 -8
- data/lib/capybara/spec/session/evaluate_script_spec.rb +1 -1
- data/lib/capybara/spec/session/execute_script_spec.rb +2 -2
- data/lib/capybara/spec/session/fill_in_spec.rb +30 -30
- data/lib/capybara/spec/session/find_button_spec.rb +5 -5
- data/lib/capybara/spec/session/find_by_id_spec.rb +2 -2
- data/lib/capybara/spec/session/find_field_spec.rb +11 -7
- data/lib/capybara/spec/session/find_link_spec.rb +2 -2
- data/lib/capybara/spec/session/find_spec.rb +52 -48
- data/lib/capybara/spec/session/first_spec.rb +9 -9
- data/lib/capybara/spec/session/go_back_spec.rb +1 -1
- data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
- data/lib/capybara/spec/session/has_button_spec.rb +12 -12
- data/lib/capybara/spec/session/has_css_spec.rb +73 -73
- data/lib/capybara/spec/session/has_current_path_spec.rb +2 -2
- data/lib/capybara/spec/session/has_field_spec.rb +78 -68
- data/lib/capybara/spec/session/has_link_spec.rb +8 -8
- data/lib/capybara/spec/session/has_select_spec.rb +70 -61
- data/lib/capybara/spec/session/has_selector_spec.rb +28 -28
- data/lib/capybara/spec/session/has_text_spec.rb +6 -6
- data/lib/capybara/spec/session/has_title_spec.rb +2 -2
- data/lib/capybara/spec/session/has_xpath_spec.rb +26 -26
- data/lib/capybara/spec/session/headers.rb +1 -1
- data/lib/capybara/spec/session/html_spec.rb +3 -3
- data/lib/capybara/spec/session/node_spec.rb +15 -15
- data/lib/capybara/spec/session/reset_session_spec.rb +4 -4
- data/lib/capybara/spec/session/response_code.rb +1 -1
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +3 -3
- data/lib/capybara/spec/session/screenshot_spec.rb +1 -1
- data/lib/capybara/spec/session/select_spec.rb +30 -30
- data/lib/capybara/spec/session/uncheck_spec.rb +2 -2
- data/lib/capybara/spec/session/unselect_spec.rb +14 -14
- data/lib/capybara/spec/session/visit_spec.rb +2 -2
- data/lib/capybara/spec/session/within_frame_spec.rb +2 -2
- data/lib/capybara/spec/session/within_spec.rb +6 -6
- data/lib/capybara/spec/spec_helper.rb +1 -1
- data/lib/capybara/spec/test_app.rb +1 -1
- data/lib/capybara/spec/views/form.erb +1 -0
- data/lib/capybara/version.rb +1 -1
- data/spec/basic_node_spec.rb +5 -5
- data/spec/capybara_spec.rb +1 -1
- data/spec/dsl_spec.rb +1 -1
- data/spec/rack_test_spec.rb +7 -7
- data/spec/rspec/matchers_spec.rb +6 -6
- data/spec/rspec_spec.rb +1 -1
- data/spec/selector_spec.rb +13 -0
- data/spec/selenium_firefox_spec.rb +1 -1
- data/spec/selenium_spec_chrome.rb +1 -1
- data/spec/shared_selenium_session.rb +10 -10
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e04794fbb1724e14269beeff9388b53a6f8603b
|
4
|
+
data.tar.gz: 377ee4cf8d61e2c1420ad7bc44b400e1f991ac30
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: afcaeaf6eb1aa0690b74ffa21acbaea6282b2ed0aba4382bc926ec6a6fbdd43bff3facc886e2d5558f7cf9af167a8278ef9ded0e946dbc9052168fc6583e94f4
|
7
|
+
data.tar.gz: b6be9f0cd07cc125a46f14c9a322b789547eb875252a10d217b4c1410080bf4be0c146c83361846a17a114b1c648416dca1a3301eefdb26087f215a0fa120872
|
data/History.md
CHANGED
@@ -1,9 +1,18 @@
|
|
1
|
+
#2.10.0
|
2
|
+
Release date: 2016-10-05
|
3
|
+
|
4
|
+
### Added
|
5
|
+
* Select `<button>` elements with descendant images with `alt` attributes matching the locator [Ian Lesperance]
|
6
|
+
* Locator string is optional in selector based matchers [Thomas Walpole]
|
7
|
+
* Selectors can specify their default visible setting [Thomas Walpole]
|
8
|
+
* Selector based finders and matchers can be passed a block to filter the results within the retry behavior [Thomas Walpole]
|
9
|
+
|
1
10
|
#Version 2.9.2
|
2
11
|
Release date: 2016-09-29
|
3
12
|
|
4
13
|
### Fixed
|
5
14
|
* :label built-in selector finds nested label/control by control id if the label has no 'for' attribute [Thomas Walpole]
|
6
|
-
* Warning issued if an unknown selector type is specified
|
15
|
+
* Warning issued if an unknown selector type is specified [Thomas Walpole]
|
7
16
|
|
8
17
|
#Version 2.9.1
|
9
18
|
Release date: 2016-09-23
|
data/README.md
CHANGED
@@ -107,8 +107,8 @@ You can use the Capybara DSL in your steps, like so:
|
|
107
107
|
```ruby
|
108
108
|
When /I sign in/ do
|
109
109
|
within("#session") do
|
110
|
-
fill_in 'Email', :
|
111
|
-
fill_in 'Password', :
|
110
|
+
fill_in 'Email', with: 'user@example.com'
|
111
|
+
fill_in 'Password', with: 'password'
|
112
112
|
end
|
113
113
|
click_button 'Sign in'
|
114
114
|
end
|
@@ -150,14 +150,14 @@ You can now write your specs like so:
|
|
150
150
|
```ruby
|
151
151
|
describe "the signin process", :type => :feature do
|
152
152
|
before :each do
|
153
|
-
User.make(:
|
153
|
+
User.make(email: 'user@example.com', password: 'password')
|
154
154
|
end
|
155
155
|
|
156
156
|
it "signs me in" do
|
157
157
|
visit '/sessions/new'
|
158
158
|
within("#session") do
|
159
|
-
fill_in 'Email', :
|
160
|
-
fill_in 'Password', :
|
159
|
+
fill_in 'Email', with: 'user@example.com'
|
160
|
+
fill_in 'Password', with: 'password'
|
161
161
|
end
|
162
162
|
click_button 'Sign in'
|
163
163
|
expect(page).to have_content 'Success'
|
@@ -165,12 +165,12 @@ describe "the signin process", :type => :feature do
|
|
165
165
|
end
|
166
166
|
```
|
167
167
|
|
168
|
-
Use
|
168
|
+
Use `js: true` to switch to the `Capybara.javascript_driver`
|
169
169
|
(`:selenium` by default), or provide a `:driver` option to switch
|
170
170
|
to one specific driver. For example:
|
171
171
|
|
172
172
|
```ruby
|
173
|
-
describe 'some stuff which requires js', :
|
173
|
+
describe 'some stuff which requires js', js: true do
|
174
174
|
it 'will use the default js driver'
|
175
175
|
it 'will switch to one specific driver', :driver => :webkit
|
176
176
|
end
|
@@ -181,26 +181,26 @@ Capybara also comes with a built in DSL for creating descriptive acceptance test
|
|
181
181
|
```ruby
|
182
182
|
feature "Signing in" do
|
183
183
|
background do
|
184
|
-
User.make(:
|
184
|
+
User.make(email: 'user@example.com', password: 'caplin')
|
185
185
|
end
|
186
186
|
|
187
187
|
scenario "Signing in with correct credentials" do
|
188
188
|
visit '/sessions/new'
|
189
189
|
within("#session") do
|
190
|
-
fill_in 'Email', :
|
191
|
-
fill_in 'Password', :
|
190
|
+
fill_in 'Email', with: 'user@example.com'
|
191
|
+
fill_in 'Password', with: 'caplin'
|
192
192
|
end
|
193
193
|
click_button 'Sign in'
|
194
194
|
expect(page).to have_content 'Success'
|
195
195
|
end
|
196
196
|
|
197
|
-
given(:other_user) { User.make(:
|
197
|
+
given(:other_user) { User.make(email: 'other@example.com', password: 'rous') }
|
198
198
|
|
199
199
|
scenario "Signing in as another user" do
|
200
200
|
visit '/sessions/new'
|
201
201
|
within("#session") do
|
202
|
-
fill_in 'Email', :
|
203
|
-
fill_in 'Password', :
|
202
|
+
fill_in 'Email', with: other_user.email
|
203
|
+
fill_in 'Password', with: other_user.password
|
204
204
|
end
|
205
205
|
click_button 'Sign in'
|
206
206
|
expect(page).to have_content 'Invalid email or password'
|
@@ -308,7 +308,7 @@ Capybara.default_driver = :selenium
|
|
308
308
|
|
309
309
|
However, if you are using RSpec or Cucumber, you may instead want to consider
|
310
310
|
leaving the faster `:rack_test` as the __default_driver__, and marking only those
|
311
|
-
tests that require a JavaScript-capable driver using
|
311
|
+
tests that require a JavaScript-capable driver using `js: true` or
|
312
312
|
`@javascript`, respectively. By default, JavaScript tests are run using the
|
313
313
|
`:selenium` driver. You can change this by setting
|
314
314
|
`Capybara.javascript_driver`.
|
@@ -344,7 +344,7 @@ RackTest can be configured with a set of headers like this:
|
|
344
344
|
|
345
345
|
```ruby
|
346
346
|
Capybara.register_driver :rack_test do |app|
|
347
|
-
Capybara::RackTest::Driver.new(app, :
|
347
|
+
Capybara::RackTest::Driver.new(app, headers: { 'HTTP_USER_AGENT' => 'Capybara' })
|
348
348
|
end
|
349
349
|
```
|
350
350
|
|
@@ -448,14 +448,14 @@ click_on('Button Value')
|
|
448
448
|
There are a number of tools for interacting with form elements:
|
449
449
|
|
450
450
|
```ruby
|
451
|
-
fill_in('First Name', :
|
452
|
-
fill_in('Password', :
|
453
|
-
fill_in('Description', :
|
451
|
+
fill_in('First Name', with: 'John')
|
452
|
+
fill_in('Password', with: 'Seekrit')
|
453
|
+
fill_in('Description', with: 'Really Long Text...')
|
454
454
|
choose('A Radio Button')
|
455
455
|
check('A Checkbox')
|
456
456
|
uncheck('A Checkbox')
|
457
457
|
attach_file('Image', '/path/to/image.jpg')
|
458
|
-
select('Option', :
|
458
|
+
select('Option', from: 'Select Box')
|
459
459
|
```
|
460
460
|
|
461
461
|
### <a name="querying"></a>Querying
|
@@ -504,6 +504,13 @@ find("#overlay").find("h1").click
|
|
504
504
|
all('a').each { |a| a[:href] }
|
505
505
|
```
|
506
506
|
|
507
|
+
If you need to find elements by additional attributes/properties you can also pass a filter block, which will be checked inside the normal waiting behavior.
|
508
|
+
If you find yourself needing to use this a lot you may be better off adding a [custom selector](http://www.rubydoc.info/github/jnicklas/capybara/Capybara#add_selector-class_method) or [adding a filter to an existing selector](http://www.rubydoc.info/github/jnicklas/capybara/Capybara#modify_selector-class_method).
|
509
|
+
|
510
|
+
```ruby
|
511
|
+
find_field('First Name'){ |el| el['data-xyz'] == '123' }
|
512
|
+
````
|
513
|
+
|
507
514
|
**Note**: `find` will wait for an element to appear on the page, as explained in the
|
508
515
|
Ajax section. If the element does not appear it will raise an error.
|
509
516
|
|
@@ -525,11 +532,11 @@ method. Optionally you can specify which kind of selector to use.
|
|
525
532
|
|
526
533
|
```ruby
|
527
534
|
within("li#employee") do
|
528
|
-
fill_in 'Name', :
|
535
|
+
fill_in 'Name', with: 'Jimmy'
|
529
536
|
end
|
530
537
|
|
531
538
|
within(:xpath, "//li[@id='employee']") do
|
532
|
-
fill_in 'Name', :
|
539
|
+
fill_in 'Name', with: 'Jimmy'
|
533
540
|
end
|
534
541
|
```
|
535
542
|
|
@@ -539,11 +546,11 @@ specific table, identified by either id or text of the table's caption tag.
|
|
539
546
|
|
540
547
|
```ruby
|
541
548
|
within_fieldset('Employee') do
|
542
|
-
fill_in 'Name', :
|
549
|
+
fill_in 'Name', with: 'Jimmy'
|
543
550
|
end
|
544
551
|
|
545
552
|
within_table('Employee') do
|
546
|
-
fill_in 'Name', :
|
553
|
+
fill_in 'Name', with: 'Jimmy'
|
547
554
|
end
|
548
555
|
```
|
549
556
|
|
@@ -782,8 +789,8 @@ module MyModule
|
|
782
789
|
|
783
790
|
def login!
|
784
791
|
within(:xpath, "//form[@id='session']") do
|
785
|
-
fill_in 'Email', :
|
786
|
-
fill_in 'Password', :
|
792
|
+
fill_in 'Email', with: 'user@example.com'
|
793
|
+
fill_in 'Password', with: 'password'
|
787
794
|
end
|
788
795
|
click_button 'Sign in'
|
789
796
|
end
|
@@ -853,8 +860,8 @@ require 'capybara'
|
|
853
860
|
|
854
861
|
session = Capybara::Session.new(:webkit, my_rack_app)
|
855
862
|
session.within("form#session") do
|
856
|
-
session.fill_in 'Email', :
|
857
|
-
session.fill_in 'Password', :
|
863
|
+
session.fill_in 'Email', with: 'user@example.com'
|
864
|
+
session.fill_in 'Password', with: 'password'
|
858
865
|
end
|
859
866
|
session.click_button 'Sign in'
|
860
867
|
```
|
data/lib/capybara.rb
CHANGED
@@ -225,7 +225,7 @@ module Capybara
|
|
225
225
|
# HTML
|
226
226
|
#
|
227
227
|
# node.find('#projects').text # => 'Projects'
|
228
|
-
# node.has_selector?('li#home', :
|
228
|
+
# node.has_selector?('li#home', text: 'Home')
|
229
229
|
# node.has_selector?('#projects')
|
230
230
|
# node.find('ul').find('li:first-child').text # => 'Home'
|
231
231
|
#
|
@@ -475,7 +475,7 @@ end
|
|
475
475
|
|
476
476
|
Capybara.register_server :webrick do |app, port, host|
|
477
477
|
require 'rack/handler/webrick'
|
478
|
-
Rack::Handler::WEBrick.run(app, :
|
478
|
+
Rack::Handler::WEBrick.run(app, Host: host, Port: port, AccessLog: [], Logger: WEBrick::Log::new(nil, 0))
|
479
479
|
end
|
480
480
|
|
481
481
|
Capybara.register_server :puma do |app, port, host|
|
@@ -62,7 +62,7 @@ module Capybara
|
|
62
62
|
# Locate a text field or text area and fill it in with the given text
|
63
63
|
# The field can be found via its name, id or label text.
|
64
64
|
#
|
65
|
-
# page.fill_in 'Name', :
|
65
|
+
# page.fill_in 'Name', with: 'Bob'
|
66
66
|
#
|
67
67
|
#
|
68
68
|
# @overload fill_in([locator], options={})
|
@@ -206,7 +206,7 @@ module Capybara
|
|
206
206
|
# one option.
|
207
207
|
# The select box can be found via its name, id or label text. The option can be found by its text.
|
208
208
|
#
|
209
|
-
# page.select 'March', :
|
209
|
+
# page.select 'March', from: 'Month'
|
210
210
|
#
|
211
211
|
# @macro waiting_behavior
|
212
212
|
#
|
@@ -228,7 +228,7 @@ module Capybara
|
|
228
228
|
# box is a multiple select, +unselect+ can be called multiple times to unselect more than
|
229
229
|
# one option. The select box can be found via its name, id or label text.
|
230
230
|
#
|
231
|
-
# page.unselect 'March', :
|
231
|
+
# page.unselect 'March', from: 'Month'
|
232
232
|
#
|
233
233
|
# @macro waiting_behavior
|
234
234
|
#
|
data/lib/capybara/node/base.rb
CHANGED
@@ -17,9 +17,9 @@ module Capybara
|
|
17
17
|
#
|
18
18
|
# session = Capybara::Session.new(:rack_test, my_app)
|
19
19
|
# session.visit('/')
|
20
|
-
# session.fill_in('Foo', :
|
20
|
+
# session.fill_in('Foo', with: 'Bar') # from Capybara::Node::Actions
|
21
21
|
# bar = session.find('#bar') # from Capybara::Node::Finders
|
22
|
-
# bar.select('Baz', :
|
22
|
+
# bar.select('Baz', from: 'Quox') # from Capybara::Node::Actions
|
23
23
|
# session.has_css?('#foobar') # from Capybara::Node::Matchers
|
24
24
|
#
|
25
25
|
class Base
|
@@ -10,7 +10,7 @@ module Capybara
|
|
10
10
|
# session = Capybara::Session.new(:rack_test, my_app)
|
11
11
|
#
|
12
12
|
# bar = session.find('#bar') # from Capybara::Node::Finders
|
13
|
-
# bar.select('Baz', :
|
13
|
+
# bar.select('Baz', from: 'Quox') # from Capybara::Node::Actions
|
14
14
|
#
|
15
15
|
# {Capybara::Node::Element} also has access to HTML attributes and other properties of the
|
16
16
|
# element:
|
@@ -19,7 +19,7 @@ module Capybara
|
|
19
19
|
#
|
20
20
|
# page.find('#foo').find('.bar')
|
21
21
|
# page.find(:xpath, '//div[contains(., "bar")]')
|
22
|
-
# page.find('li', :
|
22
|
+
# page.find('li', text: 'Quox').click_link('Delete')
|
23
23
|
#
|
24
24
|
# @param (see Capybara::Node::Finders#all)
|
25
25
|
#
|
@@ -28,8 +28,8 @@ module Capybara
|
|
28
28
|
# @return [Capybara::Node::Element] The found element
|
29
29
|
# @raise [Capybara::ElementNotFound] If the element can't be found before time expires
|
30
30
|
#
|
31
|
-
def find(*args)
|
32
|
-
query = Capybara::Queries::SelectorQuery.new(*args)
|
31
|
+
def find(*args, &optional_filter_block)
|
32
|
+
query = Capybara::Queries::SelectorQuery.new(*args, &optional_filter_block)
|
33
33
|
synchronize(query.wait) do
|
34
34
|
if (query.match == :smart or query.match == :prefer_exact) and query.supports_exact?
|
35
35
|
result = query.resolve_for(self, true)
|
@@ -74,9 +74,9 @@ module Capybara
|
|
74
74
|
# @return [Capybara::Node::Element] The found element
|
75
75
|
#
|
76
76
|
|
77
|
-
def find_field(locator=nil, options={})
|
77
|
+
def find_field(locator=nil, options={}, &optional_filter_block)
|
78
78
|
locator, options = nil, locator if locator.is_a? Hash
|
79
|
-
find(:field, locator, options)
|
79
|
+
find(:field, locator, options, &optional_filter_block)
|
80
80
|
end
|
81
81
|
alias_method :field_labeled, :find_field
|
82
82
|
|
@@ -96,9 +96,9 @@ module Capybara
|
|
96
96
|
# @option options [String, Array<String>] class Match links that match the class(es) provided
|
97
97
|
# @return [Capybara::Node::Element] The found element
|
98
98
|
#
|
99
|
-
def find_link(locator=nil, options={})
|
99
|
+
def find_link(locator=nil, options={}, &optional_filter_block)
|
100
100
|
locator, options = nil, locator if locator.is_a? Hash
|
101
|
-
find(:link, locator, options)
|
101
|
+
find(:link, locator, options, &optional_filter_block)
|
102
102
|
end
|
103
103
|
|
104
104
|
##
|
@@ -125,9 +125,9 @@ module Capybara
|
|
125
125
|
# @option options [String, Array<String>] class Match links that match the class(es) provided
|
126
126
|
# @return [Capybara::Node::Element] The found element
|
127
127
|
#
|
128
|
-
def find_button(locator=nil, options={})
|
128
|
+
def find_button(locator=nil, options={}, &optional_filter_block)
|
129
129
|
locator, options = nil, locator if locator.is_a? Hash
|
130
|
-
find(:button, locator, options)
|
130
|
+
find(:button, locator, options, &optional_filter_block)
|
131
131
|
end
|
132
132
|
|
133
133
|
##
|
@@ -140,11 +140,12 @@ module Capybara
|
|
140
140
|
#
|
141
141
|
# @return [Capybara::Node::Element] The found element
|
142
142
|
#
|
143
|
-
def find_by_id(id, options={})
|
144
|
-
find(:id, id, options)
|
143
|
+
def find_by_id(id, options={}, &optional_filter_block)
|
144
|
+
find(:id, id, options, &optional_filter_block)
|
145
145
|
end
|
146
146
|
|
147
147
|
##
|
148
|
+
# @!method all([kind = Capybara.default_selector], locator = nil, options = {})
|
148
149
|
#
|
149
150
|
# Find all elements on the page matching the given selector
|
150
151
|
# and options.
|
@@ -168,42 +169,45 @@ module Capybara
|
|
168
169
|
# The set of found elements can further be restricted by specifying
|
169
170
|
# options. It's possible to select elements by their text or visibility:
|
170
171
|
#
|
171
|
-
# page.all('a', :
|
172
|
-
# page.all('#menu li', :
|
172
|
+
# page.all('a', text: 'Home')
|
173
|
+
# page.all('#menu li', visible: true)
|
173
174
|
#
|
174
175
|
# By default if no elements are found, an empty array is returned;
|
175
176
|
# however, expectations can be set on the number of elements to be found which
|
176
177
|
# will trigger Capybara's waiting behavior for the expectations to match.The
|
177
178
|
# expectations can be set using
|
178
179
|
#
|
179
|
-
# page.assert_selector('p#foo', :
|
180
|
-
# page.assert_selector('p#foo', :
|
181
|
-
# page.assert_selector('p#foo', :
|
182
|
-
# page.assert_selector('p#foo', :
|
180
|
+
# page.assert_selector('p#foo', count: 4)
|
181
|
+
# page.assert_selector('p#foo', maximum: 10)
|
182
|
+
# page.assert_selector('p#foo', minimum: 1)
|
183
|
+
# page.assert_selector('p#foo', between: 1..10)
|
183
184
|
#
|
184
185
|
# See {Capybara::Helpers#matches_count?} for additional information about
|
185
186
|
# count matching.
|
186
187
|
#
|
187
|
-
# @
|
188
|
-
#
|
189
|
-
#
|
190
|
-
#
|
191
|
-
# @option options [Boolean, Symbol] visible Only find elements with the specified visibility:
|
188
|
+
# @param [Symbol] kind Optional selector type (:css, :xpath, :field, etc.) - Defaults to Capybara.default_selector
|
189
|
+
# @param [String] locator The selector
|
190
|
+
# @option options [String, Regexp] text Only find elements which contain this text or match this regexp
|
191
|
+
# @option options [Boolean, Symbol] visible Only find elements with the specified visibility:
|
192
192
|
# * true - only finds visible elements.
|
193
193
|
# * false - finds invisible _and_ visible elements.
|
194
194
|
# * :all - same as false; finds visible and invisible elements.
|
195
195
|
# * :hidden - only finds invisible elements.
|
196
196
|
# * :visible - same as true; only finds visible elements.
|
197
|
-
#
|
198
|
-
#
|
199
|
-
#
|
200
|
-
#
|
201
|
-
#
|
202
|
-
#
|
197
|
+
# @option options [Integer] count Exact number of matches that are expected to be found
|
198
|
+
# @option options [Integer] maximum Maximum number of matches that are expected to be found
|
199
|
+
# @option options [Integer] minimum Minimum number of matches that are expected to be found
|
200
|
+
# @option options [Range] between Number of matches found must be within the given range
|
201
|
+
# @option options [Boolean] exact Control whether `is` expressions in the given XPath match exactly or partially
|
202
|
+
# @option options [Integer] wait (Capybara.default_max_wait_time) The time to wait for element count expectations to become true
|
203
|
+
# @overload all([kind = Capybara.default_selector], locator = nil, options = {})
|
204
|
+
# @overload all([kind = Capybara.default_selector], locator = nil, options = {}, &filter_block)
|
205
|
+
# @yieldparam element [Capybara::Node::Element] The element being considered for inclusion in the results
|
206
|
+
# @yieldreturn [Boolean] Should the element be considered in the results?
|
203
207
|
# @return [Capybara::Result] A collection of found elements
|
204
208
|
#
|
205
|
-
def all(*args)
|
206
|
-
query = Capybara::Queries::SelectorQuery.new(*args)
|
209
|
+
def all(*args, &optional_filter_block)
|
210
|
+
query = Capybara::Queries::SelectorQuery.new(*args, &optional_filter_block)
|
207
211
|
synchronize(query.wait) do
|
208
212
|
result = query.resolve_for(self)
|
209
213
|
raise Capybara::ExpectationNotMet, result.failure_message unless result.matches_count?
|
@@ -227,15 +231,16 @@ module Capybara
|
|
227
231
|
# @param [Hash] options Additional options; see {#all}
|
228
232
|
# @return [Capybara::Node::Element] The found element or nil
|
229
233
|
#
|
230
|
-
def first(*args)
|
234
|
+
def first(*args, &optional_filter_block)
|
231
235
|
if Capybara.wait_on_first_by_default
|
232
236
|
options = if args.last.is_a?(Hash) then args.pop.dup else {} end
|
233
237
|
args.push({minimum: 1}.merge(options))
|
234
238
|
end
|
235
|
-
all(*args).first
|
239
|
+
all(*args, &optional_filter_block).first
|
236
240
|
rescue Capybara::ExpectationNotMet
|
237
241
|
nil
|
238
242
|
end
|
243
|
+
|
239
244
|
end
|
240
245
|
end
|
241
246
|
end
|
@@ -14,14 +14,14 @@ module Capybara
|
|
14
14
|
# By default it will check if the expression occurs at least once,
|
15
15
|
# but a different number can be specified.
|
16
16
|
#
|
17
|
-
# page.has_selector?('p.foo', :
|
17
|
+
# page.has_selector?('p.foo', count: 4)
|
18
18
|
#
|
19
19
|
# This will check if the expression occurs exactly 4 times.
|
20
20
|
#
|
21
21
|
# It also accepts all options that {Capybara::Node::Finders#all} accepts,
|
22
22
|
# such as :text and :visible.
|
23
23
|
#
|
24
|
-
# page.has_selector?('li', :
|
24
|
+
# page.has_selector?('li', text: 'Horse', visible: true)
|
25
25
|
#
|
26
26
|
# has_selector? can also accept XPath expressions generated by the
|
27
27
|
# XPath gem:
|
@@ -36,8 +36,8 @@ module Capybara
|
|
36
36
|
# @option args [Range] :between (nil) Range of times that should contain number of times text occurs
|
37
37
|
# @return [Boolean] If the expression exists
|
38
38
|
#
|
39
|
-
def has_selector?(*args)
|
40
|
-
assert_selector(*args)
|
39
|
+
def has_selector?(*args, &optional_filter_block)
|
40
|
+
assert_selector(*args, &optional_filter_block)
|
41
41
|
rescue Capybara::ExpectationNotMet
|
42
42
|
return false
|
43
43
|
end
|
@@ -50,83 +50,12 @@ module Capybara
|
|
50
50
|
# @param (see Capybara::Node::Finders#has_selector?)
|
51
51
|
# @return [Boolean]
|
52
52
|
#
|
53
|
-
def has_no_selector?(*args)
|
54
|
-
assert_no_selector(*args)
|
53
|
+
def has_no_selector?(*args, &optional_filter_block)
|
54
|
+
assert_no_selector(*args, &optional_filter_block)
|
55
55
|
rescue Capybara::ExpectationNotMet
|
56
56
|
return false
|
57
57
|
end
|
58
58
|
|
59
|
-
##
|
60
|
-
#
|
61
|
-
# Checks if the current node matches given selector
|
62
|
-
#
|
63
|
-
# @param (see Capybara::Node::Finders#has_selector?)
|
64
|
-
# @return [Boolean]
|
65
|
-
#
|
66
|
-
def matches_selector?(*args)
|
67
|
-
assert_matches_selector(*args)
|
68
|
-
rescue Capybara::ExpectationNotMet
|
69
|
-
return false
|
70
|
-
end
|
71
|
-
|
72
|
-
##
|
73
|
-
#
|
74
|
-
# Checks if the current node matches given XPath expression
|
75
|
-
#
|
76
|
-
# @param [String, XPath::Expression] xpath The XPath expression to match against the current code
|
77
|
-
# @return [Boolean]
|
78
|
-
#
|
79
|
-
def matches_xpath?(xpath, options={})
|
80
|
-
matches_selector?(:xpath, xpath, options)
|
81
|
-
end
|
82
|
-
|
83
|
-
##
|
84
|
-
#
|
85
|
-
# Checks if the current node matches given CSS selector
|
86
|
-
#
|
87
|
-
# @param [String] css The CSS selector to match against the current code
|
88
|
-
# @return [Boolean]
|
89
|
-
#
|
90
|
-
def matches_css?(css, options={})
|
91
|
-
matches_selector?(:css, css, options)
|
92
|
-
end
|
93
|
-
|
94
|
-
##
|
95
|
-
#
|
96
|
-
# Checks if the current node does not match given selector
|
97
|
-
# Usage is identical to Capybara::Node::Matchers#has_selector?
|
98
|
-
#
|
99
|
-
# @param (see Capybara::Node::Finders#has_selector?)
|
100
|
-
# @return [Boolean]
|
101
|
-
#
|
102
|
-
def not_matches_selector?(*args)
|
103
|
-
assert_not_matches_selector(*args)
|
104
|
-
rescue Capybara::ExpectationNotMet
|
105
|
-
return false
|
106
|
-
end
|
107
|
-
|
108
|
-
##
|
109
|
-
#
|
110
|
-
# Checks if the current node does not match given XPath expression
|
111
|
-
#
|
112
|
-
# @param [String, XPath::Expression] xpath The XPath expression to match against the current code
|
113
|
-
# @return [Boolean]
|
114
|
-
#
|
115
|
-
def not_matches_xpath?(xpath, options={})
|
116
|
-
not_matches_selector?(:xpath, xpath, options)
|
117
|
-
end
|
118
|
-
|
119
|
-
##
|
120
|
-
#
|
121
|
-
# Checks if the current node does not match given CSS selector
|
122
|
-
#
|
123
|
-
# @param [String] css The CSS selector to match against the current code
|
124
|
-
# @return [Boolean]
|
125
|
-
#
|
126
|
-
def not_matches_css?(css, options={})
|
127
|
-
not_matches_selector?(:css, css, options)
|
128
|
-
end
|
129
|
-
|
130
59
|
##
|
131
60
|
#
|
132
61
|
# Asserts that a given selector is on the page or a descendant of the current node.
|
@@ -138,7 +67,7 @@ module Capybara
|
|
138
67
|
# By default it will check if the expression occurs at least once,
|
139
68
|
# but a different number can be specified.
|
140
69
|
#
|
141
|
-
# page.assert_selector('p#foo', :
|
70
|
+
# page.assert_selector('p#foo', count: 4)
|
142
71
|
#
|
143
72
|
# This will check if the expression occurs exactly 4 times. See
|
144
73
|
# {Capybara::Node::Finders#all} for other available result size options.
|
@@ -149,7 +78,7 @@ module Capybara
|
|
149
78
|
# It also accepts all options that {Capybara::Node::Finders#all} accepts,
|
150
79
|
# such as :text and :visible.
|
151
80
|
#
|
152
|
-
# page.assert_selector('li', :
|
81
|
+
# page.assert_selector('li', text: 'Horse', visible: true)
|
153
82
|
#
|
154
83
|
# `assert_selector` can also accept XPath expressions generated by the
|
155
84
|
# XPath gem:
|
@@ -160,8 +89,8 @@ module Capybara
|
|
160
89
|
# @option options [Integer] :count (nil) Number of times the expression should occur
|
161
90
|
# @raise [Capybara::ExpectationNotMet] If the selector does not exist
|
162
91
|
#
|
163
|
-
def assert_selector(*args)
|
164
|
-
query = Capybara::Queries::SelectorQuery.new(*args)
|
92
|
+
def assert_selector(*args, &optional_filter_block)
|
93
|
+
query = Capybara::Queries::SelectorQuery.new(*args, &optional_filter_block)
|
165
94
|
synchronize(query.wait) do
|
166
95
|
result = query.resolve_for(self)
|
167
96
|
unless result.matches_count? && ((!result.empty?) || query.expects_none?)
|
@@ -180,15 +109,15 @@ module Capybara
|
|
180
109
|
# considered to be an integral part of the selector. This will return
|
181
110
|
# true, for example, if a page contains 4 anchors but the query expects 5:
|
182
111
|
#
|
183
|
-
# page.assert_no_selector('a', :
|
184
|
-
# page.assert_no_selector('a', :
|
185
|
-
# page.assert_no_selector('a', :
|
112
|
+
# page.assert_no_selector('a', minimum: 1) # Found, raises Capybara::ExpectationNotMet
|
113
|
+
# page.assert_no_selector('a', count: 4) # Found, raises Capybara::ExpectationNotMet
|
114
|
+
# page.assert_no_selector('a', count: 5) # Not Found, returns true
|
186
115
|
#
|
187
116
|
# @param (see Capybara::Node::Finders#assert_selector)
|
188
117
|
# @raise [Capybara::ExpectationNotMet] If the selector exists
|
189
118
|
#
|
190
|
-
def assert_no_selector(*args)
|
191
|
-
query = Capybara::Queries::SelectorQuery.new(*args)
|
119
|
+
def assert_no_selector(*args, &optional_filter_block)
|
120
|
+
query = Capybara::Queries::SelectorQuery.new(*args, &optional_filter_block)
|
192
121
|
synchronize(query.wait) do
|
193
122
|
result = query.resolve_for(self)
|
194
123
|
if result.matches_count? && ((!result.empty?) || query.expects_none?)
|
@@ -199,45 +128,6 @@ module Capybara
|
|
199
128
|
end
|
200
129
|
alias_method :refute_selector, :assert_no_selector
|
201
130
|
|
202
|
-
##
|
203
|
-
#
|
204
|
-
# Asserts that the current_node matches a given selector
|
205
|
-
#
|
206
|
-
# node.assert_matches_selector('p#foo')
|
207
|
-
# node.assert_matches_selector(:xpath, '//p[@id="foo"]')
|
208
|
-
# node.assert_matches_selector(:foo)
|
209
|
-
#
|
210
|
-
# It also accepts all options that {Capybara::Node::Finders#all} accepts,
|
211
|
-
# such as :text and :visible.
|
212
|
-
#
|
213
|
-
# node.assert_matches_selector('li', :text => 'Horse', :visible => true)
|
214
|
-
#
|
215
|
-
# @param (see Capybara::Node::Finders#all)
|
216
|
-
# @raise [Capybara::ExpectationNotMet] If the selector does not match
|
217
|
-
#
|
218
|
-
def assert_matches_selector(*args)
|
219
|
-
query = Capybara::Queries::MatchQuery.new(*args)
|
220
|
-
synchronize(query.wait) do
|
221
|
-
result = query.resolve_for(self.query_scope)
|
222
|
-
unless result.include? self
|
223
|
-
raise Capybara::ExpectationNotMet, "Item does not match the provided selector"
|
224
|
-
end
|
225
|
-
end
|
226
|
-
return true
|
227
|
-
end
|
228
|
-
|
229
|
-
def assert_not_matches_selector(*args)
|
230
|
-
query = Capybara::Queries::MatchQuery.new(*args)
|
231
|
-
synchronize(query.wait) do
|
232
|
-
result = query.resolve_for(self.query_scope)
|
233
|
-
if result.include? self
|
234
|
-
raise Capybara::ExpectationNotMet, 'Item matched the provided selector'
|
235
|
-
end
|
236
|
-
end
|
237
|
-
return true
|
238
|
-
end
|
239
|
-
alias_method :refute_matches_selector, :assert_not_matches_selector
|
240
|
-
|
241
131
|
##
|
242
132
|
#
|
243
133
|
# Checks if a given XPath expression is on the page or a descendant of the current node.
|
@@ -247,14 +137,14 @@ module Capybara
|
|
247
137
|
# By default it will check if the expression occurs at least once,
|
248
138
|
# but a different number can be specified.
|
249
139
|
#
|
250
|
-
# page.has_xpath?('.//p[@id="foo"]', :
|
140
|
+
# page.has_xpath?('.//p[@id="foo"]', count: 4)
|
251
141
|
#
|
252
142
|
# This will check if the expression occurs exactly 4 times.
|
253
143
|
#
|
254
144
|
# It also accepts all options that {Capybara::Node::Finders#all} accepts,
|
255
145
|
# such as :text and :visible.
|
256
146
|
#
|
257
|
-
# page.has_xpath?('.//li', :
|
147
|
+
# page.has_xpath?('.//li', text: 'Horse', visible: true)
|
258
148
|
#
|
259
149
|
# has_xpath? can also accept XPath expressions generate by the
|
260
150
|
# XPath gem:
|
@@ -267,8 +157,8 @@ module Capybara
|
|
267
157
|
# @option options [Integer] :count (nil) Number of times the expression should occur
|
268
158
|
# @return [Boolean] If the expression exists
|
269
159
|
#
|
270
|
-
def has_xpath?(path, options={})
|
271
|
-
has_selector?(:xpath, path, options)
|
160
|
+
def has_xpath?(path, options={}, &optional_filter_block)
|
161
|
+
has_selector?(:xpath, path, options, &optional_filter_block)
|
272
162
|
end
|
273
163
|
|
274
164
|
##
|
@@ -279,8 +169,8 @@ module Capybara
|
|
279
169
|
# @param (see Capybara::Node::Finders#has_xpath?)
|
280
170
|
# @return [Boolean]
|
281
171
|
#
|
282
|
-
def has_no_xpath?(path, options={})
|
283
|
-
has_no_selector?(:xpath, path, options)
|
172
|
+
def has_no_xpath?(path, options={}, &optional_filter_block)
|
173
|
+
has_no_selector?(:xpath, path, options, &optional_filter_block)
|
284
174
|
end
|
285
175
|
|
286
176
|
##
|
@@ -292,22 +182,22 @@ module Capybara
|
|
292
182
|
# By default it will check if the selector occurs at least once,
|
293
183
|
# but a different number can be specified.
|
294
184
|
#
|
295
|
-
# page.has_css?('p#foo', :
|
185
|
+
# page.has_css?('p#foo', count: 4)
|
296
186
|
#
|
297
187
|
# This will check if the selector occurs exactly 4 times.
|
298
188
|
#
|
299
189
|
# It also accepts all options that {Capybara::Node::Finders#all} accepts,
|
300
190
|
# such as :text and :visible.
|
301
191
|
#
|
302
|
-
# page.has_css?('li', :
|
192
|
+
# page.has_css?('li', text: 'Horse', visible: true)
|
303
193
|
#
|
304
194
|
# @param [String] path A CSS selector
|
305
195
|
# @param options (see Capybara::Node::Finders#all)
|
306
196
|
# @option options [Integer] :count (nil) Number of times the selector should occur
|
307
197
|
# @return [Boolean] If the selector exists
|
308
198
|
#
|
309
|
-
def has_css?(path, options={})
|
310
|
-
has_selector?(:css, path, options)
|
199
|
+
def has_css?(path, options={}, &optional_filter_block)
|
200
|
+
has_selector?(:css, path, options, &optional_filter_block)
|
311
201
|
end
|
312
202
|
|
313
203
|
##
|
@@ -318,8 +208,8 @@ module Capybara
|
|
318
208
|
# @param (see Capybara::Node::Finders#has_css?)
|
319
209
|
# @return [Boolean]
|
320
210
|
#
|
321
|
-
def has_no_css?(path, options={})
|
322
|
-
has_no_selector?(:css, path, options)
|
211
|
+
def has_no_css?(path, options={}, &optional_filter_block)
|
212
|
+
has_no_selector?(:css, path, options, &optional_filter_block)
|
323
213
|
end
|
324
214
|
|
325
215
|
##
|
@@ -332,8 +222,9 @@ module Capybara
|
|
332
222
|
# @option options [String, Regexp] :href The value the href attribute must be
|
333
223
|
# @return [Boolean] Whether it exists
|
334
224
|
#
|
335
|
-
def has_link?(locator, options={})
|
336
|
-
|
225
|
+
def has_link?(locator=nil, options={}, &optional_filter_block)
|
226
|
+
locator, options = nil, locator if locator.is_a? Hash
|
227
|
+
has_selector?(:link, locator, options, &optional_filter_block)
|
337
228
|
end
|
338
229
|
|
339
230
|
##
|
@@ -344,8 +235,9 @@ module Capybara
|
|
344
235
|
# @param (see Capybara::Node::Finders#has_link?)
|
345
236
|
# @return [Boolean] Whether it doesn't exist
|
346
237
|
#
|
347
|
-
def has_no_link?(locator, options={})
|
348
|
-
|
238
|
+
def has_no_link?(locator=nil, options={}, &optional_filter_block)
|
239
|
+
locator, options = nil, locator if locator.is_a? Hash
|
240
|
+
has_no_selector?(:link, locator, options, &optional_filter_block)
|
349
241
|
end
|
350
242
|
|
351
243
|
##
|
@@ -356,8 +248,9 @@ module Capybara
|
|
356
248
|
# @param [String] locator The text, value or id of a button to check for
|
357
249
|
# @return [Boolean] Whether it exists
|
358
250
|
#
|
359
|
-
def has_button?(locator, options={})
|
360
|
-
|
251
|
+
def has_button?(locator=nil, options={}, &optional_filter_block)
|
252
|
+
locator, options = nil, locator if locator.is_a? Hash
|
253
|
+
has_selector?(:button, locator, options, &optional_filter_block)
|
361
254
|
end
|
362
255
|
|
363
256
|
##
|
@@ -368,8 +261,9 @@ module Capybara
|
|
368
261
|
# @param [String] locator The text, value or id of a button to check for
|
369
262
|
# @return [Boolean] Whether it doesn't exist
|
370
263
|
#
|
371
|
-
def has_no_button?(locator, options={})
|
372
|
-
|
264
|
+
def has_no_button?(locator=nil, options={}, &optional_filter_block)
|
265
|
+
locator, options = nil, locator if locator.is_a? Hash
|
266
|
+
has_no_selector?(:button, locator, options, &optional_filter_block)
|
373
267
|
end
|
374
268
|
|
375
269
|
##
|
@@ -381,11 +275,11 @@ module Capybara
|
|
381
275
|
# HTML5 email/url/etc. fields, it's possible to specify a :with
|
382
276
|
# option to specify the text the field should contain:
|
383
277
|
#
|
384
|
-
# page.has_field?('Name', :
|
278
|
+
# page.has_field?('Name', with: 'Jonas')
|
385
279
|
#
|
386
280
|
# It is also possible to filter by the field type attribute:
|
387
281
|
#
|
388
|
-
# page.has_field?('Email', :
|
282
|
+
# page.has_field?('Email', type: 'email')
|
389
283
|
#
|
390
284
|
# Note: 'textarea' and 'select' are valid type values, matching the associated tag names.
|
391
285
|
#
|
@@ -394,8 +288,9 @@ module Capybara
|
|
394
288
|
# @option options [String] :type The type attribute of the field
|
395
289
|
# @return [Boolean] Whether it exists
|
396
290
|
#
|
397
|
-
def has_field?(locator, options={})
|
398
|
-
|
291
|
+
def has_field?(locator=nil, options={}, &optional_filter_block)
|
292
|
+
locator, options = nil, locator if locator.is_a? Hash
|
293
|
+
has_selector?(:field, locator, options, &optional_filter_block)
|
399
294
|
end
|
400
295
|
|
401
296
|
##
|
@@ -408,8 +303,9 @@ module Capybara
|
|
408
303
|
# @option options [String] :type The type attribute of the field
|
409
304
|
# @return [Boolean] Whether it doesn't exist
|
410
305
|
#
|
411
|
-
def has_no_field?(locator, options={})
|
412
|
-
|
306
|
+
def has_no_field?(locator=nil, options={}, &optional_filter_block)
|
307
|
+
locator, options = nil, locator if locator.is_a? Hash
|
308
|
+
has_no_selector?(:field, locator, options, &optional_filter_block)
|
413
309
|
end
|
414
310
|
|
415
311
|
##
|
@@ -421,8 +317,9 @@ module Capybara
|
|
421
317
|
# @param [String] locator The label, name or id of a checked field
|
422
318
|
# @return [Boolean] Whether it exists
|
423
319
|
#
|
424
|
-
def has_checked_field?(locator, options={})
|
425
|
-
|
320
|
+
def has_checked_field?(locator=nil, options={}, &optional_filter_block)
|
321
|
+
locator, options = nil, locator if locator.is_a? Hash
|
322
|
+
has_selector?(:field, locator, options.merge(checked: true), &optional_filter_block)
|
426
323
|
end
|
427
324
|
|
428
325
|
##
|
@@ -434,8 +331,9 @@ module Capybara
|
|
434
331
|
# @param [String] locator The label, name or id of a checked field
|
435
332
|
# @return [Boolean] Whether it doesn't exist
|
436
333
|
#
|
437
|
-
def has_no_checked_field?(locator, options={})
|
438
|
-
|
334
|
+
def has_no_checked_field?(locator=nil, options={}, &optional_filter_block)
|
335
|
+
locator, options = nil, locator if locator.is_a? Hash
|
336
|
+
has_no_selector?(:field, locator, options.merge(checked: true))
|
439
337
|
end
|
440
338
|
|
441
339
|
##
|
@@ -447,8 +345,9 @@ module Capybara
|
|
447
345
|
# @param [String] locator The label, name or id of an unchecked field
|
448
346
|
# @return [Boolean] Whether it exists
|
449
347
|
#
|
450
|
-
def has_unchecked_field?(locator, options={})
|
451
|
-
|
348
|
+
def has_unchecked_field?(locator=nil, options={}, &optional_filter_block)
|
349
|
+
locator, options = nil, locator if locator.is_a? Hash
|
350
|
+
has_selector?(:field, locator, options.merge(unchecked: true), &optional_filter_block)
|
452
351
|
end
|
453
352
|
|
454
353
|
##
|
@@ -460,8 +359,9 @@ module Capybara
|
|
460
359
|
# @param [String] locator The label, name or id of an unchecked field
|
461
360
|
# @return [Boolean] Whether it doesn't exist
|
462
361
|
#
|
463
|
-
def has_no_unchecked_field?(locator, options={})
|
464
|
-
|
362
|
+
def has_no_unchecked_field?(locator=nil, options={}, &optional_filter_block)
|
363
|
+
locator, options = nil, locator if locator.is_a? Hash
|
364
|
+
has_no_selector?(:field, locator, options.merge(unchecked: true), &optional_filter_block)
|
465
365
|
end
|
466
366
|
|
467
367
|
##
|
@@ -471,20 +371,20 @@ module Capybara
|
|
471
371
|
#
|
472
372
|
# It can be specified which option should currently be selected:
|
473
373
|
#
|
474
|
-
# page.has_select?('Language', :
|
374
|
+
# page.has_select?('Language', selected: 'German')
|
475
375
|
#
|
476
376
|
# For multiple select boxes, several options may be specified:
|
477
377
|
#
|
478
|
-
# page.has_select?('Language', :
|
378
|
+
# page.has_select?('Language', selected: ['English', 'German'])
|
479
379
|
#
|
480
380
|
# It's also possible to check if the exact set of options exists for
|
481
381
|
# this select box:
|
482
382
|
#
|
483
|
-
# page.has_select?('Language', :
|
383
|
+
# page.has_select?('Language', options: ['English', 'German', 'Spanish'])
|
484
384
|
#
|
485
385
|
# You can also check for a partial set of options:
|
486
386
|
#
|
487
|
-
# page.has_select?('Language', :
|
387
|
+
# page.has_select?('Language', with_options: ['English', 'German'])
|
488
388
|
#
|
489
389
|
# @param [String] locator The label, name or id of a select box
|
490
390
|
# @option options [Array] :options Options which should be contained in this select box
|
@@ -492,8 +392,9 @@ module Capybara
|
|
492
392
|
# @option options [String, Array] :selected Options which should be selected
|
493
393
|
# @return [Boolean] Whether it exists
|
494
394
|
#
|
495
|
-
def has_select?(locator, options={})
|
496
|
-
|
395
|
+
def has_select?(locator=nil, options={}, &optional_filter_block)
|
396
|
+
locator, options = nil, locator if locator.is_a? Hash
|
397
|
+
has_selector?(:select, locator, options, &optional_filter_block)
|
497
398
|
end
|
498
399
|
|
499
400
|
##
|
@@ -504,8 +405,9 @@ module Capybara
|
|
504
405
|
# @param (see Capybara::Node::Matchers#has_select?)
|
505
406
|
# @return [Boolean] Whether it doesn't exist
|
506
407
|
#
|
507
|
-
def has_no_select?(locator, options={})
|
508
|
-
|
408
|
+
def has_no_select?(locator=nil, options={}, &optional_filter_block)
|
409
|
+
locator, options = nil, locator if locator.is_a? Hash
|
410
|
+
has_no_selector?(:select, locator, options, &optional_filter_block)
|
509
411
|
end
|
510
412
|
|
511
413
|
##
|
@@ -518,8 +420,9 @@ module Capybara
|
|
518
420
|
# @param [String] locator The id or caption of a table
|
519
421
|
# @return [Boolean] Whether it exist
|
520
422
|
#
|
521
|
-
def has_table?(locator, options={})
|
522
|
-
|
423
|
+
def has_table?(locator=nil, options={}, &optional_filter_block)
|
424
|
+
locator, options = nil, locator if locator.is_a? Hash
|
425
|
+
has_selector?(:table, locator, options, &optional_filter_block)
|
523
426
|
end
|
524
427
|
|
525
428
|
##
|
@@ -530,10 +433,122 @@ module Capybara
|
|
530
433
|
# @param (see Capybara::Node::Matchers#has_table?)
|
531
434
|
# @return [Boolean] Whether it doesn't exist
|
532
435
|
#
|
533
|
-
def has_no_table?(locator, options={})
|
534
|
-
|
436
|
+
def has_no_table?(locator=nil, options={}, &optional_filter_block)
|
437
|
+
locator, options = nil, locator if locator.is_a? Hash
|
438
|
+
has_no_selector?(:table, locator, options, &optional_filter_block)
|
439
|
+
end
|
440
|
+
|
441
|
+
##
|
442
|
+
#
|
443
|
+
# Asserts that the current_node matches a given selector
|
444
|
+
#
|
445
|
+
# node.assert_matches_selector('p#foo')
|
446
|
+
# node.assert_matches_selector(:xpath, '//p[@id="foo"]')
|
447
|
+
# node.assert_matches_selector(:foo)
|
448
|
+
#
|
449
|
+
# It also accepts all options that {Capybara::Node::Finders#all} accepts,
|
450
|
+
# such as :text and :visible.
|
451
|
+
#
|
452
|
+
# node.assert_matches_selector('li', text: 'Horse', visible: true)
|
453
|
+
#
|
454
|
+
# @param (see Capybara::Node::Finders#all)
|
455
|
+
# @raise [Capybara::ExpectationNotMet] If the selector does not match
|
456
|
+
#
|
457
|
+
def assert_matches_selector(*args, &optional_filter_block)
|
458
|
+
query = Capybara::Queries::MatchQuery.new(*args, &optional_filter_block)
|
459
|
+
synchronize(query.wait) do
|
460
|
+
result = query.resolve_for(self.query_scope)
|
461
|
+
unless result.include? self
|
462
|
+
raise Capybara::ExpectationNotMet, "Item does not match the provided selector"
|
463
|
+
end
|
464
|
+
end
|
465
|
+
return true
|
466
|
+
end
|
467
|
+
|
468
|
+
def assert_not_matches_selector(*args, &optional_filter_block)
|
469
|
+
query = Capybara::Queries::MatchQuery.new(*args, &optional_filter_block)
|
470
|
+
synchronize(query.wait) do
|
471
|
+
result = query.resolve_for(self.query_scope)
|
472
|
+
if result.include? self
|
473
|
+
raise Capybara::ExpectationNotMet, 'Item matched the provided selector'
|
474
|
+
end
|
475
|
+
end
|
476
|
+
return true
|
477
|
+
end
|
478
|
+
alias_method :refute_matches_selector, :assert_not_matches_selector
|
479
|
+
|
480
|
+
##
|
481
|
+
#
|
482
|
+
# Checks if the current node matches given selector
|
483
|
+
#
|
484
|
+
# @param (see Capybara::Node::Finders#has_selector?)
|
485
|
+
# @return [Boolean]
|
486
|
+
#
|
487
|
+
def matches_selector?(*args, &optional_filter_block)
|
488
|
+
assert_matches_selector(*args, &optional_filter_block)
|
489
|
+
rescue Capybara::ExpectationNotMet
|
490
|
+
return false
|
491
|
+
end
|
492
|
+
|
493
|
+
##
|
494
|
+
#
|
495
|
+
# Checks if the current node matches given XPath expression
|
496
|
+
#
|
497
|
+
# @param [String, XPath::Expression] xpath The XPath expression to match against the current code
|
498
|
+
# @return [Boolean]
|
499
|
+
#
|
500
|
+
def matches_xpath?(xpath, options={}, &optional_filter_block)
|
501
|
+
matches_selector?(:xpath, xpath, options, &optional_filter_block)
|
502
|
+
end
|
503
|
+
|
504
|
+
##
|
505
|
+
#
|
506
|
+
# Checks if the current node matches given CSS selector
|
507
|
+
#
|
508
|
+
# @param [String] css The CSS selector to match against the current code
|
509
|
+
# @return [Boolean]
|
510
|
+
#
|
511
|
+
def matches_css?(css, options={}, &optional_filter_block)
|
512
|
+
matches_selector?(:css, css, options, &optional_filter_block)
|
535
513
|
end
|
536
514
|
|
515
|
+
##
|
516
|
+
#
|
517
|
+
# Checks if the current node does not match given selector
|
518
|
+
# Usage is identical to Capybara::Node::Matchers#has_selector?
|
519
|
+
#
|
520
|
+
# @param (see Capybara::Node::Finders#has_selector?)
|
521
|
+
# @return [Boolean]
|
522
|
+
#
|
523
|
+
def not_matches_selector?(*args, &optional_filter_block)
|
524
|
+
assert_not_matches_selector(*args, &optional_filter_block)
|
525
|
+
rescue Capybara::ExpectationNotMet
|
526
|
+
return false
|
527
|
+
end
|
528
|
+
|
529
|
+
##
|
530
|
+
#
|
531
|
+
# Checks if the current node does not match given XPath expression
|
532
|
+
#
|
533
|
+
# @param [String, XPath::Expression] xpath The XPath expression to match against the current code
|
534
|
+
# @return [Boolean]
|
535
|
+
#
|
536
|
+
def not_matches_xpath?(xpath, options={}, &optional_filter_block)
|
537
|
+
not_matches_selector?(:xpath, xpath, options, &optional_filter_block)
|
538
|
+
end
|
539
|
+
|
540
|
+
##
|
541
|
+
#
|
542
|
+
# Checks if the current node does not match given CSS selector
|
543
|
+
#
|
544
|
+
# @param [String] css The CSS selector to match against the current code
|
545
|
+
# @return [Boolean]
|
546
|
+
#
|
547
|
+
def not_matches_css?(css, options={}, &optional_filter_block)
|
548
|
+
not_matches_selector?(:css, css, options, &optional_filter_block)
|
549
|
+
end
|
550
|
+
|
551
|
+
|
537
552
|
##
|
538
553
|
# Asserts that the page or current node has the given text content,
|
539
554
|
# ignoring any HTML tags.
|
@@ -629,6 +644,7 @@ module Capybara
|
|
629
644
|
def ==(other)
|
630
645
|
self.eql?(other) || (other.respond_to?(:base) && base == other.base)
|
631
646
|
end
|
647
|
+
|
632
648
|
end
|
633
649
|
end
|
634
650
|
end
|