capybara 2.10.1 → 2.11.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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +22 -0
  3. data/README.md +48 -29
  4. data/lib/capybara/node/actions.rb +39 -48
  5. data/lib/capybara/node/document.rb +4 -0
  6. data/lib/capybara/node/document_matchers.rb +13 -14
  7. data/lib/capybara/node/element.rb +21 -0
  8. data/lib/capybara/node/finders.rb +3 -3
  9. data/lib/capybara/node/matchers.rb +38 -31
  10. data/lib/capybara/node/simple.rb +3 -0
  11. data/lib/capybara/queries/selector_query.rb +4 -2
  12. data/lib/capybara/rack_test/node.rb +1 -1
  13. data/lib/capybara/result.rb +3 -1
  14. data/lib/capybara/rspec/matchers.rb +53 -95
  15. data/lib/capybara/selector/selector.rb +10 -5
  16. data/lib/capybara/selector.rb +7 -7
  17. data/lib/capybara/selenium/driver.rb +34 -7
  18. data/lib/capybara/selenium/node.rb +5 -1
  19. data/lib/capybara/session/matchers.rb +12 -14
  20. data/lib/capybara/session.rb +30 -29
  21. data/lib/capybara/spec/public/test.js +4 -0
  22. data/lib/capybara/spec/session/accept_alert_spec.rb +1 -1
  23. data/lib/capybara/spec/session/attach_file_spec.rb +1 -1
  24. data/lib/capybara/spec/session/check_spec.rb +8 -0
  25. data/lib/capybara/spec/session/choose_spec.rb +5 -0
  26. data/lib/capybara/spec/session/click_link_or_button_spec.rb +5 -0
  27. data/lib/capybara/spec/session/click_link_spec.rb +5 -0
  28. data/lib/capybara/spec/session/element/assert_match_selector.rb +5 -0
  29. data/lib/capybara/spec/session/element/match_css_spec.rb +6 -0
  30. data/lib/capybara/spec/session/element/matches_selector_spec.rb +2 -0
  31. data/lib/capybara/spec/session/fill_in_spec.rb +5 -0
  32. data/lib/capybara/spec/session/find_spec.rb +1 -1
  33. data/lib/capybara/spec/session/first_spec.rb +10 -0
  34. data/lib/capybara/spec/session/has_selector_spec.rb +11 -0
  35. data/lib/capybara/spec/session/node_spec.rb +12 -1
  36. data/lib/capybara/spec/session/text_spec.rb +3 -4
  37. data/lib/capybara/spec/test_app.rb +10 -1
  38. data/lib/capybara/spec/views/with_js.erb +3 -1
  39. data/lib/capybara/version.rb +1 -1
  40. data/lib/capybara/window.rb +18 -2
  41. data/lib/capybara.rb +8 -9
  42. data/spec/basic_node_spec.rb +1 -1
  43. data/spec/capybara_spec.rb +4 -1
  44. data/spec/fixtures/selenium_driver_rspec_failure.rb +4 -1
  45. data/spec/fixtures/selenium_driver_rspec_success.rb +4 -1
  46. data/spec/result_spec.rb +28 -2
  47. data/spec/rspec/{matchers_spec.rb → shared_spec_matchers.rb} +4 -3
  48. data/spec/selector_spec.rb +1 -1
  49. data/spec/selenium_spec_chrome.rb +36 -5
  50. data/spec/selenium_spec_firefox.rb +67 -0
  51. data/spec/selenium_spec_marionette.rb +114 -0
  52. data/spec/shared_selenium_session.rb +6 -4
  53. metadata +15 -8
  54. data/spec/selenium_firefox_spec.rb +0 -44
data/spec/result_spec.rb CHANGED
@@ -66,8 +66,8 @@ RSpec.describe Capybara::Result do
66
66
 
67
67
  it 'supports all modes of []' do
68
68
  expect(result[1].text).to eq 'Beta'
69
- expect(result[0,2].map &:text).to eq ['Alpha', 'Beta']
70
- expect(result[1..3].map &:text).to eq ['Beta', 'Gamma', 'Delta']
69
+ expect(result[0,2].map(&:text)).to eq ['Alpha', 'Beta']
70
+ expect(result[1..3].map(&:text)).to eq ['Beta', 'Gamma', 'Delta']
71
71
  expect(result[-1].text).to eq 'Delta'
72
72
  end
73
73
 
