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
@@ -22,12 +22,12 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
22
22
  Capybara.using_wait_time 2 do
23
23
  button=@session.find(:css, '#openWindowWithLongerTimeout')
24
24
  expect do
25
- @session.window_opened_by(wait: 0.8) do
25
+ @session.window_opened_by(wait: 0.3) do
26
26
  button.click
27
27
  end
28
28
  end.to raise_error(Capybara::WindowError, zero_windows_message)
29
29
  end
30
- @session.document.synchronize(2, errors: [Capybara::CapybaraError]) do
30
+ @session.document.synchronize(5, errors: [Capybara::CapybaraError]) do
31
31
  raise Capybara::CapybaraError if @session.windows.size != 2
32
32
  end
33
33
  end
@@ -46,7 +46,7 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
46
46
  context 'without :wait option' do
47
47
  it 'should raise error if default_max_wait_time is less than timeout' do
48
48
  button = @session.find(:css, '#openWindowWithTimeout')
49
- Capybara.using_wait_time 0.4 do
49
+ Capybara.using_wait_time 0.1 do
50
50
  expect do
51
51
  @session.window_opened_by do
52
52
  button.click
@@ -60,7 +60,7 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
60
60
 
61
61
  it 'should find window if default_max_wait_time is more than timeout' do
62
62
  button = @session.find(:css, '#openWindowWithTimeout')
63
- Capybara.using_wait_time 1.5 do
63
+ Capybara.using_wait_time 5 do
64
64
  window = @session.window_opened_by do
65
65
  button.click
66
66
  end
@@ -117,7 +117,7 @@ module Capybara
117
117
  end
118
118
 
119
119
  def marionette?(session)
120
- session.driver.respond_to?(:marionette?) && session.driver.marionette?
120
+ session.driver.respond_to?(:marionette?, true) && session.driver.send(:marionette?)
121
121
  end
122
122
 
123
123
  def rspec2?
@@ -235,6 +235,17 @@ New line after and before textarea tag
235
235
  </select>
236
236
  </p>
237
237
 
238
+ <!-- invisible multiselect and options -->
239
+ <p style="display: none">
240
+ <label for="form_dessert">Dessert</label>
241
+ <select name="form[dessert]" id="form_dessert" multiple="multiple">
242
+ <option selected="selected">Pudding</option>
243
+ <option>Lava cake</option>
244
+ <option selected="selected">Tiramisu</option>
245
+ <option>Panna cotta</option>
246
+ </select>
247
+ </p>
248
+
238
249
  <!-- visible select with invisible selected option (which some browsers may treat as visible) -->
239
250
  <p>
240
251
  <label for="form_sorbet">Sorbet</label>
@@ -245,6 +256,17 @@ New line after and before textarea tag
245
256
  </select>
246
257
  </p>
247
258
 
259
+ <!-- visible multiselect with invisible selected options (which some browsers may treat as visible) -->
260
+ <p>
261
+ <label for="form_cake">Cake</label>
262
+ <select name="form[cake]" id="form_cake" multiple="multiple">
263
+ <option>Butter Cake</option>
264
+ <option selected="selected" style="display: none">Chocolate Cake</option>
265
+ <option>Strawberry Cake</option>
266
+ <option selected="selected" style="display: none">Sponge Cake</option>
267
+ </select>
268
+ </p>
269
+
248
270
  <p>
249
271
  <span>First address<span>
250
272
  <label for='address1_street'>Street</label>
@@ -593,4 +615,3 @@ New line after and before textarea tag
593
615
  <label for="asterisk_input">With Asterisk<abbr title="required">*</abbr></label>
594
616
  <input id="asterisk_input" type="number"value="2016"/>
595
617
  </p>
596
-
@@ -13,7 +13,7 @@
13
13
  <span class="number">42</span>
14
14
  <span>Other span</span>
15
15
 
16
- <p class="para" id="first">
16
+ <p class="para" id="first" data-random="abc\def">
17
17
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
18
18
  tempor incididunt ut <a href="/with_simple_html" title="awesome title" class="simple">labore</a>
19
19
  et dolore magna aliqua. Ut enim ad minim veniam,
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Capybara
3
- VERSION = '2.14.0'
3
+ VERSION = '2.14.1'
4
4
  end
