capybara 2.14.0 → 2.14.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +12 -0
  3. data/README.md +1 -1
  4. data/lib/capybara.rb +16 -15
  5. data/lib/capybara/minitest.rb +92 -113
  6. data/lib/capybara/minitest/spec.rb +12 -37
  7. data/lib/capybara/node/matchers.rb +6 -5
  8. data/lib/capybara/queries/base_query.rb +4 -0
  9. data/lib/capybara/queries/current_path_query.rb +1 -0
  10. data/lib/capybara/queries/selector_query.rb +39 -12
  11. data/lib/capybara/queries/text_query.rb +1 -1
  12. data/lib/capybara/queries/title_query.rb +1 -0
  13. data/lib/capybara/rack_test/driver.rb +1 -0
  14. data/lib/capybara/rspec/matcher_proxies.rb +10 -6
  15. data/lib/capybara/rspec/matchers.rb +29 -0
  16. data/lib/capybara/selector.rb +61 -50
  17. data/lib/capybara/selector/expression_filter.rb +40 -0
  18. data/lib/capybara/selector/filter_set.rb +22 -3
  19. data/lib/capybara/selector/selector.rb +33 -12
  20. data/lib/capybara/selenium/driver.rb +130 -25
  21. data/lib/capybara/selenium/node.rb +3 -3
  22. data/lib/capybara/session/config.rb +29 -23
  23. data/lib/capybara/session/matchers.rb +3 -0
  24. data/lib/capybara/spec/session/accept_alert_spec.rb +1 -1
  25. data/lib/capybara/spec/session/all_spec.rb +2 -1
  26. data/lib/capybara/spec/session/assert_selector.rb +1 -1
  27. data/lib/capybara/spec/session/assert_title.rb +22 -9
  28. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  29. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -1
  30. data/lib/capybara/spec/session/find_spec.rb +3 -2
  31. data/lib/capybara/spec/session/first_spec.rb +10 -5
  32. data/lib/capybara/spec/session/has_css_spec.rb +11 -0
  33. data/lib/capybara/spec/session/has_current_path_spec.rb +5 -3
  34. data/lib/capybara/spec/session/has_select_spec.rb +62 -4
  35. data/lib/capybara/spec/session/has_text_spec.rb +5 -3
  36. data/lib/capybara/spec/session/has_title_spec.rb +4 -2
  37. data/lib/capybara/spec/session/has_xpath_spec.rb +5 -3
  38. data/lib/capybara/spec/session/node_spec.rb +8 -4
  39. data/lib/capybara/spec/session/window/become_closed_spec.rb +4 -4
  40. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +4 -4
  41. data/lib/capybara/spec/spec_helper.rb +1 -1
  42. data/lib/capybara/spec/views/form.erb +22 -1
  43. data/lib/capybara/spec/views/with_html.erb +1 -1
  44. data/lib/capybara/version.rb +1 -1
  45. data/spec/capybara_spec.rb +16 -0
  46. data/spec/filter_set_spec.rb +28 -0
  47. data/spec/minitest_spec_spec.rb +4 -4
  48. data/spec/per_session_config_spec.rb +4 -4
  49. data/spec/result_spec.rb +20 -0
  50. data/spec/selector_spec.rb +2 -1
  51. data/spec/selenium_spec_chrome.rb +12 -1
  52. data/spec/selenium_spec_firefox.rb +2 -1
  53. data/spec/selenium_spec_marionette.rb +4 -3
  54. data/spec/shared_selenium_session.rb +14 -7
  55. metadata +18 -2
@@ -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