@@ -92,4 +92,30 @@ RSpec.describe Capybara::Result do
92
92
  result.to_a
93
93
  expect(result.instance_variable_get('@result_cache').size).to eq 4
94
94
  end
95
+
96
+ context '#each' do
97
+ it 'lazily evaluates' do
98
+ skip 'JRuby has an issue with lazy enumerator next evaluation' if RUBY_PLATFORM == 'java'
99
+ results=[]
100
+ result.each do |el|
101
+ results << el
102
+ expect(result.instance_variable_get('@result_cache').size).to eq results.size
103
+ end
104
+
105
+ expect(results.size).to eq 4
106
+ end
107
+
108
+ context 'without a block' do
109
+ it 'returns an iterator' do
110
+ expect(result.each).to be_a(Enumerator)
111
+ end
112
+
113
+ it 'lazily evaluates' do
114
+ skip 'JRuby has an issue with lazy enumerator next evaluation' if RUBY_PLATFORM == 'java'
115
+ result.each.with_index do |el, idx|
116
+ expect(result.instance_variable_get('@result_cache').size).to eq(idx+1) # 0 indexing
117
+ end
118
+ end
119
+ end
120
+ end
95
121
  end
@@ -3,7 +3,8 @@ require 'spec_helper'
3
3
  require 'capybara/dsl'
4
4
  require 'capybara/rspec/matchers'
5
5
 
6
- RSpec.describe Capybara::RSpecMatchers do
6
+ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
7
+
7
8
  include Capybara::DSL
8
9
  include Capybara::RSpecMatchers
9
10
 
@@ -541,7 +542,7 @@ RSpec.describe Capybara::RSpecMatchers do
541
542
 
542
543
  context 'with wait' do
543
544
  before(:each) do
544
- @session = TestSessions::Selenium
545
+ @session = session
545
546
  @session.visit('/with_js')
546
547
  end
547
548
 
@@ -586,7 +587,7 @@ RSpec.describe Capybara::RSpecMatchers do
586
587
 
587
588
  context 'with wait' do
588
589
  before(:each) do
589
- @session = TestSessions::Selenium
590
+ @session = session
590
591
  @session.visit('/with_js')
591
592
  end
592
593
 
@@ -102,7 +102,7 @@ RSpec.describe Capybara do
102
102
  table: ".//table"
103
103
  }
104
104
  selectors.each do |selector, xpath|
105
- results = string.all(selector,nil).to_a.map &:native
105
+ results = string.all(selector,nil).to_a.map(&:native)
106
106
  expect(results.size).to be > 0
107
107
  expect(results).to eq string.all(:xpath, xpath).to_a.map(&:native)
108
108
  end
@@ -8,16 +8,47 @@ Capybara.register_driver :selenium_chrome do |app|
8
8
  Capybara::Selenium::Driver.new(app, :browser => :chrome, :args => args)
9
9
  end
10
10
 
11
+ Capybara.register_driver :selenium_chrome_clear_storage do |app|
12
+ args = ENV['TRAVIS'] ? ['no-sandbox' ] : []
13
+ Capybara::Selenium::Driver.new(app, :browser => :chrome,
14
+ :args => args,
15
+ clear_local_storage: true,
16
+ clear_session_storage: true)
17
+ end
18
+
11
19
  module TestSessions
12
20
  Chrome = Capybara::Session.new(:selenium_chrome, TestApp)
13
21
  end
14
22
 
15
- Capybara::SpecHelper.run_specs TestSessions::Chrome, "selenium_chrome", capybara_skip: [
16
- :response_headers,
17
- :status_code,
18
- :trigger
19
- ] unless ENV['TRAVIS'] && (RUBY_PLATFORM == 'java')
23
+ skipped_tests = [:response_headers, :status_code, :trigger]
24
+ skipped_tests << :windows if ENV['TRAVIS'] && !ENV['WINDOW_TEST']
25
+
26
+ Capybara::SpecHelper.run_specs TestSessions::Chrome, "selenium_chrome", capybara_skip: skipped_tests
20
27
 
21
28
  RSpec.describe "Capybara::Session with chrome" do
22
29
  include_examples "Capybara::Session", TestSessions::Chrome, :selenium_chrome