@@ -79,6 +79,22 @@ RSpec.describe Capybara do
79
79
  Capybara.server(&server)
80
80
  expect(Capybara.server).to eq(server)
81
81
  end
82
+
83
+ it "should have :webrick registered" do
84
+ require 'rack/handler/webrick'
85
+ mock_app = double('app')
86
+ Capybara.server = :webrick
87
+ expect(Rack::Handler::WEBrick).to receive(:run)
88
+ Capybara.server.call(mock_app, 8000)
89
+ end
90
+
91
+ it "should have :puma registered" do
92
+ require 'rack/handler/puma'
93
+ mock_app = double('app')
94
+ Capybara.server = :puma
95
+ expect(Rack::Handler::Puma).to receive(:run)
96
+ Capybara.server.call(mock_app, 8000)
97
+ end
82
98
  end
83
99
 
84
100
  describe 'app_host' do
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Capybara::Selector::FilterSet do
5
+ after do
6
+ Capybara::Selector::FilterSet.remove(:test)
7
+ end
8
+
9
+ it "allows node filters" do
10
+ fs = Capybara::Selector::FilterSet.add(:test) do
11
+ filter(:node_test, :boolean) { |node, value| true }
12
+ expression_filter(:expression_test, :boolean) { |expr, value| true }
13
+ end
14
+
15
+ expect(fs.node_filters.keys).to include(:node_test)
16
+ expect(fs.node_filters.keys).not_to include(:expression_test)
17
+ end
18
+
19
+ it "allows expression filters" do
20
+ fs = Capybara::Selector::FilterSet.add(:test) do
21
+ filter(:node_test, :boolean) { |node, value| true }
22
+ expression_filter(:expression_test, :boolean) { |expr, value| true }
23
+ end
24
+
25
+ expect(fs.expression_filters.keys).to include(:expression_test)
26
+ expect(fs.expression_filters.keys).not_to include(:node_test)
27
+ end
28
+ end
@@ -37,10 +37,10 @@ class MinitestSpecTest < Minitest::Spec
37
37
  page.must_have_xpath('.//input[@id="customer_email"]')
38
38
  page.wont_have_xpath('.//select[@id="not_form_title"]')
39
39
  page.wont_have_xpath('.//input[@id="customer_email"]') { |el| el[:id] == "not_customer_email" }
40
- el = find(:select, 'form_title')
41
- el.must_have_xpath('.//option[@class="title"]')
42
- el.must_have_xpath('.//option', count: 1) { |el| el[:class] != 'title' && !el.disabled?}
43
- el.wont_have_xpath('.//input[@id="customer_email"]')
40
+ select = find(:select, 'form_title')
41
+ select.must_have_xpath('.//option[@class="title"]')
42
+ select.must_have_xpath('.//option', count: 1) { |option| option[:class] != 'title' && !option.disabled?}
43
+ select.wont_have_xpath('.//input[@id="customer_email"]')
44
44
  end
45
45
 
46
46
  it "support css expectations" do
@@ -40,12 +40,12 @@ RSpec.describe Capybara::SessionConfig do
40
40
  it "doesn't allow session config when false" do
41
41
  Capybara.threadsafe = false
42
42
  session = Capybara::Session.new(:rack_test, TestApp)
43
- expect { session.config.default_selector = :title }.to raise_error /Per session settings are only supported when Capybara.threadsafe == true/
43
+ expect { session.config.default_selector = :title }.to raise_error(/Per session settings are only supported when Capybara.threadsafe == true/)
44
44
  expect do
45
45
  session.configure do |config|
46
46
  config.exact = true
47
47
  end
48
- end.to raise_error /Session configuration is only supported when Capybara.threadsafe == true/
48
+ end.to raise_error(/Session configuration is only supported when Capybara.threadsafe == true/)
49
49
  end
50
50
 
51
51
  it "uses the config from the session" do
@@ -60,8 +60,8 @@ RSpec.describe Capybara::SessionConfig do
60
60
  it "won't change threadsafe once a session is created" do
61
61
  Capybara.threadsafe = true
62
62
  Capybara.threadsafe = false
63
- session = Capybara::Session.new(:rack_test, TestApp)
64
- expect { Capybara.threadsafe = true }.to raise_error /Threadsafe setting cannot be changed once a session is created/
63
+ Capybara::Session.new(:rack_test, TestApp)
64
+ expect { Capybara.threadsafe = true }.to raise_error(/Threadsafe setting cannot be changed once a session is created/)
65
65
  end
66
66
  end
67
67
  end
@@ -71,6 +71,26 @@ RSpec.describe Capybara::Result do
71
71
  expect(result[-1].text).to eq 'Delta'
72
72
  end
73
73
 
74
+ it 'works with filter blocks' do
75
+ result = string.all('//li') { |node| node.text == 'Alpha' }
76
+ expect(result.size).to eq 1
77
+ end
78
+
79
+ it 'should catch invalid element errors during filtering' do
80
+ allow_any_instance_of(Capybara::Node::Simple).to receive(:text).and_raise(StandardError)
81
+ allow_any_instance_of(Capybara::Node::Simple).to receive(:session).and_return(double("session", driver: double("driver", invalid_element_errors: [StandardError] )))
82
+ result = string.all('//li', text: 'Alpha')
83
+ expect(result.size).to eq 0
84
+ end
85
+
86
+ it 'should return non-invalid element errors during filtering' do
87
+ allow_any_instance_of(Capybara::Node::Simple).to receive(:text).and_raise(StandardError)
88
+ allow_any_instance_of(Capybara::Node::Simple).to receive(:session).and_return(double("session", driver: double("driver", invalid_element_errors: [ArgumentError] )))
89
+ expect do
90
+ string.all('//li', text: 'Alpha').to_a
91
+ end.to raise_error(StandardError)
92
+ end
93
+
74
94
  #Not a great test but it indirectly tests what is needed
75
95
  it "should evaluate filters lazily" do
76
96
  skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java'
@@ -28,7 +28,7 @@ RSpec.describe Capybara do
28
28
  <input type="hidden" id="hidden_field" value="this is hidden"/>
29
29
  <a href="#">link</a>
30
30
  <fieldset></fieldset>
31
- <select>
31
+ <select id="select">
32
32
  <option value="a">A</option>
33
33
  <option value="b" disabled>B</option>
34
34
  <option value="c" selected>C</option>
@@ -177,6 +177,7 @@ RSpec.describe Capybara do
177
177
 
178
178
  it "finds by type" do
179
179
  expect(string.find(:field, type: 'file')[:id]).to eq 'file'
180
+ expect(string.find(:field, type: 'select')[:id]).to eq 'select'
180
181
  end
181
182
  end
182
183
 
@@ -5,11 +5,19 @@ require 'shared_selenium_session'
5
5
 
6
6
  Capybara.register_driver :selenium_chrome do |app|
7
7
  args = ENV['TRAVIS'] ? ['no-sandbox' ] : []
8
+ if ENV['CAPYBARA_CHROME_HEADLESS']
9
+ args << 'headless'
10
+ Selenium::WebDriver::Chrome.path='/usr/bin/google-chrome-beta' if ENV['TRAVIS']
11
+ end
8
12
  Capybara::Selenium::Driver.new(app, :browser => :chrome, :args => args)
9
13
  end
10
14
 
11
15
  Capybara.register_driver :selenium_chrome_clear_storage do |app|
12
16
  args = ENV['TRAVIS'] ? ['no-sandbox' ] : []