30
+
31
+ context "storage" do
32
+ describe "#reset!" do
33
+ it "does not clear either storage by default" do
34
+ @session = TestSessions::Chrome
35
+ @session.visit('/with_js')
36
+ @session.find(:css, '#set-storage').click
37
+ @session.reset!
38
+ @session.visit('/with_js')
39
+ expect(@session.driver.browser.local_storage.keys).not_to be_empty
40
+ expect(@session.driver.browser.session_storage.keys).not_to be_empty
41
+ end
42
+
43
+ it "clears storage when set" do
44
+ @session = Capybara::Session.new(:selenium_chrome_clear_storage, TestApp)
45
+ @session.visit('/with_js')
46
+ @session.find(:css, '#set-storage').click
47
+ @session.reset!
48
+ @session.visit('/with_js')
49
+ expect(@session.driver.browser.local_storage.keys).to be_empty
50
+ expect(@session.driver.browser.session_storage.keys).to be_empty
51
+ end
52
+ end
53
+ end
23
54
  end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require "selenium-webdriver"
4
+ require 'shared_selenium_session'
5
+ require 'rspec/shared_spec_matchers'
6
+
7
+ Capybara.register_driver :selenium_firefox do |app|
8
+ Capybara::Selenium::Driver.new(
9
+ app,
10
+ browser: :firefox,
11
+ desired_capabilities: Selenium::WebDriver::Remote::Capabilities.firefox(marionette: false)
12
+ )
13
+ end
14
+
15
+ Capybara.register_driver :selenium_firefox_cant_clear_storage do |app|
16
+ Capybara::Selenium::Driver.new(
17
+ app,
18
+ browser: :firefox,
19
+ desired_capabilities: Selenium::WebDriver::Remote::Capabilities.firefox(marionette: false),
20
+ clear_local_storage: true,
21
+ clear_session_storage: true
22
+ )
23
+ end
24
+
25
+ module TestSessions
26
+ Selenium = Capybara::Session.new(:selenium_firefox, TestApp)
27
+ end
28
+
29
+ skipped_tests = [
30
+ :response_headers,
31
+ :status_code,
32
+ :trigger
33
+ ]
34
+ skipped_tests << :windows if ENV['TRAVIS'] && !ENV['WINDOW_TEST']
35
+
36
+ Capybara::SpecHelper.run_specs TestSessions::Selenium, "selenium", capybara_skip: skipped_tests
37
+
38
+ RSpec.describe "Capybara::Session with legacy firefox" do
39
+ include_examples "Capybara::Session", TestSessions::Selenium, :selenium_firefox
40
+ include_examples Capybara::RSpecMatchers, TestSessions::Selenium, :selenium_firefox
41
+
42
+ context "storage" do
43
+ it "warns storage clearing isn't available" do
44
+ @session = Capybara::Session.new(:selenium_firefox_cant_clear_storage, TestApp)
45
+ expect_any_instance_of(Kernel).to receive(:warn).with('sessionStorage clear requested but is not available for this driver')
46
+ expect_any_instance_of(Kernel).to receive(:warn).with('localStorage clear requested but is not available for this driver')
47
+ @session.visit('/')
48
+ @session.reset!
49
+ end
50
+ end
51
+ end
52
+
53
+ RSpec.describe Capybara::Selenium::Driver do
54
+ before do
55
+ @driver = Capybara::Selenium::Driver.new(TestApp, browser: :firefox, desired_capabilities: Selenium::WebDriver::Remote::Capabilities.firefox(marionette: false))
56
+ end
57
+
58
+ describe '#quit' do
59
+ it "should reset browser when quit" do
60
+ expect(@driver.browser).to be
61
+ @driver.quit
62
+ #access instance variable directly so we don't create a new browser instance
63
+ expect(@driver.instance_variable_get(:@browser)).to be_nil
64
+ end
65
+ end
66
+ end
67
+
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require "selenium-webdriver"
4
+ require 'shared_selenium_session'
5
+ require 'rspec/shared_spec_matchers'
6
+
7
+ Capybara.register_driver :selenium_marionette do |app|
8
+ Capybara::Selenium::Driver.new(
9
+ app,
10
+ browser: :firefox,
11
+ desired_capabilities: Selenium::WebDriver::Remote::Capabilities.firefox(marionette: true)
12
+ )
13
+ end
14
+
15
+ Capybara.register_driver :selenium_marionette_clear_storage do |app|
16
+ Capybara::Selenium::Driver.new(
17
+ app,
18
+ browser: :firefox,
19
+ desired_capabilities: Selenium::WebDriver::Remote::Capabilities.firefox(marionette: true),
20
+ clear_local_storage: true,
21
+ clear_session_storage: true
22
+ )
23
+ end
24
+
25
+ module TestSessions
26
+ SeleniumMarionette = Capybara::Session.new(:selenium_marionette, TestApp)
27
+ end
28
+
29
+ skipped_tests = [
30
+ :response_headers,
31
+ :status_code,
32
+ :trigger
33
+ ]
34
+ skipped_tests << :windows if ENV['TRAVIS'] && !ENV['WINDOW_TEST']
35
+
36
+ Capybara::SpecHelper.run_specs TestSessions::SeleniumMarionette, "selenium", capybara_skip: skipped_tests
37
+
38
+ RSpec.describe "Capybara::Session with firefox" do
39
+ include_examples "Capybara::Session", TestSessions::SeleniumMarionette, :selenium_marionette
40
+ include_examples Capybara::RSpecMatchers, TestSessions::SeleniumMarionette, :selenium_marionette
41
+ end
42
+
43
+ RSpec.describe Capybara::Selenium::Driver do
44
+ before do
45
+ @driver = Capybara::Selenium::Driver.new(TestApp, browser: :firefox)
46
+ end
47
+
48
+ describe '#quit' do
49
+ it "should reset browser when quit" do
50
+ expect(@driver.browser).to be
51
+ @driver.quit
52
+ #access instance variable directly so we don't create a new browser instance
53
+ expect(@driver.instance_variable_get(:@browser)).to be_nil
54
+ end
55
+
56
+ context "with errors" do
57
+ before do
58
+ @original_browser = @driver.browser
59
+ end
60
+ after do
61
+ # Ensure browser is actually quit so we don't leave hanging processe
62
+ RSpec::Mocks.space.proxy_for(@original_browser).reset
63
+ @original_browser.quit
64
+ end
65
+
66
+ it "warns UnknownError returned during quit because the browser is probably already gone" do
67
+ expect_any_instance_of(Capybara::Selenium::Driver).to receive(:warn).with(/random message/)
68
+ allow(@driver.browser).to(
69
+ receive(:quit)
70
+ .and_raise(Selenium::WebDriver::Error::UnknownError, "random message")
71
+ )
72
+
73
+ expect { @driver.quit }.not_to raise_error
74
+ expect(@driver.instance_variable_get(:@browser)).to be_nil
75
+ end
76
+
77
+ it "ignores silenced UnknownError returned during quit because the browser is almost definitely already gone" do
78
+ expect_any_instance_of(Capybara::Selenium::Driver).not_to receive(:warn)
79
+ allow(@driver.browser).to(
80
+ receive(:quit)
81
+ .and_raise(Selenium::WebDriver::Error::UnknownError, "Error communicating with the remote browser")
82
+ )
83
+
84
+ expect { @driver.quit }.not_to raise_error
85
+ expect(@driver.instance_variable_get(:@browser)).to be_nil
86
+ end
87
+ end
88
+ end
89
+
90
+ context "storage" do
91
+ describe "#reset!" do
92
+ it "does not clear either storage by default" do
93
+ @session = TestSessions::SeleniumMarionette
94
+ @session.visit('/with_js')
95
+ @session.find(:css, '#set-storage').click
96
+ @session.reset!
97
+ @session.visit('/with_js')
98
+ expect(@session.driver.browser.local_storage.keys).not_to be_empty
99
+ expect(@session.driver.browser.session_storage.keys).not_to be_empty
100
+ end
101
+
102
+ it "clears storage when set" do
103
+ @session = Capybara::Session.new(:selenium_marionette_clear_storage, TestApp)
104
+ @session.visit('/with_js')
105
+ @session.find(:css, '#set-storage').click
106
+ @session.reset!
107
+ @session.visit('/with_js')
108
+ expect(@session.driver.browser.local_storage.keys).to be_empty
109
+ expect(@session.driver.browser.session_storage.keys).to be_empty
110
+ end
111
+ end
112
+ end
113
+ end
114
+
@@ -41,14 +41,16 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
41
41
  end