17
+ if ENV['CAPYBARA_CHROME_HEADLESS']
18
+ args << 'headless'
19
+ Selenium::WebDriver::Chrome.path='/usr/bin/google-chrome-beta' if ENV['TRAVIS']
20
+ end
13
21
  Capybara::Selenium::Driver.new(app, :browser => :chrome,
14
22
  :args => args,
15
23
  clear_local_storage: true,
@@ -21,11 +29,14 @@ module TestSessions
21
29
  end
22
30
 
23
31
  skipped_tests = [:response_headers, :status_code, :trigger]
24
- skipped_tests << :windows if ENV['TRAVIS'] && !ENV['WINDOW_TEST']
32
+ skipped_tests << :windows if ENV['TRAVIS'] && ENV['SKIP_WINDOW']
33
+ # skip window tests when headless for now - closing a window not supported by chromedriver/chrome
34
+ skipped_tests << :windows if ENV['TRAVIS'] && ENV['CAPYBARA_CHROME_HEADLESS']
25
35
 
26
36
  Capybara::SpecHelper.run_specs TestSessions::Chrome, "selenium_chrome", capybara_skip: skipped_tests
27
37
 
28
38
  RSpec.describe "Capybara::Session with chrome" do
39
+ include Capybara::SpecHelper
29
40
  include_examples "Capybara::Session", TestSessions::Chrome, :selenium_chrome
30
41
 
31
42
  context "storage" do
@@ -31,11 +31,12 @@ skipped_tests = [
31
31
  :status_code,
32
32
  :trigger
33
33
  ]
34
- skipped_tests << :windows if ENV['TRAVIS'] && !ENV['WINDOW_TEST']
34
+ skipped_tests << :windows if ENV['TRAVIS'] && ENV['SKIP_WINDOW']
35
35
 
36
36
  Capybara::SpecHelper.run_specs TestSessions::Selenium, "selenium", capybara_skip: skipped_tests
37
37
 
38
38
  RSpec.describe "Capybara::Session with legacy firefox" do
39
+ include Capybara::SpecHelper
39
40
  include_examples "Capybara::Session", TestSessions::Selenium, :selenium_firefox
40
41
  include_examples Capybara::RSpecMatchers, TestSessions::Selenium, :selenium_firefox
41
42
 
@@ -8,7 +8,7 @@ Capybara.register_driver :selenium_marionette do |app|
8
8
  Capybara::Selenium::Driver.new(
9
9
  app,
10
10
  browser: :firefox,
11
- desired_capabilities: Selenium::WebDriver::Remote::Capabilities.firefox(marionette: true)
11
+ desired_capabilities: {marionette: true}
12
12
  )
13
13
  end
14
14
 
@@ -16,7 +16,7 @@ Capybara.register_driver :selenium_marionette_clear_storage do |app|
16
16
  Capybara::Selenium::Driver.new(
17
17
  app,
18
18
  browser: :firefox,
19
- desired_capabilities: Selenium::WebDriver::Remote::Capabilities.firefox(marionette: true),
19
+ desired_capabilities: {marionette: true},
20
20
  clear_local_storage: true,
21
21
  clear_session_storage: true
22
22
  )
@@ -31,11 +31,12 @@ skipped_tests = [
31
31
  :status_code,
32
32
  :trigger
33
33
  ]
34
- skipped_tests << :windows if ENV['TRAVIS'] && !ENV['WINDOW_TEST']
34
+ skipped_tests << :windows if ENV['TRAVIS'] && ENV['SKIP_WINDOW']
35
35
 
36
36
  Capybara::SpecHelper.run_specs TestSessions::SeleniumMarionette, "selenium", capybara_skip: skipped_tests
37
37
 
38
38
  RSpec.describe "Capybara::Session with firefox" do
39
+ include Capybara::SpecHelper
39
40
  include_examples "Capybara::Session", TestSessions::SeleniumMarionette, :selenium_marionette
40
41
  include_examples Capybara::RSpecMatchers, TestSessions::SeleniumMarionette, :selenium_marionette
41
42
  end
@@ -34,6 +34,8 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
34
34
  before do
35
35
  @current_dir = Dir.getwd
36
36
  Dir.chdir(File.join(File.dirname(__FILE__), '..'))
37
+ @env = { 'SELENIUM_BROWSER' => @session.driver.options[:browser].to_s }
38
+ @env['LEGACY_FIREFOX'] = 'TRUE' if mode == :selenium_firefox
37
39
  end
38
40
 
39
41
  after do
@@ -41,22 +43,19 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
41
43
  end
42
44
 
43
45
  it "should have return code 1 when running selenium_driver_rspec_failure.rb" do
44
- env = { 'SELENIUM_BROWSER' => @session.driver.options[:browser].to_s,
45
- 'LEGACY_FIREFOX' => (mode == :selenium_firefox ? 'TRUE' : nil) }
46
- system(env, 'rspec spec/fixtures/selenium_driver_rspec_failure.rb', out: File::NULL, err: File::NULL)
46
+ system(@env, 'rspec spec/fixtures/selenium_driver_rspec_failure.rb', out: File::NULL, err: File::NULL)
47
47
  expect($?.exitstatus).to eq(1)
48
48
  end
49
49
 
50
50
  it "should have return code 0 when running selenium_driver_rspec_success.rb" do
51
- env = { 'SELENIUM_BROWSER' => @session.driver.options[:browser].to_s,
52
- 'LEGACY_FIREFOX' => (mode == :selenium_firefox ? 'TRUE' : nil) }
53
- system(env, 'rspec spec/fixtures/selenium_driver_rspec_success.rb', out: File::NULL, err: File::NULL)
51
+ system(@env, 'rspec spec/fixtures/selenium_driver_rspec_success.rb', out: File::NULL, err: File::NULL)
54
52
  expect($?.exitstatus).to eq(0)
55
53
  end
56
54
  end
57
55
 
58
56
  describe "#accept_alert" do
59
57
  it "supports a blockless mode" do
58
+ skip "Headless Chrome doesn't support blockless modal methods" if @session.driver.send(:headless_chrome?)
60
59
  @session.visit('/with_js')
61
60
  @session.click_link('Open alert')
62
61
  @session.accept_alert
@@ -102,7 +101,7 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
102
101
 
103
102
  context "#fill_in with { clear: Array } fill_options" do
104
103
  it 'should pass the array through to the element' do
105
- pending "selenium-webdriver/geckodriver doesn't support complex sets of characters" if @session.driver.marionette?
104
+ pending "selenium-webdriver/geckodriver doesn't support complex sets of characters" if marionette?(@session)
106
105
  #this is mainly for use with [[:control, 'a'], :backspace] - however since that is platform dependant I'm testing with something less useful
107
106
  @session.visit('/form')
108
107
  @session.fill_in('form_first_name', with: 'Harry',
@@ -120,6 +119,14 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
120
119
  end
121
120
  end
122
121
 
122
+ describe "all with disappearing elements" do
123
+ it "ignores stale elements in results" do
124
+ @session.visit('/path')
125
+ elements = @session.all(:link) { |node| raise Selenium::WebDriver::Error::StaleElementReferenceError }
126
+ expect(elements.size).to eq 0
127
+ end
128
+ end
129
+
123
130
  describe "#evaluate_script" do
124
131
  it "can return an element" do
125
132
  @session.visit('/form')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.14.0
4
+ version: 2.14.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Walpole
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain:
12
12
  - gem-public_cert.pem
13
- date: 2017-05-01 00:00:00.000000000 Z
13
+ date: 2017-06-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
@@ -228,6 +228,20 @@ dependencies:
228
228
  - - ">="
229
229
  - !ruby/object:Gem::Version
230
230
  version: '0'
231
+ - !ruby/object:Gem::Dependency
232
+ name: puma
233
+ requirement: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ type: :development
239
+ prerelease: false
240
+ version_requirements: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ version: '0'
231
245
  - !ruby/object:Gem::Dependency
232
246
  name: pry
233
247
  requirement: !ruby/object:Gem::Requirement
@@ -309,6 +323,7 @@ files:
309
323
  - lib/capybara/rspec/matchers.rb
310
324
  - lib/capybara/selector.rb
311
325
  - lib/capybara/selector/css.rb
326
+ - lib/capybara/selector/expression_filter.rb
312
327
  - lib/capybara/selector/filter.rb
313
328
  - lib/capybara/selector/filter_set.rb
314
329
  - lib/capybara/selector/selector.rb
@@ -433,6 +448,7 @@ files:
433
448
  - spec/basic_node_spec.rb
434
449
  - spec/capybara_spec.rb
435
450
  - spec/dsl_spec.rb
451
+ - spec/filter_set_spec.rb
436
452
  - spec/fixtures/capybara.csv
437
453
  - spec/fixtures/selenium_driver_rspec_failure.rb
438
454
  - spec/fixtures/selenium_driver_rspec_success.rb