42
42
 
43
43
  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
- `rspec spec/fixtures/selenium_driver_rspec_failure.rb`
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
47
  expect($?.exitstatus).to eq(1)
47
48
  end
48
49
 
49
50
  it "should have return code 0 when running selenium_driver_rspec_success.rb" do
50
- ENV['SELENIUM_BROWSER'] = @session.driver.options[:browser].to_s
51
- `rspec spec/fixtures/selenium_driver_rspec_success.rb`
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)
52
54
  expect($?.exitstatus).to eq(0)
53
55
  end
54
56
  end
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.10.1
4
+ version: 2.11.0
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: 2016-10-08 00:00:00.000000000 Z
13
+ date: 2016-12-05 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
@@ -100,16 +100,22 @@ dependencies:
100
100
  name: selenium-webdriver
101
101
  requirement: !ruby/object:Gem::Requirement
102
102
  requirements:
103
- - - "~>"
103
+ - - ">="
104
104
  - !ruby/object:Gem::Version
105
105
  version: '2.0'
106
+ - - "<"
107
+ - !ruby/object:Gem::Version
108
+ version: '4.0'
106
109
  type: :development
107
110
  prerelease: false
108
111
  version_requirements: !ruby/object:Gem::Requirement
109
112
  requirements:
110
- - - "~>"
113
+ - - ">="
111
114
  - !ruby/object:Gem::Version
112
115
  version: '2.0'
116
+ - - "<"
117
+ - !ruby/object:Gem::Version
118
+ version: '4.0'
113
119
  - !ruby/object:Gem::Dependency
114
120
  name: sinatra
115
121
  requirement: !ruby/object:Gem::Requirement
@@ -412,17 +418,18 @@ files:
412
418
  - spec/rack_test_spec.rb
413
419
  - spec/result_spec.rb
414
420
  - spec/rspec/features_spec.rb
415
- - spec/rspec/matchers_spec.rb
416
421
  - spec/rspec/scenarios_spec.rb
422
+ - spec/rspec/shared_spec_matchers.rb
417
423
  - spec/rspec/views_spec.rb
418
424
  - spec/rspec_spec.rb
419
425
  - spec/selector_spec.rb
420
- - spec/selenium_firefox_spec.rb
421
426
  - spec/selenium_spec_chrome.rb
427
+ - spec/selenium_spec_firefox.rb
428
+ - spec/selenium_spec_marionette.rb
422
429
  - spec/server_spec.rb
423
430
  - spec/shared_selenium_session.rb
424
431
  - spec/spec_helper.rb
425
- homepage: https://github.com/jnicklas/capybara
432
+ homepage: https://github.com/teamcapybara/capybara
426
433
  licenses:
427
434
  - MIT
428
435
  metadata: {}
@@ -442,7 +449,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
442
449
  version: '0'
443
450
  requirements: []
444
451
  rubyforge_project:
445
- rubygems_version: 2.5.1
452
+ rubygems_version: 2.5.2
446
453
  signing_key:
447
454
  specification_version: 4
448
455
  summary: Capybara aims to simplify the process of integration testing Rack applications,
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
- require "selenium-webdriver"
4
- require 'shared_selenium_session'
5
-
6
- Capybara.register_driver :selenium_focus do |app|
7
- # profile = Selenium::WebDriver::Firefox::Profile.new
8
- # profile["focusmanager.testmode"] = true
9
- # Capybara::Selenium::Driver.new(app, browser: :firefox, profile: profile)
10
- Capybara::Selenium::Driver.new(app, browser: :firefox)
11
- end
12
-
13
- module TestSessions
14
- Selenium = Capybara::Session.new(:selenium_focus, TestApp)
15
- end
16
-
17
- skipped_tests = [
18
- :response_headers,
19
- :status_code,
20
- :trigger
21
- ]
22
- skipped_tests << :windows if ENV['TRAVIS'] && !ENV['WINDOW_TEST']
23
-
24
- Capybara::SpecHelper.run_specs TestSessions::Selenium, "selenium", capybara_skip: skipped_tests
25
-
26
- RSpec.describe "Capybara::Session with firefox" do
27
- include_examples "Capybara::Session", TestSessions::Selenium, :selenium_focus
28
- end
29
-
30
- RSpec.describe Capybara::Selenium::Driver do
31
- before do
32
- @driver = Capybara::Selenium::Driver.new(TestApp, browser: :firefox)
33
- end
34
-
35
- describe '#quit' do
36
- it "should reset browser when quit" do
37
- expect(@driver.browser).to be
38
- @driver.quit
39
- #access instance variable directly so we don't create a new browser instance
40
- expect(@driver.instance_variable_get(:@browser)).to be_nil
41
- end
42
- end
43
- end
44
-